From edbda0b83a50e1baa49d07aa775925e7de634435 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 11:25:58 +0200 Subject: [PATCH 001/191] add info on sensor configuration --- .../tutorials/working_with_expedition_yaml.md | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/user-guide/tutorials/working_with_expedition_yaml.md b/docs/user-guide/tutorials/working_with_expedition_yaml.md index af059b3f..d0825794 100644 --- a/docs/user-guide/tutorials/working_with_expedition_yaml.md +++ b/docs/user-guide/tutorials/working_with_expedition_yaml.md @@ -49,8 +49,13 @@ instruments_config: # <-- 2. instrument configuration section num_bins: 40 max_depth_meter: -1000.0 period_minutes: 5.0 + sensors: + - VELOCITY ship_underwater_st_config: period_minutes: 5.0 + sensors: + - TEMPERATURE + - SALINITY argo_float_config: ... ctd_config: ... drifter_config: ... @@ -88,6 +93,27 @@ You can do multiple `DRIFTER` deployments at the same waypoint by adding multipl This section defines the configuration settings for each instrument used in the expedition. Each instrument has its own subsection where specific parameters can be set. +##### Sensors + +For most users, the most important instrument configuration settings to consider are the **sensors** for each instrument, which control what type of measurements/variables the instrument records in the simulation. For example, for the `CTD` instrument, you can specify which sensors to include in the simulation (e.g., `TEMPERATURE`, `SALINITY`, `OXYGEN`, etc.) by adding or removing entries from the `sensors` list in the `ctd_config` section. These must be added on _new lines_ and be in _uppercase_, for example: + +```yaml +ctd_config: + max_depth_meter: -2000.0 + min_depth_meter: -11.0 + stationkeeping_time_minutes: 50.0 + sensors: + - TEMPERATURE + - SALINITY + - OXYGEN +``` + +```{important} +See [here](../documentation/full_sensor_list.md) for a full list of available sensors for each instrument. Trying to add a sensor to an instrument that does not support it will result in errors in VirtualShip. +``` + +##### Underway Instruments + Because **underway instruments** (e.g., ADCP, Ship Underwater ST) collect data continuously while the ship is moving, their deployment is not tied to specific waypoints. Instead, the presence of their configuration sections in `instruments_config` indicates that they will be active throughout the expedition. This means that if you wish to turn off an underway instrument, you can remove its configuration section or simply set it to `null`, for example: ```yaml @@ -96,7 +122,7 @@ instruments_config: ship_underwater_st_config: null ``` -For **all other instruments**, e.g. CTD, ARGO_FLOAT etc., the parameters can often be left as the default values unless advanced customisations are required. +For **all other instruments**, e.g. CTD, ARGO_FLOAT etc., the parameters can often be left as the default values unless further, advanced customisations are required. #### 3. `ship_config` From cd5b523f83046ca1e3ec5ab42a32af36ee5aa967 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 11:26:26 +0200 Subject: [PATCH 002/191] add list of available sensors to documentation --- .../documentation/full_sensor_list.md | 26 +++++++++++++++++++ docs/user-guide/index.md | 1 + 2 files changed, 27 insertions(+) create mode 100644 docs/user-guide/documentation/full_sensor_list.md diff --git a/docs/user-guide/documentation/full_sensor_list.md b/docs/user-guide/documentation/full_sensor_list.md new file mode 100644 index 00000000..1cc072a7 --- /dev/null +++ b/docs/user-guide/documentation/full_sensor_list.md @@ -0,0 +1,26 @@ +# Full list of available instrument sensors + +The following table provides a comprehensive list of available sensors for each instrument. These sensors can be specified via the `virtualship plan` tool (see the [Quickstart guide](../quickstart.md)) or in the `sensors` section of the respective instrument configuration in the `expedition.yaml` file (see the [working with expedition.yaml tutorial](../tutorials/working_with_expedition_yaml.md)). + +```{note} +Trying to add a sensor to an instrument that does not support it will result in errors in VirtualShip. Always refer to this table to check which sensors are available for each instrument. +``` + +| Instrument | Sensor Name | Description | Units | Category | +| :--------------------- | :----------------- | :-------------------------------------------------- | :----------------------------------- | :-------------- | +| **ADCP** | VELOCITY | Current velocities (eastward (u) and northward (v)) | m/s | Physical | +| **Ship Underwater ST** | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| **CTD** | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| | OXYGEN | Oxygen concentration | mmol m-3 | Biogeochemistry | +| | CHLOROPHYLL | Chlorophyll concentration | mmol m-3 | Biogeochemistry | +| | NITRATE | Nitrate concentration | mmol m-3 | Biogeochemistry | +| | PHOSPHATE | Phosphate concentration | mmol m-3 | Biogeochemistry | +| | PH | pH | - | Biogeochemistry | +| | PHYTOPLANKTON | Phytoplankton concentration in carbon | mmol m-3 | Biogeochemistry | +| | PRIMARY_PRODUCTION | Net primary production | mmol m-3 day-1 | Biogeochemistry | +| **ARGO_FLOAT** | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| **DRIFTER** | TEMPERATURE | Temperature | °C | Physics | +| **XBT** | TEMPERATURE | Temperature | °C | Physics | diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index fac1c26c..d5d4a124 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -17,4 +17,5 @@ assignments/index documentation/copernicus_products.md documentation/pre_download_data.md documentation/example_copernicus_download.ipynb +documentation/full_sensor_list.md ``` From 4668e548e63dcd27457c6493e7245a8fcea34bc2 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 11:27:16 +0200 Subject: [PATCH 003/191] remove redundant TODO --- src/virtualship/static/expedition.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index 3be45c4d..acb16dcf 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -1,7 +1,5 @@ # see https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/working_with_expedition_yaml.html for more details on how to edit this file # -# TODO: add a link to docs where lists what sensors are supported for each instrument -# schedule: waypoints: - instrument: From ae2d528edc38f735d296a0a1577e31195aa33a34 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 11:52:09 +0200 Subject: [PATCH 004/191] improve phrasing --- docs/user-guide/tutorials/working_with_expedition_yaml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/tutorials/working_with_expedition_yaml.md b/docs/user-guide/tutorials/working_with_expedition_yaml.md index d0825794..6bbf181e 100644 --- a/docs/user-guide/tutorials/working_with_expedition_yaml.md +++ b/docs/user-guide/tutorials/working_with_expedition_yaml.md @@ -95,7 +95,7 @@ This section defines the configuration settings for each instrument used in the ##### Sensors -For most users, the most important instrument configuration settings to consider are the **sensors** for each instrument, which control what type of measurements/variables the instrument records in the simulation. For example, for the `CTD` instrument, you can specify which sensors to include in the simulation (e.g., `TEMPERATURE`, `SALINITY`, `OXYGEN`, etc.) by adding or removing entries from the `sensors` list in the `ctd_config` section. These must be added on _new lines_ and be in _uppercase_, for example: +For most users, the most important instrument configuration setting to consider is the list of **sensors** for each instrument, which controls what type of measurements/variables the instrument records in the simulation. For example, for the `CTD` instrument, you can specify which sensors to include in the simulation (e.g., `TEMPERATURE`, `SALINITY`, `OXYGEN`, etc.) by adding or removing entries from the `sensors` list in the `ctd_config` section. These must be added on _new lines_ and be in _uppercase_, for example: ```yaml ctd_config: From 17d5b40bc335976b229a9cd4610d68039b1a8046 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 11:52:25 +0200 Subject: [PATCH 005/191] add details on sensor configurations to quickstart guide --- docs/user-guide/quickstart.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/user-guide/quickstart.md b/docs/user-guide/quickstart.md index cc43b8a0..a4f75997 100644 --- a/docs/user-guide/quickstart.md +++ b/docs/user-guide/quickstart.md @@ -56,7 +56,7 @@ This will create a folder/directory called `EXPEDITION_NAME` with a single file: For advanced users: it is also possible to run the expedition initialisation step without an MFP .xlsx export file. In this case you should simply run `virtualship init EXPEDITION_NAME` in the CLI. This will write an example `expedition.yaml` file in the `EXPEDITION_NAME` folder/directory. This file contains example waypoints, timings, instrument selections, and ship configuration, but can be edited or propagated through the rest of the workflow unedited to run a sample expedition. ``` -## 3) Expedition scheduling & ship configuration +## 3) Expedition scheduling & configuration ```{important} This section describes the process of finalising the expedition schedule and instrument selection using the `virtualship plan` application. This is the recommended way for most users but when expeditions become larger with many waypoints, it can become cumbersome to use the planning tool (note, using VirtualShip in a remote terminal / cloud-based environment can also introduce lag in the user-interface). **In this case, you may prefer to edit the `expedition.yaml` file directly (see [here](./tutorials/working_with_expedition_yaml.md) for more details on how to do so)**. @@ -82,6 +82,23 @@ VirtualShip is capable of taking underway temperature and salinity measurements, For the underway ADCP, there is a choice of using the 38 kHz OceanObserver or the 300 kHz SeaSeven version (see [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#ADCP) for more detail on the two ADCP types). +### Instrument configuration + +The most important instrument configuration setting to consider is the list of **sensors** for each instrument, which controls what type of measurements/variables the instrument records in the simulation and therefore what output data you will receive for each instrument. + +Sensor lists can be configured for each instrument under _Ship Config Editor_ > _Instrument Configurations_. For example, for the CTD instrument, you can specify which sensors to include in the simulation (e.g., `TEMPERATURE`, `SALINITY`, `OXYGEN`, etc.) by toggling the respective switches on or off. + +```{note} +Sensor choices are only relevant for the instruments you plan to deploy as [underway measurements](#underway-measurements) or at waypoints across your expedition schedule [(see below)](#instrument-selection). For example, if you do not select to deploy a CTD at any of your waypoints, the CTD sensor choices will not affect any output data. +``` + +```{tip} +See [here](../documentation/full_sensor_list.md) for more information on the sensors available for each instrument. + +``` + +There are other instrument configurations settings that can be adjusted in the editor as well (e.g. `max_depth` for the CTD), but these are more advanced and in most cases do not need to be changed from the default values. + ### Waypoint datetimes @@ -107,15 +124,11 @@ The MFP route planning tool will give estimated durations of sailing between sit You should now consider which measurements are to be taken at each sampling site, and therefore which instruments need to be selected in the planning tool. ```{tip} -Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on what measurement options are available, and a brief introduction to each instrument. +Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on what instrument options are available, and a brief introduction to each instrument. ``` You can make instrument selections for each waypoint in the same sub-panels as the [waypoint time](#waypoint-datetimes) selection by simply switching each on or off. Multiple instruments are allowed at each waypoint. -```{note} -For advanced users: you can also make further customisations to behaviours of all instruments under _Ship Config Editor_ > _Instrument Configurations_. -``` - ### Save changes When you are happy with your ship configuration and schedule plan, press _Save Changes_. From baa982aa43d99a8080b0b146164a03c81c10cd77 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 12:04:37 +0200 Subject: [PATCH 006/191] update sail_the_ship with sensor configuration instructions --- .../assignments/Sail_the_ship.ipynb | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/assignments/Sail_the_ship.ipynb b/docs/user-guide/assignments/Sail_the_ship.ipynb index 1e1f439d..b4b94f3d 100644 --- a/docs/user-guide/assignments/Sail_the_ship.ipynb +++ b/docs/user-guide/assignments/Sail_the_ship.ipynb @@ -157,7 +157,7 @@ "The next step is to finalise the expedition schedule plan, including setting times and instrument selection choices for each waypoint, as well as configuring the ship (including any underway measurement instruments). \n", "\n", "
\n", - "**NOTE**: This section describes the process of finalising the expedition schedule and instrument selection using the `virtualship plan` application. For expeditions with many waypoints, it can become cumbersome to use the planning tool (note, using VirtualShip in a remote terminal / cloud-based environment can also introduce lag in the user-interface). **In this case, you may prefer to edit the** `expedition.yaml` **file directly (see [here](../tutorials/working_with_expedition_yaml.md) for more details on how to do so)**.\n", + "**Note**: This section describes the process of finalising the expedition schedule and instrument selection using the `virtualship plan` application. For expeditions with many waypoints, it can become cumbersome to use the planning tool (note, using VirtualShip in a remote terminal / cloud-based environment can also introduce lag in the user-interface). **In this case, you may prefer to edit the** `expedition.yaml` **file directly (see [here](../tutorials/working_with_expedition_yaml.md) for more details on how to do so)**.\n", "
\n", "\n", "\n", @@ -177,6 +177,22 @@ "\n", "For the underway ADCP, there is a choice of using the 38 kHz OceanObserver or the 300 kHz SeaSeven version (see [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#ADCP) for more detail on the two ADCP types).\n", "\n", + "### Instrument/sensor configuration\n", + "\n", + "The most important instrument configuration setting to consider is the list of **sensors** for each instrument, which controls what type of measurements/variables the instrument records in the simulation and therefore what output data you will receive for each instrument.\n", + "\n", + "Sensor lists can be configured for each instrument under _Ship Config Editor_ > _Instrument Configurations_. For example, for the CTD instrument, you can specify which sensors to include in the simulation (e.g., `TEMPERATURE`, `SALINITY`, `OXYGEN`, etc.) by toggling the respective switches on or off.\n", + "\n", + "
\n", + "**Note**: Sensor choices are only relevant for the instruments you plan to deploy as [underway measurements](#underway-measurements) or at waypoints across your expedition schedule [(see below)](#instrument-selection). For example, if you do not select to deploy a CTD at any of your waypoints, the CTD sensor choices will not affect any output data.\n", + "
\n", + "\n", + "
\n", + "**TIP**: See [here](../documentation/full_sensor_list.md) for more information on the sensors available for each instrument.\n", + "
\n", + "\n", + "There are other instrument configurations settings that can be adjusted in the editor as well (e.g. `max_depth` for the CTD), but these are more advanced and in most cases do not need to be changed from the default values.\n", + "\n", "### Waypoint datetimes\n", "\n", "
\n", @@ -200,7 +216,7 @@ "You should now consider which measurements are to be taken at each sampling site (think about those required for your chosen research question), and therefore which instruments need to be selected in the planning tool at each waypoint.\n", "\n", "
\n", - "**Tip**: Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on what measurement options are available, and a brief introduction to each instrument.\n", + "**Tip**: Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on which instruments are available in VirtualShip, and a brief introduction to each.\n", "
\n", "\n", "You can make instrument selections for each waypoint in the same sub-panels as the [waypoint time](#waypoint-datetimes) selection by simply switching each on or off. Multiple instruments are allowed at each waypoint.\n", From a8a4978e8fb1dfd631388af9372fb7c71a33630b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 12:04:44 +0200 Subject: [PATCH 007/191] enahnce phrasing --- docs/user-guide/quickstart.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/quickstart.md b/docs/user-guide/quickstart.md index a4f75997..7d984111 100644 --- a/docs/user-guide/quickstart.md +++ b/docs/user-guide/quickstart.md @@ -82,7 +82,7 @@ VirtualShip is capable of taking underway temperature and salinity measurements, For the underway ADCP, there is a choice of using the 38 kHz OceanObserver or the 300 kHz SeaSeven version (see [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#ADCP) for more detail on the two ADCP types). -### Instrument configuration +### Instrument/sensor configuration The most important instrument configuration setting to consider is the list of **sensors** for each instrument, which controls what type of measurements/variables the instrument records in the simulation and therefore what output data you will receive for each instrument. @@ -94,7 +94,6 @@ Sensor choices are only relevant for the instruments you plan to deploy as [unde ```{tip} See [here](../documentation/full_sensor_list.md) for more information on the sensors available for each instrument. - ``` There are other instrument configurations settings that can be adjusted in the editor as well (e.g. `max_depth` for the CTD), but these are more advanced and in most cases do not need to be changed from the default values. @@ -124,7 +123,7 @@ The MFP route planning tool will give estimated durations of sailing between sit You should now consider which measurements are to be taken at each sampling site, and therefore which instruments need to be selected in the planning tool. ```{tip} -Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on what instrument options are available, and a brief introduction to each instrument. +Click [here](https://virtualship.readthedocs.io/en/latest/user-guide/assignments/Research_proposal_intro.html#Measurement-Options) for more information on what instrument options are available in VirtualShip, and a brief introduction to each. ``` You can make instrument selections for each waypoint in the same sub-panels as the [waypoint time](#waypoint-datetimes) selection by simply switching each on or off. Multiple instruments are allowed at each waypoint. From 6b3628ed1d123d00fee7f3639753d28c6d0b199b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 13:05:42 +0200 Subject: [PATCH 008/191] add testing that docs match the code for sensor options, ensure instrument column entries are consistent --- .../documentation/full_sensor_list.md | 38 ++++++----- tests/test_utils.py | 65 ++++++++++++++++++- 2 files changed, 84 insertions(+), 19 deletions(-) diff --git a/docs/user-guide/documentation/full_sensor_list.md b/docs/user-guide/documentation/full_sensor_list.md index 1cc072a7..7e108b67 100644 --- a/docs/user-guide/documentation/full_sensor_list.md +++ b/docs/user-guide/documentation/full_sensor_list.md @@ -6,21 +6,23 @@ The following table provides a comprehensive list of available sensors for each Trying to add a sensor to an instrument that does not support it will result in errors in VirtualShip. Always refer to this table to check which sensors are available for each instrument. ``` -| Instrument | Sensor Name | Description | Units | Category | -| :--------------------- | :----------------- | :-------------------------------------------------- | :----------------------------------- | :-------------- | -| **ADCP** | VELOCITY | Current velocities (eastward (u) and northward (v)) | m/s | Physical | -| **Ship Underwater ST** | TEMPERATURE | Temperature | °C | Physics | -| | SALINITY | Salinity | psu | Physics | -| **CTD** | TEMPERATURE | Temperature | °C | Physics | -| | SALINITY | Salinity | psu | Physics | -| | OXYGEN | Oxygen concentration | mmol m-3 | Biogeochemistry | -| | CHLOROPHYLL | Chlorophyll concentration | mmol m-3 | Biogeochemistry | -| | NITRATE | Nitrate concentration | mmol m-3 | Biogeochemistry | -| | PHOSPHATE | Phosphate concentration | mmol m-3 | Biogeochemistry | -| | PH | pH | - | Biogeochemistry | -| | PHYTOPLANKTON | Phytoplankton concentration in carbon | mmol m-3 | Biogeochemistry | -| | PRIMARY_PRODUCTION | Net primary production | mmol m-3 day-1 | Biogeochemistry | -| **ARGO_FLOAT** | TEMPERATURE | Temperature | °C | Physics | -| | SALINITY | Salinity | psu | Physics | -| **DRIFTER** | TEMPERATURE | Temperature | °C | Physics | -| **XBT** | TEMPERATURE | Temperature | °C | Physics | + + +| Instrument | Sensor Name | Description | Units | Category | +| :------------------------------------- | :----------------- | :-------------------------------------------------- | :----------------------------------- | :-------------- | +| **ADCP** | VELOCITY | Current velocities (eastward (u) and northward (v)) | m/s | Physical | +| **UNDERWATER_ST** (Ship Underwater ST) | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| **CTD** | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| | OXYGEN | Oxygen concentration | mmol m-3 | Biogeochemistry | +| | CHLOROPHYLL | Chlorophyll concentration | mmol m-3 | Biogeochemistry | +| | NITRATE | Nitrate concentration | mmol m-3 | Biogeochemistry | +| | PHOSPHATE | Phosphate concentration | mmol m-3 | Biogeochemistry | +| | PH | pH | - | Biogeochemistry | +| | PHYTOPLANKTON | Phytoplankton concentration in carbon | mmol m-3 | Biogeochemistry | +| | PRIMARY_PRODUCTION | Net primary production | mmol m-3 day-1 | Biogeochemistry | +| **ARGO_FLOAT** | TEMPERATURE | Temperature | °C | Physics | +| | SALINITY | Salinity | psu | Physics | +| **DRIFTER** | TEMPERATURE | Temperature | °C | Physics | +| **XBT** | TEMPERATURE | Temperature | °C | Physics | diff --git a/tests/test_utils.py b/tests/test_utils.py index fde6796f..3196fa03 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,12 +1,13 @@ import datetime +import re from pathlib import Path import numpy as np import pytest import xarray as xr -from parcels import FieldSet, JITParticle, ScipyParticle, Variable import virtualship.utils +from parcels import FieldSet, JITParticle, ScipyParticle, Variable from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.expedition import Expedition, SensorConfig @@ -399,3 +400,65 @@ def test_build_particle_class_scipy_base(): ParticleClass = build_particle_class_from_sensors(sensors, nonsensor, ScipyParticle) assert issubclass(ParticleClass, ScipyParticle) + + +def test_allowed_sensors_matches_docs(): + """Test that SUPPORTED_SENSORS_MAP (sensors allowed for each instrument) matches the sensor table in full_sensor_list.md.""" + # local imports to trigger instrument registration and avoid potential circular imports + import virtualship.instruments # noqa: F401 - ensures all @register_instrument decorators run + from virtualship.utils import INSTRUMENT_CLASS_MAP, SUPPORTED_SENSORS_MAP + + docs_path = ( + Path(__file__).parent.parent + / "docs/user-guide/documentation/full_sensor_list.md" + ) + content = docs_path.read_text(encoding="utf-8") + + display_name_to_instrument_type: dict[str, InstrumentType] = { + instrument_type.value: instrument_type + for instrument_type in INSTRUMENT_CLASS_MAP + if isinstance(instrument_type, InstrumentType) + } # all instruments should use their enum value as the bold display name in the markdown table + + # parse markdown table rows + row_pattern = re.compile(r"^\|([^|]*)\|([^|]*)\|.*$", re.MULTILINE) + + expected: dict[InstrumentType, set[SensorType]] = {} + current_instrument: InstrumentType | None = None + + for match in row_pattern.finditer(content): + instrument_cell = match.group(1).strip() + sensor_cell = match.group(2).strip() + + # extract only the **bold** text from the cell (e.g. "**UNDERWATER_ST** (Ship Underwater ST)" -> "UNDERWATER_ST") + bold_match = re.search(r"\*\*(.+?)\*\*", instrument_cell) + instrument_name = bold_match.group(1).strip() if bold_match else "" + + if instrument_name and instrument_name in display_name_to_instrument_type: + current_instrument = display_name_to_instrument_type[instrument_name] + if current_instrument not in expected: + expected[current_instrument] = set() + + # skip irrelevant cells + if ( + not sensor_cell + or sensor_cell.startswith(":") + or sensor_cell == "Sensor Name" + ): + continue + + sensor_name = sensor_cell.strip() + if current_instrument is not None and sensor_name: + expected[current_instrument].add(SensorType(sensor_name)) + + # verify each instrument in the docs is registered and has matching sensors + for instrument_type, doc_sensors in expected.items(): + assert instrument_type in SUPPORTED_SENSORS_MAP, ( + f"{instrument_type} is listed in full_sensor_list.md but not found in SUPPORTED_SENSORS_MAP." + ) + registered_sensors = set(SUPPORTED_SENSORS_MAP[instrument_type]) + assert registered_sensors == doc_sensors, ( + f"Sensor mismatch for {instrument_type}:\n" + f" In docs: {sorted(s.value for s in doc_sensors)}\n" + f" In code: {sorted(s.value for s in registered_sensors)}\n" + ) From e23087b61cae509ec7be54be780d57f4af21f48c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 13:10:46 +0200 Subject: [PATCH 009/191] add check that all instruments in code are addressed in sensor table --- tests/test_utils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_utils.py b/tests/test_utils.py index 3196fa03..4ab96654 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -462,3 +462,9 @@ def test_allowed_sensors_matches_docs(): f" In docs: {sorted(s.value for s in doc_sensors)}\n" f" In code: {sorted(s.value for s in registered_sensors)}\n" ) + + # verify each instrument registered in code is also covered in the docs + for instrument_type in SUPPORTED_SENSORS_MAP: + assert instrument_type in expected, ( + f"{instrument_type} is registered in SUPPORTED_SENSORS_MAP but not listed in full_sensor_list.md." + ) From a5ff3a44362f0cd688f03836ae2ec41bb4f27c82 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 14:17:44 +0200 Subject: [PATCH 010/191] update environments to pull parcels v4 alpha --- pixi.toml | 24 +++++++++++------------- pyproject.toml | 6 +++--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/pixi.toml b/pixi.toml index ba024968..0d4b8d87 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,7 +1,7 @@ [workspace] name = "VirtualShip" preview = ["pixi-build"] -channels = ["conda-forge"] +channels = ["https://repo.prefix.dev/parcels", "conda-forge"] platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] exclude-newer = "5d" # security pre-caution against compromised packages requires-pixi = ">=0.67.0" @@ -18,9 +18,9 @@ setuptools = "*" setuptools_scm = "*" [package.run-dependencies] # Keep in sync with `pyproject.toml` and feedstock recipe -python = ">=3.10" +python = "3.11.*" click = "*" -parcels = ">3.1.0" +parcels = ">=4.0.0alpha" pyproj = ">=3,<4" sortedcontainers = "==2.4.0" opensimplex = "==0.4.5" @@ -34,14 +34,15 @@ textual = "*" [dependencies] virtualship = { path = "." } -[feature.py310.dependencies] -python = "3.10.*" +# Commented out whilst parcels v4 alpha only supports Python 3.11 +# [feature.py310.dependencies] +# python = "3.10.*" -[feature.py311.dependencies] -python = "3.11.*" +# [feature.py311.dependencies] +# python = "3.11.*" -[feature.py312.dependencies] -python = "3.12.*" +# [feature.py312.dependencies] +# python = "3.12.*" [feature.test.dependencies] pytest = "*" @@ -98,11 +99,8 @@ lxml = "*" typing = "mypy src/virtualship --install-types" [environments] -default = { features = ["test", "notebooks", "typing", "pre-commit", "analysis"] } +default = { features = ["test", "notebooks", "typing", "pre-commit", "analysis"] } test-latest = { features = ["test"], solve-group = "test" } -test-py310 = { features = ["test", "py310"] } -test-py311 = { features = ["test", "py311"] } -test-py312 = { features = ["test", "py312"] } test-notebooks = { features = ["test", "notebooks"], solve-group = "test" } analysis = { features = ["analysis"], solve-group = "analysis" } docs = { features = ["docs"], solve-group = "docs" } diff --git a/pyproject.toml b/pyproject.toml index 7f9a2108..bc9346d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "virtualship" description = "Code for the Virtual Ship Classroom, where Marine Scientists can combine Copernicus Marine Data with an OceanParcels ship to go on a virtual expedition." readme = "README.md" dynamic = ["version"] -authors = [{ name = "oceanparcels.org team" }] +authors = [{ name = "parcels-code.org team" }] requires-python = ">=3.10" license = { file = "LICENSE" } classifiers = [ @@ -26,7 +26,7 @@ classifiers = [ ] dependencies = [ "click", - "parcels >3.1.0", + "parcels >=4.0.0alpha", "pyproj >= 3, < 4", "sortedcontainers == 2.4.0", "opensimplex == 0.4.5", @@ -40,7 +40,7 @@ dependencies = [ ] [project.urls] -Homepage = "https://oceanparcels.org/" # TODO: Update this to just be repo? +Homepage = "https://virtualship.parcels-code.org/" Repository = "https://github.com/OceanParcels/virtualship" Documentation = "https://virtualship.readthedocs.io/" "Bug Tracker" = "https://github.com/OceanParcels/virtualship/issues" From db443243b2d2d6c55031c7bfff7b0e893b2a1acc Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 14:18:34 +0200 Subject: [PATCH 011/191] changed parcels logging api --- src/virtualship/cli/_run.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index f2622be3..703502f2 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -35,11 +35,9 @@ get_instrument_class, ) -# parcels logger (suppress INFO messages to prevent log being flooded) -external_logger = logging.getLogger("parcels.tools.loggers") -external_logger.setLevel(logging.WARNING) - -# copernicusmarine logger (suppress INFO messages to prevent log being flooded) +# suppress INFO messages from copernicusmarine and parcels loggers; prevent log flooding +parcels_logger = logging.getLogger("parcels._logger") +parcels_logger.setLevel(logging.WARNING) logging.getLogger("copernicusmarine").setLevel("ERROR") From 6f732d3511a53760ed99e86531d0a4eadc596b26 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 15:36:47 +0200 Subject: [PATCH 012/191] first wave of changes to the instrument logic with v4 logic, and particle building --- src/virtualship/cli/_run.py | 1 + src/virtualship/instruments/adcp.py | 14 +- src/virtualship/instruments/argo_float.py | 197 ++++++++++-------- src/virtualship/instruments/ctd.py | 92 +++++--- src/virtualship/instruments/drifter.py | 25 ++- .../instruments/ship_underwater_st.py | 16 +- src/virtualship/instruments/xbt.py | 35 ++-- src/virtualship/utils.py | 7 +- 8 files changed, 220 insertions(+), 167 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 703502f2..10afc5c5 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -200,6 +200,7 @@ def _run( ) # execute simulation + # TODO: outpath will be Parquet with v4... instrument.execute( measurements=measurements, out_path=expedition_dir.joinpath(RESULTS, f"{itype.name.lower()}.zarr"), diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index b2da6582..7ee718f6 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -3,8 +3,8 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet, ScipyParticle +from parcels import ParticleSet from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -35,9 +35,13 @@ class ADCP: # ===================================================== -def _sample_velocity(particle, fieldset, time): - particle.U, particle.V = fieldset.UV.eval( - time, particle.depth, particle.lat, particle.lon, applyConversion=False +def _sample_velocity(particles, fieldset): + particles.U, particles.V = fieldset.UV.eval( + particles.time, + particles.z, + particles.lat, + particles.lon, + applyConversion=False, ) @@ -96,7 +100,7 @@ def simulate(self, measurements, out_path) -> None: # build dynamic particle class from the active sensors adcp_config = self.expedition.instruments_config.adcp_config _ADCPParticle = build_particle_class_from_sensors( - adcp_config.sensors, _ADCP_NONSENSOR_VARIABLES, ScipyParticle + adcp_config.sensors, _ADCP_NONSENSOR_VARIABLES ) bins = np.linspace(MAX_DEPTH, MIN_DEPTH, NUM_BINS) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 8c90cfb2..70fcb146 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -1,12 +1,11 @@ -import math from collections.abc import Callable from dataclasses import dataclass from datetime import timedelta from typing import ClassVar import numpy as np -from parcels import AdvectionRK4, JITParticle, ParticleSet, StatusCode, Variable +from parcels import AdvectionRK4, ParticleSet, StatusCode, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -53,103 +52,125 @@ class ArgoFloat: # SECTION: Kernels # ===================================================== - -def _argo_float_vertical_movement(particle, fieldset, time): - if particle.cycle_phase == 0: - # Phase 0: Sinking with vertical_speed until depth is drift_depth - particle_ddepth += ( # noqa - particle.vertical_speed * particle.dt +# TODO: need to add back in the shallow bathymetry checks (to phases 0 and 2?!) +# TODO: can this be refactored as well to a helper function? + + +def _argo_float_vertical_movement(particles, fieldset): + # Split particles based on their current cycle_phase + ptcls0 = particles[particles.cycle_phase == 0] + ptcls1 = particles[particles.cycle_phase == 1] + ptcls2 = particles[particles.cycle_phase == 2] + ptcls3 = particles[particles.cycle_phase == 3] + ptcls4 = particles[particles.cycle_phase == 4] + + # Phase 0: Sinking with vertical_speed until depth is driftdepth + ptcls0.dz += particles.vertical_speed * ptcls0.dt + loc_bathy = fieldset.bathymetry.eval(ptcls0.time, ptcls0.z, ptcls0.lat, ptcls0.lon) + driftdepth_mask = ptcls0.z + ptcls0.dz >= particles.drift_depth + bathy_mask = ptcls0.z + ptcls0.dz >= loc_bathy + next_phase = np.logical_and( + driftdepth_mask, bathy_mask + ) # combined mask; not at drift depth yet and not hitting bathymetry + ptcls0.cycle_phase[next_phase] = 1 + ptcls0.dz[next_phase] = ( + particles.drift_depth - ptcls0.z[next_phase] + ) # avoid overshoot + + # Phase 0.5: Check for grounding at bathymetry and raise if necessary + ptcls0.grounded[~bathy_mask] = 1 + if np.any(~bathy_mask): + print( + "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to drift depth. Raising by 50m above bathymetry and continuing cycle." ) - - # bathymetry at particle location - loc_bathy = fieldset.bathymetry.eval( - time, particle.depth, particle.lat, particle.lon + ptcls0.dz[~bathy_mask] = ( + loc_bathy[~bathy_mask] - ptcls0.z[~bathy_mask] + 50.0 + ) # raise to 50m above bathymetry + ptcls0.cycle_phase[~bathy_mask] = 1 + + # Phase 1: Drifting at depth for drifttime seconds + ptcls1.drift_age += ptcls1.dt + next_phase = ptcls1.drift_age >= particles.drift_days * 86400 # [seconds] + ptcls1.cycle_phase[next_phase] = 2 + ptcls1.drift_age[next_phase] = 0 # reset drift_age for next cycle + + # Phase 2: Sinking further to maxdepth + ptcls2.dz += particles.vertical_speed * ptcls2.dt + loc_bathy = fieldset.bathymetry.eval(ptcls2.time, ptcls2.z, ptcls2.lat, ptcls2.lon) + maxdepth_mask = ptcls2.z + ptcls2.dz >= particles.max_depth + bathy_mask = ptcls2.z + ptcls2.dz >= loc_bathy + next_phase = np.logical_and( + maxdepth_mask, bathy_mask + ) # combined mask; not at max depth yet and not hitting bathymetry + ptcls2.cycle_phase[next_phase] = 3 + ptcls2.dz[next_phase] = ( + particles.max_depth - ptcls2.z[next_phase] + ) # avoid overshoot + + # Phase 2.5: Check for grounding at bathymetry and raise if necessary + ptcls2.grounded[~bathy_mask] = 1 + if np.any(~bathy_mask): + print( + "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to max depth. Raising by 50m above bathymetry and continuing cycle." ) - if particle.depth + particle_ddepth <= loc_bathy: - particle_ddepth = loc_bathy - particle.depth + 50.0 # 50m above bathy - particle.cycle_phase = 1 - particle.grounded = 1 - print( - "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to drift depth. Raising by 50m above bathymetry and continuing cycle." - ) + ptcls2.dz[~bathy_mask] = ( + loc_bathy[~bathy_mask] - ptcls2.z[~bathy_mask] + 50.0 + ) # raise to 50m above bathymetry + ptcls2.cycle_phase[~bathy_mask] = 3 - elif particle.depth + particle_ddepth <= particle.drift_depth: - particle_ddepth = particle.drift_depth - particle.depth - particle.cycle_phase = 1 - - elif particle.cycle_phase == 1: - # Phase 1: Drifting at depth for drifttime seconds - particle.drift_age += particle.dt - if particle.drift_age >= particle.drift_days * 86400: - particle.drift_age = 0 # reset drift_age for next cycle - particle.cycle_phase = 2 - - elif particle.cycle_phase == 2: - # Phase 2: Sinking further to max_depth - particle_ddepth += particle.vertical_speed * particle.dt - loc_bathy = fieldset.bathymetry.eval( - time, particle.depth, particle.lat, particle.lon - ) - if particle.depth + particle_ddepth <= loc_bathy: - particle_ddepth = loc_bathy - particle.depth + 50.0 # 50m above bathy - particle.cycle_phase = 3 - particle.grounded = 1 - print( - "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to max depth. Raising by 50m above bathymetry and continuing cycle." - ) - elif particle.depth + particle_ddepth <= particle.max_depth: - particle_ddepth = particle.max_depth - particle.depth - particle.cycle_phase = 3 - - elif particle.cycle_phase == 3: - # Phase 3: Rising with vertical_speed until at surface - particle_ddepth -= particle.vertical_speed * particle.dt - particle.cycle_age += ( - particle.dt - ) # solve issue of not updating cycle_age during ascent - particle.grounded = 0 - if particle.depth + particle_ddepth >= particle.min_depth: - particle_ddepth = particle.min_depth - particle.depth - particle.cycle_phase = 4 + # Phase 3: Rising with vertical_speed until at surface + ptcls3.dz -= particles.vertical_speed * ptcls3.dt + ptcls3.temp = fieldset.thetao[ptcls3.time, ptcls3.z, ptcls3.lat, ptcls3.lon] + next_phase = ptcls3.z + ptcls3.dz <= particles.min_depth + ptcls3.cycle_phase[next_phase] = 4 + ptcls3.dz[next_phase] = ( + particles.min_depth - ptcls3.z[next_phase] + ) # avoid overshoot - elif particle.cycle_phase == 4: - # Phase 4: Transmitting at surface until cycletime is reached - if particle.cycle_age > particle.cycle_days * 86400: - particle.cycle_phase = 0 - particle.cycle_age = 0 + # Phase 4: Transmitting at surface until cycletime is reached + next_phase = ptcls4.cycle_age >= particles.cycle_days * 86400 + ptcls4.cycle_phase[next_phase] = 0 + ptcls4.cycle_age[next_phase] = 0 # reset cycle_age for next cycle + ptcls4.temp = np.nan # no temperature measurement when at surface - if particle.state == StatusCode.Evaluate: - particle.cycle_age += particle.dt # update cycle_age + particles.cycle_age += particles.dt # update cycle_age -def _keep_at_surface(particle, fieldset, time): - # Prevent error when float reaches surface - if particle.state == StatusCode.ErrorThroughSurface: - particle.depth = particle.min_depth - particle.state = StatusCode.Success +def _keep_at_surface(particles, fieldset): + through_surface = particles.state == StatusCode.ErrorThroughSurface + particles.z[through_surface] = particles.min_depth[through_surface] + particles.state[through_surface] = StatusCode.Success -def _check_error(particle, fieldset, time): - if particle.state >= 50: # This captures all Errors - particle.delete() +def _check_error(particles, fieldset): + errors = particles.state >= 50 # captures all Errors + particles.state[errors] = StatusCode.Delete -def _argo_sample_temperature(particle, fieldset, time): +def _argo_sample_temperature(particles, fieldset): # Phase 3: ascending — sample temperature; NaN otherwise - if particle.cycle_phase == 3 and particle.depth < particle.min_depth: - particle.temperature = fieldset.T[ - time, particle.depth, particle.lat, particle.lon - ] - else: - particle.temperature = math.nan - - -def _argo_sample_salinity(particle, fieldset, time): + phase_mask = particles.cycle_phase == 3 + depth_mask = particles.depth < particles.min_depth + sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] + sampling_particles.temperature = fieldset.T[ + sampling_particles.time, + sampling_particles.depth, + sampling_particles.lat, + sampling_particles.lon, + ] + + +def _argo_sample_salinity(particles, fieldset): # Phase 3: ascending — sample salinity; NaN otherwise - if particle.cycle_phase == 3 and particle.depth < particle.min_depth: - particle.salinity = fieldset.S[time, particle.depth, particle.lat, particle.lon] - else: - particle.salinity = math.nan + phase_mask = particles.cycle_phase == 3 + depth_mask = particles.depth < particles.min_depth + sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] + sampling_particles.salinity = fieldset.S[ + sampling_particles.time, + sampling_particles.depth, + sampling_particles.lat, + sampling_particles.lon, + ] # ===================================================== @@ -229,9 +250,7 @@ def simulate(self, measurements, out_path) -> None: # build dynamic particle class from the active sensors argo_float_config = self.expedition.instruments_config.argo_float_config _ArgoParticle = build_particle_class_from_sensors( - argo_float_config.sensors, - _ARGO_NONSENSOR_VARIABLES, - JITParticle, + argo_float_config.sensors, _ARGO_NONSENSOR_VARIABLES ) # define parcel particles diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 583a099c..a7a4218f 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -4,13 +4,13 @@ from typing import TYPE_CHECKING, ClassVar import numpy as np -from parcels import JITParticle, ParticleSet, Variable +from parcels._core.statuscodes import StatusCode +from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( - add_dummy_UV, build_particle_class_from_sensors, register_instrument, ) @@ -52,60 +52,87 @@ class CTD: ## physical variables -def _sample_temperature(particle, fieldset, time): - particle.temperature = fieldset.T[time, particle.depth, particle.lat, particle.lon] +def _sample_temperature(particles, fieldset): + particles.temperature = fieldset.T[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_salinity(particle, fieldset, time): - particle.salinity = fieldset.S[time, particle.depth, particle.lat, particle.lon] +def _sample_salinity(particles, fieldset): + particles.salinity = fieldset.S[ + particles.time, particles.z, particles.lat, particles.lon + ] ## bgc variables -def _sample_o2(particle, fieldset, time): - particle.o2 = fieldset.o2[time, particle.depth, particle.lat, particle.lon] +def _sample_o2(particles, fieldset): + particles.o2 = fieldset.o2[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_chlorophyll(particle, fieldset, time): - particle.chl = fieldset.chl[time, particle.depth, particle.lat, particle.lon] +def _sample_chlorophyll(particles, fieldset): + particles.chl = fieldset.chl[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_nitrate(particle, fieldset, time): - particle.no3 = fieldset.no3[time, particle.depth, particle.lat, particle.lon] +def _sample_nitrate(particles, fieldset): + particles.no3 = fieldset.no3[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_phosphate(particle, fieldset, time): - particle.po4 = fieldset.po4[time, particle.depth, particle.lat, particle.lon] +def _sample_phosphate(particles, fieldset): + particles.po4 = fieldset.po4[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_ph(particle, fieldset, time): - particle.ph = fieldset.ph[time, particle.depth, particle.lat, particle.lon] +def _sample_ph(particles, fieldset): + particles.ph = fieldset.ph[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_phytoplankton(particle, fieldset, time): - particle.phyc = fieldset.phyc[time, particle.depth, particle.lat, particle.lon] +def _sample_phytoplankton(particles, fieldset): + particles.phyc = fieldset.phyc[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _sample_primary_production(particle, fieldset, time): - particle.nppv = fieldset.nppv[time, particle.depth, particle.lat, particle.lon] +def _sample_primary_production(particles, fieldset): + particles.nppv = fieldset.nppv[ + particles.time, particles.z, particles.lat, particles.lon + ] ## cast -def _ctd_cast(particle, fieldset, time): +def _ctd_cast(particles, fieldset): + particles_lowering = particles[particles.raising == 0] + particles_raising = particles[particles.raising == 1] + + # TODO: change to boolean masking, like with Argo Floats? + # lowering - if particle.raising == 0: - particle_ddepth = -particle.winch_speed * particle.dt - if particle.depth + particle_ddepth < particle.max_depth: - particle.raising = 1 - particle_ddepth = -particle_ddepth + particles_lowering.dz = -particles_lowering.winch_speed * particles_lowering.dt + particles_lowering.raising = np.where( + particles_lowering.z + particles_lowering.dz < particles_lowering.max_depth, + 1, + particles_lowering.raising, + ) + # raising - else: - particle_ddepth = particle.winch_speed * particle.dt - if particle.depth + particle_ddepth > particle.min_depth: - particle.delete() + particles_raising.dz = particles_raising.winch_speed * particles_raising.dt + particles_raising.state = np.where( + particles_raising.z + particles_raising.dz > particles_raising.min_depth, + StatusCode.Delete, + particles_raising.state, + ) # ===================================================== @@ -162,9 +189,6 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() - # add dummy U - add_dummy_UV(fieldset) # TODO: parcels v3 bodge; remove when parcels v4 is used - # use first active field for time reference _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) @@ -208,7 +232,7 @@ def simulate(self, measurements, out_path) -> None: # build dynamic particle class from the active sensors ctd_config = self.expedition.instruments_config.ctd_config _CTDParticle = build_particle_class_from_sensors( - ctd_config.sensors, _CTD_NONSENSOR_VARIABLES, JITParticle + ctd_config.sensors, _CTD_NONSENSOR_VARIABLES ) # define parcel particles diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 379334b3..46ae82e9 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -4,8 +4,9 @@ from typing import ClassVar import numpy as np -from parcels import AdvectionRK4, JITParticle, ParticleSet, Variable +from parcels._core.statuscodes import StatusCode +from parcels import AdvectionRK4, ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -46,15 +47,21 @@ class Drifter: # ===================================================== -def _sample_temperature(particle, fieldset, time): - particle.temperature = fieldset.T[time, particle.depth, particle.lat, particle.lon] +def _sample_temperature(particles, fieldset): + particles.temperature = fieldset.T[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _check_lifetime(particle, fieldset, time): - if particle.has_lifetime == 1: - particle.age += particle.dt - if particle.age >= particle.lifetime: - particle.delete() +def _check_lifetime(particles, fieldset): + particles_wlifetime = particles[particles.has_lifetime == 1] + + particles_wlifetime.age += particles_wlifetime.dt + particles_wlifetime.state = np.where( + particles_wlifetime.age >= particles_wlifetime.lifetime, + StatusCode.Delete, + particles_wlifetime.state, + ) # ===================================================== @@ -123,7 +130,7 @@ def simulate(self, measurements, out_path) -> None: # build dynamic particle class from the active sensors drifter_config = self.expedition.instruments_config.drifter_config _DrifterParticle = build_particle_class_from_sensors( - drifter_config.sensors, _DRIFTER_NONSENSOR_VARIABLES, JITParticle + drifter_config.sensors, _DRIFTER_NONSENSOR_VARIABLES ) # define parcel particles diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 6a564cc0..78c757d2 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -3,13 +3,12 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet, ScipyParticle +from parcels import ParticleSet from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( - add_dummy_UV, build_particle_class_from_sensors, register_instrument, ) @@ -40,13 +39,13 @@ class Underwater_ST: # define function sampling Salinity -def _sample_salinity(particle, fieldset, time): - particle.salinity = fieldset.S[time, particle.depth, particle.lat, particle.lon] +def _sample_salinity(particles, fieldset): + particles.S = fieldset.S[particles.time, particles.z, particles.lat, particles.lon] # define function sampling Temperature -def _sample_temperature(particle, fieldset, time): - particle.temperature = fieldset.T[time, particle.depth, particle.lat, particle.lon] +def _sample_temperature(particles, fieldset): + particles.T = fieldset.T[particles.time, particles.z, particles.lat, particles.lon] # ===================================================== @@ -95,13 +94,10 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() - # add dummy U - add_dummy_UV(fieldset) # TODO: parcels v3 bodge; remove when parcels v4 is used - # build dynamic particle class from the active sensors st_config = self.expedition.instruments_config.ship_underwater_st_config _ShipSTParticle = build_particle_class_from_sensors( - st_config.sensors, _ST_NONSENSOR_VARIABLES, ScipyParticle + st_config.sensors, _ST_NONSENSOR_VARIABLES ) particleset = ParticleSet.from_list( diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 051bf1fa..06e862a6 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -4,14 +4,14 @@ from typing import ClassVar import numpy as np -from parcels import JITParticle, ParticleSet, Variable +from parcels._core.statuscodes import StatusCode +from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime from virtualship.utils import ( - add_dummy_UV, build_particle_class_from_sensors, register_instrument, ) @@ -50,26 +50,32 @@ class XBT: # ===================================================== -def _sample_temperature(particle, fieldset, time): - particle.temperature = fieldset.T[time, particle.depth, particle.lat, particle.lon] +def _sample_temperature(particles, fieldset): + particles.temperature = fieldset.T[ + particles.time, particles.z, particles.lat, particles.lon + ] -def _xbt_cast(particle, fieldset, time): - particle_ddepth = -particle.fall_speed * particle.dt +def _xbt_cast(particles, fieldset): + particles.dz = -particles.fall_speed * particles.dt # update the fall speed from the quadractic fall-rate equation # check https://doi.org/10.5194/os-7-231-2011 - particle.fall_speed = ( - particle.fall_speed - 2 * particle.deceleration_coefficient * particle.dt + particles.fall_speed = ( + particles.fall_speed - 2 * particles.deceleration_coefficient * particles.dt ) # delete particle if depth is exactly max_depth - if particle.depth == particle.max_depth: - particle.delete() + particles.state = np.where( + particles.z == particles.max_depth, StatusCode.Delete, particles.state + ) # set particle depth to max depth if it's too deep - if particle.depth + particle_ddepth < particle.max_depth: - particle_ddepth = particle.max_depth - particle.depth + particles.dz = np.where( + particles.z + particles.dz < particles.max_depth, + particles.max_depth - particles.z, + particles.z, + ) # ===================================================== @@ -117,9 +123,6 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() - # add dummy U - add_dummy_UV(fieldset) # TODO: parcels v3 bodge; remove when parcels v4 is used - # use first active field for time reference _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) @@ -166,7 +169,7 @@ def simulate(self, measurements, out_path) -> None: # build dynamic particle class from the active sensors xbt_config = self.expedition.instruments_config.xbt_config _XBTParticle = build_particle_class_from_sensors( - xbt_config.sensors, _XBT_NONSENSOR_VARIABLES, JITParticle + xbt_config.sensors, _XBT_NONSENSOR_VARIABLES ) # define xbt particles diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 7ad275cd..fb585934 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -15,8 +15,8 @@ import numpy as np import pyproj import xarray as xr -from parcels import FieldSet, Variable +from parcels import FieldSet, Particle, Variable from virtualship.errors import CopernicusCatalogueError if TYPE_CHECKING: @@ -677,14 +677,13 @@ def _make_hash(s: str, length: int) -> str: def build_particle_class_from_sensors( sensors: list[SensorConfig], nonsensor_variables: list[Variable], - particle_class: type, # generic type annotation needed for v3 particle class behaviour # TODO: Update with Parcels v4 ) -> type: - """Build a Particle class (JITParticle or ScipyParticle) from nonsensor variables and active sensors.""" + """Build a Particle class from nonsensor variables and active sensors.""" sensor_variables = [ variable for sc in sensors if sc.enabled for variable in sc.meta.particle_vars ] - return particle_class.add_variables(nonsensor_variables + sensor_variables) + return Particle.add_variables(nonsensor_variables + sensor_variables) # ===================================================== From 71881ccc921374fd8d4ea5b8d662499229250361 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 15:37:14 +0200 Subject: [PATCH 013/191] remove add dummy UV func, shouldn't be needed in v4 (?) --- src/virtualship/utils.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index fb585934..3dab6b70 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -340,29 +340,6 @@ def _get_expedition(expedition_dir: Path) -> Expedition: ) from e -def add_dummy_UV(fieldset: FieldSet): - """Add a dummy U and V field to a FieldSet to satisfy parcels FieldSet completeness checks.""" - if "U" not in fieldset.__dict__.keys(): - for uv_var in ["U", "V"]: - dummy_field = getattr( - FieldSet.from_data( - {"U": 0, "V": 0}, {"lon": 0, "lat": 0}, mesh="spherical" - ), - uv_var, - ) - fieldset.add_field(dummy_field) - try: - fieldset.time_origin = ( - fieldset.T.grid.time_origin - if "T" in fieldset.__dict__.keys() - else fieldset.o2.grid.time_origin - ) - except Exception: - raise ValueError( - "Cannot determine time_origin for dummy UV fields. Assert T or o2 exists in fieldset." - ) from None - - def _select_product_id( physical: bool, schedule_start, From 62b2b1b62187bfb3bf0744ffec5525c6e336a633 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 16:54:31 +0200 Subject: [PATCH 014/191] pull v4 from parcels/main --- pixi.toml | 12 +++++++++--- pyproject.toml | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pixi.toml b/pixi.toml index 0d4b8d87..b86b8f60 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,7 +1,7 @@ [workspace] name = "VirtualShip" preview = ["pixi-build"] -channels = ["https://repo.prefix.dev/parcels", "conda-forge"] +channels = ["conda-forge"] platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] exclude-newer = "5d" # security pre-caution against compromised packages requires-pixi = ">=0.67.0" @@ -20,11 +20,10 @@ setuptools_scm = "*" [package.run-dependencies] # Keep in sync with `pyproject.toml` and feedstock recipe python = "3.11.*" click = "*" -parcels = ">=4.0.0alpha" pyproj = ">=3,<4" sortedcontainers = "==2.4.0" opensimplex = "==0.4.5" -numpy = ">=1,<2" +numpy = ">=2.1.0" pydantic = ">=2,<3" pyyaml = "*" copernicusmarine = ">=2.2.2" @@ -33,6 +32,13 @@ textual = "*" [dependencies] virtualship = { path = "." } +# Pre-install as conda packages to avoid PyPI source builds +netcdf4 = "*" +numpy = ">=2.1.0" +dask = "*" + +[pypi-dependencies] +parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } # Commented out whilst parcels v4 alpha only supports Python 3.11 # [feature.py310.dependencies] diff --git a/pyproject.toml b/pyproject.toml index bc9346d0..e19024d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ dependencies = [ "pyproj >= 3, < 4", "sortedcontainers == 2.4.0", "opensimplex == 0.4.5", - "numpy >=1, < 2", + "numpy >=2.1.0", "pydantic >=2, <3", "PyYAML", "copernicusmarine >= 2.2.2", From 38afc560ab5c614244b2413e31ba14847b3d98fc Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 16:56:40 +0200 Subject: [PATCH 015/191] use AdvectionRK2 --- src/virtualship/instruments/argo_float.py | 5 +++-- src/virtualship/instruments/drifter.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 70fcb146..d1644849 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -4,8 +4,9 @@ from typing import ClassVar import numpy as np +from parcels.kernels import AdvectionRK2 -from parcels import AdvectionRK4, ParticleSet, StatusCode, Variable +from parcels import ParticleSet, StatusCode, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -291,7 +292,7 @@ def simulate(self, measurements, out_path) -> None: [ _argo_float_vertical_movement, *sampling_kernels, - AdvectionRK4, + AdvectionRK2, _keep_at_surface, _check_error, ], diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 46ae82e9..46689e79 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -5,8 +5,9 @@ import numpy as np from parcels._core.statuscodes import StatusCode +from parcels.kernels import AdvectionRK2 -from parcels import AdvectionRK4, ParticleSet, Variable +from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -176,7 +177,7 @@ def simulate(self, measurements, out_path) -> None: # execute simulation drifter_particleset.execute( - [AdvectionRK4, *sampling_kernels, _check_lifetime], + [AdvectionRK2, *sampling_kernels, _check_lifetime], endtime=endtime, dt=DT, output_file=out_file, From 573da9ed17b25b2b0327ff5f7f29f881ed88322a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 20 May 2026 16:58:40 +0200 Subject: [PATCH 016/191] migrate fieldset ingestion protocol --- src/virtualship/instruments/base.py | 29 ++++++++++++++-------------- src/virtualship/models/expedition.py | 10 +--------- src/virtualship/utils.py | 21 +++++--------------- 3 files changed, 21 insertions(+), 39 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index d4e078e6..a3b7adb4 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -9,9 +9,9 @@ import copernicusmarine import xarray as xr -from parcels import FieldSet from yaspin import yaspin +import parcels from virtualship.errors import CopernicusCatalogueError from virtualship.utils import ( COPERNICUSMARINE_PHYS_VARIABLES, @@ -86,7 +86,7 @@ def __init__( self.min_lat, self.max_lat = min(wp_lats), max(wp_lats) self.min_lon, self.max_lon = min(wp_lons), max(wp_lons) - def load_input_data(self) -> FieldSet: + def load_input_data(self) -> parcels.FieldSet: """Load and return the input data as a FieldSet for the instrument.""" try: fieldset = self._generate_fieldset() @@ -97,7 +97,7 @@ def load_input_data(self) -> FieldSet: # interpolation methods for var in (v for v in self.variables if v not in ("U", "V")): - getattr(fieldset, var).interp_method = "linear_invdist_land_tracer" + getattr(fieldset, var).interp_method = parcels.interpolators.XLinear # depth negative for g in fieldset.gridset.grids: @@ -183,11 +183,11 @@ def _get_copernicus_ds( coordinates_selection_method="outside", ) - def _generate_fieldset(self) -> FieldSet: + def _generate_fieldset(self) -> parcels.FieldSet: """ Create and combine FieldSets for each variable, supporting both local and Copernicus Marine data sources. - Per variable avoids issues when using copernicusmarine and creating directly one FieldSet of ds's sourced from different Copernicus Marine product IDs, which is often the case for BGC variables. + N.B. Per variable avoids issues when using copernicusmarine and creating directly one FieldSet of ds's sourced from different Copernicus Marine product IDs (which can also have different temporal resolutions), which is often the case for BGC variables. """ fieldsets_list = [] keys = list(self.variables.keys()) @@ -217,12 +217,11 @@ def _generate_fieldset(self) -> FieldSet: [data_dir.joinpath(f) for f in files] ) # using: ds --> .from_xarray_dataset seems more robust than .from_netcdf for handling different temporal resolutions for different variables ... - fs = FieldSet.from_xarray_dataset( - ds, - variables={key: full_var_name}, - dimensions=self.dimensions, - mesh="spherical", - ) + # TODO: do docs on pre-downloading data need to be updated for these changes? Anything about conventions etc.? + fields = {key: ds[full_var_name]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) + else: # stream via Copernicus Marine Service physical = var in COPERNICUSMARINE_PHYS_VARIABLES ds = self._get_copernicus_ds( @@ -230,9 +229,11 @@ def _generate_fieldset(self) -> FieldSet: physical=physical, var=var, ) - fs = FieldSet.from_xarray_dataset( - ds, {key: var}, self.dimensions, mesh="spherical" - ) + + fields = {key: ds[var]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) + fieldsets_list.append(fs) base_fieldset = fieldsets_list[0] diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index eef23c76..da084328 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -17,7 +17,6 @@ _calc_sail_time, _calc_wp_stationkeeping_time, _get_bathy_data, - _get_waypoint_latlons, _validate_numeric_to_timedelta, get_supported_sensors, register_instrument_config, @@ -131,14 +130,7 @@ def verify( land_waypoints = [] if not ignore_land_test: try: - wp_lats, wp_lons = _get_waypoint_latlons(self.waypoints) - bathymetry_field = _get_bathy_data( - min(wp_lats), - max(wp_lats), - min(wp_lons), - max(wp_lons), - from_data=from_data, - ).bathymetry + bathymetry_field = _get_bathy_data(from_data=from_data).bathymetry except Exception as e: raise ScheduleError( f"Problem loading bathymetry data (used to verify waypoints are in water) directly via copernicusmarine. \n\n original message: {e}" diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 3dab6b70..6ba2711e 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -16,6 +16,7 @@ import pyproj import xarray as xr +import parcels from parcels import FieldSet, Particle, Variable from virtualship.errors import CopernicusCatalogueError @@ -425,13 +426,7 @@ def _start_end_in_product_timerange( ) -def _get_bathy_data( - min_lat: float, - max_lat: float, - min_lon: float, - max_lon: float, - from_data: Path | None = None, -) -> FieldSet: +def _get_bathy_data(from_data: Path | None = None) -> FieldSet: """Bathymetry data from local or 'streamed' directly from Copernicus Marine.""" if from_data is not None: # load from local data var = "deptho" @@ -443,11 +438,6 @@ def _get_bathy_data( f"\n\n❗️ Could not find bathymetry variable '{var}' in data directory '{from_data}/bathymetry/'.\n\n❗️ Is the pre-downloaded data directory structure compliant with VirtualShip expectations?\n\n❗️ See the docs for more information on expectations: https://virtualship.readthedocs.io/en/latest/user-guide/index.html#documentation\n" ) from e ds_bathymetry = xr.open_dataset(bathy_dir.joinpath(filename)) - bathymetry_variables = {"bathymetry": "deptho"} - bathymetry_dimensions = {"lon": "longitude", "lat": "latitude"} - return FieldSet.from_xarray_dataset( - ds_bathymetry, bathymetry_variables, bathymetry_dimensions - ) else: # stream via Copernicus Marine Service ds_bathymetry = copernicusmarine.open_dataset( @@ -455,12 +445,11 @@ def _get_bathy_data( variables=["deptho"], coordinates_selection_method="outside", ) - bathymetry_variables = {"bathymetry": "deptho"} - bathymetry_dimensions = {"lon": "longitude", "lat": "latitude"} - return FieldSet.from_xarray_dataset( - ds_bathymetry, bathymetry_variables, bathymetry_dimensions + ds_fset = parcels.convert.copernicusmarine_to_sgrid( + fields={var: ds_bathymetry[var]} ) + return FieldSet.from_sgrid_conventions(ds_fset) def expedition_cost(schedule_results: ScheduleOk, time_past: timedelta) -> float: From d13a0369c4b7d7c7b26cf20063ec9552a4e6fb96 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 15:02:29 +0000 Subject: [PATCH 017/191] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/virtualship/instruments/adcp.py | 2 +- src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/instruments/base.py | 2 +- src/virtualship/instruments/ctd.py | 2 +- src/virtualship/instruments/drifter.py | 2 +- src/virtualship/instruments/ship_underwater_st.py | 2 +- src/virtualship/instruments/xbt.py | 2 +- src/virtualship/utils.py | 4 ++-- tests/test_utils.py | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 7ee718f6..626ca354 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -3,8 +3,8 @@ from typing import ClassVar import numpy as np - from parcels import ParticleSet + from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index d1644849..4eae6350 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -4,9 +4,9 @@ from typing import ClassVar import numpy as np +from parcels import ParticleSet, StatusCode, Variable from parcels.kernels import AdvectionRK2 -from parcels import ParticleSet, StatusCode, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index a3b7adb4..f6afd3e0 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -8,10 +8,10 @@ from typing import TYPE_CHECKING, ClassVar import copernicusmarine +import parcels import xarray as xr from yaspin import yaspin -import parcels from virtualship.errors import CopernicusCatalogueError from virtualship.utils import ( COPERNICUSMARINE_PHYS_VARIABLES, diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index a7a4218f..d8f229c1 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -4,9 +4,9 @@ from typing import TYPE_CHECKING, ClassVar import numpy as np +from parcels import ParticleSet, Variable from parcels._core.statuscodes import StatusCode -from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 46689e79..79a1e34b 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -4,10 +4,10 @@ from typing import ClassVar import numpy as np +from parcels import ParticleSet, Variable from parcels._core.statuscodes import StatusCode from parcels.kernels import AdvectionRK2 -from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 78c757d2..d844b7a2 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -3,8 +3,8 @@ from typing import ClassVar import numpy as np - from parcels import ParticleSet + from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 06e862a6..d02afb7a 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -4,9 +4,9 @@ from typing import ClassVar import numpy as np +from parcels import ParticleSet, Variable from parcels._core.statuscodes import StatusCode -from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 6ba2711e..85b3ad75 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -13,11 +13,11 @@ import copernicusmarine import numpy as np +import parcels import pyproj import xarray as xr - -import parcels from parcels import FieldSet, Particle, Variable + from virtualship.errors import CopernicusCatalogueError if TYPE_CHECKING: diff --git a/tests/test_utils.py b/tests/test_utils.py index 4ab96654..2628793d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -5,9 +5,9 @@ import numpy as np import pytest import xarray as xr +from parcels import FieldSet, JITParticle, ScipyParticle, Variable import virtualship.utils -from parcels import FieldSet, JITParticle, ScipyParticle, Variable from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.expedition import Expedition, SensorConfig From 5c7fd290c5b272193f3a5163991f7719d6d76c4f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 21 May 2026 09:11:53 +0200 Subject: [PATCH 018/191] standardise variable naming for bathy data ingestion --- src/virtualship/utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 6ba2711e..021a8979 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -428,27 +428,28 @@ def _start_end_in_product_timerange( def _get_bathy_data(from_data: Path | None = None) -> FieldSet: """Bathymetry data from local or 'streamed' directly from Copernicus Marine.""" + VAR = "deptho" if from_data is not None: # load from local data - var = "deptho" bathy_dir = from_data.joinpath("bathymetry") try: - filename, _ = _find_nc_file_with_variable(bathy_dir, var) + filename, _ = _find_nc_file_with_variable(bathy_dir, VAR) except Exception as e: raise RuntimeError( - f"\n\n❗️ Could not find bathymetry variable '{var}' in data directory '{from_data}/bathymetry/'.\n\n❗️ Is the pre-downloaded data directory structure compliant with VirtualShip expectations?\n\n❗️ See the docs for more information on expectations: https://virtualship.readthedocs.io/en/latest/user-guide/index.html#documentation\n" + f"\n\n❗️ Could not find bathymetry variable '{VAR}' in data directory '{from_data}/bathymetry/'.\n\n❗️ Is the pre-downloaded data directory structure compliant with VirtualShip expectations?\n\n❗️ See the docs for more information on expectations: https://virtualship.readthedocs.io/en/latest/user-guide/index.html#documentation\n" ) from e ds_bathymetry = xr.open_dataset(bathy_dir.joinpath(filename)) else: # stream via Copernicus Marine Service ds_bathymetry = copernicusmarine.open_dataset( dataset_id=BATHYMETRY_ID, - variables=["deptho"], + variables=[VAR], coordinates_selection_method="outside", ) ds_fset = parcels.convert.copernicusmarine_to_sgrid( - fields={var: ds_bathymetry[var]} + fields={"bathymetry": ds_bathymetry[VAR]} ) + return FieldSet.from_sgrid_conventions(ds_fset) From ee172304a6c127ba164330ca081fd7de385a47c0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 21 May 2026 10:23:20 +0200 Subject: [PATCH 019/191] env fixes --- pixi.toml | 3 ++- pyproject.toml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pixi.toml b/pixi.toml index b86b8f60..0f003e8e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -36,11 +36,12 @@ virtualship = { path = "." } netcdf4 = "*" numpy = ">=2.1.0" dask = "*" +zarr = ">=3" [pypi-dependencies] parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } -# Commented out whilst parcels v4 alpha only supports Python 3.11 +# Commented out whilst parcels v4 alpha only supports Python 3.11 (?) # [feature.py310.dependencies] # python = "3.10.*" diff --git a/pyproject.toml b/pyproject.toml index e19024d3..fd0d612b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,8 @@ filterwarnings = [ "error", "default::DeprecationWarning", "error::DeprecationWarning:virtualship", - "ignore:ParticleSet is empty.*:RuntimeWarning" # TODO: Probably should be ignored in the source code + "ignore:ParticleSet is empty.*:RuntimeWarning", # TODO: Probably should be ignored in the source code + "ignore:This is an alpha version of Parcels v4.*:UserWarning" # TODO: necessary whilst Parcels v4 is still alpha ] log_cli_level = "INFO" testpaths = [ From 92e74bd552c09c88de15bbf24222f014c5004107 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 21 May 2026 16:33:22 +0200 Subject: [PATCH 020/191] add ipdb for devs --- pixi.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pixi.toml b/pixi.toml index 0f003e8e..6cd97d08 100644 --- a/pixi.toml +++ b/pixi.toml @@ -37,6 +37,7 @@ netcdf4 = "*" numpy = ">=2.1.0" dask = "*" zarr = ">=3" +ipdb = ">=0.13.13,<0.14" [pypi-dependencies] parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } From 0a83437dca2f4620ff5bf01c84a5bc103a94f602 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 21 May 2026 17:22:26 +0200 Subject: [PATCH 021/191] further changes to suit v4 --- src/virtualship/instruments/base.py | 16 ++++++---------- src/virtualship/models/expedition.py | 2 +- src/virtualship/utils.py | 8 ++++++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index a3b7adb4..583f62ed 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -8,10 +8,10 @@ from typing import TYPE_CHECKING, ClassVar import copernicusmarine +import parcels import xarray as xr from yaspin import yaspin -import parcels from virtualship.errors import CopernicusCatalogueError from virtualship.utils import ( COPERNICUSMARINE_PHYS_VARIABLES, @@ -100,19 +100,15 @@ def load_input_data(self) -> parcels.FieldSet: getattr(fieldset, var).interp_method = parcels.interpolators.XLinear # depth negative - for g in fieldset.gridset.grids: + for g in fieldset.gridset: g.negate_depth() # bathymetry data if self.add_bathymetry: - bathymetry_field = _get_bathy_data( - self.min_lat, - self.max_lat, - self.min_lon, - self.max_lon, - from_data=self.from_data, - ).bathymetry - bathymetry_field.data = -bathymetry_field.data + bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry + bathymetry_field.data = ( + -bathymetry_field.data + ) # TODO: how does v4 handle? positive up or down? fieldset.add_field(bathymetry_field) return fieldset diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index da084328..d212a686 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -139,7 +139,7 @@ def verify( for wp_i, wp in enumerate(self.waypoints): try: value = bathymetry_field.eval( - 0, # time + np.float64(0.0), # time 0, # depth (surface) wp.location.lat, wp.location.lon, diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 021a8979..78657de5 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -13,11 +13,11 @@ import copernicusmarine import numpy as np +import parcels import pyproj import xarray as xr - -import parcels from parcels import FieldSet, Particle, Variable + from virtualship.errors import CopernicusCatalogueError if TYPE_CHECKING: @@ -446,6 +446,10 @@ def _get_bathy_data(from_data: Path | None = None) -> FieldSet: coordinates_selection_method="outside", ) + ds_bathymetry = ds_bathymetry.expand_dims( + {"depth": 1} + ) # TODO: bodge whilst parcels v4 does not support 2D fields and seeks depth dim; change when parcels v4 released + ds_fset = parcels.convert.copernicusmarine_to_sgrid( fields={"bathymetry": ds_bathymetry[VAR]} ) From ca9e306641540d0ba88d5f1c822f3f2b3fff2c24 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 22 May 2026 12:43:44 +0200 Subject: [PATCH 022/191] first steps considering handling depth positive up or down --- src/virtualship/instruments/base.py | 4 ---- src/virtualship/instruments/ctd.py | 5 ++++- tests/instruments/test_base.py | 1 - 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 583f62ed..f2ad8a47 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -99,10 +99,6 @@ def load_input_data(self) -> parcels.FieldSet: for var in (v for v in self.variables if v not in ("U", "V")): getattr(fieldset, var).interp_method = parcels.interpolators.XLinear - # depth negative - for g in fieldset.gridset: - g.negate_depth() - # bathymetry data if self.add_bathymetry: bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index a7a4218f..b48677ad 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -4,9 +4,9 @@ from typing import TYPE_CHECKING, ClassVar import numpy as np +from parcels import ParticleSet, Variable from parcels._core.statuscodes import StatusCode -from parcels import ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -117,6 +117,9 @@ def _ctd_cast(particles, fieldset): particles_raising = particles[particles.raising == 1] # TODO: change to boolean masking, like with Argo Floats? + # TODO: different handling of positive down for z now?! Doing positive down now... think kernels need adjusting... + # TODO: need to check on all other instrument kernels as well... + # TODO: plus how the configs are inputted in e.g. expedition.yaml # lowering particles_lowering.dz = -particles_lowering.winch_speed * particles_lowering.dt diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index bbcfea44..a17f95bf 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -33,7 +33,6 @@ def test_load_input_data(mock_copernicusmarine, mock_select_product_id, mock_Fie mock_fieldset = MagicMock() mock_FieldSet.from_netcdf.return_value = mock_fieldset mock_FieldSet.from_xarray_dataset.return_value = mock_fieldset - mock_fieldset.gridset.grids = [MagicMock(negate_depth=MagicMock())] mock_fieldset.__getitem__.side_effect = lambda k: MagicMock() mock_copernicusmarine.open_dataset.return_value = MagicMock() # Create a mock waypoint with latitude and longitude From 63122b9e84c26e4c302d001659dde00516ff7a55 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 26 May 2026 16:05:01 +0100 Subject: [PATCH 023/191] refactor to _compute_max_depths; more changes in line with Parcels v4 API --- src/virtualship/cli/_run.py | 1 - src/virtualship/instruments/ctd.py | 27 ++++++++------------------- src/virtualship/instruments/xbt.py | 14 ++------------ src/virtualship/utils.py | 20 +++++++++++++++++++- 4 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 10afc5c5..703502f2 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -200,7 +200,6 @@ def _run( ) # execute simulation - # TODO: outpath will be Parquet with v4... instrument.execute( measurements=measurements, out_path=expedition_dir.joinpath(RESULTS, f"{itype.name.lower()}.zarr"), diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index b48677ad..6162667e 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -11,6 +11,7 @@ from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( + _compute_max_depths, build_particle_class_from_sensors, register_instrument, ) @@ -195,12 +196,9 @@ def simulate(self, measurements, out_path) -> None: # use first active field for time reference _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) - fieldset_starttime = _time_ref_field.grid.time_origin.fulltime( - _time_ref_field.grid.time_full[0] - ) - fieldset_endtime = _time_ref_field.grid.time_origin.fulltime( - _time_ref_field.grid.time_full[-1] - ) + + fieldset_starttime = _time_ref_field.data.time.isel(time=0) + fieldset_endtime = _time_ref_field.data.time.isel(time=-1) # deploy time for all ctds should be later than fieldset start time if not all( @@ -212,18 +210,7 @@ def simulate(self, measurements, out_path) -> None: raise ValueError("CTD deployed before fieldset starts.") # depth the ctd will go to. shallowest between ctd max depth and bathymetry. - max_depths = [ - max( - ctd.max_depth, - fieldset.bathymetry.eval( - z=0, - y=ctd.spacetime.location.lat, - x=ctd.spacetime.location.lon, - time=0, - ), - ) - for ctd in measurements - ] + max_depths = _compute_max_depths(measurements, fieldset) # CTD depth can not be too shallow, because kernel would break. # This shallow is not useful anyway, no need to support. @@ -245,7 +232,9 @@ def simulate(self, measurements, out_path) -> None: lon=[ctd.spacetime.location.lon for ctd in measurements], lat=[ctd.spacetime.location.lat for ctd in measurements], depth=[ctd.min_depth for ctd in measurements], - time=[ctd.spacetime.time for ctd in measurements], + time=[ + np.datetime64(ctd.spacetime.time) for ctd in measurements + ], # TODO: v4 question... docstring says takes datetime, but here requires -> np.datetime64? max_depth=max_depths, min_depth=[ctd.min_depth for ctd in measurements], winch_speed=[WINCH_SPEED for _ in measurements], diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index d02afb7a..fc52696d 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -12,6 +12,7 @@ from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime from virtualship.utils import ( + _compute_max_depths, build_particle_class_from_sensors, register_instrument, ) @@ -143,18 +144,7 @@ def simulate(self, measurements, out_path) -> None: raise ValueError("XBT deployed before fieldset starts.") # depth the xbt will go to. shallowest between xbt max depth and bathymetry. - max_depths = [ - max( - xbt.max_depth, - fieldset.bathymetry.eval( - z=0, - y=xbt.spacetime.location.lat, - x=xbt.spacetime.location.lon, - time=0, - ), - ) - for xbt in measurements - ] + max_depths = _compute_max_depths(measurements, fieldset) # initial fall speeds initial_fall_speeds = [xbt.fall_speed for xbt in measurements] diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 78657de5..9b7c2b8b 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -560,6 +560,24 @@ def _find_files_in_timerange( return [fname for _, fname in files_with_dates] +def _compute_max_depths(measurements, fieldset) -> list[float]: + """Compute the effective max depth for each measurement, capped by bathymetry. Return as list of floats for best Parcels compatibility.""" + return [ + max( + m.max_depth, + float( + fieldset.bathymetry.eval( + z=0, + y=m.spacetime.location.lat, + x=m.spacetime.location.lon, + time=np.float64(0), + ) + ), + ) + for m in measurements + ] + + def _random_noise(scale: float = 0.05, limit: float = 0.1) -> float: """Generate a small random noise value for drifter seeding locations.""" value = np.random.normal(loc=0.0, scale=scale) @@ -654,7 +672,7 @@ def build_particle_class_from_sensors( variable for sc in sensors if sc.enabled for variable in sc.meta.particle_vars ] - return Particle.add_variables(nonsensor_variables + sensor_variables) + return Particle.add_variable(nonsensor_variables + sensor_variables) # ===================================================== From a6ad6317e445931ade22d14c68c3de6b3e07913b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 26 May 2026 16:09:33 +0100 Subject: [PATCH 024/191] depth -> z in ParticleSet's --- src/virtualship/instruments/adcp.py | 4 ++-- src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/instruments/ctd.py | 2 +- src/virtualship/instruments/drifter.py | 2 +- src/virtualship/instruments/ship_underwater_st.py | 2 +- src/virtualship/instruments/xbt.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 626ca354..4be4b33c 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -105,14 +105,14 @@ def simulate(self, measurements, out_path) -> None: bins = np.linspace(MAX_DEPTH, MIN_DEPTH, NUM_BINS) num_particles = len(bins) - particleset = ParticleSet.from_list( + particleset = ParticleSet( fieldset=fieldset, pclass=_ADCPParticle, lon=np.full( num_particles, 0.0 ), # initial lat/lon are irrelevant and will be overruled later.s lat=np.full(num_particles, 0.0), - depth=bins, + z=bins, time=0, ) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 4eae6350..490cf150 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -260,7 +260,7 @@ def simulate(self, measurements, out_path) -> None: pclass=_ArgoParticle, lat=[argo.spacetime.location.lat for argo in measurements], lon=[argo.spacetime.location.lon for argo in measurements], - depth=[argo.min_depth for argo in measurements], + z=[argo.min_depth for argo in measurements], time=[argo.spacetime.time for argo in measurements], min_depth=[argo.min_depth for argo in measurements], max_depth=[argo.max_depth for argo in measurements], diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 6162667e..094f08c9 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -231,7 +231,7 @@ def simulate(self, measurements, out_path) -> None: pclass=_CTDParticle, lon=[ctd.spacetime.location.lon for ctd in measurements], lat=[ctd.spacetime.location.lat for ctd in measurements], - depth=[ctd.min_depth for ctd in measurements], + z=[ctd.min_depth for ctd in measurements], time=[ np.datetime64(ctd.spacetime.time) for ctd in measurements ], # TODO: v4 question... docstring says takes datetime, but here requires -> np.datetime64? diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 79a1e34b..67e84780 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -147,7 +147,7 @@ def simulate(self, measurements, out_path) -> None: pclass=_DrifterParticle, lat=lat_release, lon=lon_release, - depth=[drifter.depth for drifter in measurements], + z=[drifter.depth for drifter in measurements], time=[drifter.spacetime.time for drifter in measurements], has_lifetime=[ 1 if drifter.lifetime is not None else 0 for drifter in measurements diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index d844b7a2..bccaa2ce 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -100,7 +100,7 @@ def simulate(self, measurements, out_path) -> None: st_config.sensors, _ST_NONSENSOR_VARIABLES ) - particleset = ParticleSet.from_list( + particleset = ParticleSet( fieldset=fieldset, pclass=_ShipSTParticle, lon=0.0, diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index fc52696d..04efc80c 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -168,7 +168,7 @@ def simulate(self, measurements, out_path) -> None: pclass=_XBTParticle, lon=[xbt.spacetime.location.lon for xbt in measurements], lat=[xbt.spacetime.location.lat for xbt in measurements], - depth=[xbt.min_depth for xbt in measurements], + z=[xbt.min_depth for xbt in measurements], time=[xbt.spacetime.time for xbt in measurements], max_depth=max_depths, min_depth=[xbt.min_depth for xbt in measurements], From 8e0a33f57039fa4c92143be8476b676d73de4ce0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 28 May 2026 10:32:42 +0100 Subject: [PATCH 025/191] times to datetime64 and update fieldset eval output --- src/virtualship/instruments/adcp.py | 1 - src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/instruments/base.py | 17 +++++++++++------ src/virtualship/instruments/ctd.py | 4 +--- src/virtualship/instruments/drifter.py | 2 +- .../instruments/ship_underwater_st.py | 1 - src/virtualship/instruments/xbt.py | 2 +- src/virtualship/utils.py | 16 +++++++--------- 8 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 4be4b33c..ee910e02 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -113,7 +113,6 @@ def simulate(self, measurements, out_path) -> None: ), # initial lat/lon are irrelevant and will be overruled later.s lat=np.full(num_particles, 0.0), z=bins, - time=0, ) out_file = particleset.ParticleFile(name=out_path, outputdt=np.inf) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 490cf150..eae21624 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -261,7 +261,7 @@ def simulate(self, measurements, out_path) -> None: lat=[argo.spacetime.location.lat for argo in measurements], lon=[argo.spacetime.location.lon for argo in measurements], z=[argo.min_depth for argo in measurements], - time=[argo.spacetime.time for argo in measurements], + time=[np.datetime64(argo.spacetime.time) for argo in measurements], min_depth=[argo.min_depth for argo in measurements], max_depth=[argo.max_depth for argo in measurements], drift_depth=[argo.drift_depth for argo in measurements], diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index f2ad8a47..3e49850b 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -120,14 +120,19 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" + TMP = False + if not self.verbose_progress: - with yaspin( - text=f"Simulating {self.__class__.__name__.split('Instrument')[0]} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: + if TMP: + with yaspin( + text=f"Simulating {self.__class__.__name__.split('Instrument')[0]} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: + self.simulate(measurements, out_path) + spinner.ok("✅\n") + else: self.simulate(measurements, out_path) - spinner.ok("✅\n") else: print( f"Simulating {self.__class__.__name__.split('Instrument')[0]} measurements... " diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 094f08c9..91c71e59 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -232,9 +232,7 @@ def simulate(self, measurements, out_path) -> None: lon=[ctd.spacetime.location.lon for ctd in measurements], lat=[ctd.spacetime.location.lat for ctd in measurements], z=[ctd.min_depth for ctd in measurements], - time=[ - np.datetime64(ctd.spacetime.time) for ctd in measurements - ], # TODO: v4 question... docstring says takes datetime, but here requires -> np.datetime64? + time=[np.datetime64(ctd.spacetime.time) for ctd in measurements], max_depth=max_depths, min_depth=[ctd.min_depth for ctd in measurements], winch_speed=[WINCH_SPEED for _ in measurements], diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 67e84780..95c6132f 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -148,7 +148,7 @@ def simulate(self, measurements, out_path) -> None: lat=lat_release, lon=lon_release, z=[drifter.depth for drifter in measurements], - time=[drifter.spacetime.time for drifter in measurements], + time=[np.datetime64(drifter.spacetime.time) for drifter in measurements], has_lifetime=[ 1 if drifter.lifetime is not None else 0 for drifter in measurements ], diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index bccaa2ce..829d1ad7 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -106,7 +106,6 @@ def simulate(self, measurements, out_path) -> None: lon=0.0, lat=0.0, depth=DEPTH, - time=0, ) out_file = particleset.ParticleFile(name=out_path, outputdt=np.inf) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 04efc80c..d738a1fd 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -169,7 +169,7 @@ def simulate(self, measurements, out_path) -> None: lon=[xbt.spacetime.location.lon for xbt in measurements], lat=[xbt.spacetime.location.lat for xbt in measurements], z=[xbt.min_depth for xbt in measurements], - time=[xbt.spacetime.time for xbt in measurements], + time=[np.datetime64(xbt.spacetime.time) for xbt in measurements], max_depth=max_depths, min_depth=[xbt.min_depth for xbt in measurements], fall_speed=[xbt.fall_speed for xbt in measurements], diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 9b7c2b8b..df5d153c 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -561,18 +561,16 @@ def _find_files_in_timerange( def _compute_max_depths(measurements, fieldset) -> list[float]: - """Compute the effective max depth for each measurement, capped by bathymetry. Return as list of floats for best Parcels compatibility.""" + """Compute the effective max depth for each measurement, capped by bathymetry.""" return [ max( m.max_depth, - float( - fieldset.bathymetry.eval( - z=0, - y=m.spacetime.location.lat, - x=m.spacetime.location.lon, - time=np.float64(0), - ) - ), + fieldset.bathymetry.eval( + z=0, + y=m.spacetime.location.lat, + x=m.spacetime.location.lon, + time=np.float64(0), + )[0], ) for m in measurements ] From 8b76854e2874ce994e43161b337f1799afb920a1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 29 May 2026 12:32:54 +0100 Subject: [PATCH 026/191] tmp ds.load() step for v4.0 --- src/virtualship/instruments/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 3e49850b..74ad7bc4 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -210,9 +210,8 @@ def _generate_fieldset(self) -> parcels.FieldSet: data_dir, var ) # get full variable name from one of the files; var may only appear as substring in variable name in file - ds = xr.open_mfdataset( - [data_dir.joinpath(f) for f in files] - ) # using: ds --> .from_xarray_dataset seems more robust than .from_netcdf for handling different temporal resolutions for different variables ... + ds = xr.open_mfdataset([data_dir.joinpath(f) for f in files]) + ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end # TODO: do docs on pre-downloading data need to be updated for these changes? Anything about conventions etc.? fields = {key: ds[full_var_name]} @@ -226,6 +225,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: physical=physical, var=var, ) + ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end fields = {key: ds[var]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) From 81f857f166de793ce3f0f1ce2160572effab56bc Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:30:21 +0200 Subject: [PATCH 027/191] error messaging in argo floats --- src/virtualship/instruments/argo_float.py | 34 ++++++++--------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index f5fbd858..86b0faf1 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -13,6 +13,11 @@ from virtualship.models.spacetime import Spacetime from virtualship.utils import build_particle_class_from_sensors, register_instrument +# mapping from StatusCode integer value to attribute name (e.g. 60 -> "ErrorOutOfBounds") +_STATUS_CODE_NAMES: dict[int, str] = { + v: k for k, v in vars(StatusCode).items() if not k.startswith("_") +} + # ===================================================== # SECTION: Dataclass # ===================================================== @@ -145,31 +150,16 @@ def _keep_at_surface(particles, fieldset): def _check_error(particles, fieldset): errors = particles.state >= 50 # captures all Errors + # TODO: check print statements are as expected + print( + "WARNING: Error(s) found during Argo Float simulation but the expedition will continue..." + f"\n\nError code(s): {', '.join(_STATUS_CODE_NAMES.get(error, str(error)) + 'at time: ' + str(particles.time[errors][i]) + ', lat: ' + str(particles.lat[errors][i]) + ', lon: ' + str(particles.lon[errors][i]) for i, error in enumerate(particles.state[errors]))}" + "\n\nIf ErrorOutOfBounds, consider reducing the lifetime in Argo Float config (the fieldset spatial bounds are constrained under-the-hood). For further advice please contact the VirtualShip team via GitHub (https://github.com/Parcels-code/virtualship/issues) or email (virtualship@uu.nl)." + "\nCarrying on with the expedition..." + ) particles.state[errors] = StatusCode.Delete -def _check_error(particle, fieldset, time): - if particle.state >= 50: # This captures all Errors - if particle.state == 50: - print("WARNING: Error during Argo Float simulation...") - elif particle.state == 51: - print("WARNING: ErrorInterpolation during Argo Float simulation...") - elif particle.state == 60: - print("WARNING: ErrorOutOfBounds during Argo Float simulation...") - elif particle.state == 61: - print("WARNING: ErrorThroughSurface during Argo Float simulation...") - elif particle.state == 70: - print("WARNING: ErrorTimeExtrapolation during Argo Float simulation...") - else: - print("Unknown error during Argo Float simulation...") - print( - "WARNING: An error occured during simulation but the expedition will continue. If ErrorOutOfBounds, consider reducing the lifetime in Argo Float config (the fieldset spatial bounds are constrained under-the-hood). For further advice please contact the VirtualShip team via GitHub (https://github.com/Parcels-code/virtualship/issues) or email (virtualship@uu.nl). Carrying on with the expedition..." - ) - # TODO: warnings are a bit limited in Parcels v3, but v4 should allow more informative (+ not all these if statements) when e.g. f-strings are supported in kernels - - particle.delete() - - def _argo_sample_temperature(particles, fieldset): # Phase 3: ascending — sample temperature; NaN otherwise phase_mask = particles.cycle_phase == 3 From cd2f9ffb203b8d3f7d8a4df77e9ce016c289c9e5 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:38:29 +0200 Subject: [PATCH 028/191] refactor _generate_fieldset() --- src/virtualship/instruments/base.py | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 74ad7bc4..81e8f4f4 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -193,12 +193,11 @@ def _generate_fieldset(self) -> parcels.FieldSet: for key in keys: var = self.variables[key] + physical = var in COPERNICUSMARINE_PHYS_VARIABLES + + # TODO: do docs on pre-downloading data need to be updated for these changes? Anything about conventions etc.? if self.from_data is not None: # load from local data - physical = var in COPERNICUSMARINE_PHYS_VARIABLES - if physical: - data_dir = self.from_data.joinpath("phys") - else: - data_dir = self.from_data.joinpath("bgc") + data_dir = self.from_data.joinpath("phys" if physical else "bgc") files = _find_files_in_timerange( data_dir, @@ -206,30 +205,25 @@ def _generate_fieldset(self) -> parcels.FieldSet: self.max_time + timedelta(days=time_buffer), ) - _, full_var_name = _find_nc_file_with_variable( + _, field_var_name = _find_nc_file_with_variable( data_dir, var ) # get full variable name from one of the files; var may only appear as substring in variable name in file ds = xr.open_mfdataset([data_dir.joinpath(f) for f in files]) - ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end - - # TODO: do docs on pre-downloading data need to be updated for these changes? Anything about conventions etc.? - fields = {key: ds[full_var_name]} - ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) - fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) else: # stream via Copernicus Marine Service - physical = var in COPERNICUSMARINE_PHYS_VARIABLES ds = self._get_copernicus_ds( time_buffer, physical=physical, var=var, ) - ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end + field_var_name = var + + ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end - fields = {key: ds[var]} - ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) - fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) + fields = {key: ds[field_var_name]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) fieldsets_list.append(fs) From 39e63d19d9fbc18911e785f996a9fb743054c3ee Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:50:04 +0200 Subject: [PATCH 029/191] small tidy up --- src/virtualship/instruments/base.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 81e8f4f4..dd38f032 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -102,9 +102,7 @@ def load_input_data(self) -> parcels.FieldSet: # bathymetry data if self.add_bathymetry: bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry - bathymetry_field.data = ( - -bathymetry_field.data - ) # TODO: how does v4 handle? positive up or down? + bathymetry_field.data = -bathymetry_field.data fieldset.add_field(bathymetry_field) return fieldset @@ -120,12 +118,13 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" - TMP = False + TMP = False # TODO: just for dev; remove before merging + instrument_name = self.__class__.__name__.split("Instrument")[0] if not self.verbose_progress: if TMP: with yaspin( - text=f"Simulating {self.__class__.__name__.split('Instrument')[0]} measurements... ", + text=f"Simulating {instrument_name} measurements... ", side="right", spinner=ship_spinner, ) as spinner: @@ -134,9 +133,7 @@ def execute(self, measurements: list, out_path: str | Path) -> None: else: self.simulate(measurements, out_path) else: - print( - f"Simulating {self.__class__.__name__.split('Instrument')[0]} measurements... " - ) + print(f"Simulating {instrument_name} measurements... ") self.simulate(measurements, out_path) print("\n") From 0dc5975aff44ac99b0c630c04be610ee4d17145c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 11:55:13 +0200 Subject: [PATCH 030/191] from zarr -> parquet output --- src/virtualship/cli/_run.py | 4 +++- src/virtualship/instruments/adcp.py | 4 ++-- src/virtualship/instruments/argo_float.py | 4 ++-- src/virtualship/instruments/ctd.py | 4 ++-- src/virtualship/instruments/drifter.py | 4 ++-- src/virtualship/instruments/ship_underwater_st.py | 4 ++-- src/virtualship/instruments/xbt.py | 4 ++-- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 703502f2..a320acad 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -202,7 +202,9 @@ def _run( # execute simulation instrument.execute( measurements=measurements, - out_path=expedition_dir.joinpath(RESULTS, f"{itype.name.lower()}.zarr"), + out_path=expedition_dir.joinpath( + RESULTS, f"{itype.name.lower()}.parquet" + ), ) except Exception as e: # clean up if unexpected error occurs diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index ee910e02..ca83f3d7 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -3,7 +3,7 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet +from parcels import ParticleFile, ParticleSet from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType @@ -115,7 +115,7 @@ def simulate(self, measurements, out_path) -> None: z=bins, ) - out_file = particleset.ParticleFile(name=out_path, outputdt=np.inf) + out_file = ParticleFile(name=out_path, outputdt=np.inf) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 86b0faf1..03801038 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -4,7 +4,7 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet, StatusCode, Variable +from parcels import ParticleFile, ParticleSet, StatusCode, Variable from parcels.kernels import AdvectionRK2 from virtualship.instruments.base import Instrument @@ -283,7 +283,7 @@ def simulate(self, measurements, out_path) -> None: ) # define output file for the simulation - out_file = argo_float_particleset.ParticleFile( + out_file = ParticleFile( name=out_path, outputdt=OUTPUT_DT, chunks=[len(argo_float_particleset), 100], diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 91c71e59..c63a09b5 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, ClassVar import numpy as np -from parcels import ParticleSet, Variable +from parcels import ParticleFile, ParticleSet, Variable from parcels._core.statuscodes import StatusCode from virtualship.instruments.base import Instrument @@ -239,7 +239,7 @@ def simulate(self, measurements, out_path) -> None: ) # define output file for the simulation - out_file = ctd_particleset.ParticleFile(name=out_path, outputdt=OUTPUT_DT) + out_file = ParticleFile(name=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 95c6132f..e1114394 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -4,7 +4,7 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet, Variable +from parcels import ParticleFile, ParticleSet, Variable from parcels._core.statuscodes import StatusCode from parcels.kernels import AdvectionRK2 @@ -159,7 +159,7 @@ def simulate(self, measurements, out_path) -> None: ) # define output file for the simulation - out_file = drifter_particleset.ParticleFile( + out_file = ParticleFile( name=out_path, outputdt=OUTPUT_DT, chunks=[len(drifter_particleset), 100], diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 829d1ad7..51c9f068 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -3,7 +3,7 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet +from parcels import ParticleFile, ParticleSet from virtualship.instruments.base import Instrument from virtualship.instruments.sensors import SensorType @@ -108,7 +108,7 @@ def simulate(self, measurements, out_path) -> None: depth=DEPTH, ) - out_file = particleset.ParticleFile(name=out_path, outputdt=np.inf) + out_file = ParticleFile(name=out_path, outputdt=np.inf) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index d738a1fd..f03c8f50 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -4,7 +4,7 @@ from typing import ClassVar import numpy as np -from parcels import ParticleSet, Variable +from parcels import ParticleFile, ParticleSet, Variable from parcels._core.statuscodes import StatusCode from virtualship.instruments.base import Instrument @@ -175,7 +175,7 @@ def simulate(self, measurements, out_path) -> None: fall_speed=[xbt.fall_speed for xbt in measurements], ) - out_file = xbt_particleset.ParticleFile(name=out_path, outputdt=OUTPUT_DT) + out_file = ParticleFile(name=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only sampling_kernels = [ From 3e52b1067c9c40d7daa09e3000fc860db62a5bfc Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:25:46 +0200 Subject: [PATCH 031/191] endtime/time_origin API update --- src/virtualship/instruments/adcp.py | 5 ++++- src/virtualship/instruments/argo_float.py | 7 +++---- src/virtualship/instruments/ctd.py | 2 +- src/virtualship/instruments/drifter.py | 5 ++--- src/virtualship/instruments/ship_underwater_st.py | 5 ++++- src/virtualship/instruments/xbt.py | 11 ++++------- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index ca83f3d7..e9a55a8d 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -115,7 +115,7 @@ def simulate(self, measurements, out_path) -> None: z=bins, ) - out_file = ParticleFile(name=out_path, outputdt=np.inf) + out_file = ParticleFile(path=out_path, outputdt=np.inf) # build kernel list from active sensors only sampling_kernels = [ @@ -124,6 +124,9 @@ def simulate(self, measurements, out_path) -> None: if sc.enabled and sc.sensor_type in self.sensor_kernels ] + # TODO: need to overhaul ADCP/underway instruments generally... don't think this Parcels API works anymore + # TODO: a good time to implement https://github.com/Parcels-code/virtualship/issues/231 + for point in measurements: particleset.lon_nextloop[:] = point.location.lon particleset.lat_nextloop[:] = point.location.lat diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 03801038..2a694466 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -247,7 +247,7 @@ def simulate(self, measurements, out_path) -> None: shallow_waypoints = {} for i, m in enumerate(measurements): loc_bathy = fieldset.bathymetry.eval( - time=0, + time=np.float64(0), z=0, y=m.spacetime.location.lat, x=m.spacetime.location.lon, @@ -284,13 +284,12 @@ def simulate(self, measurements, out_path) -> None: # define output file for the simulation out_file = ParticleFile( - name=out_path, + path=out_path, outputdt=OUTPUT_DT, - chunks=[len(argo_float_particleset), 100], ) # endtime - endtime = fieldset.time_origin.fulltime(fieldset.U.grid.time_full[-1]) + endtime = fieldset.U.data.time.isel(time=-1) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index c63a09b5..2a139abe 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -239,7 +239,7 @@ def simulate(self, measurements, out_path) -> None: ) # define output file for the simulation - out_file = ParticleFile(name=out_path, outputdt=OUTPUT_DT) + out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index e1114394..901c866e 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -160,13 +160,12 @@ def simulate(self, measurements, out_path) -> None: # define output file for the simulation out_file = ParticleFile( - name=out_path, + path=out_path, outputdt=OUTPUT_DT, - chunks=[len(drifter_particleset), 100], ) # determine end time for simulation, from fieldset (which itself is controlled by drifter lifetimes) - endtime = fieldset.time_origin.fulltime(fieldset.U.grid.time_full[-1]) + endtime = fieldset.U.data.time.isel(time=-1) # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 51c9f068..c5149a7a 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -108,7 +108,7 @@ def simulate(self, measurements, out_path) -> None: depth=DEPTH, ) - out_file = ParticleFile(name=out_path, outputdt=np.inf) + out_file = ParticleFile(path=out_path, outputdt=np.inf) # build kernel list from active sensors only sampling_kernels = [ @@ -117,6 +117,9 @@ def simulate(self, measurements, out_path) -> None: if sc.enabled and sc.sensor_type in self.sensor_kernels ] + # TODO: need to overhaul UNDERWATER_ST/underway instruments generally... don't think this Parcels API works anymore + # TODO: a good time to implement https://github.com/Parcels-code/virtualship/issues/231 + for point in measurements: particleset.lon_nextloop[:] = point.location.lon particleset.lat_nextloop[:] = point.location.lat diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index f03c8f50..abfd08ed 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -127,12 +127,9 @@ def simulate(self, measurements, out_path) -> None: # use first active field for time reference _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) - fieldset_starttime = _time_ref_field.grid.time_origin.fulltime( - _time_ref_field.grid.time_full[0] - ) - fieldset_endtime = _time_ref_field.grid.time_origin.fulltime( - _time_ref_field.grid.time_full[-1] - ) + + fieldset_starttime = _time_ref_field.data.time.isel(time=0) + fieldset_endtime = _time_ref_field.data.time.isel(time=-1) # deploy time for all xbts should be later than fieldset start time if not all( @@ -175,7 +172,7 @@ def simulate(self, measurements, out_path) -> None: fall_speed=[xbt.fall_speed for xbt in measurements], ) - out_file = ParticleFile(name=out_path, outputdt=OUTPUT_DT) + out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only sampling_kernels = [ From 07209bf03556f0472fdf38c3574956ec7c24dbce Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:44:25 +0200 Subject: [PATCH 032/191] no temp sampling in phase 3 --- src/virtualship/instruments/argo_float.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 2a694466..18a06f02 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -126,7 +126,6 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 3: Rising with vertical_speed until at surface ptcls3.dz -= particles.vertical_speed * ptcls3.dt - ptcls3.temp = fieldset.thetao[ptcls3.time, ptcls3.z, ptcls3.lat, ptcls3.lon] next_phase = ptcls3.z + ptcls3.dz <= particles.min_depth ptcls3.cycle_phase[next_phase] = 4 ptcls3.dz[next_phase] = ( @@ -289,7 +288,7 @@ def simulate(self, measurements, out_path) -> None: ) # endtime - endtime = fieldset.U.data.time.isel(time=-1) + endtime = fieldset.U.data.time.isel(time=-1).values # build kernel list from active sensors only sampling_kernels = [ From 9cb321cd63371812105a51d980e5d7a1a83666bf Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:44:46 +0200 Subject: [PATCH 033/191] endtimes access scalars directly --- src/virtualship/instruments/ctd.py | 4 ++-- src/virtualship/instruments/drifter.py | 2 +- src/virtualship/instruments/xbt.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 2a139abe..8e529f5b 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -197,8 +197,8 @@ def simulate(self, measurements, out_path) -> None: _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) - fieldset_starttime = _time_ref_field.data.time.isel(time=0) - fieldset_endtime = _time_ref_field.data.time.isel(time=-1) + fieldset_starttime = _time_ref_field.data.time.isel(time=0).values + fieldset_endtime = _time_ref_field.data.time.isel(time=-1).values # deploy time for all ctds should be later than fieldset start time if not all( diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 901c866e..c18088ee 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -165,7 +165,7 @@ def simulate(self, measurements, out_path) -> None: ) # determine end time for simulation, from fieldset (which itself is controlled by drifter lifetimes) - endtime = fieldset.U.data.time.isel(time=-1) + endtime = fieldset.U.data.time.isel(time=-1).values # build kernel list from active sensors only sampling_kernels = [ diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index abfd08ed..bc5f5ecf 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -128,8 +128,8 @@ def simulate(self, measurements, out_path) -> None: _time_ref_key = next(iter(self.variables)) _time_ref_field = getattr(fieldset, _time_ref_key) - fieldset_starttime = _time_ref_field.data.time.isel(time=0) - fieldset_endtime = _time_ref_field.data.time.isel(time=-1) + fieldset_starttime = _time_ref_field.data.time.isel(time=0).values + fieldset_endtime = _time_ref_field.data.time.isel(time=-1).values # deploy time for all xbts should be later than fieldset start time if not all( From 137978df6e6a9993a91b01ef209f7fa96e84829d Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:54:23 +0200 Subject: [PATCH 034/191] fix wrong var name in kernel --- src/virtualship/instruments/argo_float.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 18a06f02..be2da444 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -136,7 +136,7 @@ def _argo_float_vertical_movement(particles, fieldset): next_phase = ptcls4.cycle_age >= particles.cycle_days * 86400 ptcls4.cycle_phase[next_phase] = 0 ptcls4.cycle_age[next_phase] = 0 # reset cycle_age for next cycle - ptcls4.temp = np.nan # no temperature measurement when at surface + ptcls4.T = np.nan # no temperature measurement when at surface particles.cycle_age += particles.dt # update cycle_age From c29efe6a23c47e0891b61df99afa55b97c654367 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 14:32:23 +0200 Subject: [PATCH 035/191] combined vector fields for instruments --- src/virtualship/instruments/base.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index dd38f032..9cbb5699 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -228,6 +228,17 @@ def _generate_fieldset(self) -> parcels.FieldSet: for fs, key in zip(fieldsets_list[1:], keys[1:], strict=False): base_fieldset.add_field(getattr(fs, key)) + # some instruments use AdvectionRKn kernels which require a combined UV vector field + # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet + if "U" in keys and "V" in keys: + uv = parcels.VectorField( + "UV", + base_fieldset.U, + base_fieldset.V, + vector_interp_method=parcels.interpolators.XLinear_Velocity, + ) + base_fieldset.add_field(uv) + return base_fieldset def _get_spec_value(self, spec_type: str, key: str, default=None): From a8242c1fe61072fb69f5713065f1016a2675e9e7 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 14:34:59 +0200 Subject: [PATCH 036/191] small tweaks/fixes --- src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/instruments/base.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index be2da444..96adcd74 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -136,7 +136,7 @@ def _argo_float_vertical_movement(particles, fieldset): next_phase = ptcls4.cycle_age >= particles.cycle_days * 86400 ptcls4.cycle_phase[next_phase] = 0 ptcls4.cycle_age[next_phase] = 0 # reset cycle_age for next cycle - ptcls4.T = np.nan # no temperature measurement when at surface + ptcls4.temperature = np.nan # no temperature measurement when at surface particles.cycle_age += particles.dt # update cycle_age diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 9cbb5699..8e482495 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -216,6 +216,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: ) field_var_name = var + # TODO: I think this is potentially slowing down simulations slightly... compared to v0.3 anyway for *drifters* ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end fields = {key: ds[field_var_name]} From 95d84b7b03f266c99591af6ccf6fc13c7cd56cc2 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:39:18 +0200 Subject: [PATCH 037/191] cmo to pixi.toml and tweaked particleset API --- pixi.toml | 1 + src/virtualship/instruments/base.py | 2 +- src/virtualship/instruments/ctd.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pixi.toml b/pixi.toml index 6cd97d08..240c4047 100644 --- a/pixi.toml +++ b/pixi.toml @@ -38,6 +38,7 @@ numpy = ">=2.1.0" dask = "*" zarr = ">=3" ipdb = ">=0.13.13,<0.14" +cmocean = ">=4.0.3,<5" [pypi-dependencies] parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 8e482495..39dd7419 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -118,7 +118,7 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" - TMP = False # TODO: just for dev; remove before merging + TMP = True # TODO: just for dev; remove before merging instrument_name = self.__class__.__name__.split("Instrument")[0] if not self.verbose_progress: diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 8e529f5b..9f93b6ac 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -258,7 +258,7 @@ def simulate(self, measurements, out_path) -> None: ) # there should be no particles left, as they delete themselves when they resurface - if len(ctd_particleset.particledata) != 0: + if len(ctd_particleset.lon) != 0: raise ValueError( "Simulation ended before CTD resurfaced. This most likely means the field time dimension did not match the simulation time span." ) From 7f68c834b46e0c9a5b66a8cbfc080c5e0391ee39 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 10 Jun 2026 16:54:29 +0200 Subject: [PATCH 038/191] depth -> z for argo sampling, update interp method in base, fix ctd vertical movement --- src/virtualship/instruments/argo_float.py | 8 ++++---- src/virtualship/instruments/base.py | 7 ++++--- src/virtualship/instruments/ctd.py | 9 ++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 96adcd74..d1856b02 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -162,11 +162,11 @@ def _check_error(particles, fieldset): def _argo_sample_temperature(particles, fieldset): # Phase 3: ascending — sample temperature; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.depth < particles.min_depth + depth_mask = particles.z < particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.temperature = fieldset.T[ sampling_particles.time, - sampling_particles.depth, + sampling_particles.z, sampling_particles.lat, sampling_particles.lon, ] @@ -175,11 +175,11 @@ def _argo_sample_temperature(particles, fieldset): def _argo_sample_salinity(particles, fieldset): # Phase 3: ascending — sample salinity; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.depth < particles.min_depth + depth_mask = particles.z < particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.salinity = fieldset.S[ sampling_particles.time, - sampling_particles.depth, + sampling_particles.z, sampling_particles.lat, sampling_particles.lon, ] diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 39dd7419..c651645a 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -97,7 +97,9 @@ def load_input_data(self) -> parcels.FieldSet: # interpolation methods for var in (v for v in self.variables if v not in ("U", "V")): - getattr(fieldset, var).interp_method = parcels.interpolators.XLinear + getattr( + fieldset, var + ).interp_method = parcels.interpolators.XLinearInvdistLandTracer # bathymetry data if self.add_bathymetry: @@ -118,7 +120,7 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" - TMP = True # TODO: just for dev; remove before merging + TMP = False # TODO: just for dev; remove before merging instrument_name = self.__class__.__name__.split("Instrument")[0] if not self.verbose_progress: @@ -192,7 +194,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: var = self.variables[key] physical = var in COPERNICUSMARINE_PHYS_VARIABLES - # TODO: do docs on pre-downloading data need to be updated for these changes? Anything about conventions etc.? if self.from_data is not None: # load from local data data_dir = self.from_data.joinpath("phys" if physical else "bgc") diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 9f93b6ac..6823cca8 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -117,13 +117,8 @@ def _ctd_cast(particles, fieldset): particles_lowering = particles[particles.raising == 0] particles_raising = particles[particles.raising == 1] - # TODO: change to boolean masking, like with Argo Floats? - # TODO: different handling of positive down for z now?! Doing positive down now... think kernels need adjusting... - # TODO: need to check on all other instrument kernels as well... - # TODO: plus how the configs are inputted in e.g. expedition.yaml - # lowering - particles_lowering.dz = -particles_lowering.winch_speed * particles_lowering.dt + particles_lowering.dz += -particles_lowering.winch_speed * particles_lowering.dt particles_lowering.raising = np.where( particles_lowering.z + particles_lowering.dz < particles_lowering.max_depth, 1, @@ -131,7 +126,7 @@ def _ctd_cast(particles, fieldset): ) # raising - particles_raising.dz = particles_raising.winch_speed * particles_raising.dt + particles_raising.dz += particles_raising.winch_speed * particles_raising.dt particles_raising.state = np.where( particles_raising.z + particles_raising.dz > particles_raising.min_depth, StatusCode.Delete, From 003f79fbdf3551a10c21f5c7572465c26c90d8e7 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 10 Jun 2026 17:36:56 +0200 Subject: [PATCH 039/191] move to positive down API throughout virtualship --- src/virtualship/instruments/adcp.py | 4 ++-- src/virtualship/instruments/argo_float.py | 4 ++-- src/virtualship/instruments/base.py | 1 - src/virtualship/instruments/ctd.py | 13 ++++++------ .../instruments/ship_underwater_st.py | 2 +- src/virtualship/instruments/xbt.py | 6 +++--- src/virtualship/models/expedition.py | 20 +++++++++---------- src/virtualship/static/expedition.yaml | 18 ++++++++--------- src/virtualship/utils.py | 2 +- .../expedition/expedition_dir/expedition.yaml | 14 ++++++------- 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index e9a55a8d..94027aaf 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -82,7 +82,7 @@ def simulate(self, measurements, out_path) -> None: self.expedition.instruments_config.adcp_config.max_depth_meter ) - if config_max_depth < -1600.0: + if config_max_depth > 1600.0: print( f"\n\n⚠️ Warning: The configured ADCP max depth of {abs(config_max_depth)} m exceeds the 1600 m limit for the technology (e.g. https://www.geomar.de/en/research/fb1/fb1-po/observing-systems/adcp)." "\n\n This expedition will continue using the prescribed configuration. However, note, the results will not necessarily represent authentic ADCP instrument readings and could also lead to slower simulations ." @@ -90,7 +90,7 @@ def simulate(self, measurements, out_path) -> None: ) MAX_DEPTH = config_max_depth - MIN_DEPTH = -5.0 + MIN_DEPTH = 5.0 NUM_BINS = self.expedition.instruments_config.adcp_config.num_bins measurements.sort(key=lambda p: p.time) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index d1856b02..97c35181 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -162,7 +162,7 @@ def _check_error(particles, fieldset): def _argo_sample_temperature(particles, fieldset): # Phase 3: ascending — sample temperature; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z < particles.min_depth + depth_mask = particles.z > particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.temperature = fieldset.T[ sampling_particles.time, @@ -175,7 +175,7 @@ def _argo_sample_temperature(particles, fieldset): def _argo_sample_salinity(particles, fieldset): # Phase 3: ascending — sample salinity; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z < particles.min_depth + depth_mask = particles.z > particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.salinity = fieldset.S[ sampling_particles.time, diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index c651645a..4d487c46 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -104,7 +104,6 @@ def load_input_data(self) -> parcels.FieldSet: # bathymetry data if self.add_bathymetry: bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry - bathymetry_field.data = -bathymetry_field.data fieldset.add_field(bathymetry_field) return fieldset diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 6823cca8..c2b24742 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -118,17 +118,17 @@ def _ctd_cast(particles, fieldset): particles_raising = particles[particles.raising == 1] # lowering - particles_lowering.dz += -particles_lowering.winch_speed * particles_lowering.dt + particles_lowering.dz += particles_lowering.winch_speed * particles_lowering.dt particles_lowering.raising = np.where( - particles_lowering.z + particles_lowering.dz < particles_lowering.max_depth, + particles_lowering.z + particles_lowering.dz > particles_lowering.max_depth, 1, particles_lowering.raising, ) # raising - particles_raising.dz += particles_raising.winch_speed * particles_raising.dt + particles_raising.dz += -particles_raising.winch_speed * particles_raising.dt particles_raising.state = np.where( - particles_raising.z + particles_raising.dz > particles_raising.min_depth, + particles_raising.z + particles_raising.dz < particles_raising.min_depth, StatusCode.Delete, particles_raising.state, ) @@ -209,9 +209,10 @@ def simulate(self, measurements, out_path) -> None: # CTD depth can not be too shallow, because kernel would break. # This shallow is not useful anyway, no need to support. - if not all([max_depth <= -DT * WINCH_SPEED for max_depth in max_depths]): + # TODO: should make this say which CTD(s) are the issue, and which max depth(s) are the issue, to make it easier for users to fix + if not all([max_depth >= DT * WINCH_SPEED for max_depth in max_depths]): raise ValueError( - f"CTD max_depth or bathymetry shallower than maximum {-DT * WINCH_SPEED}" + f"CTD max_depth or bathymetry shallower than maximum {DT * WINCH_SPEED}" ) # build dynamic particle class from the active sensors diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index c5149a7a..0c099003 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -88,7 +88,7 @@ def __init__(self, expedition, from_data): def simulate(self, measurements, out_path) -> None: """Simulate underway salinity and temperature measurements.""" - DEPTH = -2.0 + DEPTH = 2.0 measurements.sort(key=lambda p: p.time) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index bc5f5ecf..cfa7283d 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -58,7 +58,7 @@ def _sample_temperature(particles, fieldset): def _xbt_cast(particles, fieldset): - particles.dz = -particles.fall_speed * particles.dt + particles.dz = particles.fall_speed * particles.dt # update the fall speed from the quadractic fall-rate equation # check https://doi.org/10.5194/os-7-231-2011 @@ -73,9 +73,9 @@ def _xbt_cast(particles, fieldset): # set particle depth to max depth if it's too deep particles.dz = np.where( - particles.z + particles.dz < particles.max_depth, + particles.z + particles.dz > particles.max_depth, particles.max_depth - particles.z, - particles.z, + particles.dz, ) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index b7269373..7bcf6208 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -255,10 +255,10 @@ class ArgoFloatConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.ARGO_FLOAT _instrument_name: ClassVar[str] = "ArgoFloat" - min_depth_meter: float = pydantic.Field(le=0.0) - max_depth_meter: float = pydantic.Field(le=0.0) - drift_depth_meter: float = pydantic.Field(le=0.0) - vertical_speed_meter_per_second: float = pydantic.Field(lt=0.0) + min_depth_meter: float = pydantic.Field(ge=0.0) + max_depth_meter: float = pydantic.Field(ge=0.0) + drift_depth_meter: float = pydantic.Field(ge=0.0) + vertical_speed_meter_per_second: float = pydantic.Field(gt=0.0) cycle_days: float = pydantic.Field(gt=0.0) drift_days: float = pydantic.Field(gt=0.0) lifetime: timedelta = pydantic.Field( @@ -302,7 +302,7 @@ class ADCPConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.ADCP _instrument_name: ClassVar[str] = "ADCP" - max_depth_meter: float = pydantic.Field(le=0.0) + max_depth_meter: float = pydantic.Field(ge=0.0) num_bins: int = pydantic.Field(gt=0.0) period: timedelta = pydantic.Field( serialization_alias="period_minutes", @@ -346,8 +346,8 @@ class CTDConfig(_InstrumentConfigMixin, pydantic.BaseModel): validation_alias="stationkeeping_time_minutes", gt=timedelta(), ) - min_depth_meter: float = pydantic.Field(le=0.0) - max_depth_meter: float = pydantic.Field(le=0.0) + min_depth_meter: float = pydantic.Field(ge=0.0) + max_depth_meter: float = pydantic.Field(ge=0.0) sensors: list[SensorConfig] = pydantic.Field( default_factory=lambda: [ @@ -402,7 +402,7 @@ class DrifterConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.DRIFTER _instrument_name: ClassVar[str] = "Drifter" - depth_meter: float = pydantic.Field(le=0.0) + depth_meter: float = pydantic.Field(ge=0.0) lifetime: timedelta = pydantic.Field( serialization_alias="lifetime_days", validation_alias="lifetime_days", @@ -429,8 +429,8 @@ class XBTConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.XBT _instrument_name: ClassVar[str] = "XBT" - min_depth_meter: float = pydantic.Field(le=0.0) - max_depth_meter: float = pydantic.Field(le=0.0) + min_depth_meter: float = pydantic.Field(ge=0.0) + max_depth_meter: float = pydantic.Field(ge=0.0) fall_speed_meter_per_second: float = pydantic.Field(gt=0.0) deceleration_coefficient: float = pydantic.Field(gt=0.0) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index acb16dcf..9615ccb1 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -34,25 +34,25 @@ schedule: instruments_config: adcp_config: num_bins: 40 - max_depth_meter: -1000.0 + max_depth_meter: 1000.0 period_minutes: 5.0 sensors: - VELOCITY argo_float_config: cycle_days: 10.0 drift_days: 9.0 - drift_depth_meter: -1000.0 - max_depth_meter: -2000.0 + drift_depth_meter: 1000.0 + max_depth_meter: 2000.0 min_depth_meter: 0.0 - vertical_speed_meter_per_second: -0.1 + vertical_speed_meter_per_second: 0.1 stationkeeping_time_minutes: 20.0 lifetime_days: 63.0 sensors: - TEMPERATURE - SALINITY ctd_config: - max_depth_meter: -2000.0 - min_depth_meter: -11.0 + max_depth_meter: 2000.0 + min_depth_meter: 11.0 stationkeeping_time_minutes: 50.0 sensors: - TEMPERATURE @@ -65,14 +65,14 @@ instruments_config: - PHYTOPLANKTON - PRIMARY_PRODUCTION drifter_config: - depth_meter: -1.0 + depth_meter: 1.0 lifetime_days: 42.0 stationkeeping_time_minutes: 20.0 sensors: - TEMPERATURE xbt_config: - max_depth_meter: -285.0 - min_depth_meter: -2.0 + max_depth_meter: 285.0 + min_depth_meter: 2.0 fall_speed_meter_per_second: 6.7 deceleration_coefficient: 0.00225 sensors: diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index df5d153c..03283023 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -563,7 +563,7 @@ def _find_files_in_timerange( def _compute_max_depths(measurements, fieldset) -> list[float]: """Compute the effective max depth for each measurement, capped by bathymetry.""" return [ - max( + min( # min because depth is positive down m.max_depth, fieldset.bathymetry.eval( z=0, diff --git a/tests/expedition/expedition_dir/expedition.yaml b/tests/expedition/expedition_dir/expedition.yaml index 6392076b..e8393ed1 100644 --- a/tests/expedition/expedition_dir/expedition.yaml +++ b/tests/expedition/expedition_dir/expedition.yaml @@ -22,23 +22,23 @@ schedule: instruments_config: adcp_config: num_bins: 40 - max_depth_meter: -1000.0 + max_depth_meter: 1000.0 period_minutes: 5.0 argo_float_config: cycle_days: 10.0 drift_days: 9.0 - drift_depth_meter: -1000.0 - max_depth_meter: -2000.0 + drift_depth_meter: 1000.0 + max_depth_meter: 2000.0 min_depth_meter: 0.0 - vertical_speed_meter_per_second: -0.1 + vertical_speed_meter_per_second: 0.1 stationkeeping_time_minutes: 20.0 lifetime_days: 63.0 ctd_config: - max_depth_meter: -2000.0 - min_depth_meter: -11.0 + max_depth_meter: 2000.0 + min_depth_meter: 11.0 stationkeeping_time_minutes: 50.0 drifter_config: - depth_meter: -1.0 + depth_meter: 1.0 lifetime_days: 28.0 stationkeeping_time_minutes: 20.0 ship_underwater_st_config: From da866131286cc24b95d7ff479c81c02fdc3342c4 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 11 Jun 2026 13:33:05 +0200 Subject: [PATCH 040/191] Revert "move to positive down API throughout virtualship" This reverts commit 003f79fbdf3551a10c21f5c7572465c26c90d8e7. --- src/virtualship/instruments/adcp.py | 4 ++-- src/virtualship/instruments/argo_float.py | 4 ++-- src/virtualship/instruments/base.py | 1 + src/virtualship/instruments/ctd.py | 13 ++++++------ .../instruments/ship_underwater_st.py | 2 +- src/virtualship/instruments/xbt.py | 6 +++--- src/virtualship/models/expedition.py | 20 +++++++++---------- src/virtualship/static/expedition.yaml | 18 ++++++++--------- src/virtualship/utils.py | 2 +- .../expedition/expedition_dir/expedition.yaml | 14 ++++++------- 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 94027aaf..e9a55a8d 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -82,7 +82,7 @@ def simulate(self, measurements, out_path) -> None: self.expedition.instruments_config.adcp_config.max_depth_meter ) - if config_max_depth > 1600.0: + if config_max_depth < -1600.0: print( f"\n\n⚠️ Warning: The configured ADCP max depth of {abs(config_max_depth)} m exceeds the 1600 m limit for the technology (e.g. https://www.geomar.de/en/research/fb1/fb1-po/observing-systems/adcp)." "\n\n This expedition will continue using the prescribed configuration. However, note, the results will not necessarily represent authentic ADCP instrument readings and could also lead to slower simulations ." @@ -90,7 +90,7 @@ def simulate(self, measurements, out_path) -> None: ) MAX_DEPTH = config_max_depth - MIN_DEPTH = 5.0 + MIN_DEPTH = -5.0 NUM_BINS = self.expedition.instruments_config.adcp_config.num_bins measurements.sort(key=lambda p: p.time) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 97c35181..d1856b02 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -162,7 +162,7 @@ def _check_error(particles, fieldset): def _argo_sample_temperature(particles, fieldset): # Phase 3: ascending — sample temperature; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z > particles.min_depth + depth_mask = particles.z < particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.temperature = fieldset.T[ sampling_particles.time, @@ -175,7 +175,7 @@ def _argo_sample_temperature(particles, fieldset): def _argo_sample_salinity(particles, fieldset): # Phase 3: ascending — sample salinity; NaN otherwise phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z > particles.min_depth + depth_mask = particles.z < particles.min_depth sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.salinity = fieldset.S[ sampling_particles.time, diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 4d487c46..c651645a 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -104,6 +104,7 @@ def load_input_data(self) -> parcels.FieldSet: # bathymetry data if self.add_bathymetry: bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry + bathymetry_field.data = -bathymetry_field.data fieldset.add_field(bathymetry_field) return fieldset diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index c2b24742..6823cca8 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -118,17 +118,17 @@ def _ctd_cast(particles, fieldset): particles_raising = particles[particles.raising == 1] # lowering - particles_lowering.dz += particles_lowering.winch_speed * particles_lowering.dt + particles_lowering.dz += -particles_lowering.winch_speed * particles_lowering.dt particles_lowering.raising = np.where( - particles_lowering.z + particles_lowering.dz > particles_lowering.max_depth, + particles_lowering.z + particles_lowering.dz < particles_lowering.max_depth, 1, particles_lowering.raising, ) # raising - particles_raising.dz += -particles_raising.winch_speed * particles_raising.dt + particles_raising.dz += particles_raising.winch_speed * particles_raising.dt particles_raising.state = np.where( - particles_raising.z + particles_raising.dz < particles_raising.min_depth, + particles_raising.z + particles_raising.dz > particles_raising.min_depth, StatusCode.Delete, particles_raising.state, ) @@ -209,10 +209,9 @@ def simulate(self, measurements, out_path) -> None: # CTD depth can not be too shallow, because kernel would break. # This shallow is not useful anyway, no need to support. - # TODO: should make this say which CTD(s) are the issue, and which max depth(s) are the issue, to make it easier for users to fix - if not all([max_depth >= DT * WINCH_SPEED for max_depth in max_depths]): + if not all([max_depth <= -DT * WINCH_SPEED for max_depth in max_depths]): raise ValueError( - f"CTD max_depth or bathymetry shallower than maximum {DT * WINCH_SPEED}" + f"CTD max_depth or bathymetry shallower than maximum {-DT * WINCH_SPEED}" ) # build dynamic particle class from the active sensors diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 0c099003..c5149a7a 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -88,7 +88,7 @@ def __init__(self, expedition, from_data): def simulate(self, measurements, out_path) -> None: """Simulate underway salinity and temperature measurements.""" - DEPTH = 2.0 + DEPTH = -2.0 measurements.sort(key=lambda p: p.time) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index cfa7283d..bc5f5ecf 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -58,7 +58,7 @@ def _sample_temperature(particles, fieldset): def _xbt_cast(particles, fieldset): - particles.dz = particles.fall_speed * particles.dt + particles.dz = -particles.fall_speed * particles.dt # update the fall speed from the quadractic fall-rate equation # check https://doi.org/10.5194/os-7-231-2011 @@ -73,9 +73,9 @@ def _xbt_cast(particles, fieldset): # set particle depth to max depth if it's too deep particles.dz = np.where( - particles.z + particles.dz > particles.max_depth, + particles.z + particles.dz < particles.max_depth, particles.max_depth - particles.z, - particles.dz, + particles.z, ) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 7bcf6208..b7269373 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -255,10 +255,10 @@ class ArgoFloatConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.ARGO_FLOAT _instrument_name: ClassVar[str] = "ArgoFloat" - min_depth_meter: float = pydantic.Field(ge=0.0) - max_depth_meter: float = pydantic.Field(ge=0.0) - drift_depth_meter: float = pydantic.Field(ge=0.0) - vertical_speed_meter_per_second: float = pydantic.Field(gt=0.0) + min_depth_meter: float = pydantic.Field(le=0.0) + max_depth_meter: float = pydantic.Field(le=0.0) + drift_depth_meter: float = pydantic.Field(le=0.0) + vertical_speed_meter_per_second: float = pydantic.Field(lt=0.0) cycle_days: float = pydantic.Field(gt=0.0) drift_days: float = pydantic.Field(gt=0.0) lifetime: timedelta = pydantic.Field( @@ -302,7 +302,7 @@ class ADCPConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.ADCP _instrument_name: ClassVar[str] = "ADCP" - max_depth_meter: float = pydantic.Field(ge=0.0) + max_depth_meter: float = pydantic.Field(le=0.0) num_bins: int = pydantic.Field(gt=0.0) period: timedelta = pydantic.Field( serialization_alias="period_minutes", @@ -346,8 +346,8 @@ class CTDConfig(_InstrumentConfigMixin, pydantic.BaseModel): validation_alias="stationkeeping_time_minutes", gt=timedelta(), ) - min_depth_meter: float = pydantic.Field(ge=0.0) - max_depth_meter: float = pydantic.Field(ge=0.0) + min_depth_meter: float = pydantic.Field(le=0.0) + max_depth_meter: float = pydantic.Field(le=0.0) sensors: list[SensorConfig] = pydantic.Field( default_factory=lambda: [ @@ -402,7 +402,7 @@ class DrifterConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.DRIFTER _instrument_name: ClassVar[str] = "Drifter" - depth_meter: float = pydantic.Field(ge=0.0) + depth_meter: float = pydantic.Field(le=0.0) lifetime: timedelta = pydantic.Field( serialization_alias="lifetime_days", validation_alias="lifetime_days", @@ -429,8 +429,8 @@ class XBTConfig(_InstrumentConfigMixin, pydantic.BaseModel): _instrument_type: ClassVar[InstrumentType] = InstrumentType.XBT _instrument_name: ClassVar[str] = "XBT" - min_depth_meter: float = pydantic.Field(ge=0.0) - max_depth_meter: float = pydantic.Field(ge=0.0) + min_depth_meter: float = pydantic.Field(le=0.0) + max_depth_meter: float = pydantic.Field(le=0.0) fall_speed_meter_per_second: float = pydantic.Field(gt=0.0) deceleration_coefficient: float = pydantic.Field(gt=0.0) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index 9615ccb1..acb16dcf 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -34,25 +34,25 @@ schedule: instruments_config: adcp_config: num_bins: 40 - max_depth_meter: 1000.0 + max_depth_meter: -1000.0 period_minutes: 5.0 sensors: - VELOCITY argo_float_config: cycle_days: 10.0 drift_days: 9.0 - drift_depth_meter: 1000.0 - max_depth_meter: 2000.0 + drift_depth_meter: -1000.0 + max_depth_meter: -2000.0 min_depth_meter: 0.0 - vertical_speed_meter_per_second: 0.1 + vertical_speed_meter_per_second: -0.1 stationkeeping_time_minutes: 20.0 lifetime_days: 63.0 sensors: - TEMPERATURE - SALINITY ctd_config: - max_depth_meter: 2000.0 - min_depth_meter: 11.0 + max_depth_meter: -2000.0 + min_depth_meter: -11.0 stationkeeping_time_minutes: 50.0 sensors: - TEMPERATURE @@ -65,14 +65,14 @@ instruments_config: - PHYTOPLANKTON - PRIMARY_PRODUCTION drifter_config: - depth_meter: 1.0 + depth_meter: -1.0 lifetime_days: 42.0 stationkeeping_time_minutes: 20.0 sensors: - TEMPERATURE xbt_config: - max_depth_meter: 285.0 - min_depth_meter: 2.0 + max_depth_meter: -285.0 + min_depth_meter: -2.0 fall_speed_meter_per_second: 6.7 deceleration_coefficient: 0.00225 sensors: diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 03283023..df5d153c 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -563,7 +563,7 @@ def _find_files_in_timerange( def _compute_max_depths(measurements, fieldset) -> list[float]: """Compute the effective max depth for each measurement, capped by bathymetry.""" return [ - min( # min because depth is positive down + max( m.max_depth, fieldset.bathymetry.eval( z=0, diff --git a/tests/expedition/expedition_dir/expedition.yaml b/tests/expedition/expedition_dir/expedition.yaml index e8393ed1..6392076b 100644 --- a/tests/expedition/expedition_dir/expedition.yaml +++ b/tests/expedition/expedition_dir/expedition.yaml @@ -22,23 +22,23 @@ schedule: instruments_config: adcp_config: num_bins: 40 - max_depth_meter: 1000.0 + max_depth_meter: -1000.0 period_minutes: 5.0 argo_float_config: cycle_days: 10.0 drift_days: 9.0 - drift_depth_meter: 1000.0 - max_depth_meter: 2000.0 + drift_depth_meter: -1000.0 + max_depth_meter: -2000.0 min_depth_meter: 0.0 - vertical_speed_meter_per_second: 0.1 + vertical_speed_meter_per_second: -0.1 stationkeeping_time_minutes: 20.0 lifetime_days: 63.0 ctd_config: - max_depth_meter: 2000.0 - min_depth_meter: 11.0 + max_depth_meter: -2000.0 + min_depth_meter: -11.0 stationkeeping_time_minutes: 50.0 drifter_config: - depth_meter: 1.0 + depth_meter: -1.0 lifetime_days: 28.0 stationkeeping_time_minutes: 20.0 ship_underwater_st_config: From a468adeb38b70bdba733db61ae477c2acb77ae76 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 11 Jun 2026 15:11:53 +0200 Subject: [PATCH 041/191] negate *and* reindex depth in ds before fieldset creation --- src/virtualship/instruments/base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index c651645a..6f898e39 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -120,7 +120,7 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" - TMP = False # TODO: just for dev; remove before merging + TMP = True # TODO: just for dev; remove before merging instrument_name = self.__class__.__name__.split("Instrument")[0] if not self.verbose_progress: @@ -220,6 +220,10 @@ def _generate_fieldset(self) -> parcels.FieldSet: # TODO: I think this is potentially slowing down simulations slightly... compared to v0.3 anyway for *drifters* ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end + # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) + ds["depth"] = -ds["depth"] + ds = ds.reindex(depth=ds["depth"][::-1]) # + fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) From fd2232a2ca35b3e2df02810a67527b0f0a615e4c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 11 Jun 2026 16:42:03 +0200 Subject: [PATCH 042/191] fill land/nans with 0s --- src/virtualship/instruments/base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 6f898e39..f6d0c9a2 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -222,7 +222,10 @@ def _generate_fieldset(self) -> parcels.FieldSet: # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) ds["depth"] = -ds["depth"] - ds = ds.reindex(depth=ds["depth"][::-1]) # + ds = ds.reindex(depth=ds["depth"][::-1]) + + # TODO: update when decision on handling of nans/0s in v4 is made (i.e. https://github.com/Parcels-code/Parcels/issues/2393) + ds = ds.fillna(0) fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) From 0be180d9aa1d63a18471449aaceb62c0100a7729 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:51:26 +0200 Subject: [PATCH 043/191] fixes to argo kernels + some refactoring --- src/virtualship/instruments/argo_float.py | 146 ++++++++++++++-------- 1 file changed, 95 insertions(+), 51 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index d1856b02..7ed59710 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -58,9 +58,6 @@ class ArgoFloat: # SECTION: Kernels # ===================================================== -# TODO: need to add back in the shallow bathymetry checks (to phases 0 and 2?!) -# TODO: can this be refactored as well to a helper function? - def _argo_float_vertical_movement(particles, fieldset): # Split particles based on their current cycle_phase @@ -73,26 +70,21 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 0: Sinking with vertical_speed until depth is driftdepth ptcls0.dz += particles.vertical_speed * ptcls0.dt loc_bathy = fieldset.bathymetry.eval(ptcls0.time, ptcls0.z, ptcls0.lat, ptcls0.lon) - driftdepth_mask = ptcls0.z + ptcls0.dz >= particles.drift_depth - bathy_mask = ptcls0.z + ptcls0.dz >= loc_bathy - next_phase = np.logical_and( - driftdepth_mask, bathy_mask - ) # combined mask; not at drift depth yet and not hitting bathymetry + driftdepth_mask = ptcls0.z + ptcls0.dz <= particles.drift_depth # noqa:has reached drift depth + bathysafe_mask = ptcls0.z + ptcls0.dz >= loc_bathy # noqa:has not reached bathymetry + next_phase = np.logical_and(driftdepth_mask, bathysafe_mask) ptcls0.cycle_phase[next_phase] = 1 - ptcls0.dz[next_phase] = ( - particles.drift_depth - ptcls0.z[next_phase] - ) # avoid overshoot + ptcls0.dz[next_phase] = particles.drift_depth - ptcls0.z[next_phase] # noqa:avoid overshoot # Phase 0.5: Check for grounding at bathymetry and raise if necessary - ptcls0.grounded[~bathy_mask] = 1 - if np.any(~bathy_mask): - print( - "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to drift depth. Raising by 50m above bathymetry and continuing cycle." - ) - ptcls0.dz[~bathy_mask] = ( - loc_bathy[~bathy_mask] - ptcls0.z[~bathy_mask] + 50.0 - ) # raise to 50m above bathymetry - ptcls0.cycle_phase[~bathy_mask] = 1 + _handle_grounding( + ptcls0, + bathysafe_mask, + loc_bathy, + fieldset, + "sinking to drift depth", + target_phase=1, + ) # Phase 1: Drifting at depth for drifttime seconds ptcls1.drift_age += ptcls1.dt @@ -103,34 +95,27 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 2: Sinking further to maxdepth ptcls2.dz += particles.vertical_speed * ptcls2.dt loc_bathy = fieldset.bathymetry.eval(ptcls2.time, ptcls2.z, ptcls2.lat, ptcls2.lon) - maxdepth_mask = ptcls2.z + ptcls2.dz >= particles.max_depth - bathy_mask = ptcls2.z + ptcls2.dz >= loc_bathy - next_phase = np.logical_and( - maxdepth_mask, bathy_mask - ) # combined mask; not at max depth yet and not hitting bathymetry + maxdepth_mask = ptcls2.z + ptcls2.dz <= particles.max_depth # noqa:has reached max depth + bathysafe_mask = ptcls2.z + ptcls2.dz >= loc_bathy # noqa:has not reached bathymetry + next_phase = np.logical_and(maxdepth_mask, bathysafe_mask) ptcls2.cycle_phase[next_phase] = 3 - ptcls2.dz[next_phase] = ( - particles.max_depth - ptcls2.z[next_phase] - ) # avoid overshoot + ptcls2.dz[next_phase] = particles.max_depth - ptcls2.z[next_phase] # noqa:avoid overshoot # Phase 2.5: Check for grounding at bathymetry and raise if necessary - ptcls2.grounded[~bathy_mask] = 1 - if np.any(~bathy_mask): - print( - "Shallow bathymetry warning: Argo float grounded at bathymetry depth during sinking to max depth. Raising by 50m above bathymetry and continuing cycle." - ) - ptcls2.dz[~bathy_mask] = ( - loc_bathy[~bathy_mask] - ptcls2.z[~bathy_mask] + 50.0 - ) # raise to 50m above bathymetry - ptcls2.cycle_phase[~bathy_mask] = 3 + _handle_grounding( + ptcls2, + bathysafe_mask, + loc_bathy, + fieldset, + "sinking to max depth", + target_phase=3, + ) # Phase 3: Rising with vertical_speed until at surface ptcls3.dz -= particles.vertical_speed * ptcls3.dt - next_phase = ptcls3.z + ptcls3.dz <= particles.min_depth + next_phase = ptcls3.z + ptcls3.dz >= particles.min_depth ptcls3.cycle_phase[next_phase] = 4 - ptcls3.dz[next_phase] = ( - particles.min_depth - ptcls3.z[next_phase] - ) # avoid overshoot + ptcls3.dz[next_phase] = particles.min_depth - ptcls3.z[next_phase] # noqa:avoid overshoot # Phase 4: Transmitting at surface until cycletime is reached next_phase = ptcls4.cycle_age >= particles.cycle_days * 86400 @@ -148,21 +133,38 @@ def _keep_at_surface(particles, fieldset): def _check_error(particles, fieldset): - errors = particles.state >= 50 # captures all Errors - # TODO: check print statements are as expected + errors = particles.state >= 50 + if not np.any(errors): + return + + error_ints = particles.state[errors].astype(int) + error_times, error_lats, error_lons = _format_log_metadata( + particles, errors, fieldset + ) + + error_details = ", ".join( + f"{_STATUS_CODE_NAMES.get(err, str(err))} at time(s): {t}, lat(s): {lat}, lon(s): {lon}" + for err, lat, lon, t in zip( + error_ints, error_lats, error_lons, error_times, strict=True + ) + ) print( - "WARNING: Error(s) found during Argo Float simulation but the expedition will continue..." - f"\n\nError code(s): {', '.join(_STATUS_CODE_NAMES.get(error, str(error)) + 'at time: ' + str(particles.time[errors][i]) + ', lat: ' + str(particles.lat[errors][i]) + ', lon: ' + str(particles.lon[errors][i]) for i, error in enumerate(particles.state[errors]))}" - "\n\nIf ErrorOutOfBounds, consider reducing the lifetime in Argo Float config (the fieldset spatial bounds are constrained under-the-hood). For further advice please contact the VirtualShip team via GitHub (https://github.com/Parcels-code/virtualship/issues) or email (virtualship@uu.nl)." - "\nCarrying on with the expedition..." + "WARNING: Error(s) found during Argo Float simulation but the expedition will continue...\n\n" + f"Error code(s): {error_details}\n\n" + "If ErrorOutOfBounds, consider reducing the lifetime in Argo Float config " + "(the fieldset spatial bounds are constrained under-the-hood). For further advice " + "please contact the VirtualShip team via GitHub (https://github.com/Parcels-code/virtualship/issues) " + "or email (virtualship@uu.nl).\n" + "Carrying on with the expedition..." ) + particles.state[errors] = StatusCode.Delete def _argo_sample_temperature(particles, fieldset): - # Phase 3: ascending — sample temperature; NaN otherwise + # Phase 3: ascending — sample temperature phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z < particles.min_depth + depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.temperature = fieldset.T[ sampling_particles.time, @@ -173,9 +175,9 @@ def _argo_sample_temperature(particles, fieldset): def _argo_sample_salinity(particles, fieldset): - # Phase 3: ascending — sample salinity; NaN otherwise + # Phase 3: ascending — sample salinity phase_mask = particles.cycle_phase == 3 - depth_mask = particles.z < particles.min_depth + depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.salinity = fieldset.S[ sampling_particles.time, @@ -185,6 +187,48 @@ def _argo_sample_salinity(particles, fieldset): ] +# ===================================================== +# SECTION: Helper Functions +# ===================================================== + + +def _handle_grounding( + ptcls_subset, bathysafe_mask, loc_bathy, fieldset, phase_name, target_phase +): + """Handle grounding logic, logging warnings, and raising particles above bathymetry.""" + grounded_mask = ~bathysafe_mask + if not np.any(grounded_mask): + return + + ptcls_subset.grounded[grounded_mask] = 1 + + # extract log data + times, lats, lons = _format_log_metadata(ptcls_subset, grounded_mask, fieldset) + + print( + f"Shallow bathymetry warning: Argo float grounded at bathymetry during {phase_name} " + f"(time(s): {times}, lat(s): {lats}, lon(s): {lons}). " + f"Raising by 50m above bathymetry and continuing cycle." + ) + + # adjust vertical displacement to be 50m above bathymetry and transition phase + ptcls_subset.dz[grounded_mask] = ( + loc_bathy[grounded_mask] - ptcls_subset.z[grounded_mask] + 50.0 + ) + ptcls_subset.cycle_phase[grounded_mask] = target_phase + + +def _format_log_metadata(ptcls_subset, mask, fieldset): + """Extracts and formats timestamps, latitudes, and longitudes for particles.""" + lats = ptcls_subset.lat[mask].astype(float) + lons = ptcls_subset.lon[mask].astype(float) + + time_origin = fieldset.U.data.time[0].values + times = ptcls_subset.time[mask].astype("timedelta64[s]") + time_origin + + return times, lats, lons + + # ===================================================== # SECTION: Instrument Class # ===================================================== From c05d2f7634a08012fdaebe5926151ed350ba5c18 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:21:50 +0200 Subject: [PATCH 044/191] switch to using .to_windowed_arrays() for performance --- src/virtualship/instruments/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index f6d0c9a2..baa36e9d 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -217,9 +217,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: ) field_var_name = var - # TODO: I think this is potentially slowing down simulations slightly... compared to v0.3 anyway for *drifters* - ds.load() # TODO: tmp step during v4 alpha stage... probably to be updated on the Parcels end - # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) ds["depth"] = -ds["depth"] ds = ds.reindex(depth=ds["depth"][::-1]) @@ -229,7 +226,9 @@ def _generate_fieldset(self) -> parcels.FieldSet: fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) + fs.to_windowed_arrays() # TODO: for enhanced performance in Parcels v4, Parcels-side recommendations may change in the future... fieldsets_list.append(fs) From cff02401c4dc77ec8534b822b7a60dfa25926795 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:11:52 +0200 Subject: [PATCH 045/191] neater way of negating depth --- src/virtualship/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index df5d153c..98fdb866 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -450,6 +450,9 @@ def _get_bathy_data(from_data: Path | None = None) -> FieldSet: {"depth": 1} ) # TODO: bodge whilst parcels v4 does not support 2D fields and seeks depth dim; change when parcels v4 released + # Negate bathymetry to convert from depth below geoid to negative depth (Parcels convention) + ds_bathymetry[VAR] = -ds_bathymetry[VAR] + ds_fset = parcels.convert.copernicusmarine_to_sgrid( fields={"bathymetry": ds_bathymetry[VAR]} ) From d9df5b6dddbea0022ba3eefec08f0870fe54afc0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:13:26 +0200 Subject: [PATCH 046/191] use interpolator object --- src/virtualship/instruments/base.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index baa36e9d..4986eae9 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -99,12 +99,11 @@ def load_input_data(self) -> parcels.FieldSet: for var in (v for v in self.variables if v not in ("U", "V")): getattr( fieldset, var - ).interp_method = parcels.interpolators.XLinearInvdistLandTracer + ).interp_method = parcels.interpolators.XLinearInvdistLandTracer() # bathymetry data if self.add_bathymetry: bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry - bathymetry_field.data = -bathymetry_field.data fieldset.add_field(bathymetry_field) return fieldset @@ -236,16 +235,16 @@ def _generate_fieldset(self) -> parcels.FieldSet: for fs, key in zip(fieldsets_list[1:], keys[1:], strict=False): base_fieldset.add_field(getattr(fs, key)) - # some instruments use AdvectionRKn kernels which require a combined UV vector field - # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet - if "U" in keys and "V" in keys: - uv = parcels.VectorField( - "UV", - base_fieldset.U, - base_fieldset.V, - vector_interp_method=parcels.interpolators.XLinear_Velocity, - ) - base_fieldset.add_field(uv) + # # some instruments use AdvectionRKn kernels which require a combined UV vector field + # # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet + # if "U" in keys and "V" in keys: + # uv = parcels.VectorField( + # "UV", + # base_fieldset.U, + # base_fieldset.V, + # interp_method=parcels.interpolators.XLinear_Velocity, + # ) + # base_fieldset.add_field(uv) return base_fieldset From f89ce7362584df659e550e9ce2b99d28f81da61b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:54:36 +0200 Subject: [PATCH 047/191] lat/lon/time -> y/x/t --- src/virtualship/instruments/adcp.py | 12 +++--- src/virtualship/instruments/argo_float.py | 32 ++++++++------- src/virtualship/instruments/ctd.py | 40 ++++++------------- src/virtualship/instruments/drifter.py | 8 ++-- .../instruments/ship_underwater_st.py | 10 ++--- src/virtualship/instruments/xbt.py | 8 ++-- 6 files changed, 48 insertions(+), 62 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index e9a55a8d..49a08120 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -37,10 +37,10 @@ class ADCP: def _sample_velocity(particles, fieldset): particles.U, particles.V = fieldset.UV.eval( - particles.time, + particles.t, particles.z, - particles.lat, - particles.lon, + particles.x, + particles.y, applyConversion=False, ) @@ -108,10 +108,10 @@ def simulate(self, measurements, out_path) -> None: particleset = ParticleSet( fieldset=fieldset, pclass=_ADCPParticle, - lon=np.full( + x=np.full( num_particles, 0.0 - ), # initial lat/lon are irrelevant and will be overruled later.s - lat=np.full(num_particles, 0.0), + ), # initial lat/lon are irrelevant and will be overruled later + y=np.full(num_particles, 0.0), z=bins, ) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 7ed59710..bca082e9 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -60,6 +60,8 @@ class ArgoFloat: def _argo_float_vertical_movement(particles, fieldset): + breakpoint() + # Split particles based on their current cycle_phase ptcls0 = particles[particles.cycle_phase == 0] ptcls1 = particles[particles.cycle_phase == 1] @@ -69,7 +71,7 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 0: Sinking with vertical_speed until depth is driftdepth ptcls0.dz += particles.vertical_speed * ptcls0.dt - loc_bathy = fieldset.bathymetry.eval(ptcls0.time, ptcls0.z, ptcls0.lat, ptcls0.lon) + loc_bathy = fieldset.bathymetry.eval(ptcls0.t, ptcls0.z, ptcls0.y, ptcls0.x) driftdepth_mask = ptcls0.z + ptcls0.dz <= particles.drift_depth # noqa:has reached drift depth bathysafe_mask = ptcls0.z + ptcls0.dz >= loc_bathy # noqa:has not reached bathymetry next_phase = np.logical_and(driftdepth_mask, bathysafe_mask) @@ -94,7 +96,7 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 2: Sinking further to maxdepth ptcls2.dz += particles.vertical_speed * ptcls2.dt - loc_bathy = fieldset.bathymetry.eval(ptcls2.time, ptcls2.z, ptcls2.lat, ptcls2.lon) + loc_bathy = fieldset.bathymetry.eval(ptcls2.t, ptcls2.z, ptcls2.y, ptcls2.x) maxdepth_mask = ptcls2.z + ptcls2.dz <= particles.max_depth # noqa:has reached max depth bathysafe_mask = ptcls2.z + ptcls2.dz >= loc_bathy # noqa:has not reached bathymetry next_phase = np.logical_and(maxdepth_mask, bathysafe_mask) @@ -167,10 +169,10 @@ def _argo_sample_temperature(particles, fieldset): depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.temperature = fieldset.T[ - sampling_particles.time, + sampling_particles.t, sampling_particles.z, - sampling_particles.lat, - sampling_particles.lon, + sampling_particles.y, + sampling_particles.x, ] @@ -180,10 +182,10 @@ def _argo_sample_salinity(particles, fieldset): depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] sampling_particles.salinity = fieldset.S[ - sampling_particles.time, + sampling_particles.t, sampling_particles.z, - sampling_particles.lat, - sampling_particles.lon, + sampling_particles.y, + sampling_particles.x, ] @@ -220,11 +222,11 @@ def _handle_grounding( def _format_log_metadata(ptcls_subset, mask, fieldset): """Extracts and formats timestamps, latitudes, and longitudes for particles.""" - lats = ptcls_subset.lat[mask].astype(float) - lons = ptcls_subset.lon[mask].astype(float) + lats = ptcls_subset.y[mask].astype(float) + lons = ptcls_subset.x[mask].astype(float) time_origin = fieldset.U.data.time[0].values - times = ptcls_subset.time[mask].astype("timedelta64[s]") + time_origin + times = ptcls_subset.t[mask].astype("timedelta64[s]") + time_origin return times, lats, lons @@ -290,7 +292,7 @@ def simulate(self, measurements, out_path) -> None: shallow_waypoints = {} for i, m in enumerate(measurements): loc_bathy = fieldset.bathymetry.eval( - time=np.float64(0), + t=np.float64(0), z=0, y=m.spacetime.location.lat, x=m.spacetime.location.lon, @@ -313,10 +315,10 @@ def simulate(self, measurements, out_path) -> None: argo_float_particleset = ParticleSet( fieldset=fieldset, pclass=_ArgoParticle, - lat=[argo.spacetime.location.lat for argo in measurements], - lon=[argo.spacetime.location.lon for argo in measurements], + y=[argo.spacetime.location.lat for argo in measurements], + x=[argo.spacetime.location.lon for argo in measurements], z=[argo.min_depth for argo in measurements], - time=[np.datetime64(argo.spacetime.time) for argo in measurements], + t=[np.datetime64(argo.spacetime.time) for argo in measurements], min_depth=[argo.min_depth for argo in measurements], max_depth=[argo.max_depth for argo in measurements], drift_depth=[argo.drift_depth for argo in measurements], diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 6823cca8..1dfda753 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -55,59 +55,43 @@ class CTD: def _sample_temperature(particles, fieldset): particles.temperature = fieldset.T[ - particles.time, particles.z, particles.lat, particles.lon + particles.t, particles.z, particles.y, particles.x ] def _sample_salinity(particles, fieldset): - particles.salinity = fieldset.S[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.salinity = fieldset.S[particles.t, particles.z, particles.y, particles.x] ## bgc variables def _sample_o2(particles, fieldset): - particles.o2 = fieldset.o2[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.o2 = fieldset.o2[particles.t, particles.z, particles.y, particles.x] def _sample_chlorophyll(particles, fieldset): - particles.chl = fieldset.chl[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.chl = fieldset.chl[particles.t, particles.z, particles.y, particles.x] def _sample_nitrate(particles, fieldset): - particles.no3 = fieldset.no3[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.no3 = fieldset.no3[particles.t, particles.z, particles.y, particles.x] def _sample_phosphate(particles, fieldset): - particles.po4 = fieldset.po4[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.po4 = fieldset.po4[particles.t, particles.z, particles.y, particles.x] def _sample_ph(particles, fieldset): - particles.ph = fieldset.ph[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.ph = fieldset.ph[particles.t, particles.z, particles.y, particles.x] def _sample_phytoplankton(particles, fieldset): - particles.phyc = fieldset.phyc[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.phyc = fieldset.phyc[particles.t, particles.z, particles.y, particles.x] def _sample_primary_production(particles, fieldset): - particles.nppv = fieldset.nppv[ - particles.time, particles.z, particles.lat, particles.lon - ] + particles.nppv = fieldset.nppv[particles.t, particles.z, particles.y, particles.x] ## cast @@ -224,10 +208,10 @@ def simulate(self, measurements, out_path) -> None: ctd_particleset = ParticleSet( fieldset=fieldset, pclass=_CTDParticle, - lon=[ctd.spacetime.location.lon for ctd in measurements], - lat=[ctd.spacetime.location.lat for ctd in measurements], + x=[ctd.spacetime.location.lon for ctd in measurements], + y=[ctd.spacetime.location.lat for ctd in measurements], z=[ctd.min_depth for ctd in measurements], - time=[np.datetime64(ctd.spacetime.time) for ctd in measurements], + t=[np.datetime64(ctd.spacetime.time) for ctd in measurements], max_depth=max_depths, min_depth=[ctd.min_depth for ctd in measurements], winch_speed=[WINCH_SPEED for _ in measurements], diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index c18088ee..a771b246 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -50,7 +50,7 @@ class Drifter: def _sample_temperature(particles, fieldset): particles.temperature = fieldset.T[ - particles.time, particles.z, particles.lat, particles.lon + particles.t, particles.z, particles.y, particles.x ] @@ -145,10 +145,10 @@ def simulate(self, measurements, out_path) -> None: drifter_particleset = ParticleSet( fieldset=fieldset, pclass=_DrifterParticle, - lat=lat_release, - lon=lon_release, + y=lat_release, + x=lon_release, z=[drifter.depth for drifter in measurements], - time=[np.datetime64(drifter.spacetime.time) for drifter in measurements], + t=[np.datetime64(drifter.spacetime.time) for drifter in measurements], has_lifetime=[ 1 if drifter.lifetime is not None else 0 for drifter in measurements ], diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index c5149a7a..302d991f 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -40,12 +40,12 @@ class Underwater_ST: # define function sampling Salinity def _sample_salinity(particles, fieldset): - particles.S = fieldset.S[particles.time, particles.z, particles.lat, particles.lon] + particles.S = fieldset.S[particles.t, particles.z, particles.y, particles.x] # define function sampling Temperature def _sample_temperature(particles, fieldset): - particles.T = fieldset.T[particles.time, particles.z, particles.lat, particles.lon] + particles.T = fieldset.T[particles.t, particles.z, particles.y, particles.x] # ===================================================== @@ -103,9 +103,9 @@ def simulate(self, measurements, out_path) -> None: particleset = ParticleSet( fieldset=fieldset, pclass=_ShipSTParticle, - lon=0.0, - lat=0.0, - depth=DEPTH, + x=0.0, + y=0.0, + z=DEPTH, ) out_file = ParticleFile(path=out_path, outputdt=np.inf) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index bc5f5ecf..92f6b3f2 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -53,7 +53,7 @@ class XBT: def _sample_temperature(particles, fieldset): particles.temperature = fieldset.T[ - particles.time, particles.z, particles.lat, particles.lon + particles.t, particles.z, particles.y, particles.x ] @@ -163,10 +163,10 @@ def simulate(self, measurements, out_path) -> None: xbt_particleset = ParticleSet( fieldset=fieldset, pclass=_XBTParticle, - lon=[xbt.spacetime.location.lon for xbt in measurements], - lat=[xbt.spacetime.location.lat for xbt in measurements], + x=[xbt.spacetime.location.lon for xbt in measurements], + y=[xbt.spacetime.location.lat for xbt in measurements], z=[xbt.min_depth for xbt in measurements], - time=[np.datetime64(xbt.spacetime.time) for xbt in measurements], + t=[np.datetime64(xbt.spacetime.time) for xbt in measurements], max_depth=max_depths, min_depth=[xbt.min_depth for xbt in measurements], fall_speed=[xbt.fall_speed for xbt in measurements], From d8bd0743e163873192b7087ce4e9de37afdc1c86 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:55:05 +0200 Subject: [PATCH 048/191] performance step: windowed arrays --- src/virtualship/instruments/base.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 4986eae9..b84cc854 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -227,7 +227,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) - fs.to_windowed_arrays() # TODO: for enhanced performance in Parcels v4, Parcels-side recommendations may change in the future... + fs = fs.to_windowed_arrays() # TODO: for enhanced performance in Parcels v4, Parcels-side recommendations may change in the future... fieldsets_list.append(fs) @@ -235,16 +235,16 @@ def _generate_fieldset(self) -> parcels.FieldSet: for fs, key in zip(fieldsets_list[1:], keys[1:], strict=False): base_fieldset.add_field(getattr(fs, key)) - # # some instruments use AdvectionRKn kernels which require a combined UV vector field - # # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet - # if "U" in keys and "V" in keys: - # uv = parcels.VectorField( - # "UV", - # base_fieldset.U, - # base_fieldset.V, - # interp_method=parcels.interpolators.XLinear_Velocity, - # ) - # base_fieldset.add_field(uv) + # some instruments use AdvectionRKn kernels which require a combined UV vector field + # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet + if "U" in keys and "V" in keys: + uv = parcels.VectorField( + "UV", + base_fieldset.U, + base_fieldset.V, + interp_method=parcels.interpolators.XLinear_Velocity(), + ) + base_fieldset.add_field(uv) return base_fieldset From ca3ba1f20f26fceddde3f1fdab38d1f6b2404a73 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:55:12 +0200 Subject: [PATCH 049/191] time -> t --- src/virtualship/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 98fdb866..9cb028f3 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -572,7 +572,7 @@ def _compute_max_depths(measurements, fieldset) -> list[float]: z=0, y=m.spacetime.location.lat, x=m.spacetime.location.lon, - time=np.float64(0), + t=np.float64(0), )[0], ) for m in measurements From c7406308e60136ae0117f059540243ab9da67a1a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 16 Jul 2026 09:31:30 +0200 Subject: [PATCH 050/191] fix argo bug, min_depth spec to avoid immediately error out of bounds --- src/virtualship/instruments/argo_float.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index bca082e9..b18c91ba 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -60,8 +60,6 @@ class ArgoFloat: def _argo_float_vertical_movement(particles, fieldset): - breakpoint() - # Split particles based on their current cycle_phase ptcls0 = particles[particles.cycle_phase == 0] ptcls1 = particles[particles.cycle_phase == 1] @@ -151,7 +149,7 @@ def _check_error(particles, fieldset): ) ) print( - "WARNING: Error(s) found during Argo Float simulation but the expedition will continue...\n\n" + "\nWARNING: Error(s) found during Argo Float simulation but the expedition will continue...\n\n" f"Error code(s): {error_details}\n\n" "If ErrorOutOfBounds, consider reducing the lifetime in Argo Float config " "(the fieldset spatial bounds are constrained under-the-hood). For further advice " @@ -311,15 +309,18 @@ def simulate(self, measurements, out_path) -> None: argo_float_config.sensors, _ARGO_NONSENSOR_VARIABLES ) + # in case fieldset depth is smaller than the config min_depth, possible when min_depth config is 0 and fieldset surface is ~ -0.4... + grid_shallowest = fieldset.U.grid.depth[-1] + # define parcel particles argo_float_particleset = ParticleSet( fieldset=fieldset, pclass=_ArgoParticle, y=[argo.spacetime.location.lat for argo in measurements], x=[argo.spacetime.location.lon for argo in measurements], - z=[argo.min_depth for argo in measurements], + z=[min(argo.min_depth, grid_shallowest) for argo in measurements], t=[np.datetime64(argo.spacetime.time) for argo in measurements], - min_depth=[argo.min_depth for argo in measurements], + min_depth=[min(argo.min_depth, grid_shallowest) for argo in measurements], max_depth=[argo.max_depth for argo in measurements], drift_depth=[argo.drift_depth for argo in measurements], vertical_speed=[argo.vertical_speed for argo in measurements], From abb5380a3b32efe68de2294ebb45bbad92683e9c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 17 Jul 2026 11:57:17 +0200 Subject: [PATCH 051/191] remove ds.load/to_windowed_arrays experiments --- src/virtualship/instruments/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index b84cc854..cc406def 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -208,6 +208,8 @@ def _generate_fieldset(self) -> parcels.FieldSet: ds = xr.open_mfdataset([data_dir.joinpath(f) for f in files]) + # TODO: for the local data it's useful to sel the relevant depth layer(s), in case the user's data is full depth + else: # stream via Copernicus Marine Service ds = self._get_copernicus_ds( time_buffer, @@ -227,7 +229,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) - fs = fs.to_windowed_arrays() # TODO: for enhanced performance in Parcels v4, Parcels-side recommendations may change in the future... fieldsets_list.append(fs) From 583fc7b038853af3ff34c706b1a3f79cae78c696 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 20 Jul 2026 13:20:15 +0200 Subject: [PATCH 052/191] lon -> x --- src/virtualship/instruments/ctd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 1dfda753..48164ca7 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -237,7 +237,7 @@ def simulate(self, measurements, out_path) -> None: ) # there should be no particles left, as they delete themselves when they resurface - if len(ctd_particleset.lon) != 0: + if len(ctd_particleset.x) != 0: raise ValueError( "Simulation ended before CTD resurfaced. This most likely means the field time dimension did not match the simulation time span." ) From f2becc0c7dd540e219a862826d85c83a2cdb7460 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 20 Jul 2026 15:15:45 +0200 Subject: [PATCH 053/191] use vertical_axis arg for depth convention --- src/virtualship/instruments/base.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index cc406def..1595f5e4 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -176,6 +176,9 @@ def _get_copernicus_ds( minimum_depth=depth_min, maximum_depth=depth_max, coordinates_selection_method="outside", + service="arco-geo-series", + chunk_size_limit=1, + vertical_axis="elevation", ) def _generate_fieldset(self) -> parcels.FieldSet: @@ -218,9 +221,9 @@ def _generate_fieldset(self) -> parcels.FieldSet: ) field_var_name = var - # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) - ds["depth"] = -ds["depth"] - ds = ds.reindex(depth=ds["depth"][::-1]) + # # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) + # ds["depth"] = -ds["depth"] + # ds = ds.reindex(depth=ds["depth"][::-1]) # TODO: update when decision on handling of nans/0s in v4 is made (i.e. https://github.com/Parcels-code/Parcels/issues/2393) ds = ds.fillna(0) From ae980592e251f2c2f10626e0020ce46e213b1f18 Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 22 Jul 2026 14:44:14 +0200 Subject: [PATCH 054/191] Refactor dataset retrieval specs (#359) * small refactor: consolidate spacetime_buffer_size and limit_spec dicts for clarity * to FetchSpec dataclass * new test for FetchSpec class --- src/virtualship/instruments/adcp.py | 8 +--- src/virtualship/instruments/argo_float.py | 16 +++----- src/virtualship/instruments/base.py | 37 ++++++++++--------- src/virtualship/instruments/ctd.py | 8 +--- src/virtualship/instruments/drifter.py | 20 ++++------ .../instruments/ship_underwater_st.py | 12 +----- src/virtualship/instruments/xbt.py | 8 +--- tests/instruments/test_base.py | 17 ++++++++- 8 files changed, 57 insertions(+), 69 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 49a08120..26c8122d 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -5,7 +5,7 @@ import numpy as np from parcels import ParticleFile, ParticleSet -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import build_particle_class_from_sensors, register_instrument @@ -61,9 +61,6 @@ class ADCPInstrument(Instrument): def __init__(self, expedition, from_data): """Initialize ADCPInstrument.""" variables = expedition.instruments_config.adcp_config.active_variables() - limit_spec = { - "spatial": True - } # spatial limits; lat/lon constrained to waypoint locations + buffer super().__init__( expedition, @@ -71,8 +68,7 @@ def __init__(self, expedition, from_data): add_bathymetry=False, allow_time_extrapolation=True, verbose_progress=False, - spacetime_buffer_size=None, - limit_spec=limit_spec, + fetch_spec=FetchSpec(), from_data=from_data, ) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index b18c91ba..96b8e4f0 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -7,7 +7,7 @@ from parcels import ParticleFile, ParticleSet, StatusCode, Variable from parcels.kernels import AdvectionRK2 -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime @@ -253,14 +253,11 @@ def __init__(self, expedition, from_data): "V": "vo", **sensor_variables, } # advection variables (U and V) are always required for argo float simulation; sensor variables come from config - spacetime_buffer_size = { - "latlon": 3.0, # [degrees] - "time": expedition.instruments_config.argo_float_config.lifetime.total_seconds() + fetch_spec = FetchSpec( + latlon_buffer=3.0, # [degrees] + time_buffer=expedition.instruments_config.argo_float_config.lifetime.total_seconds() / (24 * 3600), # [days] - } - limit_spec = { - "spatial": True, # spatial limits; lat/lon constrained to waypoint locations + buffer - } + ) super().__init__( expedition, @@ -268,8 +265,7 @@ def __init__(self, expedition, from_data): add_bathymetry=True, allow_time_extrapolation=False, verbose_progress=True, - spacetime_buffer_size=spacetime_buffer_size, - limit_spec=limit_spec, + fetch_spec=fetch_spec, from_data=from_data, ) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 1595f5e4..f07bc0cf 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -2,6 +2,7 @@ import abc import collections +from dataclasses import dataclass from datetime import timedelta from itertools import pairwise from pathlib import Path @@ -28,6 +29,17 @@ from virtualship.models import Expedition +@dataclass +class FetchSpec: + """Fetch constraints and parameters for dataset retrieval.""" + + spatial: bool = True + latlon_buffer: float = 0.25 # degrees + time_buffer: float = 0.0 # days + depth_min: float | None = None + depth_max: float | None = None + + class Instrument(abc.ABC): """Base class for instruments and their simulation.""" @@ -50,8 +62,7 @@ def __init__( allow_time_extrapolation: bool, verbose_progress: bool, from_data: Path | None, - spacetime_buffer_size: dict | None = None, - limit_spec: dict | None = None, + fetch_spec: FetchSpec | None = None, ): """Initialise instrument.""" self.expedition = expedition @@ -67,8 +78,7 @@ def __init__( self.add_bathymetry = add_bathymetry self.allow_time_extrapolation = allow_time_extrapolation self.verbose_progress = verbose_progress - self.spacetime_buffer_size = spacetime_buffer_size - self.limit_spec = limit_spec + self.fetch_spec = fetch_spec or FetchSpec() wp_lats, wp_lons = _get_waypoint_latlons(expedition.schedule.waypoints) wp_times = [ @@ -152,12 +162,10 @@ def _get_copernicus_ds( variable=var if not physical else None, ) - latlon_buffer = self._get_spec_value( - "buffer", "latlon", 0.25 - ) # [degrees]; default 0.25 deg buffer to ensure coverage in field cell edge cases - depth_min = self._get_spec_value("limit", "depth_min", None) - depth_max = self._get_spec_value("limit", "depth_max", None) - spatial_constraint = self._get_spec_value("limit", "spatial", True) + latlon_buffer = self.fetch_spec.latlon_buffer + depth_min = self.fetch_spec.depth_min + depth_max = self.fetch_spec.depth_max + spatial_constraint = self.fetch_spec.spatial min_lon_bound = self.min_lon - latlon_buffer if spatial_constraint else None max_lon_bound = self.max_lon + latlon_buffer if spatial_constraint else None @@ -176,8 +184,6 @@ def _get_copernicus_ds( minimum_depth=depth_min, maximum_depth=depth_max, coordinates_selection_method="outside", - service="arco-geo-series", - chunk_size_limit=1, vertical_axis="elevation", ) @@ -190,7 +196,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: fieldsets_list = [] keys = list(self.variables.keys()) - time_buffer = self._get_spec_value("buffer", "time", 0.0) + time_buffer = self.fetch_spec.time_buffer for key in keys: var = self.variables[key] @@ -251,8 +257,3 @@ def _generate_fieldset(self) -> parcels.FieldSet: base_fieldset.add_field(uv) return base_fieldset - - def _get_spec_value(self, spec_type: str, key: str, default=None): - """Helper to extract a value from spacetime_buffer_size or limit_spec.""" - spec = self.spacetime_buffer_size if spec_type == "buffer" else self.limit_spec - return spec.get(key) if spec and spec.get(key) is not None else default diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 48164ca7..d6764130 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -7,7 +7,7 @@ from parcels import ParticleFile, ParticleSet, Variable from parcels._core.statuscodes import StatusCode -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( @@ -142,9 +142,6 @@ class CTDInstrument(Instrument): def __init__(self, expedition, from_data): """Initialize CTDInstrument.""" variables = expedition.instruments_config.ctd_config.active_variables() - limit_spec = { - "spatial": True - } # spatial limits; lat/lon constrained to waypoint locations + buffer super().__init__( expedition, @@ -152,8 +149,7 @@ def __init__(self, expedition, from_data): add_bathymetry=True, allow_time_extrapolation=True, verbose_progress=False, - spacetime_buffer_size=None, - limit_spec=limit_spec, + fetch_spec=FetchSpec(), from_data=from_data, ) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index a771b246..6319831e 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -8,7 +8,7 @@ from parcels._core.statuscodes import StatusCode from parcels.kernels import AdvectionRK2 -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime @@ -88,20 +88,17 @@ def __init__(self, expedition, from_data): "V": "vo", **sensor_variables, } # advection variables (U and V) are always required for drifter simulation; sensor variables come from config - spacetime_buffer_size = { - "latlon": None, - "time": expedition.instruments_config.drifter_config.lifetime.total_seconds() + fetch_spec = FetchSpec( + latlon_buffer=30.0, # TODO: generous buffer to limit tmp file size download, can potentially be removed in the future as and when Parcels streaming performance improves (see #358) + time_buffer=expedition.instruments_config.drifter_config.lifetime.total_seconds() / (24 * 3600), # [days] - } - limit_spec = { - "spatial": False, # no spatial limits; generate global fieldset - "depth_min": abs( + depth_min=abs( expedition.instruments_config.drifter_config.depth_meter ), # [meters] - "depth_max": abs( + depth_max=abs( expedition.instruments_config.drifter_config.depth_meter ), # [meters] - } + ) super().__init__( expedition, @@ -109,8 +106,7 @@ def __init__(self, expedition, from_data): add_bathymetry=False, allow_time_extrapolation=False, verbose_progress=True, - spacetime_buffer_size=spacetime_buffer_size, - limit_spec=limit_spec, + fetch_spec=fetch_spec, from_data=from_data, ) diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 302d991f..1dc7522a 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -5,7 +5,7 @@ import numpy as np from parcels import ParticleFile, ParticleSet -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( @@ -67,13 +67,6 @@ def __init__(self, expedition, from_data): variables = ( expedition.instruments_config.ship_underwater_st_config.active_variables() ) - spacetime_buffer_size = { - "latlon": 0.25, # [degrees] - "time": 0.0, # [days] - } - limit_spec = { - "spatial": True - } # spatial limits; lat/lon constrained to waypoint locations + buffer super().__init__( expedition, @@ -81,8 +74,7 @@ def __init__(self, expedition, from_data): add_bathymetry=False, allow_time_extrapolation=True, verbose_progress=False, - spacetime_buffer_size=spacetime_buffer_size, - limit_spec=limit_spec, + fetch_spec=FetchSpec(), from_data=from_data, ) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 92f6b3f2..7046fde1 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -7,7 +7,7 @@ from parcels import ParticleFile, ParticleSet, Variable from parcels._core.statuscodes import StatusCode -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime @@ -95,9 +95,6 @@ class XBTInstrument(Instrument): def __init__(self, expedition, from_data): """Initialize XBTInstrument.""" variables = expedition.instruments_config.xbt_config.active_variables() - limit_spec = { - "spatial": True - } # spatial limits; lat/lon constrained to waypoint locations + buffer super().__init__( expedition, @@ -105,8 +102,7 @@ def __init__(self, expedition, from_data): add_bathymetry=True, allow_time_extrapolation=True, verbose_progress=False, - spacetime_buffer_size=None, - limit_spec=limit_spec, + fetch_spec=FetchSpec(), from_data=from_data, ) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index a17f95bf..1b090cb9 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -2,11 +2,26 @@ import pytest -from virtualship.instruments.base import Instrument +from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.types import InstrumentType from virtualship.utils import get_instrument_class +def test_FetchSpec(): + fetch_spec = FetchSpec() + + # test that default values are set + assert fetch_spec.latlon_buffer is not None + assert fetch_spec.time_buffer is not None + + # test setting values (in new instance) and that original is unchanged in memory + fetch_spec2 = FetchSpec(latlon_buffer=0.5, time_buffer=1.0) + assert fetch_spec2.latlon_buffer == 0.5 + assert fetch_spec2.time_buffer == 1.0 + + assert fetch_spec.latlon_buffer != fetch_spec2.latlon_buffer + + def test_all_instruments_have_instrument_class(): for instrument in InstrumentType: instrument_class = get_instrument_class(instrument) From 391b9305cb021d83f4ee8fabc85f55f3fad47539 Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 23 Jul 2026 11:19:35 +0200 Subject: [PATCH 055/191] add tmp file write/read step (#358) * add tmp file write/read step * small refactor: consolidate spacetime_buffer_size and limit_spec dicts for clarity * to FetchSpec dataclass * add tmp file write/read step * remove depth axis reversal now using depth='elevation' in copernicusmarine.open_dataset() * tidy up todo * small update: fetch spec to match changes implemented in #359 * add test for _via_tmp_ds * add to_windowed_arrays() back in --- src/virtualship/instruments/base.py | 21 ++++++++++++----- src/virtualship/instruments/drifter.py | 2 +- tests/instruments/test_base.py | 31 +++++++++++++++++++++----- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index f07bc0cf..bbb32889 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -2,6 +2,7 @@ import abc import collections +import tempfile from dataclasses import dataclass from datetime import timedelta from itertools import pairwise @@ -192,6 +193,9 @@ def _generate_fieldset(self) -> parcels.FieldSet: Create and combine FieldSets for each variable, supporting both local and Copernicus Marine data sources. N.B. Per variable avoids issues when using copernicusmarine and creating directly one FieldSet of ds's sourced from different Copernicus Marine product IDs (which can also have different temporal resolutions), which is often the case for BGC variables. + + Includes an intermediate step of writing to tmp files, as per https://github.com/Parcels-code/parcels-benchmarks/pull/49 + TODO: the need for this step may be removed as Parcels x copernicusmarine integration improves, tracked in https://github.com/Parcels-code/Parcels/issues/2756 and xref'd in VirtualShip #357 (https://github.com/Parcels-code/virtualship/issues/357) """ fieldsets_list = [] keys = list(self.variables.keys()) @@ -227,17 +231,15 @@ def _generate_fieldset(self) -> parcels.FieldSet: ) field_var_name = var - # # negate depth and reindex (to suit Parcels XGrid strictly increasing depth convention) - # ds["depth"] = -ds["depth"] - # ds = ds.reindex(depth=ds["depth"][::-1]) - - # TODO: update when decision on handling of nans/0s in v4 is made (i.e. https://github.com/Parcels-code/Parcels/issues/2393) + # TODO: to be removed when Parcels #2746 is merged (i.e. https://github.com/Parcels-code/Parcels/pull/2746) ds = ds.fillna(0) fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + ds_fset = self._via_tmp_ds(ds_fset) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) + fs.to_windowed_arrays() # always to windowed arrays, just in case any ds is Dask backed fieldsets_list.append(fs) @@ -257,3 +259,12 @@ def _generate_fieldset(self) -> parcels.FieldSet: base_fieldset.add_field(uv) return base_fieldset + + @staticmethod + def _via_tmp_ds(ds) -> xr.Dataset: + """Create and re-load a temporary local dataset.""" + tmpdir = tempfile.TemporaryDirectory() + tmp_fpath = Path(tmpdir.name).joinpath("tmp.nc") + ds.to_netcdf(tmp_fpath) + del ds + return xr.open_dataset(tmp_fpath) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 6319831e..3b52dc71 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -89,7 +89,7 @@ def __init__(self, expedition, from_data): **sensor_variables, } # advection variables (U and V) are always required for drifter simulation; sensor variables come from config fetch_spec = FetchSpec( - latlon_buffer=30.0, # TODO: generous buffer to limit tmp file size download, can potentially be removed in the future as and when Parcels streaming performance improves (see #358) + latlon_buffer=30.0, # TODO: generous buffer to reduce tmp file footprint, can potentially be removed in the future as/when Parcels streaming performance improves (see #358) time_buffer=expedition.instruments_config.drifter_config.lifetime.total_seconds() / (24 * 3600), # [days] depth_min=abs( diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index 1b090cb9..93a38e90 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -1,6 +1,7 @@ from unittest.mock import MagicMock, patch import pytest +import xarray as xr from virtualship.instruments.base import FetchSpec, Instrument from virtualship.instruments.types import InstrumentType @@ -89,25 +90,43 @@ def test_execute_calls_simulate(monkeypatch): dummy.simulate.assert_called_once() -def test_get_spec_value_buffer_and_limit(): +def test_fetch_spec_applied_to_instrument(): + """FetchSpec values are correctly stored on the instrument.""" mock_waypoint = MagicMock() mock_waypoint.location.latitude = 1.0 mock_waypoint.location.longitude = 2.0 mock_schedule = MagicMock() mock_schedule.waypoints = [mock_waypoint] + fetch_spec = FetchSpec(latlon_buffer=5.0, depth_min=10.0) dummy = DummyInstrument( expedition=MagicMock(schedule=mock_schedule), variables={"A": "a"}, add_bathymetry=False, allow_time_extrapolation=False, verbose_progress=False, - spacetime_buffer_size={"latlon": 5.0}, - limit_spec={"depth_min": 10.0}, + fetch_spec=fetch_spec, from_data=None, ) - assert dummy._get_spec_value("buffer", "latlon", 0.0) == 5.0 - assert dummy._get_spec_value("limit", "depth_min", None) == 10.0 - assert dummy._get_spec_value("buffer", "missing", 42) == 42 + assert dummy.fetch_spec.latlon_buffer == 5.0 + assert dummy.fetch_spec.depth_min == 10.0 + # unset values use dataclass defaults + assert dummy.fetch_spec.time_buffer == 0.0 + assert dummy.fetch_spec.depth_max is None + + +def test_via_tmp_ds_roundtrip(): + """_via_tmp_ds writes to a tmp file and re-opens it.""" + ds = xr.Dataset( + {"temperature": (["x", "y"], [[1.0, 2.0], [3.0, 4.0]])}, + coords={"x": [0, 1], "y": [10, 20]}, + ) + result = Instrument._via_tmp_ds(ds) + + assert isinstance(result, xr.Dataset) + assert "temperature" in result + assert ( + result is not ds + ) # result is new object loaded from tmp file, not the original def test_generate_fieldset_combines_fields(monkeypatch): From 1ca6860f8daf64a128c9333dedae3fc9fa5f51ef Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 27 Jul 2026 13:31:04 +0200 Subject: [PATCH 056/191] `to_windowed_arrays` only for non-underway instruments (#361) * instrument type property, conditional windowed arrays * add instrument_type/is_underway property tests to ADCP instrument tests * update tests across all instruments for instrument type property/is underway, incl. some refactoring * clean-up for review * Apply suggestions from code review Co-authored-by: Erik van Sebille --------- Co-authored-by: Erik van Sebille --- src/virtualship/instruments/base.py | 13 +- tests/instruments/test_adcp.py | 87 +++++++------ tests/instruments/test_argo_float.py | 14 +++ tests/instruments/test_ctd.py | 125 +++++++++---------- tests/instruments/test_drifter.py | 10 ++ tests/instruments/test_ship_underwater_st.py | 73 +++++++---- tests/instruments/test_xbt.py | 74 +++++++---- 7 files changed, 242 insertions(+), 154 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index bbb32889..80deeb02 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -15,8 +15,10 @@ from yaspin import yaspin from virtualship.errors import CopernicusCatalogueError +from virtualship.instruments.types import InstrumentType from virtualship.utils import ( COPERNICUSMARINE_PHYS_VARIABLES, + INSTRUMENT_CLASS_MAP, _find_files_in_timerange, _find_nc_file_with_variable, _get_bathy_data, @@ -239,7 +241,11 @@ def _generate_fieldset(self) -> parcels.FieldSet: ds_fset = self._via_tmp_ds(ds_fset) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) - fs.to_windowed_arrays() # always to windowed arrays, just in case any ds is Dask backed + + # non-underway instruments to windowed arrays, just in case any ds is Dask backed + # underway instruments should not to converted to windowed arrays, as they use one direct fieldset.eval() call which could cause a big memory usage if the fieldset is windowed + if not self.instrument_type.is_underway: + fs = fs.to_windowed_arrays() fieldsets_list.append(fs) @@ -268,3 +274,8 @@ def _via_tmp_ds(ds) -> xr.Dataset: ds.to_netcdf(tmp_fpath) del ds return xr.open_dataset(tmp_fpath) + + @property + def instrument_type(self) -> InstrumentType: + """Return the InstrumentType for this instrument instance.""" + return next(k for k, v in INSTRUMENT_CLASS_MAP.items() if type(self) is v) diff --git a/tests/instruments/test_adcp.py b/tests/instruments/test_adcp.py index 48e9e17c..16604b67 100644 --- a/tests/instruments/test_adcp.py +++ b/tests/instruments/test_adcp.py @@ -1,32 +1,64 @@ """Test the simulation of ADCP instruments.""" import datetime +from typing import ClassVar import numpy as np import pydantic import pytest import xarray as xr - from parcels import FieldSet + from virtualship.instruments.adcp import ADCPInstrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models import Location, Spacetime, Waypoint from virtualship.models.expedition import ADCPConfig, InstrumentsConfig, SensorConfig +# ===================================================== +# Shared constants and fixtures +# ===================================================== -def test_simulate_adcp(tmpdir) -> None: - MAX_DEPTH = -1000 - MIN_DEPTH = -5 - NUM_BINS = 40 +BASE_TIME = datetime.datetime.strptime( + "1950-01-01", "%Y-%m-%d" +) # arbitrary time offset for the dummy fieldset +MAX_DEPTH = -1000 +NUM_BINS = 40 + + +@pytest.fixture +def adcp_expedition(): + """Minimal Expedition for ADCPInstrument instantiation.""" + + class DummyExpedition: + class schedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=InstrumentType.ADCP, + ), + ] + + instruments_config = InstrumentsConfig( + adcp_config=ADCPConfig( + max_depth_meter=MAX_DEPTH, + num_bins=NUM_BINS, + period_minutes=5.0, + sensors=[SensorConfig(sensor_type=SensorType.VELOCITY)], + ) + ) + + return DummyExpedition() - # arbitrary time offset for the dummy fieldset - base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") + +def test_simulate_adcp(tmpdir, adcp_expedition) -> None: + MIN_DEPTH = -5 # where to sample sample_points = [ - Spacetime(Location(1, 2), base_time + datetime.timedelta(seconds=0)), - Spacetime(Location(3, 4), base_time + datetime.timedelta(seconds=1)), + Spacetime(Location(1, 2), BASE_TIME + datetime.timedelta(seconds=0)), + Spacetime(Location(3, 4), BASE_TIME + datetime.timedelta(seconds=1)), ] # expected observations at sample points @@ -36,14 +68,14 @@ def test_simulate_adcp(tmpdir) -> None: "U": {"surface": 7, "max_depth": 8}, "lat": sample_points[0].location.lat, "lon": sample_points[0].location.lon, - "time": base_time + datetime.timedelta(seconds=0), + "time": BASE_TIME + datetime.timedelta(seconds=0), }, { "V": {"surface": 9, "max_depth": 10}, "U": {"surface": 11, "max_depth": 12}, "lat": sample_points[1].location.lat, "lon": sample_points[1].location.lon, - "time": base_time + datetime.timedelta(seconds=1), + "time": BASE_TIME + datetime.timedelta(seconds=1), }, ] @@ -79,31 +111,7 @@ def test_simulate_adcp(tmpdir) -> None: }, ) - # dummy expedition for ADCPInstrument - class DummyExpedition: - class schedule: - # ruff: noqa - waypoints = [ - Waypoint( - location=Location(1, 2), - time=base_time, - instrument=InstrumentType.ADCP, - ), - ] - - instruments_config = InstrumentsConfig( - adcp_config=ADCPConfig( - max_depth_meter=MAX_DEPTH, - num_bins=NUM_BINS, - period_minutes=5.0, - sensors=[SensorConfig(sensor_type=SensorType.VELOCITY)], - ) - ) - - expedition = DummyExpedition() - from_data = None - - adcp_instrument = ADCPInstrument(expedition, from_data) + adcp_instrument = ADCPInstrument(adcp_expedition, from_data=None) out_path = tmpdir.join("out.zarr") adcp_instrument.load_input_data = lambda: fieldset @@ -183,3 +191,10 @@ def test_adcp_config_unsupported_sensor_rejected(): period_minutes=30.0, sensors=[SensorConfig(sensor_type=SensorType.TEMPERATURE)], ) + + +def test_adcp_instrument_type(adcp_expedition): + """ADCPInstrument returns the correct InstrumentType and if is underway instrument.""" + adcp_instrument = ADCPInstrument(adcp_expedition, from_data=None) + assert adcp_instrument.instrument_type == InstrumentType.ADCP + assert adcp_instrument.instrument_type.is_underway diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index 1a61673a..c56b6d4c 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -10,6 +10,7 @@ from virtualship.instruments.argo_float import ArgoFloat, ArgoFloatInstrument from virtualship.instruments.sensors import SensorType +from virtualship.instruments.types import InstrumentType from virtualship.models import Location, Spacetime from virtualship.models.expedition import ( ArgoFloatConfig, @@ -239,3 +240,16 @@ def test_argo_fieldoutofbounds_error(tmpdir) -> None: # TODO: capturing the warnings in the tests is complicated by the Parcels C-level print statements; but the logic of not crashing on out-of-bounds is tested if the test simulation runs # TODO: when using Parcels v4, this test can become much more robust by capturing the specific warning as well + + +def test_argo_float_instrument_type(): + """ArgoFloatInstrument returns the correct InstrumentType and if is underway instrument.""" + sensors = [ + SensorConfig(sensor_type=SensorType.TEMPERATURE), + SensorConfig(sensor_type=SensorType.SALINITY), + ] + expedition = create_dummy_expedition(sensors) + + argo_instrument = ArgoFloatInstrument(expedition, from_data=None) + assert argo_instrument.instrument_type == InstrumentType.ARGO_FLOAT + assert not argo_instrument.instrument_type.is_underway diff --git a/tests/instruments/test_ctd.py b/tests/instruments/test_ctd.py index c080f0f5..29eb758a 100644 --- a/tests/instruments/test_ctd.py +++ b/tests/instruments/test_ctd.py @@ -10,8 +10,8 @@ import pydantic import pytest import xarray as xr - from parcels import Field, FieldSet + from virtualship.instruments.ctd import CTD, CTDInstrument from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -23,18 +23,43 @@ Waypoint, ) +BASE_TIME = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") +MIN_DEPTH = -11 +MAX_DEPTH = -2000 +STATIONKEEPING_TIME = 50 + + +def create_dummy_expedition( + sensors, lifetime=datetime.timedelta(days=1), location=(1, 2) +): + """Create a DummyExpedition class with specified sensors and parameters.""" + + class DummyExpedition: + class schedule: + waypoints: list[Waypoint] = [ # noqa: RUF012 + Waypoint(location=Location(*location), time=BASE_TIME) + ] + + instruments_config = InstrumentsConfig( + ctd_config=CTDConfig( + stationkeeping_time_minutes=STATIONKEEPING_TIME, + min_depth_meter=MIN_DEPTH, + max_depth_meter=MAX_DEPTH, + sensors=sensors, + ) + ) + + return DummyExpedition() + def test_simulate_ctds(tmpdir) -> None: """Test that CTDInstrument simulates measurements correctly, incuding sampling physical and bgc variables.""" - # arbitrary time offset for the dummy fieldset - base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") - # where to cast CTDs ctds = [ CTD( spacetime=Spacetime( location=Location(latitude=0, longitude=1), - time=base_time + datetime.timedelta(hours=0), + time=BASE_TIME + datetime.timedelta(hours=0), ), min_depth=0, max_depth=float("-inf"), @@ -42,7 +67,7 @@ def test_simulate_ctds(tmpdir) -> None: CTD( spacetime=Spacetime( location=Location(latitude=1, longitude=0), - time=base_time, + time=BASE_TIME, ), min_depth=0, max_depth=float("-inf"), @@ -132,8 +157,8 @@ def test_simulate_ctds(tmpdir) -> None: {"V": v, "U": u, "T": t, "S": s, "o2": o2, "chl": chl, "no3": no3}, { "time": [ - np.datetime64(base_time + datetime.timedelta(hours=0)), - np.datetime64(base_time + datetime.timedelta(hours=1)), + np.datetime64(BASE_TIME + datetime.timedelta(hours=0)), + np.datetime64(BASE_TIME + datetime.timedelta(hours=1)), ], "depth": [-1000, 0], "lat": [0, 1], @@ -142,33 +167,15 @@ def test_simulate_ctds(tmpdir) -> None: ) fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) - # dummy expedition for CTDInstrument - class DummyExpedition: - class schedule: - # ruff: noqa - waypoints = [ - Waypoint( - location=Location(1, 2), - time=base_time, - ), - ] - - instruments_config = InstrumentsConfig( - ctd_config=CTDConfig( - stationkeeping_time_minutes=50, - min_depth_meter=-11.0, - max_depth_meter=-2000.0, - sensors=[ - SensorConfig(sensor_type=SensorType.TEMPERATURE), - SensorConfig(sensor_type=SensorType.SALINITY), - SensorConfig(sensor_type=SensorType.OXYGEN), - SensorConfig(sensor_type=SensorType.CHLOROPHYLL), - SensorConfig(sensor_type=SensorType.NITRATE), - ], - ) - ) + sensors = [ + SensorConfig(sensor_type=SensorType.TEMPERATURE), + SensorConfig(sensor_type=SensorType.SALINITY), + SensorConfig(sensor_type=SensorType.OXYGEN), + SensorConfig(sensor_type=SensorType.CHLOROPHYLL), + SensorConfig(sensor_type=SensorType.NITRATE), + ] - expedition = DummyExpedition() + expedition = create_dummy_expedition(sensors) from_data = None ctd_instrument = CTDInstrument(expedition, from_data) @@ -278,22 +285,11 @@ def test_ctd_disabled_sensor_absent(tmpdir) -> None: ) fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) - class DummyExpedition: - class schedule: - waypoints = [Waypoint(location=Location(1, 2), time=base_time)] - - instruments_config = InstrumentsConfig( - ctd_config=CTDConfig( - stationkeeping_time_minutes=50, - min_depth_meter=-11.0, - max_depth_meter=-2000.0, - sensors=[ - SensorConfig(sensor_type=SensorType.TEMPERATURE) - ], # SALINITY omitted = disabled - ) - ) + sensors = ( + [SensorConfig(sensor_type=SensorType.TEMPERATURE)], + ) # SALINITY omitted = disabled - expedition = DummyExpedition() + expedition = create_dummy_expedition(sensors) ctd_instrument = CTDInstrument(expedition, None) out_path = tmpdir.join("out_disabled.zarr") ctd_instrument.load_input_data = lambda: fieldset @@ -387,23 +383,12 @@ def test_sensor_absent(tmpdir) -> None: ) fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) - class DummyExpedition: - class schedule: - waypoints = [Waypoint(location=Location(1, 2), time=base_time)] - - instruments_config = InstrumentsConfig( - ctd_config=CTDConfig( - stationkeeping_time_minutes=50, - min_depth_meter=-11.0, - max_depth_meter=-2000.0, - sensors=[ - SensorConfig(sensor_type=SensorType.OXYGEN), - # CHLOROPHYLL omitted = disabled - ], - ) - ) + sensors = [ + SensorConfig(sensor_type=SensorType.OXYGEN), + # CHLOROPHYLL omitted = disabled + ] - expedition = DummyExpedition() + expedition = create_dummy_expedition(sensors) ctd_instrument = CTDInstrument(expedition, None) out_path = tmpdir.join("out_bgc_disabled.zarr") ctd_instrument.load_input_data = lambda: fieldset @@ -412,3 +397,13 @@ class schedule: results = xr.open_zarr(out_path) assert "o2" in results, "Enabled BGC sensor variable must be present" assert "chl" not in results, "Disabled sensor variable must be absent from output" + + +def test_ctd_instrument_type(): + """CTDInstrument returns the correct InstrumentType and if is underway instrument.""" + sensors = [SensorConfig(sensor_type=SensorType.TEMPERATURE)] # only need one + expedition = create_dummy_expedition(sensors) + + ctd_instrument = CTDInstrument(expedition, from_data=None) + assert ctd_instrument.instrument_type == InstrumentType.CTD + assert not ctd_instrument.instrument_type.is_underway diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 56f3257e..0b115374 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -11,6 +11,7 @@ from virtualship.instruments.drifter import Drifter, DrifterInstrument from virtualship.instruments.sensors import SensorType +from virtualship.instruments.types import InstrumentType from virtualship.models import Location, Spacetime from virtualship.models.expedition import ( DrifterConfig, @@ -232,3 +233,12 @@ def test_drifter_config_unsupported_sensor_rejected(): stationkeeping_time_minutes=10, sensors=[SensorConfig(sensor_type=SensorType.VELOCITY)], ) + + +def test_drifter_instrument_type(): + """DrifterInstrument returns the correct InstrumentType and if is underway instrument.""" + expedition = create_dummy_expedition() + + drifter_instrument = DrifterInstrument(expedition, from_data=None) + assert drifter_instrument.instrument_type == InstrumentType.DRIFTER + assert not drifter_instrument.instrument_type.is_underway diff --git a/tests/instruments/test_ship_underwater_st.py b/tests/instruments/test_ship_underwater_st.py index 9c879d48..016734a1 100644 --- a/tests/instruments/test_ship_underwater_st.py +++ b/tests/instruments/test_ship_underwater_st.py @@ -1,15 +1,17 @@ """Test the simulation of ship salinity temperature measurements.""" import datetime +from typing import ClassVar import numpy as np import pydantic import pytest import xarray as xr - from parcels import FieldSet -from virtualship.instruments.ship_underwater_st import Underwater_STInstrument + from virtualship.instruments.sensors import SensorType +from virtualship.instruments.ship_underwater_st import Underwater_STInstrument +from virtualship.instruments.types import InstrumentType from virtualship.models import Location, Spacetime from virtualship.models.expedition import ( InstrumentsConfig, @@ -18,8 +20,40 @@ Waypoint, ) +BASE_TIME = datetime.datetime.strptime( + "1950-01-01", "%Y-%m-%d" +) # arbitrary time offset for the dummy fieldset +PERIOD = 5.0 # minutes + + +@pytest.fixture +def underwater_st_expedition(): + """Minimal Expedition for Underwater_STInstrument instantiation.""" + + class DummyExpedition: + class schedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=InstrumentType.UNDERWATER_ST, + ), + ] + + instruments_config = InstrumentsConfig( + ship_underwater_st_config=ShipUnderwaterSTConfig( + period_minutes=PERIOD, + sensors=[ + SensorConfig(sensor_type=SensorType.TEMPERATURE), + SensorConfig(sensor_type=SensorType.SALINITY), + ], + ) + ) -def test_simulate_ship_underwater_st(tmpdir) -> None: + return DummyExpedition() + + +def test_simulate_ship_underwater_st(tmpdir, underwater_st_expedition) -> None: # arbitrary time offset for the dummy fieldset base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") @@ -76,31 +110,9 @@ def test_simulate_ship_underwater_st(tmpdir) -> None: }, ) - # dummy expedition for Underwater_STInstrument - class DummyExpedition: - class schedule: - # ruff: noqa - waypoints = [ - Waypoint( - location=Location(1, 2), - time=base_time, - ), - ] - - instruments_config = InstrumentsConfig( - ship_underwater_st_config=ShipUnderwaterSTConfig( - period_minutes=5.0, - sensors=[ - SensorConfig(sensor_type=SensorType.TEMPERATURE), - SensorConfig(sensor_type=SensorType.SALINITY), - ], - ) - ) - - expedition = DummyExpedition() from_data = None - st_instrument = Underwater_STInstrument(expedition, from_data) + st_instrument = Underwater_STInstrument(underwater_st_expedition, from_data) out_path = tmpdir.join("out.zarr") st_instrument.load_input_data = lambda: fieldset @@ -180,3 +192,12 @@ def test_underwater_st_config_unsupported_sensor_rejected(): period_minutes=5.0, sensors=[SensorConfig(sensor_type=SensorType.OXYGEN)], ) + + +def test_underwater_st_instrument_type(underwater_st_expedition): + """Underwater_STInstrument returns the correct InstrumentType and if is underway instrument.""" + underwater_st_instrument = Underwater_STInstrument( + underwater_st_expedition, from_data=None + ) + assert underwater_st_instrument.instrument_type == InstrumentType.UNDERWATER_ST + assert underwater_st_instrument.instrument_type.is_underway diff --git a/tests/instruments/test_xbt.py b/tests/instruments/test_xbt.py index 0ac3a7cb..ac4af1a7 100644 --- a/tests/instruments/test_xbt.py +++ b/tests/instruments/test_xbt.py @@ -5,15 +5,17 @@ """ import datetime +from typing import ClassVar import numpy as np import pydantic import pytest import xarray as xr - from parcels import Field, FieldSet -from virtualship.instruments.xbt import XBT, XBTInstrument + from virtualship.instruments.sensors import SensorType +from virtualship.instruments.types import InstrumentType +from virtualship.instruments.xbt import XBT, XBTInstrument from virtualship.models import Location, Spacetime from virtualship.models.expedition import ( InstrumentsConfig, @@ -22,8 +24,43 @@ XBTConfig, ) +BASE_TIME = datetime.datetime.strptime( + "1950-01-01", "%Y-%m-%d" +) # arbitrary time offset for the dummy fieldset +MIN_DEPTH = -2.0 +MAX_DEPTH = -285.0 +FALL_SPEED = 6.7 +DECELERATION_COEFFICIENT = 0.00225 + + +@pytest.fixture +def xbt_expedition(): + """Minimal Expedition for Underwater_STInstrument instantiation.""" + + class DummyExpedition: + class schedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=InstrumentType.XBT, + ), + ] + + instruments_config = InstrumentsConfig( + xbt_config=XBTConfig( + min_depth_meter=MIN_DEPTH, + max_depth_meter=MAX_DEPTH, + fall_speed_meter_per_second=FALL_SPEED, + deceleration_coefficient=DECELERATION_COEFFICIENT, + sensors=[SensorConfig(sensor_type=SensorType.TEMPERATURE)], + ) + ) + + return DummyExpedition() + -def test_simulate_xbts(tmpdir) -> None: +def test_simulate_xbts(tmpdir, xbt_expedition) -> None: # arbitrary time offset for the dummy fieldset base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") @@ -104,31 +141,9 @@ def test_simulate_xbts(tmpdir) -> None: ) fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) - # dummy expedition for XBTInstrument - class DummyExpedition: - class schedule: - # ruff: noqa - waypoints = [ - Waypoint( - location=Location(1, 2), - time=base_time, - ), - ] - - instruments_config = InstrumentsConfig( - xbt_config=XBTConfig( - min_depth_meter=-2.0, - max_depth_meter=-285.0, - fall_speed_meter_per_second=6.7, - deceleration_coefficient=0.00225, - sensors=[SensorConfig(sensor_type=SensorType.TEMPERATURE)], - ) - ) - - expedition = DummyExpedition() from_data = None - xbt_instrument = XBTInstrument(expedition, from_data) + xbt_instrument = XBTInstrument(xbt_expedition, from_data) out_path = tmpdir.join("out.zarr") xbt_instrument.load_input_data = lambda: fieldset @@ -208,3 +223,10 @@ def test_xbt_config_unsupported_sensor_rejected(): deceleration_coefficient=0.00225, sensors=[SensorConfig(sensor_type=SensorType.SALINITY)], ) + + +def test_xbt_instrument_type(xbt_expedition): + """XBTInstrument returns the correct InstrumentType and if is underway instrument.""" + xbt_instrument = XBTInstrument(xbt_expedition, from_data=None) + assert xbt_instrument.instrument_type == InstrumentType.XBT + assert not xbt_instrument.instrument_type.is_underway From 4dfa96f414d5239b09f9b3efdb920f617d77a95c Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 31 Jul 2026 11:31:19 +0200 Subject: [PATCH 057/191] Update underway (#360) * first changes; Parcels v4 API * move to using field.eval for UV sampling, plus call to custom write-to-parquet * custom write-to-parquet for underway instruments * instrument type property, conditional windowed arrays * tidy up * sample individual U and V fields for m s-1 units * fix u, v sampling to use correct sampling and conversions * new intermediate UnderwayInstrument base class (parquet writing moved over from utils), change kernels to special-case underway kernels * fix intermediate class logic so that sensor_kernels check is only triggered for final instrument child classes * remove support for depth as None * use coords for adcp 'kernel' * add validtion to UnderwayCoordinates class, rename func * migrate UnderwaterST instrument to new underway instrument logic * fix func name * add new tests and refine for intermediate UnderwayInstrument class * update ADCP tests * tidy up comments * update UnderwaterST tests * use fieldset.time_interval.left / right for fieldset start / end times * particle_id is constant for underway instruments * dt and state are unnecessary for public facing output * add test for monitoring for schema drift vs. parcels, plus some refactoring * Update tests/instruments/test_base.py Co-authored-by: Erik van Sebille * remove dev spinner bypass option * parcels simulation only needs one write step --------- Co-authored-by: Erik van Sebille --- src/virtualship/instruments/adcp.py | 125 ++++----- src/virtualship/instruments/base.py | 166 ++++++++++- src/virtualship/instruments/ctd.py | 8 +- .../instruments/ship_underwater_st.py | 115 ++++---- src/virtualship/instruments/xbt.py | 8 +- tests/instruments/test_adcp.py | 69 ++--- tests/instruments/test_base.py | 259 +++++++++++++++++- tests/instruments/test_ship_underwater_st.py | 95 +++---- 8 files changed, 599 insertions(+), 246 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index 26c8122d..bd253230 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -1,48 +1,38 @@ from collections.abc import Callable -from dataclasses import dataclass from typing import ClassVar import numpy as np -from parcels import ParticleFile, ParticleSet +import parcels -from virtualship.instruments.base import FetchSpec, Instrument +from virtualship.instruments.base import ( + FetchSpec, + UnderwayCoordinates, + UnderwayInstrument, +) from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType -from virtualship.utils import build_particle_class_from_sensors, register_instrument +from virtualship.utils import register_instrument # ===================================================== -# SECTION: Dataclass +# SECTION: Kernels # ===================================================== -@dataclass -class ADCP: - """ADCP configuration.""" - - name: ClassVar[str] = "ADCP" - - -# ===================================================== -# SECTION: non-sensor Particle Variables (non-sampling) -# ===================================================== - -# ADCP has no non-sensor variables, only sensor variables. -_ADCP_NONSENSOR_VARIABLES: list = [] +# N.B. underway 'kernels' are special cases, where the particleset is not needed, and the kernel is not passed to `pset.execute()` as would be done for a typical Parcels workflow. +# Instead, the 'kernel' function is used only once to evaluate the fieldset at given times, depths, lats, lons. -# ===================================================== -# SECTION: Kernels -# ===================================================== +def _sample_underway_velocity(fieldset: parcels.FieldSet, coords: UnderwayCoordinates): + # eval + u, v = fieldset.UV.eval( + t=coords.times, z=coords.depths, x=coords.lons, y=coords.lats + ) + # convert from degrees s-1 to metres s-1 + u = u * 1852 * 60 * np.cos(np.deg2rad(coords.lats)) + v = v * 1852 * 60 -def _sample_velocity(particles, fieldset): - particles.U, particles.V = fieldset.UV.eval( - particles.t, - particles.z, - particles.x, - particles.y, - applyConversion=False, - ) + return u, v # ===================================================== @@ -51,11 +41,11 @@ def _sample_velocity(particles, fieldset): @register_instrument(InstrumentType.ADCP) -class ADCPInstrument(Instrument): +class ADCPInstrument(UnderwayInstrument): """ADCP instrument class.""" sensor_kernels: ClassVar[dict[SensorType, Callable]] = { - SensorType.VELOCITY: _sample_velocity, + SensorType.VELOCITY: _sample_underway_velocity, } def __init__(self, expedition, from_data): @@ -74,9 +64,9 @@ def __init__(self, expedition, from_data): def simulate(self, measurements, out_path) -> None: """Simulate ADCP measurements.""" - config_max_depth = ( - self.expedition.instruments_config.adcp_config.max_depth_meter - ) + adcp_config = self.expedition.instruments_config.adcp_config + + config_max_depth = adcp_config.max_depth_meter if config_max_depth < -1600.0: print( @@ -87,53 +77,42 @@ def simulate(self, measurements, out_path) -> None: MAX_DEPTH = config_max_depth MIN_DEPTH = -5.0 - NUM_BINS = self.expedition.instruments_config.adcp_config.num_bins + NUM_BINS = adcp_config.num_bins measurements.sort(key=lambda p: p.time) fieldset = self.load_input_data() - # build dynamic particle class from the active sensors - adcp_config = self.expedition.instruments_config.adcp_config - _ADCPParticle = build_particle_class_from_sensors( - adcp_config.sensors, _ADCP_NONSENSOR_VARIABLES + # times in seconds since fieldset time origin, expanded across depth bins + fieldset_starttime = fieldset.time_interval.left + times = np.array( + [ + (np.datetime64(point.time) - fieldset_starttime) + / np.timedelta64(1, "s") + for point in measurements + ] ) + lons = np.array([point.location.lon for point in measurements]) + lats = np.array([point.location.lat for point in measurements]) bins = np.linspace(MAX_DEPTH, MIN_DEPTH, NUM_BINS) - num_particles = len(bins) - particleset = ParticleSet( - fieldset=fieldset, - pclass=_ADCPParticle, - x=np.full( - num_particles, 0.0 - ), # initial lat/lon are irrelevant and will be overruled later - y=np.full(num_particles, 0.0), - z=bins, - ) - - out_file = ParticleFile(path=out_path, outputdt=np.inf) - # build kernel list from active sensors only - sampling_kernels = [ - self.sensor_kernels[sc.sensor_type] - for sc in adcp_config.sensors - if sc.enabled and sc.sensor_type in self.sensor_kernels - ] - - # TODO: need to overhaul ADCP/underway instruments generally... don't think this Parcels API works anymore - # TODO: a good time to implement https://github.com/Parcels-code/virtualship/issues/231 + # full sampling coordinates + coords = UnderwayCoordinates( + times=np.repeat(times, NUM_BINS), + lons=np.repeat(lons, NUM_BINS), + lats=np.repeat(lats, NUM_BINS), + depths=np.tile(bins, len(times)), + ) - for point in measurements: - particleset.lon_nextloop[:] = point.location.lon - particleset.lat_nextloop[:] = point.location.lat - particleset.time_nextloop[:] = fieldset.time_origin.reltime( - np.datetime64(point.time) - ) + sampled = self._sample_underway( + config_sensors=adcp_config.sensors, fieldset=fieldset, coords=coords + ) - particleset.execute( - sampling_kernels, - dt=1, - runtime=1, - verbose_progress=self.verbose_progress, - output_file=out_file, - ) + self._to_parquet( + dat_arrays=sampled, + var_names=self.variables.keys(), + fieldset_time_origin=fieldset_starttime, + out_path=out_path, + coords=coords, + ) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 80deeb02..ce0f8324 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -2,15 +2,19 @@ import abc import collections +import inspect import tempfile from dataclasses import dataclass from datetime import timedelta from itertools import pairwise from pathlib import Path -from typing import TYPE_CHECKING, ClassVar +from typing import TYPE_CHECKING, ClassVar, Literal import copernicusmarine +import numpy as np import parcels +import pyarrow as pa +import pyarrow.parquet as pq import xarray as xr from yaspin import yaspin @@ -50,8 +54,11 @@ class Instrument(abc.ABC): sensor_kernels: ClassVar[dict[SensorType, collections.abc.Callable]] def __init_subclass__(cls, **kwargs: object) -> None: - """Ensure subclasses define sensor_kernels as class attribute.""" + """Ensure non-abstract subclasses (i.e. final/concrete instrument classes) define sensor_kernels as a class attribute.""" super().__init_subclass__(**kwargs) + if inspect.isabstract(cls): + return + if "sensor_kernels" not in cls.__dict__: raise TypeError( f"Instrument subclass '{cls.__name__}' must define 'sensor_kernels' as a class attribute." @@ -132,20 +139,17 @@ def simulate( def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" - TMP = True # TODO: just for dev; remove before merging instrument_name = self.__class__.__name__.split("Instrument")[0] if not self.verbose_progress: - if TMP: - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: - self.simulate(measurements, out_path) - spinner.ok("✅\n") - else: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: self.simulate(measurements, out_path) + spinner.ok("✅\n") + else: print(f"Simulating {instrument_name} measurements... ") self.simulate(measurements, out_path) @@ -279,3 +283,141 @@ def _via_tmp_ds(ds) -> xr.Dataset: def instrument_type(self) -> InstrumentType: """Return the InstrumentType for this instrument instance.""" return next(k for k, v in INSTRUMENT_CLASS_MAP.items() if type(self) is v) + + +@dataclass(frozen=True) +class UnderwayCoordinates: + """1D sampling location arrays for underway instruments.""" + + times: np.ndarray # seconds since origin + lons: np.ndarray + lats: np.ndarray + depths: np.ndarray + + def __post_init__(self): + """Validate that all arrays are 1D and have the same length.""" + shapes = { + "times": self.times.shape, + "lons": self.lons.shape, + "lats": self.lats.shape, + "depths": self.depths.shape, + } + + for name, shape in shapes.items(): + if len(shape) != 1: + raise ValueError(f"Array '{name}' must be 1D, but got shape {shape}.") + + n = len(self.times) + if not (len(self.lons) == len(self.lats) == len(self.depths) == n): + raise ValueError( + f"Array length mismatch in UnderwayCoordinates: " + f"times={len(self.times)}, lons={len(self.lons)}, " + f"lats={len(self.lats)}, depths={len(self.depths)}" + ) + + +class UnderwayInstrument(Instrument): + """Intermediate base class for underway instruments, which perform variable sampling without ParticleSets.""" + + def _sample_underway( + self, + config_sensors: list, + fieldset: parcels.FieldSet, + coords: UnderwayCoordinates, + ): + """Perform variable sampling for underway instruments and their active sensors.""" + sampling_kernels = [ + self.sensor_kernels[sc.sensor_type] + for sc in config_sensors + if sc.enabled and sc.sensor_type in self.sensor_kernels + ] # active sensors only + + sampled = [ + kernel(fieldset, coords) for kernel in sampling_kernels + ] # perform sampling + + # ensure that sampled is a flat list of arrays, even if some kernels return tuples/lists of arrays + # e.g. ADCP kernel returns (u, v) tuple of arrays, whilst UnderwaterST returns single array of temperature/salinity + sampled_flat = [ + arr + for item in sampled + for arr in (item if isinstance(item, (tuple, list)) else (item,)) + ] + + return sampled_flat + + @staticmethod + def _to_parquet( + dat_arrays: list[np.ndarray], + var_names: list[str], + fieldset_time_origin: np.datetime64, + out_path: Path | str, + coords: UnderwayCoordinates, + compression: Literal["zstd", "gzip", "snappy", "brotli", None] = "zstd", + ) -> None: + """ + Write underway instrument data to a Parquet file mirroring the Parcels v4 ParticleFile schema. + + Designed so that output files can be re-read back in with Parcels.read_particlefile for consistent downstream workflows with non-underway instruments. + """ + assert len(dat_arrays) == len(var_names), ( + "dat_arrays and var_names must have the same length" + ) + + n = len(coords.times) + + origin_str = str(fieldset_time_origin).replace("T", " ") + t_metadata = {"units": f"seconds since {origin_str}", "calendar": "standard"} + + # base schema mirroring Parcels ParticleFile schema, not yet with sampled variables + base_schema = pa.schema( + [ + pa.field("t", pa.float64(), metadata=t_metadata), + pa.field("z", pa.float32()), + pa.field("y", pa.float32()), + pa.field("x", pa.float32()), + pa.field("particle_id", pa.int64()), + ], + metadata={ + "feature_type": "trajectory", + "Conventions": "CF-1.6/CF-1.7", + "ncei_template_version": "NCEI_NetCDF_Trajectory_Template_v2.0", + "parcels_version": parcels.__version__, + "parcels_grid_mesh": "spherical", + }, + ) + + for var in var_names: + base_schema = base_schema.append( + pa.field(var, pa.float32()) + ) # add sampled variable to schema + + out_path = Path(out_path) + if out_path.suffix != ".parquet": + raise ValueError( + f"out_path must end in '.parquet', got {out_path.suffix!r}" + ) + + # build table with all data, including sampled variables + table = pa.table( + { + "t": pa.array(coords.times.astype(np.float64)), + "z": pa.array(coords.depths.astype(np.float32)) + if coords.depths is not None + else pa.array(np.full(n, np.nan, dtype=np.float32)), + "y": pa.array(coords.lats.astype(np.float32)), + "x": pa.array(coords.lons.astype(np.float32)), + "particle_id": pa.array( + np.zeros(n, dtype=np.int64) + ), # ship is a single 'particle' (here represented by a constant particle_id of 0) + "dt": pa.array(np.full(n, np.nan, dtype=np.float64)), + "state": pa.array(np.zeros(n, dtype=np.int32)), + **{ + var: pa.array(dat.astype(np.float32)) + for var, dat in zip(var_names, dat_arrays, strict=True) + }, + }, + schema=base_schema, + ) + + pq.write_table(table, out_path, compression=compression) diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index d6764130..5b8cba61 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -168,12 +168,8 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() - # use first active field for time reference - _time_ref_key = next(iter(self.variables)) - _time_ref_field = getattr(fieldset, _time_ref_key) - - fieldset_starttime = _time_ref_field.data.time.isel(time=0).values - fieldset_endtime = _time_ref_field.data.time.isel(time=-1).values + fieldset_starttime = fieldset.time_interval.left + fieldset_endtime = fieldset.time_interval.right # deploy time for all ctds should be later than fieldset start time if not all( diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 1dc7522a..4aff0af5 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -1,51 +1,40 @@ from collections.abc import Callable -from dataclasses import dataclass from typing import ClassVar import numpy as np -from parcels import ParticleFile, ParticleSet +import parcels -from virtualship.instruments.base import FetchSpec, Instrument +from virtualship.instruments.base import ( + FetchSpec, + UnderwayCoordinates, + UnderwayInstrument, +) from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import ( - build_particle_class_from_sensors, register_instrument, ) -# ===================================================== -# SECTION: Dataclass -# ===================================================== - - -@dataclass -class Underwater_ST: - """Underwater_ST configuration.""" - - name: ClassVar[str] = "Underwater_ST" - - -# ===================================================== -# SECTION: non-sensor Particle Variables (non-sampling) -# ===================================================== - -# Underwater ST has no non-sensor variables, only sensor variables. -_ST_NONSENSOR_VARIABLES: list = [] - - # ===================================================== # SECTION: Kernels # ===================================================== +# N.B. underway 'kernels' are special cases, where the particleset is not needed, and the kernel is not passed to `pset.execute()` as would be done for a typical Parcels workflow. +# Instead, the 'kernel' function is used only once to evaluate the fieldset at given times, depths, lats, lons. -# define function sampling Salinity -def _sample_salinity(particles, fieldset): - particles.S = fieldset.S[particles.t, particles.z, particles.y, particles.x] +def _sample_underway_salinity(fieldset: parcels.FieldSet, coords: UnderwayCoordinates): + return fieldset.S.eval( + t=coords.times, z=coords.depths, x=coords.lons, y=coords.lats + ) -# define function sampling Temperature -def _sample_temperature(particles, fieldset): - particles.T = fieldset.T[particles.t, particles.z, particles.y, particles.x] + +def _sample_underway_temperature( + fieldset: parcels.FieldSet, coords: UnderwayCoordinates +): + return fieldset.T.eval( + t=coords.times, z=coords.depths, x=coords.lons, y=coords.lats + ) # ===================================================== @@ -54,12 +43,12 @@ def _sample_temperature(particles, fieldset): @register_instrument(InstrumentType.UNDERWATER_ST) -class Underwater_STInstrument(Instrument): +class Underwater_STInstrument(UnderwayInstrument): """Underwater_ST instrument class.""" sensor_kernels: ClassVar[dict[SensorType, Callable]] = { - SensorType.TEMPERATURE: _sample_temperature, - SensorType.SALINITY: _sample_salinity, + SensorType.TEMPERATURE: _sample_underway_temperature, + SensorType.SALINITY: _sample_underway_salinity, } def __init__(self, expedition, from_data): @@ -80,49 +69,37 @@ def __init__(self, expedition, from_data): def simulate(self, measurements, out_path) -> None: """Simulate underway salinity and temperature measurements.""" + st_config = self.expedition.instruments_config.ship_underwater_st_config + DEPTH = -2.0 measurements.sort(key=lambda p: p.time) fieldset = self.load_input_data() - # build dynamic particle class from the active sensors - st_config = self.expedition.instruments_config.ship_underwater_st_config - _ShipSTParticle = build_particle_class_from_sensors( - st_config.sensors, _ST_NONSENSOR_VARIABLES + # sampling times and locations + fieldset_starttime = fieldset.time_interval.left + times = np.array( + [ + (np.datetime64(point.time) - fieldset_starttime) + / np.timedelta64(1, "s") + for point in measurements + ] + ) + lons = np.array([point.location.lon for point in measurements]) + lats = np.array([point.location.lat for point in measurements]) + coords = UnderwayCoordinates( + times, lons, lats, depths=np.full_like(times, DEPTH) ) - particleset = ParticleSet( - fieldset=fieldset, - pclass=_ShipSTParticle, - x=0.0, - y=0.0, - z=DEPTH, + sampled = self._sample_underway( + config_sensors=st_config.sensors, fieldset=fieldset, coords=coords ) - out_file = ParticleFile(path=out_path, outputdt=np.inf) - - # build kernel list from active sensors only - sampling_kernels = [ - self.sensor_kernels[sc.sensor_type] - for sc in st_config.sensors - if sc.enabled and sc.sensor_type in self.sensor_kernels - ] - - # TODO: need to overhaul UNDERWATER_ST/underway instruments generally... don't think this Parcels API works anymore - # TODO: a good time to implement https://github.com/Parcels-code/virtualship/issues/231 - - for point in measurements: - particleset.lon_nextloop[:] = point.location.lon - particleset.lat_nextloop[:] = point.location.lat - particleset.time_nextloop[:] = fieldset.time_origin.reltime( - np.datetime64(point.time) - ) - - particleset.execute( - sampling_kernels, - dt=1, - runtime=1, - verbose_progress=self.verbose_progress, - output_file=out_file, - ) + self._to_parquet( + dat_arrays=sampled, + var_names=self.variables.keys(), + fieldset_time_origin=fieldset_starttime, + out_path=out_path, + coords=coords, + ) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 7046fde1..9de23092 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -120,12 +120,8 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() - # use first active field for time reference - _time_ref_key = next(iter(self.variables)) - _time_ref_field = getattr(fieldset, _time_ref_key) - - fieldset_starttime = _time_ref_field.data.time.isel(time=0).values - fieldset_endtime = _time_ref_field.data.time.isel(time=-1).values + fieldset_starttime = fieldset.time_interval.left + fieldset_endtime = fieldset.time_interval.right # deploy time for all xbts should be later than fieldset start time if not all( diff --git a/tests/instruments/test_adcp.py b/tests/instruments/test_adcp.py index 16604b67..ab13f99c 100644 --- a/tests/instruments/test_adcp.py +++ b/tests/instruments/test_adcp.py @@ -4,10 +4,11 @@ from typing import ClassVar import numpy as np +import parcels +import polars as pl import pydantic import pytest import xarray as xr -from parcels import FieldSet from virtualship.instruments.adcp import ADCPInstrument from virtualship.instruments.sensors import SensorType @@ -22,6 +23,7 @@ BASE_TIME = datetime.datetime.strptime( "1950-01-01", "%Y-%m-%d" ) # arbitrary time offset for the dummy fieldset +MIN_DEPTH = -5 MAX_DEPTH = -1000 NUM_BINS = 40 @@ -53,8 +55,6 @@ class schedule: def test_simulate_adcp(tmpdir, adcp_expedition) -> None: - MIN_DEPTH = -5 - # where to sample sample_points = [ Spacetime(Location(1, 2), BASE_TIME + datetime.timedelta(seconds=0)), @@ -93,53 +93,58 @@ def test_simulate_adcp(tmpdir, adcp_expedition) -> None: u[1, 0, 1, 1] = expected_obs[1]["U"]["max_depth"] u[1, 1, 1, 1] = expected_obs[1]["U"]["surface"] - fieldset = FieldSet.from_data( - { - "V": v, - "U": u, + # make ds + times = np.array([expected_obs[0]["time"], expected_obs[1]["time"]]) + lats = np.array([expected_obs[0]["lat"], expected_obs[1]["lat"]]) + lons = np.array([expected_obs[0]["lon"], expected_obs[1]["lon"]]) + + ds_fields = xr.Dataset( + data_vars={ + "U": (["time", "depth", "lat", "lon"], u, {"units": "m s-1"}), + "V": (["time", "depth", "lat", "lon"], v, {"units": "m s-1"}), }, - { - "lat": np.array([expected_obs[0]["lat"], expected_obs[1]["lat"]]), - "lon": np.array([expected_obs[0]["lon"], expected_obs[1]["lon"]]), - "depth": np.array([MAX_DEPTH, MIN_DEPTH]), - "time": np.array( - [ - np.datetime64(expected_obs[0]["time"]), - np.datetime64(expected_obs[1]["time"]), - ] - ), + coords={ + "time": ("time", times, {"axis": "T"}), + "depth": ("depth", [MAX_DEPTH, MIN_DEPTH], {"units": "m", "axis": "Z"}), + "lat": ("lat", lats, {"units": "degrees_north"}), + "lon": ("lon", lons, {"units": "degrees_east"}), }, ) + # to fieldset + fields = {"U": ds_fields["U"], "V": ds_fields["V"]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + adcp_instrument = ADCPInstrument(adcp_expedition, from_data=None) - out_path = tmpdir.join("out.zarr") + out_path = tmpdir.join("out.parquet") adcp_instrument.load_input_data = lambda: fieldset adcp_instrument.simulate(sample_points, out_path) - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - # test if output is as expected - assert len(results.trajectory) == NUM_BINS + assert np.unique(results["z"].to_numpy()).size == NUM_BINS # for every obs, check if the variables match the expected observations # we only verify at the surface and max depth of the adcp, because in between is tricky - for traj, vert_loc in [ - (results.trajectory[0], "max_depth"), - (results.trajectory[-1], "surface"), + for df_depth, vert_loc in [ + (results.filter(pl.col("z") == MAX_DEPTH), "max_depth"), + (results.filter(pl.col("z") == MIN_DEPTH), "surface"), ]: - obs_all = results.sel(trajectory=traj).obs - assert len(obs_all) == len(sample_points) - for i, (obs_i, exp) in enumerate(zip(obs_all, expected_obs, strict=True)): - obs = results.sel(trajectory=traj, obs=obs_i) - for var in ["lat", "lon"]: - obs_value = obs[var].values.item() - exp_value = exp[var] + assert len(df_depth) == len(sample_points) + + for i, (obs_i, exp) in enumerate( + zip(df_depth.iter_rows(named=True), expected_obs, strict=True) + ): + for var in [("y", "lat"), ("x", "lon")]: + obs_value = obs_i[var[0]] + exp_value = exp[var[1]] assert np.isclose(obs_value, exp_value), ( f"Observation incorrect {vert_loc=} {obs_i=} {var=} {obs_value=} {exp_value=}." ) for var in ["V", "U"]: - obs_value = obs[var].values.item() + obs_value = obs_i[var] exp_value = exp[var][vert_loc] assert np.isclose(obs_value, exp_value), ( f"Observation incorrect {vert_loc=} {i=} {var=} {obs_value=} {exp_value=}." diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index 93a38e90..e14bb630 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -1,12 +1,27 @@ +from dataclasses import dataclass +from typing import ClassVar from unittest.mock import MagicMock, patch +import numpy as np +import parcels +import pyarrow.parquet as pq import pytest import xarray as xr -from virtualship.instruments.base import FetchSpec, Instrument +from virtualship.instruments.base import ( + FetchSpec, + Instrument, + UnderwayCoordinates, + UnderwayInstrument, +) +from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.utils import get_instrument_class +# ============================================================================= +# Instrument base class testing +# ============================================================================= + def test_FetchSpec(): fetch_spec = FetchSpec() @@ -193,3 +208,245 @@ def test_instrument_subclass_without_sensor_kernels_error(): class ErrorInstrument(Instrument): def simulate(self, data_dir, measurements, out_path): pass + + +# ============================================================================= +# UnderwayInstrument intermediate class testing +# ============================================================================= + + +@dataclass +class DummySensorConfig: + """Mock sensor configuration.""" + + sensor_type: SensorType + enabled: bool = True + + +class ConcreteUnderwayInstrument(UnderwayInstrument): + """Concrete subclass of UnderwayInstrument for testing.""" + + sensor_kernels: ClassVar = { + SensorType.TEMPERATURE: lambda fieldset, coords: np.array( + [15.0, 16.0], dtype=np.float32 + ), + SensorType.SALINITY: lambda fieldset, coords: np.array( + [35.0, 35.1], dtype=np.float32 + ), + SensorType.VELOCITY: lambda fieldset, coords: ( + np.array([0.5, 0.6], dtype=np.float32), # U vector component + np.array([-0.1, -0.2], dtype=np.float32), # V vector component + ), + } + + def simulate(self, measurements, out_path) -> None: # noqa + pass + + +@pytest.fixture +def sample_underway_coords(): + """Fixture providing valid 1D UnderwayCoordinates.""" + return UnderwayCoordinates( + times=np.array([0.0, 3600.0]), + lons=np.array([-5.0, -5.1]), + lats=np.array([50.0, 50.1]), + depths=np.array([-2.0, -2.0]), + ) + + +@pytest.fixture +def dummy_underway_inst(): + """Bypass __init__ and requirements for expedition object etc. for testing.""" + return ConcreteUnderwayInstrument.__new__(ConcreteUnderwayInstrument) + + +def test_underway_coordinates_validation(): + """UnderwayCoordinates validates array lengths upon instantiation.""" + # valid coordinates work cleanly + coords = UnderwayCoordinates( + times=np.array([0.0, 1.0]), + lons=np.array([10.0, 11.0]), + lats=np.array([20.0, 21.0]), + depths=np.array([-1.0, -1.0]), + ) + assert len(coords.times) == 2 + + # mismatched array lengths raise ValueError + with pytest.raises(ValueError, match="Array length mismatch"): + UnderwayCoordinates( + times=np.array([0.0, 1.0]), + lons=np.array([10.0]), # length 1 vs 2 + lats=np.array([20.0, 21.0]), + depths=np.array([-1.0, -1.0]), + ) + + +def test_sample_underway_filters_and_flattens( + dummy_underway_inst, sample_underway_coords +): + """_sample_underway evaluates active sensors and flattens multi-output tuple kernels.""" + configs = [ + DummySensorConfig(SensorType.VELOCITY, enabled=True), + DummySensorConfig(SensorType.TEMPERATURE, enabled=True), + DummySensorConfig(SensorType.SALINITY, enabled=True), + ] + + sampled = dummy_underway_inst._sample_underway( + config_sensors=configs, + fieldset=None, + coords=sample_underway_coords, + ) + + assert len(sampled) == 4 # total flattened arrays (u, v, temp, sal) + np.testing.assert_array_equal(sampled[0], np.array([0.5, 0.6], dtype=np.float32)) + np.testing.assert_array_equal(sampled[1], np.array([-0.1, -0.2], dtype=np.float32)) + np.testing.assert_array_equal(sampled[2], np.array([15.0, 16.0], dtype=np.float32)) + np.testing.assert_array_equal(sampled[3], np.array([35.0, 35.1], dtype=np.float32)) + + +def test_to_parquet_writes_valid_file( + tmp_path, dummy_underway_inst, sample_underway_coords +): + """_to_parquet writes a valid Parquet table with expected schema metadata and data values.""" + out_path = tmp_path / "output.parquet" + dat_arrays = [ + np.array([15.0, 16.0], dtype=np.float32), + np.array([35.0, 35.1], dtype=np.float32), + ] + var_names = ["temp", "sal"] + origin = np.datetime64("2026-01-01T00:00:00") + + dummy_underway_inst._to_parquet( + dat_arrays=dat_arrays, + var_names=var_names, + fieldset_time_origin=origin, + out_path=out_path, + coords=sample_underway_coords, + ) + + assert out_path.exists() + + # verify parquet table, metadata, and columns + table = pq.read_table(out_path) + schema = table.schema + + assert table.column_names == [ + "t", + "z", + "y", + "x", + "particle_id", + "temp", + "sal", + ] + assert schema.metadata[b"feature_type"] == b"trajectory" + assert b"units" in schema.field("t").metadata + + np.testing.assert_array_equal( + table["x"].to_numpy(), np.array(sample_underway_coords.lons, dtype=np.float32) + ) + np.testing.assert_array_equal(table["temp"].to_numpy(), dat_arrays[0]) + + +def _create_underway_parquet( + out_path, + var_names, + dat_arrays=None, + origin=np.datetime64("2026-01-01T00:00:00"), # noqa +): + """Helper to generate an UnderwayInstrument parquet output file.""" + coords = UnderwayCoordinates( + times=np.array([0.0, 3600.0]), + lons=np.array([-5.0, -5.1]), + lats=np.array([50.0, 50.1]), + depths=np.array([-2.0, -2.0]), + ) + + if dat_arrays is None: + dat_arrays = [ + np.array([15.0, 16.0], dtype=np.float32), + np.array([35.0, 35.1], dtype=np.float32), + ] + + UnderwayInstrument._to_parquet( + dat_arrays=dat_arrays, + var_names=var_names, + fieldset_time_origin=origin, + out_path=out_path, + coords=coords, + ) + + +def dummy_sample_temperature(particles, fieldset): + particles.T = fieldset.T[particles.t, particles.z, particles.y, particles.x] + + +def test_parquet_openable_by_parcels_read_particlefile(tmp_path): + """Test that a parquet file written by _to_parquet can be read back by parcels.read_particlefile.""" + parquet_path = tmp_path / "test_particles.parquet" + _create_underway_parquet( + out_path=parquet_path, + var_names=["temp", "sal"], + dat_arrays=[ + np.array([15.0, 16.0], dtype=np.float32), + np.array([35.0, 35.1], dtype=np.float32), + ], + ) + + # read back and assert values + results = parcels.read_particlefile(parquet_path) + assert len(results) == 2 + assert np.isclose(results["temp"][0], 15.0) + assert np.isclose(results["sal"][1], 35.1) + + +def test_underway_schema_matches_parcels(tmp_path): + """Verify that underway instrument parquet output base schema matches Parcels' ParticleFile.""" + # minimal Parcels FieldSet + T = np.zeros((2, 1, 1)) + T[0, 0, 0], T[1, 0, 0] = 15.0, 16.0 + + t1 = np.datetime64("2024-01-01T00:00:00") + t2 = np.datetime64("2024-01-02T00:00:00") + ds_fields = xr.Dataset( + data_vars={"temperature": (["time", "lat", "lon"], T, {"units": "degC"})}, + coords={ + "time": ("time", [t1, t2], {"axis": "T"}), + "lat": ("lat", [0.0], {"units": "degrees_north"}), + "lon": ("lon", [0.0], {"units": "degrees_east"}), + }, + ) + + fields = {"T": ds_fields["temperature"]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + + # parcels simualtion + SampleParticle = parcels.Particle.add_variable(parcels.Variable("T")) + + pset = parcels.ParticleSet( + fieldset=fieldset, pclass=SampleParticle, t=t1, y=[0.0], x=[0.0] + ) + + parcels_path = tmp_path / "parcels_particles.parquet" + parcels_output = parcels.ParticleFile(parcels_path, outputdt=3600.0) + pset.execute( + [dummy_sample_temperature], + runtime=np.timedelta64(60, "m"), + dt=np.timedelta64(60, "m"), + output_file=parcels_output, + ) + parcels_df = parcels.read_particlefile(parcels_path) + + # UnderwayInstrument output + underway_path = tmp_path / "underway_particles.parquet" + _create_underway_parquet( + out_path=underway_path, + var_names=["T"], + dat_arrays=[np.array([15.0, 16.0], dtype=np.float32)], + origin=np.datetime64("2024-01-01T00:00:00"), + ) + underway_df = parcels.read_particlefile(underway_path) + + # assert schemas match + assert parcels_df.schema == underway_df.schema diff --git a/tests/instruments/test_ship_underwater_st.py b/tests/instruments/test_ship_underwater_st.py index 016734a1..1bf1689c 100644 --- a/tests/instruments/test_ship_underwater_st.py +++ b/tests/instruments/test_ship_underwater_st.py @@ -4,10 +4,10 @@ from typing import ClassVar import numpy as np +import parcels import pydantic import pytest import xarray as xr -from parcels import FieldSet from virtualship.instruments.sensors import SensorType from virtualship.instruments.ship_underwater_st import Underwater_STInstrument @@ -54,87 +54,88 @@ class schedule: def test_simulate_ship_underwater_st(tmpdir, underwater_st_expedition) -> None: - # arbitrary time offset for the dummy fieldset - base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") - # where to sample sample_points = [ - Spacetime(Location(1, 2), base_time + datetime.timedelta(seconds=0)), - Spacetime(Location(3, 4), base_time + datetime.timedelta(seconds=1)), + Spacetime(Location(1, 2), BASE_TIME + datetime.timedelta(seconds=0)), + Spacetime(Location(3, 4), BASE_TIME + datetime.timedelta(seconds=1)), ] # expected observations at sample points expected_obs = [ { - "salinity": 5, - "temperature": 6, + "S": 5, + "T": 6, "lat": sample_points[0].location.lat, "lon": sample_points[0].location.lon, - "time": base_time + datetime.timedelta(seconds=0), + "time": BASE_TIME + datetime.timedelta(seconds=0), }, { - "salinity": 7, - "temperature": 8, + "S": 7, + "T": 8, "lat": sample_points[1].location.lat, "lon": sample_points[1].location.lon, - "time": base_time + datetime.timedelta(seconds=1), + "time": BASE_TIME + datetime.timedelta(seconds=1), }, ] # create fieldset based on the expected observations # indices are time, latitude, longitude salinity = np.zeros((2, 2, 2)) - salinity[0, 0, 0] = expected_obs[0]["salinity"] - salinity[1, 1, 1] = expected_obs[1]["salinity"] + salinity[0, 0, 0] = expected_obs[0]["S"] + salinity[1, 1, 1] = expected_obs[1]["S"] temperature = np.zeros((2, 2, 2)) - temperature[0, 0, 0] = expected_obs[0]["temperature"] - temperature[1, 1, 1] = expected_obs[1]["temperature"] - - fieldset = FieldSet.from_data( - { - "V": np.zeros((2, 2, 2)), - "U": np.zeros((2, 2, 2)), - "S": salinity, - "T": temperature, + temperature[0, 0, 0] = expected_obs[0]["T"] + temperature[1, 1, 1] = expected_obs[1]["T"] + + # make ds + times = np.array([expected_obs[0]["time"], expected_obs[1]["time"]]) + lats = np.array([expected_obs[0]["lat"], expected_obs[1]["lat"]]) + lons = np.array([expected_obs[0]["lon"], expected_obs[1]["lon"]]) + + ds_fields = xr.Dataset( + data_vars={ + "T": (["time", "lat", "lon"], temperature, {"units": "degC"}), + "S": (["time", "lat", "lon"], salinity, {"units": "psu"}), }, - { - "lat": np.array([expected_obs[0]["lat"], expected_obs[1]["lat"]]), - "lon": np.array([expected_obs[0]["lon"], expected_obs[1]["lon"]]), - "time": np.array( - [ - np.datetime64(expected_obs[0]["time"]), - np.datetime64(expected_obs[1]["time"]), - ] - ), + coords={ + "time": ("time", times, {"axis": "T"}), + "lat": ("lat", lats, {"units": "degrees_north"}), + "lon": ("lon", lons, {"units": "degrees_east"}), }, ) - from_data = None + # to fieldset + fields = {"T": ds_fields["T"], "S": ds_fields["S"]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) - st_instrument = Underwater_STInstrument(underwater_st_expedition, from_data) - out_path = tmpdir.join("out.zarr") + st_instrument = Underwater_STInstrument(underwater_st_expedition, from_data=None) + out_path = tmpdir.join("out.parquet") st_instrument.load_input_data = lambda: fieldset - # The instrument expects measurements as sample_points st_instrument.simulate(sample_points, out_path) - # test if output is as expected - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - assert len(results.trajectory) == 1 # expect a single trajectory - traj = results.trajectory.item() - assert len(results.sel(trajectory=traj).obs) == len( - sample_points - ) # expect as many obs as sample points + # expect a single depth level + assert np.unique(results["z"].to_numpy()).size == 1 + + # expect as many obs as sample points (given the period is 5 minutes and the sample points are 1 second apart) + assert len(results) == len(sample_points) # for every obs, check if the variables match the expected observations for i, (obs_i, exp) in enumerate( - zip(results.sel(trajectory=traj).obs, expected_obs, strict=True) + zip(results.iter_rows(named=True), expected_obs, strict=True) ): - obs = results.sel(trajectory=traj, obs=obs_i) - for var in ["salinity", "temperature", "lat", "lon"]: - obs_value = obs[var].values.item() + for var in [("y", "lat"), ("x", "lon")]: + obs_value = obs_i[var[0]] + exp_value = exp[var[1]] + assert np.isclose(obs_value, exp_value), ( + f"Observation incorrect {obs_i=} {var=} {obs_value=} {exp_value=}." + ) + for var in ["T", "S"]: + obs_value = obs_i[var] exp_value = exp[var] assert np.isclose(obs_value, exp_value), ( f"Observation incorrect {i=} {var=} {obs_value=} {exp_value=}." From ebd2c0c1ddd4637973162b5fe477b3a85eb207a2 Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:05:06 +0200 Subject: [PATCH 058/191] Add initial Field sampling for non-underway instruments (#364) * new method for setting initial conditions for sampling variables * add initial sampling step to all (non-underway) instruments * move _sample_initial to staticmethod * refactor to use fixtures, add test for field initial condition sampling * use `pset` as sole argument Co-authored-by: Erik van Sebille --------- Co-authored-by: Erik van Sebille --- src/virtualship/instruments/argo_float.py | 5 ++ src/virtualship/instruments/base.py | 22 ++++++ src/virtualship/instruments/ctd.py | 3 + src/virtualship/instruments/drifter.py | 3 + src/virtualship/instruments/xbt.py | 3 + tests/instruments/test_base.py | 90 ++++++++++++++++------- 6 files changed, 98 insertions(+), 28 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 96b8e4f0..029a0aec 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -324,6 +324,11 @@ def simulate(self, measurements, out_path) -> None: drift_days=[argo.drift_days for argo in measurements], ) + # add initial conditions to sampling variables + self._sample_initial( + argo_float_particleset, fieldset, argo_float_config.sensors + ) + # define output file for the simulation out_file = ParticleFile( path=out_path, diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index ce0f8324..a9643718 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -279,6 +279,28 @@ def _via_tmp_ds(ds) -> xr.Dataset: del ds return xr.open_dataset(tmp_fpath) + @staticmethod + def _sample_initial( + pset: parcels.ParticleSet, + fieldset: parcels.FieldSet, + sensors_config: object, + ) -> parcels.ParticleSet: + """Perform initial Field sampling with ParticleSet.""" + for sensor in sensors_config: + if not sensor.enabled: + raise ValueError( + f"Attempted to initialise sensor '{sensor.sensor_type}' but it is not enabled in the expedition configuration." + ) + + fs_key = sensor.meta.fs_key + field = getattr(fieldset, fs_key) + particle_vars = [pv.name for pv in sensor.meta.particle_vars] + + for var in particle_vars: + setattr(pset, var, field[pset]) + + return pset + @property def instrument_type(self) -> InstrumentType: """Return the InstrumentType for this instrument instance.""" diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 5b8cba61..1291890d 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -209,6 +209,9 @@ def simulate(self, measurements, out_path) -> None: winch_speed=[WINCH_SPEED for _ in measurements], ) + # add initial conditions to sampling variables + self._sample_initial(ctd_particleset, fieldset, ctd_config.sensors) + # define output file for the simulation out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 3b52dc71..fe8b3738 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -154,6 +154,9 @@ def simulate(self, measurements, out_path) -> None: ], ) + # add initial conditions to sampling variables + self._sample_initial(drifter_particleset, fieldset, drifter_config.sensors) + # define output file for the simulation out_file = ParticleFile( path=out_path, diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 9de23092..c59e6996 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -164,6 +164,9 @@ def simulate(self, measurements, out_path) -> None: fall_speed=[xbt.fall_speed for xbt in measurements], ) + # add initial conditions to sampling variables + self._sample_initial(xbt_particleset, fieldset, xbt_config.sensors) + out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index e14bb630..aa725fb4 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -16,8 +16,48 @@ ) from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType +from virtualship.models.expedition import SensorConfig from virtualship.utils import get_instrument_class +# ============================================================================= +# Fixtures +# ============================================================================= + + +@pytest.fixture() +def fieldset(): + """Minimal Parcels FieldSet containing a temperature field.""" + T = np.zeros((2, 1, 1)) + T[0, 0, 0], T[1, 0, 0] = 15.0, 16.0 + + t1 = np.datetime64("2024-01-01T00:00:00") + t2 = np.datetime64("2024-01-02T00:00:00") + + ds_fields = xr.Dataset( + data_vars={"temperature": (["time", "lat", "lon"], T, {"units": "degC"})}, + coords={ + "time": ("time", [t1, t2], {"axis": "T"}), + "lat": ("lat", [0.0], {"units": "degrees_north"}), + "lon": ("lon", [0.0], {"units": "degrees_east"}), + }, + ) + + fields = {"T": ds_fields["temperature"]} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + return parcels.FieldSet.from_sgrid_conventions(ds_fset) + + +@pytest.fixture() +def pset(fieldset): + """Minimal ParticleSet initialized with a custom Particle class and the fieldset fixture.""" + SampleParticle = parcels.Particle.add_variable(parcels.Variable("temperature")) + t1 = np.datetime64("2024-01-01T00:00:00") + + return parcels.ParticleSet( + fieldset=fieldset, pclass=SampleParticle, t=t1, y=[0.0], x=[0.0] + ) + + # ============================================================================= # Instrument base class testing # ============================================================================= @@ -210,6 +250,24 @@ def simulate(self, data_dir, measurements, out_path): pass +def test_instrument_samples_initial_conditions(fieldset, pset): + """_sample_initial adds initial conditions to particles.""" + psetT_preinit = pset.temperature.copy() # before sampling initial conditions + + sensor_config = SensorConfig(sensor_type=SensorType.TEMPERATURE, enabled=True) + pset = Instrument._sample_initial(pset, fieldset, [sensor_config]) + + psetT_postinit = pset.temperature # once initialised + + assert not np.array_equal(psetT_preinit, psetT_postinit), ( + "Initial conditions were not added." + ) + + assert np.allclose(psetT_postinit, [15.0]), ( + "Initial conditions do not match expected values." + ) + + # ============================================================================= # UnderwayInstrument intermediate class testing # ============================================================================= @@ -378,7 +436,9 @@ def _create_underway_parquet( def dummy_sample_temperature(particles, fieldset): - particles.T = fieldset.T[particles.t, particles.z, particles.y, particles.x] + particles.temperature = fieldset.T[ + particles.t, particles.z, particles.y, particles.x + ] def test_parquet_openable_by_parcels_read_particlefile(tmp_path): @@ -400,34 +460,8 @@ def test_parquet_openable_by_parcels_read_particlefile(tmp_path): assert np.isclose(results["sal"][1], 35.1) -def test_underway_schema_matches_parcels(tmp_path): +def test_underway_schema_matches_parcels(tmp_path, pset): """Verify that underway instrument parquet output base schema matches Parcels' ParticleFile.""" - # minimal Parcels FieldSet - T = np.zeros((2, 1, 1)) - T[0, 0, 0], T[1, 0, 0] = 15.0, 16.0 - - t1 = np.datetime64("2024-01-01T00:00:00") - t2 = np.datetime64("2024-01-02T00:00:00") - ds_fields = xr.Dataset( - data_vars={"temperature": (["time", "lat", "lon"], T, {"units": "degC"})}, - coords={ - "time": ("time", [t1, t2], {"axis": "T"}), - "lat": ("lat", [0.0], {"units": "degrees_north"}), - "lon": ("lon", [0.0], {"units": "degrees_east"}), - }, - ) - - fields = {"T": ds_fields["temperature"]} - ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) - fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) - - # parcels simualtion - SampleParticle = parcels.Particle.add_variable(parcels.Variable("T")) - - pset = parcels.ParticleSet( - fieldset=fieldset, pclass=SampleParticle, t=t1, y=[0.0], x=[0.0] - ) - parcels_path = tmp_path / "parcels_particles.parquet" parcels_output = parcels.ParticleFile(parcels_path, outputdt=3600.0) pset.execute( From ac43f15365bf20786ded34b44f7ff65b8d0ad7c2 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:46:29 +0200 Subject: [PATCH 059/191] remove .fillna() now that it's in Parcels internals --- src/virtualship/instruments/base.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index a9643718..86b76f8b 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -237,9 +237,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: ) field_var_name = var - # TODO: to be removed when Parcels #2746 is merged (i.e. https://github.com/Parcels-code/Parcels/pull/2746) - ds = ds.fillna(0) - fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) ds_fset = self._via_tmp_ds(ds_fset) From 1e08b9656c95c4b24e45658150a3e2e065a84f68 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:45:38 +0200 Subject: [PATCH 060/191] via_tmp_ds is only needed when streaming data --- src/virtualship/instruments/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 86b76f8b..7f20c146 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -239,7 +239,9 @@ def _generate_fieldset(self) -> parcels.FieldSet: fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) - ds_fset = self._via_tmp_ds(ds_fset) + + if self.from_data is None: + ds_fset = self._via_tmp_ds(ds_fset) fs = parcels.FieldSet.from_sgrid_conventions(ds_fset) From c202418d6d149a96f9e4738156193dfbb202e484 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:46:36 +0200 Subject: [PATCH 061/191] FetchSpec takes the VirtualShip-native negative depth values --- src/virtualship/instruments/drifter.py | 8 ++------ tests/instruments/test_base.py | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index fe8b3738..b72b8ab0 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -92,12 +92,8 @@ def __init__(self, expedition, from_data): latlon_buffer=30.0, # TODO: generous buffer to reduce tmp file footprint, can potentially be removed in the future as/when Parcels streaming performance improves (see #358) time_buffer=expedition.instruments_config.drifter_config.lifetime.total_seconds() / (24 * 3600), # [days] - depth_min=abs( - expedition.instruments_config.drifter_config.depth_meter - ), # [meters] - depth_max=abs( - expedition.instruments_config.drifter_config.depth_meter - ), # [meters] + depth_min=expedition.instruments_config.drifter_config.depth_meter, # [meters] + depth_max=expedition.instruments_config.drifter_config.depth_meter, # [meters] ) super().__init__( diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index aa725fb4..7d662076 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -152,7 +152,7 @@ def test_fetch_spec_applied_to_instrument(): mock_waypoint.location.longitude = 2.0 mock_schedule = MagicMock() mock_schedule.waypoints = [mock_waypoint] - fetch_spec = FetchSpec(latlon_buffer=5.0, depth_min=10.0) + fetch_spec = FetchSpec(latlon_buffer=5.0, depth_min=-10.0) dummy = DummyInstrument( expedition=MagicMock(schedule=mock_schedule), variables={"A": "a"}, @@ -163,7 +163,7 @@ def test_fetch_spec_applied_to_instrument(): from_data=None, ) assert dummy.fetch_spec.latlon_buffer == 5.0 - assert dummy.fetch_spec.depth_min == 10.0 + assert dummy.fetch_spec.depth_min == -10.0 # unset values use dataclass defaults assert dummy.fetch_spec.time_buffer == 0.0 assert dummy.fetch_spec.depth_max is None From 90573125073f76558da9ae1c6511bbf96f67018f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:47:32 +0200 Subject: [PATCH 062/191] bring --from-data methods up to date with new v4 workflows, also includes some refactoring/reorganisation --- src/virtualship/instruments/base.py | 135 +++++++++++++++++++--------- 1 file changed, 93 insertions(+), 42 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 7f20c146..4f3f4b1e 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -155,45 +155,6 @@ def execute(self, measurements: list, out_path: str | Path) -> None: self.simulate(measurements, out_path) print("\n") - def _get_copernicus_ds( - self, - time_buffer: float | None, - physical: bool, - var: str, - ) -> xr.Dataset: - """Get Copernicus Marine dataset for direct ingestion.""" - product_id = _select_product_id( - physical=physical, - schedule_start=self.min_time, - schedule_end=self.max_time, - variable=var if not physical else None, - ) - - latlon_buffer = self.fetch_spec.latlon_buffer - depth_min = self.fetch_spec.depth_min - depth_max = self.fetch_spec.depth_max - spatial_constraint = self.fetch_spec.spatial - - min_lon_bound = self.min_lon - latlon_buffer if spatial_constraint else None - max_lon_bound = self.max_lon + latlon_buffer if spatial_constraint else None - min_lat_bound = self.min_lat - latlon_buffer if spatial_constraint else None - max_lat_bound = self.max_lat + latlon_buffer if spatial_constraint else None - - return copernicusmarine.open_dataset( - dataset_id=product_id, - minimum_longitude=min_lon_bound, - maximum_longitude=max_lon_bound, - minimum_latitude=min_lat_bound, - maximum_latitude=max_lat_bound, - variables=[var], - start_datetime=self.min_time, - end_datetime=self.max_time + timedelta(days=time_buffer), - minimum_depth=depth_min, - maximum_depth=depth_max, - coordinates_selection_method="outside", - vertical_axis="elevation", - ) - def _generate_fieldset(self) -> parcels.FieldSet: """ Create and combine FieldSets for each variable, supporting both local and Copernicus Marine data sources. @@ -225,9 +186,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: data_dir, var ) # get full variable name from one of the files; var may only appear as substring in variable name in file - ds = xr.open_mfdataset([data_dir.joinpath(f) for f in files]) - - # TODO: for the local data it's useful to sel the relevant depth layer(s), in case the user's data is full depth + ds = self._get_local_ds([data_dir.joinpath(f) for f in files]) else: # stream via Copernicus Marine Service ds = self._get_copernicus_ds( @@ -240,6 +199,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: fields = {key: ds[field_var_name]} ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + # streaming data performance is improved by writing to a temporary file, unnecessary for local data if self.from_data is None: ds_fset = self._via_tmp_ds(ds_fset) @@ -269,6 +229,81 @@ def _generate_fieldset(self) -> parcels.FieldSet: return base_fieldset + def _get_copernicus_ds( + self, + time_buffer: float | None, + physical: bool, + var: str, + ) -> xr.Dataset: + """Get Copernicus Marine dataset for direct ingestion.""" + product_id = _select_product_id( + physical=physical, + schedule_start=self.min_time, + schedule_end=self.max_time, + variable=var if not physical else None, + ) + + # spatial bounds with buffer, if spatial constraints apply + min_lon_wbuf, max_lon_wbuf, min_lat_wbuf, max_lat_wbuf = self.spatial_bounds + + return copernicusmarine.open_dataset( + dataset_id=product_id, + minimum_longitude=min_lon_wbuf, + maximum_longitude=max_lon_wbuf, + minimum_latitude=min_lat_wbuf, + maximum_latitude=max_lat_wbuf, + variables=[var], + start_datetime=self.min_time, + end_datetime=self.max_time + timedelta(days=time_buffer), + minimum_depth=abs(self.fetch_spec.depth_min), + maximum_depth=abs(self.fetch_spec.depth_max), + coordinates_selection_method="outside", + vertical_axis="elevation", + ) + + def _get_local_ds(self, files: list[Path]) -> xr.Dataset: + """Get local dataset for direct ingestion.""" + # TODO: add flexibility to ingest one .nc file / not split across time? (i.e. #366) + ds = xr.open_mfdataset([f for f in files]) + + # TODO: update docs about the depth dimension metadata requirement, but will be superseded by #366 + try: + if ds["depth"].attrs.get("positive") == "down": + ds["depth"] = -ds["depth"] + ds = ds.reindex(depth=ds["depth"][::-1]) + ds["depth"].attrs["positive"] = "up" + elif ds["depth"].attrs.get("positive") != "up": + pass + + except Exception as e: + raise ValueError( + f"Missing or invalid 'positive' attribute for 'depth' coordinate in {files[0].parent}. Expected 'positive: up' or 'positive: down'. Original error: {e}" + ) from e + + # sel only relevant latlon and depth subsets, to speed up simulations (avoid bringing in potentially global data) + # spatial bounds with buffer, if spatial constraints apply + min_lon_wbuf, max_lon_wbuf, min_lat_wbuf, max_lat_wbuf = self.spatial_bounds + + depth_min = self.fetch_spec.depth_min + depth_max = self.fetch_spec.depth_max + if depth_min == depth_max: + depth_sel = { + "depth": [depth_min], + "method": "nearest", + } # preserve depth dim with square brackets + else: + # max, min slice because depth is negative and positive: up + depth_sel = {"depth": slice(depth_max, depth_min)} + + ds = ds.sel( + longitude=slice(min_lon_wbuf, max_lon_wbuf), + latitude=slice(min_lat_wbuf, max_lat_wbuf), + ) + # separate sel for depth to allow nearest selection if not using slices + ds = ds.sel(**depth_sel) + + return ds + @staticmethod def _via_tmp_ds(ds) -> xr.Dataset: """Create and re-load a temporary local dataset.""" @@ -305,6 +340,22 @@ def instrument_type(self) -> InstrumentType: """Return the InstrumentType for this instrument instance.""" return next(k for k, v in INSTRUMENT_CLASS_MAP.items() if type(self) is v) + @property + def spatial_bounds( + self, + ) -> tuple[float | None, float | None, float | None, float | None]: + """Return (min_lon, max_lon, min_lat, max_lat) bounds including buffer if spatial constraints apply.""" + if not self.fetch_spec.spatial: + return None, None, None, None + + buf = self.fetch_spec.latlon_buffer + return ( + self.min_lon - buf, + self.max_lon + buf, + self.min_lat - buf, + self.max_lat + buf, + ) + @dataclass(frozen=True) class UnderwayCoordinates: From d68aa097ef127cc03c59c5ddd01fa279721c4872 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 16:06:35 +0200 Subject: [PATCH 063/191] update test_utils for new v4 workflows --- src/virtualship/utils.py | 15 ++++--- tests/test_utils.py | 94 ++++++++++++++-------------------------- 2 files changed, 41 insertions(+), 68 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 9cb028f3..e74e4380 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -437,7 +437,9 @@ def _get_bathy_data(from_data: Path | None = None) -> FieldSet: raise RuntimeError( f"\n\n❗️ Could not find bathymetry variable '{VAR}' in data directory '{from_data}/bathymetry/'.\n\n❗️ Is the pre-downloaded data directory structure compliant with VirtualShip expectations?\n\n❗️ See the docs for more information on expectations: https://virtualship.readthedocs.io/en/latest/user-guide/index.html#documentation\n" ) from e - ds_bathymetry = xr.open_dataset(bathy_dir.joinpath(filename)) + ds_bathymetry = xr.open_dataset( + bathy_dir.joinpath(filename), engine="h5netcdf" + ) # h5netcdf for more robust handling else: # stream via Copernicus Marine Service ds_bathymetry = copernicusmarine.open_dataset( @@ -446,11 +448,8 @@ def _get_bathy_data(from_data: Path | None = None) -> FieldSet: coordinates_selection_method="outside", ) - ds_bathymetry = ds_bathymetry.expand_dims( - {"depth": 1} - ) # TODO: bodge whilst parcels v4 does not support 2D fields and seeks depth dim; change when parcels v4 released - - # Negate bathymetry to convert from depth below geoid to negative depth (Parcels convention) + # give a depth dimension and make bathymetry negative + ds_bathymetry = ds_bathymetry.expand_dims({"depth": 1}) ds_bathymetry[VAR] = -ds_bathymetry[VAR] ds_fset = parcels.convert.copernicusmarine_to_sgrid( @@ -487,7 +486,9 @@ def _find_nc_file_with_variable(data_dir: Path, var: str) -> str | None: """Search for a .nc file in the given directory containing the specified variable.""" for nc_file in data_dir.glob("*.nc"): try: - with xr.open_dataset(nc_file, chunks={}) as ds: + with xr.open_dataset( + nc_file, engine="h5netcdf" + ) as ds: # h5netcdf for more robust handling matched_vars = [v for v in ds.variables if var in v] if matched_vars: return nc_file.name, matched_vars[0] diff --git a/tests/test_utils.py b/tests/test_utils.py index 2628793d..7a05ef4d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -5,7 +5,7 @@ import numpy as np import pytest import xarray as xr -from parcels import FieldSet, JITParticle, ScipyParticle, Variable +from parcels import FieldSet, ParticleClass, Variable import virtualship.utils from virtualship.instruments.sensors import SensorType @@ -20,7 +20,6 @@ _get_bathy_data, _select_product_id, _start_end_in_product_timerange, - add_dummy_UV, build_particle_class_from_sensors, get_example_expedition, ) @@ -89,25 +88,6 @@ def test_instrument_registry_updates(dummy_instrument): assert utils.INSTRUMENT_CLASS_MAP["DUMMY_TYPE"] is dummy_instrument -def test_add_dummy_UV_adds_fields(): - fieldset = FieldSet.from_data({"T": 1}, {"lon": 0, "lat": 0}, mesh="spherical") - fieldset.__dict__.pop("U", None) - fieldset.__dict__.pop("V", None) - - # should not have U or V fields initially - assert "U" not in fieldset.__dict__ - assert "V" not in fieldset.__dict__ - - add_dummy_UV(fieldset) - - # now U and V should be present - assert "U" in fieldset.__dict__ - assert "V" in fieldset.__dict__ - - # should not raise error if U and V already present - add_dummy_UV(fieldset) - - @pytest.mark.usefixtures("copernicus_no_download") def test_select_product_id(expedition): """Should return the physical reanalysis product id via the timings prescribed.""" @@ -138,27 +118,31 @@ def test_start_end_in_product_timerange(expedition): def test_get_bathy_data_local(tmp_path): """Test that _get_bathy_data returns a FieldSet when given a local directory for --from-data.""" # dummy .nc file with 'deptho' variable - data = np.array([[1, 2], [3, 4]]) + + data = np.array( + [[1, 2], [3, 4]] + ) # positive values, to mock how most bathymetry datasets are supplied ds = xr.Dataset( { - "deptho": (("x", "y"), data), + "deptho": (("lat", "lon"), data), }, coords={ - "longitude": (("x", "y"), np.array([[0, 1], [0, 1]])), - "latitude": (("x", "y"), np.array([[0, 0], [1, 1]])), + "lon": (("lon"), np.array([0, 1]), {"units": "degrees_east"}), + "lat": (("lat"), np.array([0, 1]), {"units": "degrees_north"}), }, ) + nc_path = tmp_path / "bathymetry/dummy.nc" nc_path.parent.mkdir(parents=True, exist_ok=True) - ds.to_netcdf(nc_path) + ds.to_netcdf(nc_path, engine="h5netcdf") - # should return a FieldSet - fieldset = _get_bathy_data( - min_lat=0.25, max_lat=0.75, min_lon=0.25, max_lon=0.75, from_data=tmp_path - ) + fieldset = _get_bathy_data(from_data=tmp_path) assert isinstance(fieldset, FieldSet) assert hasattr(fieldset, "bathymetry") - assert np.allclose(fieldset.bathymetry.data, data) + + assert np.allclose( + fieldset.bathymetry.data.values, -ds["deptho"].values + ) # should be negated def test_get_bathy_data_copernicusmarine(monkeypatch): @@ -172,7 +156,7 @@ def dummy_copernicusmarine(*args, **kwargs): ) try: - _get_bathy_data(min_lat=0.25, max_lat=0.75, min_lon=0.25, max_lon=0.75) + _get_bathy_data(from_data=None) # None means call copernicusmarine except RuntimeError as e: assert "copernicusmarine called" in str(e) @@ -190,7 +174,7 @@ def test_find_nc_file_with_variable_substring(tmp_path): }, ) nc_path = tmp_path / "test.nc" - ds.to_netcdf(nc_path) + ds.to_netcdf(nc_path, engine="h5netcdf") # h5netcdf for more robust handling # should find 'uo_glor' when searching for 'uo' result = _find_nc_file_with_variable(tmp_path, "uo") @@ -220,35 +204,32 @@ def test_data_dir_and_filename_compliance(): utils_code = utils_path.read_text(encoding="utf-8") # Check for phys and bgc in Instrument._generate_fieldset - assert 'self.from_data.joinpath("phys")' in base_code, ( - "Expected 'phys' subdirectory not found in Instrument._generate_fieldset. This indicates a drift between docs and implementation." + assert 'self.from_data.joinpath("phys"' in base_code, ( + "Expected 'phys' subdirectory not found in Instrument._generate_fieldset. This could indicate a drift between docs and implementation." ) - assert 'self.from_data.joinpath("bgc")' in base_code, ( - "Expected 'bgc' subdirectory not found in Instrument._generate_fieldset. This indicates a drift between docs and implementation." + assert 'if physical else "bgc")' in base_code, ( + "Expected 'bgc' subdirectory not found in Instrument._generate_fieldset. This could indicate a drift between docs and implementation." ) # Check for bathymetry in _get_bathy_data assert 'from_data.joinpath("bathymetry")' in utils_code, ( - "Expected 'bathymetry' subdirectory not found in _get_bathy_data. This indicates a drift between docs and implementation." + "Expected 'bathymetry' subdirectory not found in _get_bathy_data. This could indicate a drift between docs and implementation." ) # Check for date_pattern in _find_files_in_timerange assert 'date_pattern=r"\\d{4}_\\d{2}_\\d{2}"' in utils_code, ( - "Expected date_pattern r'\\d{4}_\\d{2}_\\d{2}' not found in _find_files_in_timerange. This indicates a drift between docs and implementation." + "Expected date_pattern r'\\d{4}_\\d{2}_\\d{2}' not found in _find_files_in_timerange. This could indicate a drift between docs and implementation." ) # Check for P1D and P1M in t_resolution logic assert 'if all("P1D" in s for s in all_files):' in utils_code, ( - "Expected check for 'P1D' in all_files not found in _find_files_in_timerange. This indicates a drift between docs and implementation." + "Expected check for 'P1D' in all_files not found in _find_files_in_timerange. This could indicate a drift between docs and implementation." ) assert 'elif all("P1M" in s for s in all_files):' in utils_code, ( - "Expected check for 'P1M' in all_files not found in _find_files_in_timerange. This indicates a drift between docs and implementation." + "Expected check for 'P1M' in all_files not found in _find_files_in_timerange. This could indicate a drift between docs and implementation." ) -# TODO: test for calc_sail_time - - def test_calc_sail_time(projection=PROJECTION): LATITUDE = 0.0 # constant at equator @@ -366,8 +347,8 @@ def test_build_basic_particle_class(): nonsensor = [Variable("cycle_phase", dtype=np.int32, initial=0)] sensors = _make_sensors(SensorType.TEMPERATURE, SensorType.SALINITY) - ParticleClass = build_particle_class_from_sensors(sensors, nonsensor, JITParticle) - assert issubclass(ParticleClass, JITParticle) + pclass = build_particle_class_from_sensors(sensors, nonsensor) + assert isinstance(pclass, ParticleClass) def test_build_particle_class_disabled_sensors_excluded(): @@ -378,9 +359,9 @@ def test_build_particle_class_disabled_sensors_excluded(): SensorConfig(sensor_type=SensorType.SALINITY, enabled=False), ] - ParticleClass = build_particle_class_from_sensors(sensors, nonsensor, JITParticle) - assert hasattr(ParticleClass, "temperature") - assert not hasattr(ParticleClass, "salinity") + pclass = build_particle_class_from_sensors(sensors, nonsensor) + assert any(v.name == "temperature" for v in pclass.variables) + assert not any(v.name == "salinity" for v in pclass.variables) def test_build_particle_class_velocity_adds_U_V(): @@ -388,18 +369,9 @@ def test_build_particle_class_velocity_adds_U_V(): nonsensor = [] sensors = _make_sensors(SensorType.VELOCITY) - ParticleClass = build_particle_class_from_sensors(sensors, nonsensor, JITParticle) - assert hasattr(ParticleClass, "U") - assert hasattr(ParticleClass, "V") - - -def test_build_particle_class_scipy_base(): - """Should also work with ScipyParticle as the base class.""" - nonsensor = [] - sensors = _make_sensors(SensorType.TEMPERATURE) - - ParticleClass = build_particle_class_from_sensors(sensors, nonsensor, ScipyParticle) - assert issubclass(ParticleClass, ScipyParticle) + pclass = build_particle_class_from_sensors(sensors, nonsensor) + assert any(v.name == "U" for v in pclass.variables) + assert any(v.name == "V" for v in pclass.variables) def test_allowed_sensors_matches_docs(): From 707328d1265ddcfb802adb44e6b2bd24ee08d96b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 16:12:20 +0200 Subject: [PATCH 064/191] update test_expedition for v4 fieldset ingestion --- tests/expedition/test_expedition.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index f6a84dfe..4bde12bd 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -3,10 +3,10 @@ from unittest.mock import patch import numpy as np +import parcels import pyproj import pytest import xarray as xr -from parcels import FieldSet from virtualship.errors import InstrumentsConfigError, ScheduleError from virtualship.models import ( @@ -105,8 +105,8 @@ def test_get_instruments() -> None: def test_verify_on_land(): """Test that schedule verification raises error for waypoints on land (0.0 m bathymetry).""" # bathymetry fieldset with NaNs at specific locations - latitude = np.array([0, 1.0, 2.0]) - longitude = np.array([0, 1.0, 2.0]) + lat = np.array([0, 1.0, 2.0]) + lon = np.array([0, 1.0, 2.0]) bathymetry = np.array( [ [100, 0.0, 100], @@ -117,20 +117,20 @@ def test_verify_on_land(): ds_bathymetry = xr.Dataset( { - "deptho": (("latitude", "longitude"), bathymetry), + "deptho": (("lat", "lon"), bathymetry), }, coords={ - "latitude": latitude, - "longitude": longitude, + "lon": (("lon"), lon, {"units": "degrees_east"}), + "lat": (("lat"), lat, {"units": "degrees_north"}), }, ) - bathymetry_variables = {"bathymetry": "deptho"} - bathymetry_dimensions = {"lon": "longitude", "lat": "latitude"} - bathymetry_fieldset = FieldSet.from_xarray_dataset( - ds_bathymetry, bathymetry_variables, bathymetry_dimensions + ds_fset = parcels.convert.copernicusmarine_to_sgrid( + fields={"bathymetry": ds_bathymetry["deptho"]}, ) + bathymetry_fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + # waypoints placed in NaN bathy cells waypoints = [ Waypoint( From 56bf4df388c2e2e1b557bdbdab98b5657d517570 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 16:53:38 +0200 Subject: [PATCH 065/191] use context managers for _via_tmp_ds, fix using abs() for copernicusmarine open_dataset --- src/virtualship/instruments/base.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 4f3f4b1e..0d5edc82 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -246,6 +246,17 @@ def _get_copernicus_ds( # spatial bounds with buffer, if spatial constraints apply min_lon_wbuf, max_lon_wbuf, min_lat_wbuf, max_lat_wbuf = self.spatial_bounds + min_depth = ( + abs(self.fetch_spec.depth_min) + if self.fetch_spec.depth_min is not None + else None + ) + max_depth = ( + abs(self.fetch_spec.depth_max) + if self.fetch_spec.depth_max is not None + else None + ) + return copernicusmarine.open_dataset( dataset_id=product_id, minimum_longitude=min_lon_wbuf, @@ -255,8 +266,8 @@ def _get_copernicus_ds( variables=[var], start_datetime=self.min_time, end_datetime=self.max_time + timedelta(days=time_buffer), - minimum_depth=abs(self.fetch_spec.depth_min), - maximum_depth=abs(self.fetch_spec.depth_max), + minimum_depth=min_depth, + maximum_depth=max_depth, coordinates_selection_method="outside", vertical_axis="elevation", ) @@ -305,13 +316,15 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: return ds @staticmethod - def _via_tmp_ds(ds) -> xr.Dataset: + def _via_tmp_ds(ds: xr.Dataset) -> xr.Dataset: """Create and re-load a temporary local dataset.""" - tmpdir = tempfile.TemporaryDirectory() - tmp_fpath = Path(tmpdir.name).joinpath("tmp.nc") - ds.to_netcdf(tmp_fpath) - del ds - return xr.open_dataset(tmp_fpath) + with tempfile.TemporaryDirectory() as tmpdir: + tmp_fpath = Path(tmpdir) / "tmp.nc" + ds.to_netcdf(tmp_fpath) + + # Open and load into memory so the file handle closes before tmpdir exits + with xr.open_dataset(tmp_fpath) as loaded_ds: + return loaded_ds.load() @staticmethod def _sample_initial( From 8954456b0c0ab3823c2ff08bc7c2ebf79e6b3f62 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 16:54:34 +0200 Subject: [PATCH 066/191] avoid annoying warnings concerning potential pixi build issues and compatibility with parcels v4 pull from main --- pixi.toml | 5 ++++- pyproject.toml | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pixi.toml b/pixi.toml index 152766f9..3d18b8b4 100644 --- a/pixi.toml +++ b/pixi.toml @@ -14,11 +14,12 @@ version = "dynamic" # dynamic versioning needs better support in pixi https://gi backend = { name = "pixi-build-python", version = "0.4.*" } [package.host-dependencies] +python = "3.12.*" setuptools = "*" setuptools_scm = "*" [package.run-dependencies] # Keep in sync with `pyproject.toml` and feedstock recipe -python = "3.11.*" +python = "3.12.*" click = "*" pyproj = ">=3,<4" sortedcontainers = "==2.4.0" @@ -32,6 +33,7 @@ textual = "*" [dependencies] virtualship = { path = "." } +python = "3.12.*" # Pre-install as conda packages to avoid PyPI source builds netcdf4 = "*" numpy = ">=2.1.0" @@ -39,6 +41,7 @@ dask = "*" zarr = ">=3" ipdb = ">=0.13.13,<0.14" cmocean = ">=4.0.3,<5" +numba = ">=0.59.0" [pypi-dependencies] parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } diff --git a/pyproject.toml b/pyproject.toml index 7e6d184b..d83dc25c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,7 +70,8 @@ filterwarnings = [ "default::DeprecationWarning", "error::DeprecationWarning:virtualship", "ignore:ParticleSet is empty.*:RuntimeWarning", # TODO: Probably should be ignored in the source code - "ignore:This is an alpha version of Parcels v4.*:UserWarning" # TODO: necessary whilst Parcels v4 is still alpha + "ignore:This is an alpha version of Parcels v4.*:UserWarning", # TODO: necessary whilst Parcels v4 is still alpha + "ignore:numpy.ndarray size changed:RuntimeWarning" # TODO: annoying incompatability issue with pixi env, see if fixed when relying on a Parcels v4 release rather than pulling from main ] log_cli_level = "INFO" testpaths = [ From acca7e34649a552b03d83a411dd3573b9355363a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 16:55:00 +0200 Subject: [PATCH 067/191] revert need to specify h5netcdf engine --- src/virtualship/utils.py | 8 ++------ tests/test_utils.py | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index e74e4380..8ccf69a5 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -437,9 +437,7 @@ def _get_bathy_data(from_data: Path | None = None) -> FieldSet: raise RuntimeError( f"\n\n❗️ Could not find bathymetry variable '{VAR}' in data directory '{from_data}/bathymetry/'.\n\n❗️ Is the pre-downloaded data directory structure compliant with VirtualShip expectations?\n\n❗️ See the docs for more information on expectations: https://virtualship.readthedocs.io/en/latest/user-guide/index.html#documentation\n" ) from e - ds_bathymetry = xr.open_dataset( - bathy_dir.joinpath(filename), engine="h5netcdf" - ) # h5netcdf for more robust handling + ds_bathymetry = xr.open_dataset(bathy_dir.joinpath(filename)) else: # stream via Copernicus Marine Service ds_bathymetry = copernicusmarine.open_dataset( @@ -486,9 +484,7 @@ def _find_nc_file_with_variable(data_dir: Path, var: str) -> str | None: """Search for a .nc file in the given directory containing the specified variable.""" for nc_file in data_dir.glob("*.nc"): try: - with xr.open_dataset( - nc_file, engine="h5netcdf" - ) as ds: # h5netcdf for more robust handling + with xr.open_dataset(nc_file) as ds: matched_vars = [v for v in ds.variables if var in v] if matched_vars: return nc_file.name, matched_vars[0] diff --git a/tests/test_utils.py b/tests/test_utils.py index 7a05ef4d..63b5c4e9 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -134,7 +134,7 @@ def test_get_bathy_data_local(tmp_path): nc_path = tmp_path / "bathymetry/dummy.nc" nc_path.parent.mkdir(parents=True, exist_ok=True) - ds.to_netcdf(nc_path, engine="h5netcdf") + ds.to_netcdf(nc_path) fieldset = _get_bathy_data(from_data=tmp_path) assert isinstance(fieldset, FieldSet) @@ -174,7 +174,7 @@ def test_find_nc_file_with_variable_substring(tmp_path): }, ) nc_path = tmp_path / "test.nc" - ds.to_netcdf(nc_path, engine="h5netcdf") # h5netcdf for more robust handling + ds.to_netcdf(nc_path) # should find 'uo_glor' when searching for 'uo' result = _find_nc_file_with_variable(tmp_path, "uo") From fefcc206e67beb74044d8e5e7326db12be857013 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:10:31 +0200 Subject: [PATCH 068/191] update test_base.py for new v4 workflows --- tests/instruments/test_base.py | 78 +++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index 7d662076..bcc741a5 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -93,36 +93,45 @@ def simulate(self, data_dir, measurements, out_path): """Dummy simulate implementation for test.""" self.simulate_called = True + @property + def instrument_type(self) -> InstrumentType: + """Return a valid InstrumentType for the test.""" + return InstrumentType.CTD -@patch("virtualship.instruments.base.FieldSet") -@patch( - "virtualship.instruments.base._select_product_id", return_value="dummy_product_id" -) -@patch("virtualship.instruments.base.copernicusmarine") -def test_load_input_data(mock_copernicusmarine, mock_select_product_id, mock_FieldSet): + +def test_load_input_data(): """Test Instrument.load_input_data with mocks.""" - mock_fieldset = MagicMock() - mock_FieldSet.from_netcdf.return_value = mock_fieldset - mock_FieldSet.from_xarray_dataset.return_value = mock_fieldset - mock_fieldset.__getitem__.side_effect = lambda k: MagicMock() - mock_copernicusmarine.open_dataset.return_value = MagicMock() - # Create a mock waypoint with latitude and longitude mock_waypoint = MagicMock() mock_waypoint.location.latitude = 1.0 mock_waypoint.location.longitude = 2.0 - mock_schedule = MagicMock() - mock_schedule.waypoints = [mock_waypoint] + dummy = DummyInstrument( - expedition=MagicMock(schedule=mock_schedule), + expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a"}, add_bathymetry=False, allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) - fieldset = dummy.load_input_data() - assert mock_FieldSet.from_xarray_dataset.called - assert fieldset == mock_fieldset + + mock_fieldset = MagicMock() + mock_fieldset.to_windowed_arrays.return_value = mock_fieldset + + with ( + patch( + "virtualship.instruments.base._select_product_id", + return_value="dummy_product_id", + ), + patch("copernicusmarine.open_dataset"), + patch.object(dummy, "_via_tmp_ds", side_effect=lambda ds: ds), + patch("parcels.convert.copernicusmarine_to_sgrid"), + patch( + "parcels.FieldSet.from_sgrid_conventions", return_value=mock_fieldset + ) as mock_from_sgrid, + ): + fieldset = dummy.load_input_data() + + mock_from_sgrid.assert_called_once() assert fieldset == mock_fieldset @@ -184,35 +193,34 @@ def test_via_tmp_ds_roundtrip(): ) # result is new object loaded from tmp file, not the original -def test_generate_fieldset_combines_fields(monkeypatch): +def test_generate_fieldset_combines_fields(): mock_waypoint = MagicMock() mock_waypoint.location.latitude = 1.0 mock_waypoint.location.longitude = 2.0 - mock_schedule = MagicMock() - mock_schedule.waypoints = [mock_waypoint] + dummy = DummyInstrument( - expedition=MagicMock(schedule=mock_schedule), + expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a", "B": "b"}, add_bathymetry=False, allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) - dummy.from_data = None - - monkeypatch.setattr( - dummy, "_get_copernicus_ds", lambda *args, **kwargs: MagicMock() - ) fs_A = MagicMock() fs_B = MagicMock() - fs_B.B = MagicMock() - monkeypatch.setattr( - "virtualship.instruments.base.FieldSet.from_xarray_dataset", - lambda ds, varmap, dims, mesh=None: fs_A if "A" in varmap else fs_B, - ) - monkeypatch.setattr(fs_A, "add_field", MagicMock()) - dummy._generate_fieldset() + + fs_A.to_windowed_arrays.return_value = fs_A + fs_B.to_windowed_arrays.return_value = fs_B + + with ( + patch.object(dummy, "_get_copernicus_ds"), + patch.object(dummy, "_via_tmp_ds"), + patch("parcels.convert.copernicusmarine_to_sgrid"), + patch("parcels.FieldSet.from_sgrid_conventions", side_effect=[fs_A, fs_B]), + ): + dummy._generate_fieldset() + fs_A.add_field.assert_called_once_with(fs_B.B) @@ -476,7 +484,7 @@ def test_underway_schema_matches_parcels(tmp_path, pset): underway_path = tmp_path / "underway_particles.parquet" _create_underway_parquet( out_path=underway_path, - var_names=["T"], + var_names=["temperature"], dat_arrays=[np.array([15.0, 16.0], dtype=np.float32)], origin=np.datetime64("2024-01-01T00:00:00"), ) From de8c627b0357e1c9ceac38f6d5dbb01966a33037 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 11:09:04 +0200 Subject: [PATCH 069/191] update tests for v4 workflows and enhance out of bounds error checking --- tests/instruments/test_argo_float.py | 115 ++++++++++++++++++--------- 1 file changed, 79 insertions(+), 36 deletions(-) diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index c56b6d4c..c9e881d4 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -1,12 +1,14 @@ """Test the simulation of Argo floats.""" +import contextlib +import io from datetime import datetime, timedelta import numpy as np +import parcels import pydantic import pytest import xarray as xr -from parcels import FieldSet from virtualship.instruments.argo_float import ArgoFloat, ArgoFloatInstrument from virtualship.instruments.sensors import SensorType @@ -44,7 +46,10 @@ def argo_config_kwargs(): def create_fieldset( - lon_range=(0.0, 10.0), lat_range=(0.0, 10.0), include_salinity=True, lifetime_days=1 + lon_range=(0.0, 10.0), + lat_range=(0.0, 10.0), + include_salinity=True, + lifetime_days=0.1, ): """Create a test fieldset with optional salinity.""" v = np.full((2, 2, 2), 1.0) @@ -52,34 +57,62 @@ def create_fieldset( t = np.full((2, 2, 2), 1.0) bathy = np.full((2, 2), -5000.0) - data = {"V": v, "U": u, "T": t} + data_vars = { + "V": (("time", "lat", "lon"), v), + "U": (("time", "lat", "lon"), u), + "T": (("time", "lat", "lon"), t), + } + if include_salinity: - data["S"] = np.full((2, 2, 2), 1.0) - - fieldset = FieldSet.from_data( - data, - { - "lon": np.array(lon_range), - "lat": np.array(lat_range), - "time": [ - np.datetime64(BASE_TIME), - np.datetime64(BASE_TIME + timedelta(days=lifetime_days + 1)), - ], + data_vars["S"] = (("time", "lat", "lon"), np.full((2, 2, 2), 1.0)) + + ds_fields = xr.Dataset( + data_vars=data_vars, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + "time": ( + ("time"), + [ + np.datetime64(BASE_TIME), + np.datetime64(BASE_TIME + timedelta(days=lifetime_days)), + ], + {"axis": "T"}, + ), }, ) - fieldset.add_field( - FieldSet.from_data( - {"bathymetry": bathy}, - {"lon": np.array(lon_range), "lat": np.array(lat_range)}, - ).bathymetry + + fields = {var: ds_fields[var] for var in data_vars.keys()} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + + ds_bathymetry = xr.Dataset( + data_vars={"bathymetry": (("lat", "lon"), bathy)}, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + }, + ) + ds_bathymetry_fset = parcels.convert.copernicusmarine_to_sgrid( + fields={"bathymetry": ds_bathymetry["bathymetry"]} ) + bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) + + fieldset.add_field(bathymetry_fset.bathymetry) + return fieldset -def create_argo_float(lat=0.0, lon=0.0): +def create_argo_float(waypoint): """Create a single ArgoFloat instance.""" return ArgoFloat( - spacetime=Spacetime(location=Location(latitude=lat, longitude=lon), time=0), + spacetime=Spacetime( + location=Location( + latitude=waypoint.location.latitude, + longitude=waypoint.location.longitude, + ), + time=waypoint.time, + ), min_depth=0.0, max_depth=MAX_DEPTH, drift_depth=DRIFT_DEPTH, @@ -118,7 +151,6 @@ class schedule: def test_simulate_argo_floats(tmpdir) -> None: """Test basic Argo float simulation with temperature and salinity sensors.""" fieldset = create_fieldset() - argo_floats = [create_argo_float()] sensors = [ SensorConfig(sensor_type=SensorType.TEMPERATURE), @@ -127,31 +159,32 @@ def test_simulate_argo_floats(tmpdir) -> None: expedition = create_dummy_expedition(sensors) argo_instrument = ArgoFloatInstrument(expedition, None) - out_path = tmpdir.join("out.zarr") + argo_floats = [create_argo_float(wp) for wp in expedition.schedule.waypoints] + out_path = tmpdir.join("out.parquet") argo_instrument.load_input_data = lambda: fieldset argo_instrument.simulate(argo_floats, out_path) - results = xr.open_zarr(out_path) - assert len(results.trajectory) == len(argo_floats) - for var in ["lon", "lat", "z", "temperature", "salinity"]: + results = parcels.read_particlefile(out_path) + assert np.unique(results["particle_id"].to_numpy()).size == len(argo_floats) + for var in ["x", "y", "z", "temperature", "salinity"]: assert var in results, f"Results don't contain {var}" def test_argo_float_disabled_sensor(tmpdir) -> None: """Variables for disabled sensors must not appear in the zarr output.""" fieldset = create_fieldset(include_salinity=False) - argo_floats = [create_argo_float()] # only temperature sensor enabled sensors = [SensorConfig(sensor_type=SensorType.TEMPERATURE)] expedition = create_dummy_expedition(sensors) argo_instrument = ArgoFloatInstrument(expedition, None) - out_path = tmpdir.join("out_disabled.zarr") + argo_floats = [create_argo_float(wp) for wp in expedition.schedule.waypoints] + out_path = tmpdir.join("out_disabled.parquet") argo_instrument.load_input_data = lambda: fieldset argo_instrument.simulate(argo_floats, out_path) - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) assert "temperature" in results, "Enabled sensor variable must be present" assert "salinity" not in results, ( "Disabled sensor variable must be absent from output" @@ -213,7 +246,6 @@ def test_argo_fieldoutofbounds_error(tmpdir) -> None: fieldset = create_fieldset( lon_range=(0.0, 0.1), lat_range=(0.0, 0.1), lifetime_days=lifetime.days ) - argo_floats = [create_argo_float()] sensors = [ SensorConfig(sensor_type=SensorType.TEMPERATURE), @@ -224,22 +256,33 @@ def test_argo_fieldoutofbounds_error(tmpdir) -> None: ) argo_instrument = ArgoFloatInstrument(expedition, None) - out_path = tmpdir.join("out.zarr") + argo_floats = [create_argo_float(wp) for wp in expedition.schedule.waypoints] + + out_path = tmpdir.join("out.parquet") argo_instrument.load_input_data = lambda: fieldset - argo_instrument.simulate(argo_floats, out_path) + + # capture stdout/stderr safely without breaking (i.e. using capsys interferes with print out stream...) + f = io.StringIO() + with contextlib.redirect_stdout(f), contextlib.redirect_stderr(f): + argo_instrument.simulate(argo_floats, out_path) + + output_log = f.getvalue() # results file should exist even if data is incomplete due to out-of-bounds error - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) # not reaching expected final time indicates simulation was stopped due to FieldOutOfBounds expected_final_time = np.datetime64(BASE_TIME + lifetime) - actual_final_time = results.time.values[np.isfinite(results.time.values)].max() + actual_final_time = ( + results["t"].to_numpy()[np.isfinite(results["t"].to_numpy())].max() + ) assert actual_final_time < expected_final_time, ( "Actual final time should be less than expected final time due to out-of-bounds error/warning" ) - # TODO: capturing the warnings in the tests is complicated by the Parcels C-level print statements; but the logic of not crashing on out-of-bounds is tested if the test simulation runs - # TODO: when using Parcels v4, this test can become much more robust by capturing the specific warning as well + assert "ErrorOutOfBounds" in output_log, ( + "Expected 'ErrorOutOfBounds' message to be printed during simulation." + ) def test_argo_float_instrument_type(): From f17b43e15e01df0b09ab625a3dc6fbf270d52dc1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 12:09:21 +0200 Subject: [PATCH 070/191] update tests for v4 workflows --- tests/instruments/test_ctd.py | 180 +++++++++++++++++++++------------- 1 file changed, 114 insertions(+), 66 deletions(-) diff --git a/tests/instruments/test_ctd.py b/tests/instruments/test_ctd.py index 29eb758a..845ac06d 100644 --- a/tests/instruments/test_ctd.py +++ b/tests/instruments/test_ctd.py @@ -7,10 +7,11 @@ import datetime import numpy as np +import parcels +import polars as pl import pydantic import pytest import xarray as xr -from parcels import Field, FieldSet from virtualship.instruments.ctd import CTD, CTDInstrument from virtualship.instruments.sensors import SensorType @@ -52,6 +53,64 @@ class schedule: return DummyExpedition() +def create_fieldset( + data_dict, + lon_range=(0.0, 1.0), + lat_range=(0.0, 1.0), + depth_range=(-1000, 0), + time_range=None, + bathymetry_val=-1000.0, +): + if time_range is None: + time_range = [ + np.datetime64(BASE_TIME), + np.datetime64(BASE_TIME + datetime.timedelta(hours=1)), + ] + + data_vars = {} + for key, val in data_dict.items(): + data_vars[key] = (("time", "depth", "lat", "lon"), val) + + ds_fields = xr.Dataset( + data_vars=data_vars, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + "depth": (("depth"), np.array(depth_range)), + "time": ( + ("time"), + time_range, + {"axis": "T"}, + ), + }, + ) + + fields = {var: ds_fields[var] for var in data_vars.keys()} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + + ds_bathymetry = xr.Dataset( + data_vars={ + "bathymetry": ( + ("lat", "lon"), + np.full((len(lat_range), len(lon_range)), bathymetry_val), + ) + }, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + }, + ) + ds_bathymetry_fset = parcels.convert.copernicusmarine_to_sgrid( + fields={"bathymetry": ds_bathymetry["bathymetry"]} + ) + bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) + + fieldset.add_field(bathymetry_fset.bathymetry) + + return fieldset + + def test_simulate_ctds(tmpdir) -> None: """Test that CTDInstrument simulates measurements correctly, incuding sampling physical and bgc variables.""" # where to cast CTDs @@ -83,8 +142,8 @@ def test_simulate_ctds(tmpdir) -> None: "o2": 10.0, "chl": 20.0, "no3": 30.0, - "lat": ctds[0].spacetime.location.lat, - "lon": ctds[0].spacetime.location.lon, + "y": ctds[0].spacetime.location.lat, + "x": ctds[0].spacetime.location.lon, }, "maxdepth": { "salinity": 7, @@ -92,8 +151,8 @@ def test_simulate_ctds(tmpdir) -> None: "o2": 11.0, "chl": 21.0, "no3": 31.0, - "lat": ctds[0].spacetime.location.lat, - "lon": ctds[0].spacetime.location.lon, + "y": ctds[0].spacetime.location.lat, + "x": ctds[0].spacetime.location.lon, }, }, { @@ -103,8 +162,8 @@ def test_simulate_ctds(tmpdir) -> None: "o2": 12.0, "chl": 22.0, "no3": 32.0, - "lat": ctds[1].spacetime.location.lat, - "lon": ctds[1].spacetime.location.lon, + "y": ctds[1].spacetime.location.lat, + "x": ctds[1].spacetime.location.lon, }, "maxdepth": { "salinity": 7, @@ -112,8 +171,8 @@ def test_simulate_ctds(tmpdir) -> None: "o2": 13.0, "chl": 23.0, "no3": 33.0, - "lat": ctds[1].spacetime.location.lat, - "lon": ctds[1].spacetime.location.lon, + "y": ctds[1].spacetime.location.lat, + "x": ctds[1].spacetime.location.lon, }, }, ] @@ -153,19 +212,13 @@ def test_simulate_ctds(tmpdir) -> None: no3[:, 1, 1, 0] = ctd_exp[1]["surface"]["no3"] no3[:, 0, 1, 0] = ctd_exp[1]["maxdepth"]["no3"] - fieldset = FieldSet.from_data( + fieldset = create_fieldset( {"V": v, "U": u, "T": t, "S": s, "o2": o2, "chl": chl, "no3": no3}, - { - "time": [ - np.datetime64(BASE_TIME + datetime.timedelta(hours=0)), - np.datetime64(BASE_TIME + datetime.timedelta(hours=1)), - ], - "depth": [-1000, 0], - "lat": [0, 1], - "lon": [0, 1], - }, + time_range=[ + np.datetime64(BASE_TIME + datetime.timedelta(hours=0)), + np.datetime64(BASE_TIME + datetime.timedelta(hours=1)), + ], ) - fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) sensors = [ SensorConfig(sensor_type=SensorType.TEMPERATURE), @@ -179,30 +232,31 @@ def test_simulate_ctds(tmpdir) -> None: from_data = None ctd_instrument = CTDInstrument(expedition, from_data) - out_path = tmpdir.join("out.zarr") + out_path = tmpdir.join("out.parquet") ctd_instrument.load_input_data = lambda: fieldset ctd_instrument.simulate(ctds, out_path) # test if output is as expected - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - assert len(results.trajectory) == len(ctds) + assert np.unique(results["particle_id"].to_numpy()).size == len(ctds) - for ctd_i, (traj, exp_bothloc) in enumerate( - zip(results.trajectory, ctd_exp, strict=True) - ): - obs_surface = results.sel(trajectory=traj, obs=0) - min_index = np.argmin(results.sel(trajectory=traj)["z"].data) - obs_maxdepth = results.sel(trajectory=traj, obs=min_index) + for ctd_i, id in enumerate(np.unique(results["particle_id"].to_numpy())): + ctd_df = results.filter(pl.col("particle_id") == id) + ctd_surface = ctd_df.filter(pl.col("z") == ctd_df["z"].max())[ + 0 + ] # one row (there are two given ctd ascends back to surface) + ctd_maxdepth = ctd_df.filter(pl.col("z") == ctd_df["z"].min()) for obs, loc in [ - (obs_surface, "surface"), - (obs_maxdepth, "maxdepth"), + (ctd_surface, "surface"), + (ctd_maxdepth, "maxdepth"), ]: - exp = exp_bothloc[loc] - for var in ["salinity", "temperature", "o2", "chl", "no3", "lat", "lon"]: - obs_value = obs[var].values.item() + exp = ctd_exp[ctd_i][loc] + + for var in ["salinity", "temperature", "o2", "chl", "no3", "y", "x"]: + obs_value = obs[var].item() exp_value = exp[var] assert np.isclose(obs_value, exp_value), ( @@ -256,7 +310,7 @@ def test_ctd_sensor_config_yaml() -> None: def test_ctd_disabled_sensor_absent(tmpdir) -> None: - """Variables for disabled sensors must not appear in the zarr output.""" + """Variables for disabled sensors must not appear in the output.""" base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") ctds = [ @@ -271,31 +325,28 @@ def test_ctd_disabled_sensor_absent(tmpdir) -> None: ] # Only temperature field, no salinty - t = np.full((2, 2, 2), 5.0) - fieldset = FieldSet.from_data( + t = np.full((2, 2, 2, 2), 5.0) + fieldset = create_fieldset( {"T": t}, - { - "lon": np.array([0.0, 1.0]), - "lat": np.array([0.0, 1.0]), - "time": [ - np.datetime64(base_time + datetime.timedelta(seconds=0)), - np.datetime64(base_time + datetime.timedelta(hours=4)), - ], - }, + time_range=[ + np.datetime64(base_time + datetime.timedelta(seconds=0)), + np.datetime64(base_time + datetime.timedelta(hours=4)), + ], + lat_range=np.array([0.0, 1.0]), + lon_range=np.array([0.0, 1.0]), ) - fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) - sensors = ( - [SensorConfig(sensor_type=SensorType.TEMPERATURE)], - ) # SALINITY omitted = disabled + sensors = [ + SensorConfig(sensor_type=SensorType.TEMPERATURE) + ] # SALINITY omitted = disabled expedition = create_dummy_expedition(sensors) ctd_instrument = CTDInstrument(expedition, None) - out_path = tmpdir.join("out_disabled.zarr") + out_path = tmpdir.join("out_disabled.parquet") ctd_instrument.load_input_data = lambda: fieldset ctd_instrument.simulate(ctds, out_path) - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) assert "temperature" in results, "Enabled sensor variable must be present" assert "salinity" not in results, ( "Disabled sensor variable must be absent from output" @@ -355,7 +406,7 @@ def test_ctd_config_unsupported_sensor_rejected(): def test_sensor_absent(tmpdir) -> None: - """A (BGC) sensor that is disabled must not appear in the zarr output.""" + """A (BGC) sensor that is disabled must not appear in the output.""" base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") ctds = [ @@ -369,32 +420,29 @@ def test_sensor_absent(tmpdir) -> None: ), ] - o2_data = np.full((2, 2, 2), 5.0) - fieldset = FieldSet.from_data( + o2_data = np.full((2, 2, 2, 2), 5.0) + fieldset = create_fieldset( {"o2": o2_data}, - { - "lon": np.array([0.0, 1.0]), - "lat": np.array([0.0, 1.0]), - "time": [ - np.datetime64(base_time + datetime.timedelta(seconds=0)), - np.datetime64(base_time + datetime.timedelta(hours=4)), - ], - }, + time_range=[ + np.datetime64(base_time + datetime.timedelta(seconds=0)), + np.datetime64(base_time + datetime.timedelta(hours=4)), + ], + lat_range=np.array([0.0, 1.0]), + lon_range=np.array([0.0, 1.0]), ) - fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) sensors = [ - SensorConfig(sensor_type=SensorType.OXYGEN), + SensorConfig(sensor_type=SensorType.OXYGEN) # CHLOROPHYLL omitted = disabled ] expedition = create_dummy_expedition(sensors) ctd_instrument = CTDInstrument(expedition, None) - out_path = tmpdir.join("out_bgc_disabled.zarr") + out_path = tmpdir.join("out_bgc_disabled.parquet") ctd_instrument.load_input_data = lambda: fieldset ctd_instrument.simulate(ctds, out_path) - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) assert "o2" in results, "Enabled BGC sensor variable must be present" assert "chl" not in results, "Disabled sensor variable must be absent from output" From 52ff1fdaf1f8cf761306fef6dc14530504d7e0c9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 12:20:43 +0200 Subject: [PATCH 071/191] update drifter tests for v4 workflows --- tests/instruments/test_drifter.py | 141 +++++++++++++++++------------- 1 file changed, 80 insertions(+), 61 deletions(-) diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 0b115374..21ac2afa 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -1,13 +1,13 @@ """Test the simulation of drifters.""" import datetime -from typing import ClassVar import numpy as np +import parcels +import polars as pl import pydantic import pytest import xarray as xr -from parcels import FieldSet from virtualship.instruments.drifter import Drifter, DrifterInstrument from virtualship.instruments.sensors import SensorType @@ -22,36 +22,75 @@ BASE_TIME = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") LIFETIME = datetime.timedelta(days=1) +DEPLOY_DEPTH = -1.0 -DEPLOY_DEPTH = -1.0 # default - -def create_dummy_expedition(): - # arbitrary time offset for the dummy fieldset +def create_dummy_expedition( + sensors=None, + lifetime=LIFETIME, + depth=DEPLOY_DEPTH, + location=(1, 2), +): + if sensors is None: + sensors = [SensorConfig(sensor_type=SensorType.TEMPERATURE)] class DummyExpedition: class schedule: - waypoints: ClassVar = [ - Waypoint( - location=Location( - 1, 2 - ), # any location is fine for dummy, actual drifter deployment locations are defined in the test functions - time=BASE_TIME, - ), + waypoints: list[Waypoint] = [ # noqa: RUF012 + Waypoint(location=Location(*location), time=BASE_TIME) ] instruments_config = InstrumentsConfig( drifter_config=DrifterConfig( - lifetime=LIFETIME, - depth_meter=DEPLOY_DEPTH, + lifetime=lifetime, + depth_meter=depth, stationkeeping_time_minutes=10, - sensors=[SensorConfig(sensor_type=SensorType.TEMPERATURE)], + sensors=sensors, ) ) return DummyExpedition() +def create_fieldset( + data_dict, + lon_range=(0.0, 10.0), + lat_range=(0.0, 10.0), + depth_range=None, + time_range=None, +): + if time_range is None: + time_range = [ + np.datetime64(BASE_TIME), + np.datetime64(BASE_TIME + datetime.timedelta(days=3)), + ] + + data_vars = {} + is_3d = depth_range is not None + + for key, val in data_dict.items(): + if is_3d: + data_vars[key] = (("time", "depth", "lat", "lon"), val) + else: + data_vars[key] = (("time", "lat", "lon"), val) + + coords = { + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + "time": (("time"), time_range, {"axis": "T"}), + } + if is_3d: + coords["depth"] = (("depth"), np.array(depth_range)) + + ds_fields = xr.Dataset(data_vars=data_vars, coords=coords) + + fields = {var: ds_fields[var] for var in data_vars.keys()} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + + return fieldset + + def test_simulate_drifters(tmpdir) -> None: CONST_TEMPERATURE = 1.0 # constant temperature in fieldset @@ -59,19 +98,8 @@ def test_simulate_drifters(tmpdir) -> None: u = np.full((2, 2, 2), 1.0) t = np.full((2, 2, 2), CONST_TEMPERATURE) - fieldset = FieldSet.from_data( - {"V": v, "U": u, "T": t}, - { - "lon": np.array([0.0, 10.0]), - "lat": np.array([0.0, 10.0]), - "time": [ - np.datetime64(BASE_TIME + datetime.timedelta(seconds=0)), - np.datetime64(BASE_TIME + datetime.timedelta(days=3)), - ], - }, - ) + fieldset = create_fieldset({"V": v, "U": u, "T": t}) - # drifters to deploy drifters = [ Drifter( spacetime=Spacetime( @@ -95,28 +123,29 @@ def test_simulate_drifters(tmpdir) -> None: from_data = None drifter_instrument = DrifterInstrument(expedition, from_data) - out_path = tmpdir.join("out.zarr") + out_path = tmpdir.join("out.parquet") drifter_instrument.load_input_data = lambda: fieldset drifter_instrument.simulate(drifters, out_path) - # test if output is as expected - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - assert len(results.trajectory) == len(drifters) + assert np.unique(results["particle_id"].to_numpy()).size == len(drifters) - for drifter_i, traj in enumerate(results.trajectory): - # Check if drifters are moving - # lat, lon, should be increasing values (with the above positive VU fieldset) - dlat = np.diff(results.sel(trajectory=traj)["lat"].values) + for drifter_i, traj_id in enumerate(np.unique(results["particle_id"].to_numpy())): + traj_df = results.filter(pl.col("particle_id") == traj_id) + + dlat = np.diff(traj_df["y"].to_numpy()) assert np.all(dlat[np.isfinite(dlat)] > 0), ( f"Drifter is not moving over y {drifter_i=}" ) - dlon = np.diff(results.sel(trajectory=traj)["lon"].values) + + dlon = np.diff(traj_df["x"].to_numpy()) assert np.all(dlon[np.isfinite(dlon)] > 0), ( f"Drifter is not moving over x {drifter_i=}" ) - temp = results.sel(trajectory=traj)["temperature"].values + + temp = traj_df["temperature"].to_numpy() assert np.all(temp[np.isfinite(temp)] == CONST_TEMPERATURE), ( f"measured temperature does not match {drifter_i=}" ) @@ -130,25 +159,15 @@ def test_drifter_depths(tmpdir) -> None: u = np.full((2, 2, 2, 2), 1.0) t = np.full((2, 2, 2, 2), CONST_TEMPERATURE) - # different values at depth (random) v[:, -1, :, :] = 1.0 * DEPTH_FACTOR u[:, -1, :, :] = 1.0 * DEPTH_FACTOR t[:, -1, :, :] = CONST_TEMPERATURE * DEPTH_FACTOR - fieldset = FieldSet.from_data( + fieldset = create_fieldset( {"V": v, "U": u, "T": t}, - { - "time": [ - np.datetime64(BASE_TIME + datetime.timedelta(seconds=0)), - np.datetime64(BASE_TIME + datetime.timedelta(days=3)), - ], - "depth": np.array([-10, 0]), - "lat": np.array([0.0, 10.0]), - "lon": np.array([0.0, 10.0]), - }, + depth_range=(-10, 0), ) - # drifters to deploy (same time and location, but different depths) drifters = [ Drifter( spacetime=Spacetime( @@ -163,7 +182,7 @@ def test_drifter_depths(tmpdir) -> None: location=Location(latitude=5.0, longitude=5.0), time=BASE_TIME + datetime.timedelta(days=0), ), - depth=DEPLOY_DEPTH - 5.0, # different drogue depth + depth=DEPLOY_DEPTH - 5.0, lifetime=datetime.timedelta(hours=12), ), ] @@ -172,25 +191,25 @@ def test_drifter_depths(tmpdir) -> None: from_data = None drifter_instrument = DrifterInstrument(expedition, from_data) - out_path = tmpdir.join("out.zarr") + out_path = tmpdir.join("out.parquet") drifter_instrument.load_input_data = lambda: fieldset drifter_instrument.simulate(drifters, out_path) - # test if output is as expected - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - assert len(results.trajectory) == len(drifters) + pids = np.unique(results["particle_id"].to_numpy()) + assert pids.size == len(drifters) - drifter_surface = results.isel(trajectory=0) - drifter_depth = results.isel(trajectory=1) + drifter_surface = results.filter(pl.col("particle_id") == pids[0]) + drifter_depth = results.filter(pl.col("particle_id") == pids[1]) - assert drifter_surface.z[0] > drifter_depth.z[0], ( + assert drifter_surface["z"][0] > drifter_depth["z"][0], ( "Surface drifter should be at shallower depth than deeper drifter" ) - surface_depths = drifter_surface.z.values - depth_depths = drifter_depth.z.values + surface_depths = drifter_surface["z"].to_numpy() + depth_depths = drifter_depth["z"].to_numpy() assert np.all(surface_depths[~np.isnan(surface_depths)] == surface_depths[0]), ( "Surface drifter depth should be constant" ) @@ -198,7 +217,7 @@ def test_drifter_depths(tmpdir) -> None: "Depth drifter depth should be constant" ) - assert drifter_surface.temperature[0] != drifter_depth.temperature[0], ( + assert drifter_surface["temperature"][0] != drifter_depth["temperature"][0], ( "Surface and deeper drifter should have different temperature measurements" ) From 90bef409180e1dd449f326d9ab9328ac6a751928 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:25:26 +0200 Subject: [PATCH 072/191] fix bugs in xbt behavious, also update particleset inspection for v4 --- src/virtualship/instruments/xbt.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index c59e6996..c07c385c 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -75,7 +75,7 @@ def _xbt_cast(particles, fieldset): particles.dz = np.where( particles.z + particles.dz < particles.max_depth, particles.max_depth - particles.z, - particles.z, + particles.dz, ) @@ -162,6 +162,9 @@ def simulate(self, measurements, out_path) -> None: max_depth=max_depths, min_depth=[xbt.min_depth for xbt in measurements], fall_speed=[xbt.fall_speed for xbt in measurements], + deceleration_coefficient=[ + xbt.deceleration_coefficient for xbt in measurements + ], ) # add initial conditions to sampling variables @@ -185,7 +188,7 @@ def simulate(self, measurements, out_path) -> None: ) # there should be no particles left, as they delete themselves when they finish profiling - if len(xbt_particleset.particledata) != 0: + if len(xbt_particleset._data["x"]) != 0: raise ValueError( "Simulation ended before XBT finished profiling. This most likely means the field time dimension did not match the simulation time span." ) From 12d87f6c4c5d2da1eacae7356bca860bafbe9e15 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:32:57 +0200 Subject: [PATCH 073/191] update xbt tests for v4 workflows --- tests/instruments/test_xbt.py | 124 +++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 40 deletions(-) diff --git a/tests/instruments/test_xbt.py b/tests/instruments/test_xbt.py index ac4af1a7..e2d8525f 100644 --- a/tests/instruments/test_xbt.py +++ b/tests/instruments/test_xbt.py @@ -8,10 +8,11 @@ from typing import ClassVar import numpy as np +import parcels +import polars as pl import pydantic import pytest import xarray as xr -from parcels import Field, FieldSet from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType @@ -60,6 +61,63 @@ class schedule: return DummyExpedition() +def create_fieldset( + data_dict, + lon_range=(0.0, 1.0), + lat_range=(0.0, 1.0), + depth_range=(-1000, 0), + time_range=None, + bathymetry_val=-1000.0, +): + if time_range is None: + time_range = [ + np.datetime64(BASE_TIME), + np.datetime64(BASE_TIME + datetime.timedelta(hours=3)), + ] + data_vars = {} + for key, val in data_dict.items(): + data_vars[key] = (("time", "depth", "lat", "lon"), val) + + ds_fields = xr.Dataset( + data_vars=data_vars, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + "depth": (("depth"), np.array(depth_range)), + "time": ( + ("time"), + time_range, + {"axis": "T"}, + ), + }, + ) + + fields = {var: ds_fields[var] for var in data_vars.keys()} + ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields) + fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) + + ds_bathymetry = xr.Dataset( + data_vars={ + "bathymetry": ( + ("lat", "lon"), + np.full((len(lat_range), len(lon_range)), bathymetry_val), + ) + }, + coords={ + "lon": (("lon"), np.array(lon_range), {"units": "degrees_east"}), + "lat": (("lat"), np.array(lat_range), {"units": "degrees_north"}), + }, + ) + ds_bathymetry_fset = parcels.convert.copernicusmarine_to_sgrid( + fields={"bathymetry": ds_bathymetry["bathymetry"]} + ) + bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) + + fieldset.add_field(bathymetry_fset.bathymetry) + + return fieldset + + def test_simulate_xbts(tmpdir, xbt_expedition) -> None: # arbitrary time offset for the dummy fieldset base_time = datetime.datetime.strptime("1950-01-01", "%Y-%m-%d") @@ -73,18 +131,18 @@ def test_simulate_xbts(tmpdir, xbt_expedition) -> None: ), min_depth=0, max_depth=float("-inf"), - fall_speed=6.553, - deceleration_coefficient=0.00242, + fall_speed=FALL_SPEED, + deceleration_coefficient=DECELERATION_COEFFICIENT, ), XBT( spacetime=Spacetime( location=Location(latitude=1, longitude=0), - time=base_time, + time=base_time + datetime.timedelta(hours=1), ), min_depth=0, max_depth=float("-inf"), - fall_speed=6.553, - deceleration_coefficient=0.00242, + fall_speed=FALL_SPEED, + deceleration_coefficient=DECELERATION_COEFFICIENT, ), ] @@ -93,25 +151,25 @@ def test_simulate_xbts(tmpdir, xbt_expedition) -> None: { "surface": { "temperature": 6, - "lat": xbts[0].spacetime.location.lat, - "lon": xbts[0].spacetime.location.lon, + "y": xbts[0].spacetime.location.lat, + "x": xbts[0].spacetime.location.lon, }, "maxdepth": { "temperature": 8, - "lat": xbts[0].spacetime.location.lat, - "lon": xbts[0].spacetime.location.lon, + "y": xbts[0].spacetime.location.lat, + "x": xbts[0].spacetime.location.lon, }, }, { "surface": { "temperature": 6, - "lat": xbts[1].spacetime.location.lat, - "lon": xbts[1].spacetime.location.lon, + "y": xbts[1].spacetime.location.lat, + "x": xbts[1].spacetime.location.lon, }, "maxdepth": { "temperature": 8, - "lat": xbts[1].spacetime.location.lat, - "lon": xbts[1].spacetime.location.lon, + "y": xbts[1].spacetime.location.lat, + "x": xbts[1].spacetime.location.lon, }, }, ] @@ -127,49 +185,35 @@ def test_simulate_xbts(tmpdir, xbt_expedition) -> None: t[:, 1, 1, 0] = xbt_exp[1]["surface"]["temperature"] t[:, 0, 1, 0] = xbt_exp[1]["maxdepth"]["temperature"] - fieldset = FieldSet.from_data( - {"V": v, "U": u, "T": t}, - { - "time": [ - np.datetime64(base_time + datetime.timedelta(hours=0)), - np.datetime64(base_time + datetime.timedelta(hours=1)), - ], - "depth": [-1000, 0], - "lat": [0, 1], - "lon": [0, 1], - }, - ) - fieldset.add_field(Field("bathymetry", [-1000], lon=0, lat=0)) + fieldset = create_fieldset({"V": v, "U": u, "T": t}) from_data = None xbt_instrument = XBTInstrument(xbt_expedition, from_data) - out_path = tmpdir.join("out.zarr") + out_path = tmpdir.join("out.parquet") xbt_instrument.load_input_data = lambda: fieldset xbt_instrument.simulate(xbts, out_path) # test if output is as expected - results = xr.open_zarr(out_path) + results = parcels.read_particlefile(out_path) - assert len(results.trajectory) == len(xbts) + assert np.unique(results["particle_id"].to_numpy()).size == len(xbts) - for xbt_i, (traj, exp_bothloc) in enumerate( - zip(results.trajectory, xbt_exp, strict=True) - ): - obs_surface = results.sel(trajectory=traj, obs=0) - min_index = np.argmin(results.sel(trajectory=traj)["z"].data) - obs_maxdepth = results.sel(trajectory=traj, obs=min_index) + for xbt_i, id in enumerate(np.unique(results["particle_id"].to_numpy())): + xbt_df = results.filter(pl.col("particle_id") == id) + obs_surface = xbt_df.filter(pl.col("z") == xbt_df["z"].max())[0] + obs_maxdepth = xbt_df.filter(pl.col("z") == xbt_df["z"].min())[0] for obs, loc in [ (obs_surface, "surface"), (obs_maxdepth, "maxdepth"), ]: - exp = exp_bothloc[loc] - for var in ["temperature", "lat", "lon"]: - obs_value = obs[var].values.item() + exp = xbt_exp[xbt_i][loc] + for var in ["temperature", "y", "x"]: + obs_value = obs[var].item() exp_value = exp[var] - assert np.isclose(obs_value, exp_value), ( + assert np.isclose(obs_value, exp_value, rtol=0.1), ( f"Observation incorrect {xbt_i=} {loc=} {var=} {obs_value=} {exp_value=}." ) From 4e075a2ccd3f47ce703274c95ad6f172f8de710b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:08:23 +0200 Subject: [PATCH 074/191] attempt to fix pixi env and CI --- .github/workflows/ci.yml | 2 +- pixi.toml | 38 +++++++++++++++++++------------------- pyproject.toml | 22 ++++++++++------------ 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b93379b..85a1f227 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: pixi-environment: ["test-latest"] runs-on: [ubuntu-latest, windows-latest, macos-14] include: - - pixi-environment: "test-py310" + - pixi-environment: "test-py311" runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 diff --git a/pixi.toml b/pixi.toml index 3d18b8b4..a373ec3f 100644 --- a/pixi.toml +++ b/pixi.toml @@ -15,11 +15,11 @@ backend = { name = "pixi-build-python", version = "0.4.*" } [package.host-dependencies] python = "3.12.*" -setuptools = "*" -setuptools_scm = "*" +setuptools = ">=61.0" +setuptools_scm = ">=8.0" [package.run-dependencies] # Keep in sync with `pyproject.toml` and feedstock recipe -python = "3.12.*" +python = ">=3.11,<3.13" click = "*" pyproj = ">=3,<4" sortedcontainers = "==2.4.0" @@ -33,12 +33,12 @@ textual = "*" [dependencies] virtualship = { path = "." } -python = "3.12.*" # Pre-install as conda packages to avoid PyPI source builds netcdf4 = "*" numpy = ">=2.1.0" dask = "*" -zarr = ">=3" +pandas = "*" +pyarrow = "*" ipdb = ">=0.13.13,<0.14" cmocean = ">=4.0.3,<5" numba = ">=0.59.0" @@ -46,15 +46,13 @@ numba = ">=0.59.0" [pypi-dependencies] parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } -# Commented out whilst parcels v4 alpha only supports Python 3.11 (?) -# [feature.py310.dependencies] -# python = "3.10.*" +[feature.py311.dependencies] +python = "3.11.*" +zarr = ">=3.0.0" -# [feature.py311.dependencies] -# python = "3.11.*" - -# [feature.py312.dependencies] -# python = "3.12.*" +[feature.py312.dependencies] +python = "3.12.*" +zarr = ">=3.0.0" [feature.test.dependencies] pytest = "*" @@ -120,10 +118,12 @@ types-xlrd = "*" typing = "mypy src/virtualship --install-types" [environments] -default = { features = ["test", "notebooks", "typing", "pre-commit", "analysis"] } -test-latest = { features = ["test"], solve-group = "test" } -test-notebooks = { features = ["test", "notebooks"], solve-group = "test" } -analysis = { features = ["analysis"], solve-group = "analysis" } -docs = { features = ["docs"], solve-group = "docs" } -typing = { features = ["typing"], solve-group = "typing" } +default = { features = ["py312", "test", "notebooks", "typing", "pre-commit", "analysis"] } +test-latest = { features = ["py312", "test"], solve-group = "test-py312" } +test-py311 = { features = ["py311", "test"], solve-group = "test-py311" } +test-py312 = { features = ["py312", "test"], solve-group = "test-py312" } +test-notebooks = { features = ["py312", "test", "notebooks"], solve-group = "test-py312" } +analysis = { features = ["py312", "analysis"], solve-group = "analysis" } +docs = { features = ["py312", "docs"], solve-group = "docs" } +typing = { features = ["py312", "typing"], solve-group = "typing" } pre-commit = { features = ["pre-commit"], no-default-feature = true } diff --git a/pyproject.toml b/pyproject.toml index d83dc25c..1fbeff00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,11 +8,11 @@ description = "Code for the Virtual Ship Classroom, where Marine Scientists can readme = "README.md" dynamic = ["version"] authors = [{ name = "parcels-code.org team" }] -requires-python = ">=3.10" -license = { file = "LICENSE" } +requires-python = ">=3.10, <3.13" +license = "MIT" +license-files = ["LICENSE"] classifiers = [ "Development Status :: 3 - Alpha", - "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", @@ -41,11 +41,10 @@ dependencies = [ [project.urls] Homepage = "https://virtualship.parcels-code.org/" -Repository = "https://github.com/OceanParcels/virtualship" +Repository = "https://github.com/Parcels-code/virtualship" Documentation = "https://virtualship.readthedocs.io/" -"Bug Tracker" = "https://github.com/OceanParcels/virtualship/issues" -Changelog = "https://github.com/OceanParcels/virtualship/releases" - +"Bug Tracker" = "https://github.com/Parcels-code/virtualship/issues" +Changelog = "https://github.com/Parcels-code/virtualship/releases" [tool.setuptools.packages.find] where = ["src"] @@ -60,7 +59,6 @@ local_scheme = "no-local-version" [project.scripts] virtualship = "virtualship.cli.main:cli" - [tool.pytest.ini_options] minversion = "6.0" addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] @@ -78,10 +76,11 @@ testpaths = [ "tests", ] +[tool.coverage.run] +source = ["virtualship"] -[tool.coverage] -run.source = ["virtualship"] -report.exclude_also = [ +[tool.coverage.report] +exclude_also = [ '\.\.\.', 'if typing.TYPE_CHECKING:', ] @@ -120,7 +119,6 @@ ignore = [ "D100", "D103" ] - [tool.mypy] files = ['src'] disable_error_code = "import-untyped" From dc783c03ac8b1d399684b4321ee14240d3989127 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 09:16:25 +0200 Subject: [PATCH 075/191] update pixi and CI to python 3.14 --- pixi.toml | 27 +++++++++++++-------------- pyproject.toml | 31 +++++++++++++------------------ 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/pixi.toml b/pixi.toml index a373ec3f..a429025d 100644 --- a/pixi.toml +++ b/pixi.toml @@ -14,12 +14,11 @@ version = "dynamic" # dynamic versioning needs better support in pixi https://gi backend = { name = "pixi-build-python", version = "0.4.*" } [package.host-dependencies] -python = "3.12.*" -setuptools = ">=61.0" -setuptools_scm = ">=8.0" +setuptools = "*" +setuptools_scm = "*" -[package.run-dependencies] # Keep in sync with `pyproject.toml` and feedstock recipe -python = ">=3.11,<3.13" +[package.run-dependencies] # Keep in sync with `pyproject.toml` dependencies +python = ">=3.11" click = "*" pyproj = ">=3,<4" sortedcontainers = "==2.4.0" @@ -50,8 +49,8 @@ parcels = { git = "https://github.com/Parcels-code/Parcels", branch = "main" } python = "3.11.*" zarr = ">=3.0.0" -[feature.py312.dependencies] -python = "3.12.*" +[feature.py314.dependencies] +python = "3.14.*" zarr = ">=3.0.0" [feature.test.dependencies] @@ -118,12 +117,12 @@ types-xlrd = "*" typing = "mypy src/virtualship --install-types" [environments] -default = { features = ["py312", "test", "notebooks", "typing", "pre-commit", "analysis"] } -test-latest = { features = ["py312", "test"], solve-group = "test-py312" } +default = { features = ["py314", "test", "notebooks", "typing", "pre-commit", "analysis"], solve-group = "main" } +test-latest = { features = ["py314", "test"], solve-group = "test-py314" } test-py311 = { features = ["py311", "test"], solve-group = "test-py311" } -test-py312 = { features = ["py312", "test"], solve-group = "test-py312" } -test-notebooks = { features = ["py312", "test", "notebooks"], solve-group = "test-py312" } -analysis = { features = ["py312", "analysis"], solve-group = "analysis" } -docs = { features = ["py312", "docs"], solve-group = "docs" } -typing = { features = ["py312", "typing"], solve-group = "typing" } +test-py314 = { features = ["py314", "test"], solve-group = "test-py314" } +test-notebooks = { features = ["py314", "test", "notebooks"], solve-group = "test-py314" } +analysis = { features = ["py314", "analysis"], solve-group = "analysis" } +docs = { features = ["py314", "docs"], solve-group = "docs" } +typing = { features = ["py314", "typing"], solve-group = "main" } pre-commit = { features = ["pre-commit"], no-default-feature = true } diff --git a/pyproject.toml b/pyproject.toml index 1fbeff00..a5f1f8e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,21 @@ [build-system] -requires = ["setuptools >= 61.0", "setuptools_scm[toml]>=6.2"] +requires = ["setuptools>=61.0", "setuptools_scm>=8.0"] build-backend = "setuptools.build_meta" [project] name = "virtualship" -description = "Code for the Virtual Ship Classroom, where Marine Scientists can combine Copernicus Marine Data with an OceanParcels ship to go on a virtual expedition." +description = "Code for VirtualShip, where Marine Scientists can combine Copernicus Marine Data with a Parcels ship to go on a virtual expedition." readme = "README.md" dynamic = ["version"] authors = [{ name = "parcels-code.org team" }] -requires-python = ">=3.10, <3.13" -license = "MIT" -license-files = ["LICENSE"] +requires-python = ">=3.11" +license = { file = "LICENSE" } classifiers = [ - "Development Status :: 3 - Alpha", - "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", "Topic :: Scientific/Engineering", "Topic :: Education", @@ -26,17 +23,15 @@ classifiers = [ ] dependencies = [ "click", - "parcels >=4.0.0alpha", - "pyproj >= 3, < 4", - "sortedcontainers == 2.4.0", - "opensimplex == 0.4.5", - "numpy >=2.1.0", - "pydantic >=2, <3", - "PyYAML", - "copernicusmarine >= 2.2.2", + "pyproj>=3,<4", + "sortedcontainers==2.4.0", + "opensimplex==0.4.5", + "numpy>=2.1.0", + "pydantic>=2,<3", + "pyyaml", + "copernicusmarine>=2.2.2", "yaspin", "textual", - "openpyxl", ] [project.urls] From 1d3955a919da97a652e0f615308c49dbcbe5d438 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 09:39:12 +0200 Subject: [PATCH 076/191] update contribution guide for pixi instructions --- docs/contributing/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/contributing/index.md b/docs/contributing/index.md index 171d714e..47db0282 100644 --- a/docs/contributing/index.md +++ b/docs/contributing/index.md @@ -51,9 +51,8 @@ You can use the following Pixi commands to run common development tasks. VirtualShip supports testing against different environments (e.g., different Python versions) with different feature sets. In CI we test against these environments, and you can too locally. For example: -- `pixi run -e test-py310 tests` - Run tests using Python 3.10 -- `pixi run -e test-py311 tests` - Run tests using Python 3.11 -- `pixi run -e test-py312 tests` - Run tests using Python 3.12 +- `pixi run -e test-py311 tests` - Run tests using Python 3.11 (lower bound) +- `pixi run -e test-py314 tests` - Run tests using Python 3.14 The name of the workflow on GitHub contains the command you have to run locally to recreate the workflow - making it super easy to reproduce CI failures locally. From 616f5d824c6463e4379411e392ebf395d6ddb585 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:36:44 +0200 Subject: [PATCH 077/191] fix pre-commit issue --- src/virtualship/instruments/sensors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/virtualship/instruments/sensors.py b/src/virtualship/instruments/sensors.py index 2db148d8..1205880f 100644 --- a/src/virtualship/instruments/sensors.py +++ b/src/virtualship/instruments/sensors.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass -from enum import Enum +from enum import StrEnum from functools import lru_cache from typing import Literal @@ -9,7 +9,7 @@ from parcels import Variable -class SensorType(str, Enum): +class SensorType(StrEnum): """Sensors available. Different intstruments mix and match these sensors as needed.""" TEMPERATURE = "TEMPERATURE" From 9a53435e2c7e7a928f1cdf13946a1adcf62b3f35 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:37:58 +0200 Subject: [PATCH 078/191] sort out encoding to avoid UserWarnings --- src/virtualship/instruments/base.py | 7 +++++-- src/virtualship/utils.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 0d5edc82..e06ae344 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -28,6 +28,7 @@ _get_bathy_data, _get_waypoint_latlons, _select_product_id, + get_clean_encoding, ship_spinner, ) @@ -318,11 +319,13 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: @staticmethod def _via_tmp_ds(ds: xr.Dataset) -> xr.Dataset: """Create and re-load a temporary local dataset.""" + encoding = get_clean_encoding(ds) + with tempfile.TemporaryDirectory() as tmpdir: tmp_fpath = Path(tmpdir) / "tmp.nc" - ds.to_netcdf(tmp_fpath) + ds.to_netcdf(tmp_fpath, encoding=encoding) - # Open and load into memory so the file handle closes before tmpdir exits + # context manage to ensure file closure with xr.open_dataset(tmp_fpath) as loaded_ds: return loaded_ds.load() diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 8ccf69a5..30f3dffc 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -673,6 +673,20 @@ def build_particle_class_from_sensors( return Particle.add_variable(nonsensor_variables + sensor_variables) +def get_clean_encoding(ds): + """ + Clean existing encodings and supply explicit native endianness to prevent netCDF4 UserWarnings. + + Helps avoid annoying user warnings when writing tmp files to disk. + """ + encoding = {} + for var_name, var in ds.variables.items(): + var.encoding.pop("endian", None) + encoding[var_name] = {"endian": "native"} + + return encoding + + # ===================================================== # SECTION: misc. # ===================================================== From f37ce1d1974095854c786a7b58b316348e7114c8 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:44:20 +0200 Subject: [PATCH 079/191] use fieldset.time_interval.left notation --- src/virtualship/instruments/argo_float.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 029a0aec..eafeb612 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -223,7 +223,7 @@ def _format_log_metadata(ptcls_subset, mask, fieldset): lats = ptcls_subset.y[mask].astype(float) lons = ptcls_subset.x[mask].astype(float) - time_origin = fieldset.U.data.time[0].values + time_origin = fieldset.time_interval.left times = ptcls_subset.t[mask].astype("timedelta64[s]") + time_origin return times, lats, lons From b3fe2de8b1bdc38edeb382fbb7234beaf663525f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:44:30 +0200 Subject: [PATCH 080/191] add _handle_grounding test --- tests/instruments/test_argo_float.py | 60 +++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index c9e881d4..b7da7a60 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -10,7 +10,11 @@ import pytest import xarray as xr -from virtualship.instruments.argo_float import ArgoFloat, ArgoFloatInstrument +from virtualship.instruments.argo_float import ( + ArgoFloat, + ArgoFloatInstrument, + _handle_grounding, +) from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType from virtualship.models import Location, Spacetime @@ -296,3 +300,57 @@ def test_argo_float_instrument_type(): argo_instrument = ArgoFloatInstrument(expedition, from_data=None) assert argo_instrument.instrument_type == InstrumentType.ARGO_FLOAT assert not argo_instrument.instrument_type.is_underway + + +def test_handle_grounding(): + """Test that _handle_grounding sets grounded status, logs warnings, adjusts dz, and updates cycle phase.""" + + class DummyParticles: + def __init__(self): + self.grounded = np.array([0, 0]) + self.z = np.array([-1200.0, -1500.0]) + self.dz = np.array([0.0, 0.0]) + self.cycle_phase = np.array([1, 1]) + self.t = np.array([0.0, 0.0]) + self.y = np.array([10.0, 11.0]) + self.x = np.array([50.0, 51.0]) + + ptcls = DummyParticles() + + # index 0 is grounded (-1000m bathymetry vs -1200m particle depth) + # index 1 is safe (-2000m bathymetry vs -1500m particle depth) + loc_bathy = np.array([-1000.0, -2000.0]) + bathysafe_mask = np.array([False, True]) + + target_phase = 2 + fieldset = create_fieldset() + + # capture print outputs + log_stream = io.StringIO() + with contextlib.redirect_stdout(log_stream): + _handle_grounding( + ptcls_subset=ptcls, + bathysafe_mask=bathysafe_mask, + loc_bathy=loc_bathy, + fieldset=fieldset, + phase_name="descent", + target_phase=target_phase, + ) + + output = log_stream.getvalue() + + # grounding mask applied correctly + np.testing.assert_array_equal(ptcls.grounded, np.array([1, 0])) + + # dz updated (target depth = bathy + 50m = -1000 + 50 = -950m; dz = -950 - (-1200) = 250m) + expected_dz = np.array([250.0, 0.0]) + np.testing.assert_allclose(ptcls.dz, expected_dz) + + # cycle phase updated + np.testing.assert_array_equal(ptcls.cycle_phase, np.array([target_phase, 1])) + + # warning message printed + assert ( + "Shallow bathymetry warning: Argo float grounded at bathymetry during descent" + in output + ) From 84db2eb3ea23e840fc472a3106eede5899b8ec56 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 7 Aug 2026 11:48:31 +0200 Subject: [PATCH 081/191] remove docstring for consistency --- src/virtualship/cli/_run.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index a320acad..6969d32f 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -1,5 +1,3 @@ -"""do_expedition function.""" - import logging import os import shutil From fb789fc507f88d38e455c6dc8625232a34f753bd Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 7 Aug 2026 11:53:38 +0200 Subject: [PATCH 082/191] filter out parcels v4 user warning for (temporary measure) --- src/virtualship/cli/main.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/virtualship/cli/main.py b/src/virtualship/cli/main.py index a02a5ffb..a055429f 100644 --- a/src/virtualship/cli/main.py +++ b/src/virtualship/cli/main.py @@ -1,6 +1,15 @@ -import click +import warnings -from . import commands +# TODO: remove this when Parcels v4 is no longer alpha and the warning is no longer issued +warnings.filterwarnings( + "ignore", + message="This is an alpha version of Parcels v4.*", + category=UserWarning, +) + +import click # noqa: E402 + +from . import commands # noqa: E402 @click.group() From 495c1437d28a42c7c6585e8744b1a0612d304db0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:13:18 +0200 Subject: [PATCH 083/191] remove initial sampling from argo floats --- src/virtualship/instruments/argo_float.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index eafeb612..4ae81966 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -324,10 +324,8 @@ def simulate(self, measurements, out_path) -> None: drift_days=[argo.drift_days for argo in measurements], ) - # add initial conditions to sampling variables - self._sample_initial( - argo_float_particleset, fieldset, argo_float_config.sensors - ) + # N.B. whilst some instruments need sample initial conditions (`_sample_initial`), Argo floats should not; + # as this would result in sampling at the initial release, which is not authentic. The sampling should occur during the ascent phase of the cycles. # define output file for the simulation out_file = ParticleFile( From 26d6681b761722d436ab82e0babc97f6d6445a46 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 10 Aug 2026 14:44:19 +0200 Subject: [PATCH 084/191] argo kernel: solve issue of not updating cycle_age during ascent --- src/virtualship/instruments/argo_float.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 4ae81966..66e7ca3d 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -113,6 +113,7 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 3: Rising with vertical_speed until at surface ptcls3.dz -= particles.vertical_speed * ptcls3.dt + ptcls3.cycle_age += ptcls3.dt # solve issue of not updating cycle_age during ascent next_phase = ptcls3.z + ptcls3.dz >= particles.min_depth ptcls3.cycle_phase[next_phase] = 4 ptcls3.dz[next_phase] = particles.min_depth - ptcls3.z[next_phase] # noqa:avoid overshoot From bc7a6b65ce4ad82dbcc346b2c0bff8b6386dfee0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:42:37 +0200 Subject: [PATCH 085/191] add state_date argument to init command --- src/virtualship/cli/commands.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index 41f4d519..b5110fac 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -10,6 +10,7 @@ EXPEDITION, get_example_expedition, mfp_to_yaml, + validate_start_date, ) @@ -26,7 +27,15 @@ 'Marine Facilities Planning tool (specifically the "Export Coordinates > DD" option). ' "User edits are required after initialisation.", ) -def init(path, from_mfp): +@click.option( + "--start-date", + type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S", "%Y-%m-%d"]), + default=None, + callback=validate_start_date, + help="The departure/start date of the expedition (required when using --from-mfp). " + "Expected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00.", +) +def init(path, from_mfp, start_date): """ Initialize a directory for a new expedition, with an expedition.yaml file. @@ -46,7 +55,9 @@ def init(path, from_mfp): mfp_file = Path(from_mfp) # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") - mfp_to_yaml(mfp_file, expedition) + mfp_to_yaml(mfp_file, start_date, expedition) + # TODO: this print needs to be updated + # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. click.echo( "\n⚠️ The generated schedule does not contain TIME values or INSTRUMENT selections. ⚠️" "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the schedule configuration, " From 9c14261328476672ba376acf2296904957de18ab Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:43:23 +0200 Subject: [PATCH 086/191] handle timedeltas from mfp export, .xlsx only now that MFP export is .xslx only --- src/virtualship/utils.py | 126 +++++++++++++++++++++++++-------------- 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 30f3dffc..9126c72d 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -11,6 +11,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Literal, TextIO +import click import copernicusmarine import numpy as np import parcels @@ -181,35 +182,56 @@ def _generic_load_yaml(data: str, model: BaseModel) -> BaseModel: return model.model_validate(yaml.safe_load(data)) -def load_coordinates(file_path): - """Loads coordinates from a file based on its extension.""" +def validate_start_date(ctx, param, value): + """Callback to enforce and validate --start-date when --from-mfp is used.""" + if ctx.params.get("from_mfp"): + if not value: + raise click.BadParameter( + "The '--start-date' option is required when using '--from-mfp'." + "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." + ) + return value + + +def _load_mfpexport(file_path): if not os.path.isfile(file_path): raise FileNotFoundError(f"File not found: {file_path}") - ext = os.path.splitext(file_path)[-1].lower() - try: - if ext in [".xls", ".xlsx"]: - return pd.read_excel(file_path) - - if ext == ".csv": - return pd.read_csv(file_path) - - raise ValueError(f"Unsupported file extension {ext}.") + df = pd.read_excel(file_path) + return df.dropna(how="all", axis=1) # drop empty columns except Exception as e: raise RuntimeError( "Could not read coordinates data from the provided file. " - "Ensure it is either a csv or excel file." + "Ensure it is an exported .xlsx file from MFP." ) from e -def validate_coordinates(coordinates_data): - # Expected column headers - expected_columns = {"Station Type", "Name", "Latitude", "Longitude"} +def _validate_mfpdata(file_path): + """Load and validate MFP CruiseData export.""" + mfp_data = _load_mfpexport(file_path) + + # clean up column names + mfp_data.columns = mfp_data.columns.astype(str).str.strip() + mfp_data = mfp_data.loc[ + :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") + ] - # Check if the headers match the expected ones - actual_columns = set(coordinates_data.columns) + expected_columns = { + "Station", + "Type", + "Latitude", + "Longitude", + "Sea Depth", + "Time at Station", + "Travel Time to Next", + "Distance to Next (NM)", + "Ship Speed (kn)", + "EEZ", + } + + actual_columns = set(mfp_data.columns) missing_columns = expected_columns - actual_columns if missing_columns: @@ -228,42 +250,39 @@ def validate_coordinates(coordinates_data): stacklevel=2, ) - # Drop unexpected columns (optional, only if you want to ensure strict conformity) - coordinates_data = coordinates_data[list(expected_columns)] - - # Continue with the rest of the function after validation... - coordinates_data = coordinates_data.dropna() + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] # Convert latitude and longitude to floats, replacing commas with dots # Handles case when the latitude and longitude have decimals with commas - if coordinates_data["Latitude"].dtype in ["object", "string"]: - coordinates_data["Latitude"] = coordinates_data["Latitude"].apply( + if mfp_data["Latitude"].dtype in ["object", "string"]: + mfp_data["Latitude"] = mfp_data["Latitude"].apply( lambda x: float(x.replace(",", ".")) ) - if coordinates_data["Longitude"].dtype in ["object", "string"]: - coordinates_data["Longitude"] = coordinates_data["Longitude"].apply( + if mfp_data["Longitude"].dtype in ["object", "string"]: + mfp_data["Longitude"] = mfp_data["Longitude"].apply( lambda x: float(x.replace(",", ".")) ) - return coordinates_data - + # convert 'Travel Time to Next' and 'Time at Station' to timedelta + mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) -def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D417 - """ - Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version. + # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column + mfp_data["Total Time"] = ( + mfp_data["Travel Time to Next"] + mfp_data["Time at Station"] + ) - Parameters - ---------- - - excel_file_path (str): Path to the Excel file containing coordinate and instrument data. + return mfp_data - The function: - 1. Reads instrument and location data from the Excel file. - 2. Determines the maximum depth and buffer based on the instruments present. - 3. Ensures longitude and latitude values remain valid after applying buffer adjustments. - 4. returns the yaml information. - """ +def mfp_to_yaml(file_path: str, start_date: str, output_path: str): + """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" # avoid circular imports from virtualship.models import ( Expedition, @@ -274,19 +293,24 @@ def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D41 ) # Read data from file - coordinates_data = load_coordinates(coordinates_file_path) - - coordinates_data = validate_coordinates(coordinates_data) + mfp_data = _validate_mfpdata(file_path) # Generate waypoints waypoints = [] - for _, row in coordinates_data.iterrows(): + current_time, previous_timedelta = start_date, None + for i, row in mfp_data.iterrows(): + if i > 0: + current_time += previous_timedelta waypoints.append( Waypoint( - instrument=None, # instruments blank, to be built by user using `virtualship plan` UI or by interacting directly with YAML files + instrument=None, location=Location(latitude=row["Latitude"], longitude=row["Longitude"]), + time=current_time, ) ) + previous_timedelta = row[ + "Total Time" + ] # store total timedelta for next iteration # Create Schedule object schedule = Schedule( @@ -309,7 +333,17 @@ def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D41 ) # Save to YAML file - expedition.to_yaml(yaml_output_path) + expedition.to_yaml(output_path) + + +def _mfp_string_to_timedelta(value: str) -> timedelta: + """Handle MFP export string format (e.g., "0d 13h 13m").""" + if pd.isna(value): # last waypoint has no travel time to next, so will be NaN + return timedelta(0) + + value = value.replace("d", ":").replace("h", ":").replace("m", "") + days, hours, minutes = map(int, value.split(":")) + return timedelta(days=days, hours=hours, minutes=minutes) def _validate_numeric_to_timedelta( From 2c303d126243f8212e8a7ecfc69139a271411618 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:54:07 +0200 Subject: [PATCH 087/191] update click.echo(); no time instructions required --- src/virtualship/cli/commands.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index b5110fac..2ecf7125 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -56,14 +56,16 @@ def init(path, from_mfp, start_date): # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: this print needs to be updated # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. + # TODO: the schedule object should be able to take a special 'port' waypoint type, which is the same as a regular waypoint (to ensure compatibility) but without 'instruments' + # TODO: need to check this interacts as expected with the 'problems' module + # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) + # TODO: but add and remove waypoint buttons should ignore ports click.echo( - "\n⚠️ The generated schedule does not contain TIME values or INSTRUMENT selections. ⚠️" - "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the schedule configuration, " - "\nOR edit 'expedition.yaml' and manually add the necessary time values and instrument selections under the 'schedule' heading." + "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" + "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " + "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🕒 Expected time format: 'YYYY-MM-DD HH:MM:SS' (e.g., '2023-10-20 01:00:00')." "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" ) From ff2f8f8a197edb75fa71d93153d49e6b7a4059f1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:05:15 +0200 Subject: [PATCH 088/191] add waypoint numbers (comments) to expedition.yaml --- src/virtualship/models/expedition.py | 19 +++++++- src/virtualship/static/expedition.yaml | 67 ++++++++++++++------------ 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index b7269373..07e4d184 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -37,9 +37,24 @@ class Expedition(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") def to_yaml(self, file_path: str) -> None: - """Write exepedition object to yaml file.""" + """Write expedition object to yaml file, with waypoint number comments.""" + raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) + + breakpoint() + lines = raw.splitlines(keepends=True) + annotated = [] + waypoint_number = 0 + for line in lines: + if line.lstrip().startswith( + "- instrument:" + ): # TODO: unit test that this is how each waypoint is identified in the yaml dump + waypoint_number += 1 + indent = " " * (len(line) - len(line.lstrip())) + annotated.append(f"{indent}# Waypoint {waypoint_number}\n") + annotated.append(line) + with open(file_path, "w") as file: - yaml.dump(self.model_dump(by_alias=True), file) + file.writelines(annotated) @classmethod def from_yaml(cls, file_path: str) -> Expedition: diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index acb16dcf..0f2c0c0b 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -1,36 +1,5 @@ # see https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/working_with_expedition_yaml.html for more details on how to edit this file # -schedule: - waypoints: - - instrument: - - CTD - location: - latitude: 0 - longitude: 0 - time: 1998-01-01 00:00:00 - - instrument: - - DRIFTER - - CTD - location: - latitude: 0.01 - longitude: 0.01 - time: 1998-01-02 01:00:00 - - instrument: - - ARGO_FLOAT - location: - latitude: 0.02 - longitude: 0.02 - time: 1998-01-03 02:00:00 - - instrument: - - XBT - location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-04 03:00:00 - - location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-05 03:00:00 instruments_config: adcp_config: num_bins: 40 @@ -82,5 +51,41 @@ instruments_config: sensors: - TEMPERATURE - SALINITY +schedule: + waypoints: + # Waypoint 1 + - instrument: + - CTD + location: + latitude: 0 + longitude: 0 + time: 1998-01-01 00:00:00 + # Waypoint 2 + - instrument: + - DRIFTER + - CTD + location: + latitude: 0.01 + longitude: 0.01 + time: 1998-01-02 01:00:00 + # Waypoint 3 + - instrument: + - ARGO_FLOAT + location: + latitude: 0.02 + longitude: 0.02 + time: 1998-01-03 02:00:00 + # Waypoint 4 + - instrument: + - XBT + location: + latitude: 0.03 + longitude: 0.03 + time: 1998-01-04 03:00:00 + # Waypoint 5 + - location: + latitude: 0.03 + longitude: 0.03 + time: 1998-01-05 03:00:00 ship_config: ship_speed_knots: 10.0 From bf3a44249a4c45689d38b6fac6b6b1daf9a8b51b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:13:08 +0200 Subject: [PATCH 089/191] add unit test: waypoint field in yaml always starts with "- instrument" --- src/virtualship/models/expedition.py | 4 +-- tests/expedition/test_expedition.py | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 07e4d184..176220a5 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -45,9 +45,7 @@ def to_yaml(self, file_path: str) -> None: annotated = [] waypoint_number = 0 for line in lines: - if line.lstrip().startswith( - "- instrument:" - ): # TODO: unit test that this is how each waypoint is identified in the yaml dump + if line.lstrip().startswith("- instrument:"): waypoint_number += 1 indent = " " * (len(line) - len(line.lstrip())) annotated.append(f"{indent}# Waypoint {waypoint_number}\n") diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index 4bde12bd..406ffbe4 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -7,6 +7,7 @@ import pyproj import pytest import xarray as xr +import yaml from virtualship.errors import InstrumentsConfigError, ScheduleError from virtualship.models import ( @@ -371,3 +372,40 @@ def test_all_instrument_configs_use_mixin(expedition): assert iconfig.__class__._instrument_type == iconfig._instrument_type, ( f"{iconfig.__class__.__name__}._instrument_type does not match its registered InstrumentType" ) + + +def test_waypoint_yaml_line() -> None: + """Each waypoint entry in the raw YAML dump should start with '- instrument:'.""" + base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") + schedule = Schedule( + waypoints=[ + Waypoint(location=Location(0, 0), time=base_time, instrument=None), + Waypoint( + location=Location(1, 1), + time=base_time + timedelta(hours=1), + instrument=None, + ), + Waypoint( + location=Location(2, 2), + time=base_time + timedelta(hours=2), + instrument=["CTD"], + ), + ] + ) + raw = yaml.dump( + { + "schedule": { + "waypoints": [wp.model_dump(by_alias=True) for wp in schedule.waypoints] + } + }, + default_flow_style=False, + ) + + lines = [ + line for line in raw.splitlines() if line.lstrip().startswith("- instrument:") + ] + assert len(lines) == len(schedule.waypoints), ( + f"Expected {len(schedule.waypoints)} lines starting with '- instrument:' in the YAML dump, " + f"got {len(lines)}. The Waypoint field order or teminology may have changed. " + "Note this can have implications for the placement of waypoint number comments in Expedition.to_yaml()." + ) From a1d0b5e94bf6a76cd2ed2ce633f77935166aaf94 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:45:02 +0200 Subject: [PATCH 090/191] new Port class --- .../expedition/simulate_schedule.py | 7 ++- src/virtualship/models/__init__.py | 2 + src/virtualship/models/expedition.py | 63 ++++++++++++++----- src/virtualship/models/location.py | 29 +++++---- 4 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 6af9d80c..93dd7441 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -16,6 +16,7 @@ from virtualship.models import ( Expedition, Location, + Port, Spacetime, Waypoint, ) @@ -247,7 +248,11 @@ def _get_underway_stationary_times( for i in range(1, int(npts) + 1) ] - def _make_measurements(self, waypoint: Waypoint) -> timedelta: + def _make_measurements(self, waypoint: Waypoint | Port) -> timedelta: + # port stops have no instruments + if isinstance(waypoint, Port): + return timedelta() + # if there are no instruments, there is no time cost if waypoint.instrument is None: return timedelta() diff --git a/src/virtualship/models/__init__.py b/src/virtualship/models/__init__.py index dd4b2bf1..b95544c8 100644 --- a/src/virtualship/models/__init__.py +++ b/src/virtualship/models/__init__.py @@ -8,6 +8,7 @@ DrifterConfig, Expedition, InstrumentsConfig, + Port, Schedule, SensorConfig, ShipConfig, @@ -23,6 +24,7 @@ __all__ = [ # noqa: RUF022 "Location", + "Port", "Schedule", "SensorConfig", "ShipConfig", diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 176220a5..5b519316 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -37,19 +37,8 @@ class Expedition(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") def to_yaml(self, file_path: str) -> None: - """Write expedition object to yaml file, with waypoint number comments.""" - raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) - - breakpoint() - lines = raw.splitlines(keepends=True) - annotated = [] - waypoint_number = 0 - for line in lines: - if line.lstrip().startswith("- instrument:"): - waypoint_number += 1 - indent = " " * (len(line) - len(line.lstrip())) - annotated.append(f"{indent}# Waypoint {waypoint_number}\n") - annotated.append(line) + """Write expedition object to yaml file, with port/waypoint number comments.""" + annotated = self._annotate() with open(file_path, "w") as file: file.writelines(annotated) @@ -66,6 +55,8 @@ def get_instruments(self) -> set[InstrumentType]: instruments_in_expedition = [] # from waypoints for waypoint in self.schedule.waypoints: + if isinstance(waypoint, Port): + continue if waypoint.instrument: for instrument in waypoint.instrument: if instrument: @@ -83,6 +74,36 @@ def get_instruments(self) -> set[InstrumentType]: "Underway instrument config attribute(s) are missing from YAML. Must be Config object or None." ) from e + def _annotate(self): + """Add port/waypoint comments/annotations to the expedition.yaml file.""" + assert isinstance(self.schedule.waypoints[0], Port) & isinstance( + self.schedule.waypoints[-1], Port + ), ( + "First and last waypoints must be Ports." + ) # commenting logic below assumes first and last waypoints are ports + + raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) + + lines = raw.splitlines(keepends=True) + annotated = [] + waypoint_number = 0 + for line in lines: + stripped = line.lstrip() + indent = " " * (len(line) - len(stripped)) + + # waypoints start with "- instrument:" and Ports start with "- location:" (no instrument field). + if stripped.startswith("- instrument:"): + waypoint_number += 1 + annotated.append(f"{indent}# Waypoint {waypoint_number}\n") + + if stripped.startswith("- location:"): + arrival_departure = "Departure" if waypoint_number == 0 else "Arrival" + annotated.append(f"{indent}# Port of {arrival_departure}\n") + + annotated.append(line) + + return annotated + class ShipConfig(pydantic.BaseModel): """Configuration of the ship.""" @@ -97,7 +118,7 @@ class ShipConfig(pydantic.BaseModel): class Schedule(pydantic.BaseModel): """Schedule of the virtual ship.""" - waypoints: list[Waypoint] + waypoints: list[Port | Waypoint] model_config = pydantic.ConfigDict(extra="forbid") @@ -150,6 +171,8 @@ def verify( ) from e for wp_i, wp in enumerate(self.waypoints): + if isinstance(wp, Port): + continue # ports are in harbour; skip bathymetry land check try: value = bathymetry_field.eval( np.float64(0.0), # time @@ -175,7 +198,8 @@ def verify( zip(self.waypoints, self.waypoints[1:], strict=False) ): stationkeeping_time = _calc_wp_stationkeeping_time( - wp.instrument, instruments_config + wp.instrument if isinstance(wp, Waypoint) else None, + instruments_config, ) time_to_reach = _calc_sail_time( @@ -201,6 +225,15 @@ def verify( print("... All good to go!") +class Port(pydantic.BaseModel): + """A port stop: a location the ship visits with no instrument deployments made.""" + + location: Location | None = None + time: datetime | None = None + + model_config = pydantic.ConfigDict(extra="forbid") + + class Waypoint(pydantic.BaseModel): """A Waypoint to sail to with an optional time and an optional instrument.""" diff --git a/src/virtualship/models/location.py b/src/virtualship/models/location.py index 793e5312..1c40bb8b 100644 --- a/src/virtualship/models/location.py +++ b/src/virtualship/models/location.py @@ -7,26 +7,29 @@ class Location: """A location on a sphere.""" - latitude: float - longitude: float + latitude: float | None = None + longitude: float | None = None def __post_init__(self) -> None: """ - Verify this location has valid latitude and longitude. + Verify this location has valid latitude and longitude if provided. :raises ValueError: If latitude and/or longitude are not valid. """ - if self.lat < -90: - raise ValueError("Latitude cannot be smaller than -90.") - if self.lat > 90: - raise ValueError("Latitude cannot be larger than 90.") - if self.lon < -180: - raise ValueError("Longitude cannot be smaller than -180.") - if self.lon > 360: - raise ValueError("Longitude cannot be larger than 360.") + if self.lat is not None: + if self.lat < -90: + raise ValueError("Latitude cannot be smaller than -90.") + if self.lat > 90: + raise ValueError("Latitude cannot be larger than 90.") + + if self.lon is not None: + if self.lon < -180: + raise ValueError("Longitude cannot be smaller than -180.") + if self.lon > 360: + raise ValueError("Longitude cannot be larger than 360.") @property - def lat(self) -> float: + def lat(self) -> float | None: """ Shorthand for latitude variable. @@ -35,7 +38,7 @@ def lat(self) -> float: return self.latitude @property - def lon(self) -> float: + def lon(self) -> float | None: """ Shorthand for longitude variable. From e40defd994a5cb4fde17762ec8ca8b1a970473c7 Mon Sep 17 00:00:00 2001 From: Jamie Atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:50:16 +0200 Subject: [PATCH 091/191] Update docs for v4 migration (#371) * docs: copy updates from old/broken branch * Update depth dimension attribute explanation --- .../assignments/Sail_the_ship.ipynb | 10 +- .../documentation/pre_download_data.md | 1 + docs/user-guide/index.md | 1 - docs/user-guide/quickstart.md | 6 +- docs/user-guide/teacher-content/index.md | 17 +- .../user-guide/tutorials/ADCP_transects.ipynb | 257 +++++++++++++----- .../tutorials/Argo_data_tutorial.ipynb | 112 ++++---- docs/user-guide/tutorials/CTD_transects.ipynb | 190 ++++++------- .../tutorials/Drifter_data_tutorial.ipynb | 87 +++--- .../Ship_underwater_ST_plotting.ipynb | 53 ++-- docs/user-guide/tutorials/index.md | 3 - docs/user-guide/tutorials/xbt_plotting.ipynb | 31 ++- 12 files changed, 456 insertions(+), 312 deletions(-) diff --git a/docs/user-guide/assignments/Sail_the_ship.ipynb b/docs/user-guide/assignments/Sail_the_ship.ipynb index b4b94f3d..db2562b7 100644 --- a/docs/user-guide/assignments/Sail_the_ship.ipynb +++ b/docs/user-guide/assignments/Sail_the_ship.ipynb @@ -251,10 +251,6 @@ "\n", "Small simulations (e.g. small space-time domains and fewer instrument deployments) will be relatively fast. For large, complex expeditions, it _could_ take up to an hour to simulate the measurements depending on your choices. Waiting for simulation is a great time to practice your level of patience. A skill much needed in oceanographic fieldwork ;-)\n", "\n", - "
\n", - "**Tip**: Not using underway instruments will speed up the simulation time considerably. So, if you do not plan to use underway temperature/salinity or ADCP measurements, make sure to switch these off in the planning tool before running the expedition.\n", - "
\n", - "\n", "
\n", "**Important**: VirtualShip may encounter 'real-life challenges' during the expedition, which simulate the various problems and unexpected events that can occur during real-life oceanographic expeditions (e.g. instrument and/or equipment failure, logistical challenges etc.). These may require your intervention to ensure your expedition schedule can continue!\n", "
" @@ -266,11 +262,11 @@ "source": [ "## 7) Results\n", "\n", - "Upon successfully completing the simulation, results from the expedition will be stored in the `EXPEDITION_NAME/results` directory, written as [Zarr](https://zarr.dev/) files.\n", + "Upon successfully completing the simulation, results from the expedition will be stored in the `EXPEDITION_NAME/results` directory, written in `.parquet` [format](https://parquet.apache.org/).\n", "\n", - "From here you can carry on your analysis. In general, we encourage you to explore and analyse these data using [Xarray](https://docs.xarray.dev/en/stable/). We also provide various further [VirtualShip tutorials](https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/index.html) which provide examples of how to visualise data recorded by the VirtualShip instruments. Use these to help you get started!\n", + "From here you can carry on your analysis. In general, we encourage you to use [Parcels](https://Parcels-code.org/) (i.e. `parcels.read_particlefile()`) to read in VirtualShip output files, and tools such as [Polars](https://www.pola.rs/) and/or [Pandas](https://pandas.pydata.org/) for further data analysis. We also provide various further [VirtualShip tutorials](https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/index.html) which provide examples of how to visualise data recorded by the VirtualShip instruments. Use these to help you get started!\n", "\n", - "If you are using VirtualShip in class, the same tutorial notebooks will be uploaded in your SURF RC environment for you to use and interact directly with the code. These should be available in e.g. the `data/storage/tutorials/` directory. You will notice that there is a notebook file dedicated to visualising each of the different instruments available in VirtualShip. \n", + "If you are using VirtualShip in class, the same tutorial notebooks may be uploaded in your SURF RC environment for you to use and interact directly with the code. These should be available in e.g. the `data/storage/tutorials/` directory. You will notice that there is a notebook file dedicated to visualising each of the different instruments available in VirtualShip. \n", "\n", "To run these notebooks with your own data, you will need to copy the them over to your expedition working directory (i.e. `data/storage/{your-group-name}`). This can be done by either 1) using the file explorer panel in JupyterLab to copy the relevant files or the via the command line in Terminal. In the terminal, running `cp -r /data/storage/tutorials/* /data/storage/{your-group-name}/` would copy __all__ the tutorial notebooks to your group's directory, so if you only want to copy specific ones, make sure to adjust the command accordingly." ] diff --git a/docs/user-guide/documentation/pre_download_data.md b/docs/user-guide/documentation/pre_download_data.md index d58100cc..5e43fc1b 100644 --- a/docs/user-guide/documentation/pre_download_data.md +++ b/docs/user-guide/documentation/pre_download_data.md @@ -77,6 +77,7 @@ The following assumptions are also made about the data: 3. If using BGC-enabled instruments (e.g. BGC variables on the `CTD`), the relevant biogeochemical data files must contain the following variables: `o2`, `chl`, `no3`, `po4`, `nppv`, `ph`, `phyc`. - Or these strings must appear as substrings within the variable names (e.g. `o2_glor` is acceptable for `o2`). 4. Bathymetry data files must contain a variable named `deptho`. +5. Pre-downloaded data files must have a `"positive"` attribute for the depth dimension (e.g. `"positive": "down"` or `"positive": "up"`) in order to ensure that the depth dimension is correctly interpreted under-the-hood. #### Also of note diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index d7b25e4f..24eee0c8 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -18,5 +18,4 @@ documentation/full_sensor_list.md documentation/copernicus_products.md documentation/pre_download_data.md documentation/example_copernicus_download.ipynb -documentation/full_sensor_list.md ``` diff --git a/docs/user-guide/quickstart.md b/docs/user-guide/quickstart.md index 7d984111..5f913a79 100644 --- a/docs/user-guide/quickstart.md +++ b/docs/user-guide/quickstart.md @@ -178,6 +178,8 @@ See the relevant [documentation](https://virtualship.readthedocs.io/en/latest/us ## 5) Results -Upon successfully completing the simulation, results from the expedition will be stored in the `EXPEDITION_NAME/results` directory, written as [Zarr](https://zarr.dev/) files. +Upon successfully completing the simulation, results from the expedition will be stored in the `EXPEDITION_NAME/results` directory, written in `.parquet` [format](https://parquet.apache.org/). -From here you can carry on your analysis (offline). We encourage you to explore and analyse these data using [Xarray](https://docs.xarray.dev/en/stable/). We also provide various further [VirtualShip tutorials](https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/index.html) which provide examples of how to visualise data recorded by the VirtualShip instruments. +From here you can carry on your analysis (offline). We encourage you to use [Parcels](https://Parcels-code.org/) (i.e. `parcels.read_particlefile()`) to read in VirtualShip output files, and tools such as [Polars](https://www.pola.rs/) and/or [Pandas](https://pandas.pydata.org/) for further data analysis. + +We also provide various [VirtualShip tutorials](https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/index.html) with further examples of how to visualise data recorded by the VirtualShip instruments. diff --git a/docs/user-guide/teacher-content/index.md b/docs/user-guide/teacher-content/index.md index d6a39eb0..89389d8e 100644 --- a/docs/user-guide/teacher-content/index.md +++ b/docs/user-guide/teacher-content/index.md @@ -1,5 +1,7 @@ # Teacher content +### Overview + VirtualShip is used as part of the VirtualShip Classroom, that combines authentic tools with VR to create a virtual fieldwork experience and allows you to teach about sea-based research from your regular classroom. All VirtualShip Classroom (VSC) material is open under an MIT licence and freely available! You can use the VSC to teach anything from a 4 hour masterclass up to an open assignment of more than 40 hours. Example assignments are available below and please feel free to customize anything offline or [contribute](../../contributing/index.md) to the assignments provided here. @@ -16,17 +18,26 @@ The VSC design focuses on creating didactically sound, authentic learning experi We evaluated in several (under)graduate courses and find that the VirtualShip Classroom is highly engaging, and students report on enhanced confidence and knowledge [(Daniels et al. 2025)](https://current-journal.com/articles/10.5334/cjme.121). +### Teaching materials + ```{toctree} :maxdepth: 1 -:caption: Teaching materials ILOs.ipynb letter.md ``` +### Previous implementations + +```{warning} +The following implementations are examples of how the VSC has been used in the past. They are provided here for reference only and may not be up to date with the latest version of the VSC and/or VirtualShip software. +``` + +#### Utrecht University + ```{nbgallery} --- -caption: UU Ocean of the Future +caption: Ocean of the Future (BSc), 2025-26 --- UU-ocean-of-future/Tutorial1.ipynb UU-ocean-of-future/CoordinatesExport-Transect.xlsx @@ -37,7 +48,7 @@ UU-ocean-of-future/plot_slider.py ```{nbgallery} --- -caption: UU Dynamical Oceanography +caption: Dynamical Oceanography (MSc), 2025-26 --- UU-dyoc/example_expedition.md UU-dyoc/file_permissions.md diff --git a/docs/user-guide/tutorials/ADCP_transects.ipynb b/docs/user-guide/tutorials/ADCP_transects.ipynb index b35a916b..d07ecddf 100644 --- a/docs/user-guide/tutorials/ADCP_transects.ipynb +++ b/docs/user-guide/tutorials/ADCP_transects.ipynb @@ -5,15 +5,13 @@ "id": "bad21046", "metadata": {}, "source": [ - "# ADCP Transect Plotting\n", + "# ADCP Plotting\n", "\n", - "This notebook demonstrates a simple plotting exercise for ADCP data across a transect, using the output of a VirtualShip expedition. There are example plots embedded at the end, but these will ultimately be replaced by your own versions as you work through the notebook.\n", + "This notebook demonstrates a simple plotting exercise for ADCP data across a ship track, using the output of a VirtualShip expedition. There are example plots embedded at the end, but these will ultimately be replaced by your own versions as you work through the notebook.\n", "\n", - "The plot(s) we will produce are simple plots which follow the trajectory of the expedition as a function of distance from the start, and are intended to be a starting point for your analysis. Because the `ADCP` instrument is an underway/onboard instrument, this means we benefit from continuous recordings across the length of the ship's track (unlike overboard instruments such as CTDs which have to deployed at individual sampling sites).\n", + "The plot(s) we will produce are simple plots which follow the trajectory of the expedition as a function of distance travelled by the ship, and are intended to be a starting point for your analysis. \n", "\n", - "
\n", - "Note: This notebook assumes that each point along the expedition track is further from the start than the previous point. The code will still work if not, but the resultant plots might not be very intuitive.\n", - "
" + "Because the `ADCP` instrument is an underway/onboard instrument, this means we benefit from continuous recordings across the length of the ship's track (unlike overboard instruments such as CTDs which have to deployed at individual sampling sites)." ] }, { @@ -34,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "f6c87472", "metadata": {}, "outputs": [], @@ -43,8 +41,10 @@ "import matplotlib.colors as mcolors\n", "import matplotlib.patches as mpatches\n", "import numpy as np\n", + "from matplotlib import pyplot as plt\n", "import xarray as xr\n", - "from matplotlib import pyplot as plt" + "import polars as pl\n", + "import parcels" ] }, { @@ -65,12 +65,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "0cb630f6", "metadata": {}, "outputs": [], "source": [ - "data_dir = \"/path/to/EXPEDITION/results/\" # set this to be where your expedition output data is located on your (virtual) machine" + "data_dir = \"/path/to/EXPEDITION/results\" # set this to be where your expedition output data is located on your (virtual) machine" ] }, { @@ -80,20 +80,71 @@ "source": [ "## Load data\n", "\n", - "We are now ready to read in the data. You can carry on executing the next cells without making changes to the code..." + "We are now ready to read in the ADCP data. You can carry on executing the next cells without making changes to the code..." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "654fb036", "metadata": {}, "outputs": [], "source": [ "# load ADCP data\n", - "adcp_ds = xr.open_dataset(f\"{data_dir}/adcp.zarr\")\n", - "if adcp_ds[\"obs\"].size <= 1:\n", - " raise ValueError(\"Number of waypoints must be > 1\")" + "adcp_df = parcels.read_particlefile(f\"{data_dir}/adcp.parquet\")\n", + "if len(adcp_df) <= 1:\n", + " raise ValueError(\"Number of observations must be > 1\")" + ] + }, + { + "cell_type": "markdown", + "id": "97cbee6a", + "metadata": {}, + "source": [ + "\n", + "And here is what the first few lines of the data look like, with recordings of time (t), latitude (y), longitude (x), depth (z), plus the U and V velocity components:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a3cf571", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (5, 7)
tzyxparticle_idUV
datetime[ns]f32f32f32i64f32f32
2024-07-01 08:05:00-1000.064.3206412.50582500.0124130.011444
2024-07-01 08:05:00-974.48718364.3206412.50582500.0102750.012868
2024-07-01 08:05:00-948.97436564.3206412.50582500.0081370.014291
2024-07-01 08:05:00-923.46154864.3206412.50582500.0059990.015715
2024-07-01 08:05:00-897.9487364.3206412.50582500.0185710.010055
" + ], + "text/plain": [ + "shape: (5, 7)\n", + "┌─────────────────────┬─────────────┬───────────┬──────────┬─────────────┬──────────┬──────────┐\n", + "│ t ┆ z ┆ y ┆ x ┆ particle_id ┆ U ┆ V │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ datetime[ns] ┆ f32 ┆ f32 ┆ f32 ┆ i64 ┆ f32 ┆ f32 │\n", + "╞═════════════════════╪═════════════╪═══════════╪══════════╪═════════════╪══════════╪══════════╡\n", + "│ 2024-07-01 08:05:00 ┆ -1000.0 ┆ 64.320641 ┆ 2.505825 ┆ 0 ┆ 0.012413 ┆ 0.011444 │\n", + "│ 2024-07-01 08:05:00 ┆ -974.487183 ┆ 64.320641 ┆ 2.505825 ┆ 0 ┆ 0.010275 ┆ 0.012868 │\n", + "│ 2024-07-01 08:05:00 ┆ -948.974365 ┆ 64.320641 ┆ 2.505825 ┆ 0 ┆ 0.008137 ┆ 0.014291 │\n", + "│ 2024-07-01 08:05:00 ┆ -923.461548 ┆ 64.320641 ┆ 2.505825 ┆ 0 ┆ 0.005999 ┆ 0.015715 │\n", + "│ 2024-07-01 08:05:00 ┆ -897.94873 ┆ 64.320641 ┆ 2.505825 ┆ 0 ┆ 0.018571 ┆ 0.010055 │\n", + "└─────────────────────┴─────────────┴───────────┴──────────┴─────────────┴──────────┴──────────┘" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "adcp_df.head() # display the first 5 rows only" ] }, { @@ -103,7 +154,7 @@ "source": [ "## Data post-processing\n", "\n", - "Before we can continue, we need to do some post-processing to get it ready for plotting. Below are various helper functions which perform tasks such as calculating the ship's distance from the start of the transect at each point and calculating the various velocity components from the ADCP data." + "Before we can continue, we need to do some post-processing to get it ready for plotting as a 2D distance × depth plot. Below are various helper functions which perform tasks such as calculating the ship's cumulative travel distance and calculating the various velocity components from the ADCP data." ] }, { @@ -125,31 +176,104 @@ " return 6371000 * c\n", "\n", "\n", - "def distance_from_start(ds):\n", - " \"\"\"Array of meters from first waypoint.\"\"\"\n", - " lon0, lat0 = ds.isel(obs=0)[\"lon\"].values, ds.isel(obs=0)[\"lat\"].values\n", - " d = np.zeros_like(ds[\"lon\"].values, dtype=float)\n", - " for ob, (lon, lat) in enumerate(zip(ds[\"lon\"], ds[\"lat\"], strict=False)):\n", - " d[ob] = haversine(lon, lat, lon0, lat0)\n", + "def distance_along_expedition(df):\n", + " \"\"\"Array of cumulative meters travelled along ADCP measurement locations.\"\"\"\n", + " d = np.zeros_like(df[\"x\"], dtype=float)\n", + " for ob in range(1, len(df[\"x\"])):\n", + " d[ob] = d[ob - 1] + haversine(\n", + " df[\"x\"][ob - 1], df[\"y\"][ob - 1], df[\"x\"][ob], df[\"y\"][ob]\n", + " )\n", " return d\n", "\n", "\n", - "def calc_velocities(ds):\n", - " \"\"\"Calculate absolute, parallel and perpendicular (to the ship trajectory) velocities, as well as (compass) direction of flow.\"\"\"\n", - " Uabs = np.sqrt(ds[\"U\"] ** 2 + ds[\"V\"] ** 2)\n", - " ds_surface = ds.isel(trajectory=0)\n", - " dlon = np.deg2rad(ds_surface[\"lon\"].differentiate(\"obs\"))\n", - " dlat = np.deg2rad(ds_surface[\"lat\"].differentiate(\"obs\"))\n", - " lat = np.deg2rad(ds_surface[\"lat\"])\n", - " alpha = np.arctan(dlat / (dlon * np.cos(lat))).mean(\"obs\") # cruise direction angle\n", - " Uparallel = np.cos(alpha) * ds[\"U\"] + np.sin(alpha) * ds[\"V\"]\n", - " Uperp = -np.sin(alpha) * ds[\"U\"] + np.cos(alpha) * ds[\"V\"]\n", - " direction_rad = np.arctan2(\n", - " ds[\"U\"], ds[\"V\"]\n", - " ) # direction of flow [degrees from north]\n", - " direction_deg = (np.degrees(direction_rad) + 360) % 360\n", - "\n", - " return Uabs, Uparallel, Uperp, direction_deg" + "def calc_velocities(df):\n", + " \"\"\"From U and V in df, calculate absolute, parallel, and perpendicular velocities, as well as compass flow direction, using a per-waypoint ship angle alpha.\"\"\"\n", + " traj_df = (\n", + " df.select([\"t\", \"x\", \"y\"])\n", + " .unique(subset=[\"t\"])\n", + " .sort(\"t\")\n", + " .with_columns(\n", + " # next waypoint (x1, y1)\n", + " pl.col(\"x\").radians().alias(\"lon_rad\"),\n", + " pl.col(\"y\").radians().alias(\"lat_rad\"),\n", + " pl.col(\"x\").shift(-1).radians().alias(\"lon1_rad\"),\n", + " pl.col(\"y\").shift(-1).radians().alias(\"lat1_rad\"),\n", + " )\n", + " .with_columns(\n", + " # forward differences to next waypoint\n", + " (pl.col(\"lon1_rad\") - pl.col(\"lon_rad\")).alias(\"dlon\"),\n", + " (pl.col(\"lat1_rad\") - pl.col(\"lat_rad\")).alias(\"dlat\"),\n", + " )\n", + " .with_columns(\n", + " # alpha between (x, y) and (x1, y1) using arctan2\n", + " pl.arctan2(pl.col(\"dlat\"), pl.col(\"dlon\") * pl.col(\"lat_rad\").cos()).alias(\n", + " \"alpha\"\n", + " )\n", + " )\n", + " # fill final location alpha (where shift(-1) is Null) with backward fill\n", + " .with_columns(pl.col(\"alpha\").backward_fill())\n", + " .select([\"t\", \"alpha\"])\n", + " )\n", + "\n", + " # join per-timestep alpha back to main DataFrame and calculate velocity components\n", + " return df.join(traj_df, on=\"t\", how=\"left\").with_columns(\n", + " # Uabs = sqrt(U^2 + V^2)\n", + " (pl.col(\"U\").pow(2) + pl.col(\"V\").pow(2)).sqrt().alias(\"Uabs\"),\n", + " # Uparallel = cos(alpha)*U + sin(alpha)*V\n", + " (\n", + " pl.col(\"alpha\").cos() * pl.col(\"U\") + pl.col(\"alpha\").sin() * pl.col(\"V\")\n", + " ).alias(\"Uparallel\"),\n", + " # Uperp = -sin(alpha)*U + cos(alpha)*V\n", + " (\n", + " -pl.col(\"alpha\").sin() * pl.col(\"U\") + pl.col(\"alpha\").cos() * pl.col(\"V\")\n", + " ).alias(\"Uperp\"),\n", + " # compass direction in degrees [0, 360)\n", + " ((pl.arctan2(pl.col(\"U\"), pl.col(\"V\")).degrees() + 360) % 360).alias(\n", + " \"direction_deg\"\n", + " ),\n", + " )\n", + "\n", + "\n", + "def get_velocity_2d_array(df, var_name, units):\n", + " \"\"\"Extract a single velocity variable as a 2D xarray DataArray (dims: t, z).\"\"\"\n", + " # deduplicate (t, z) pairs in case of duplicate sampling\n", + " df_clean = df.unique(subset=[\"t\", \"z\"])\n", + "\n", + " # to 2D grid matrix (rows = t, columns = z)\n", + " pivot_df = df_clean.pivot(on=\"z\", index=\"t\", values=var_name).sort(\"t\")\n", + "\n", + " # map distance along track to each timestamp (t)\n", + " dist_map = df_clean.select([\"t\", \"distance\"]).unique(subset=[\"t\"]).sort(\"t\")\n", + " pivot_df = pivot_df.join(dist_map, on=\"t\", how=\"left\")\n", + "\n", + " # extract coordinates and matrix\n", + " z_coords = sorted(\n", + " [float(c) for c in pivot_df.columns if c not in (\"t\", \"distance\")]\n", + " )\n", + " dist_coords = pivot_df[\"distance\"].to_numpy()\n", + " t_coords = pivot_df[\"t\"].to_numpy()\n", + "\n", + " data_matrix = pivot_df.select([pl.col(str(z)) for z in z_coords]).to_numpy()\n", + "\n", + " # create/return da\n", + " return xr.DataArray(\n", + " data=data_matrix,\n", + " dims=[\"distance\", \"z\"],\n", + " coords={\n", + " \"distance\": (\n", + " \"distance\",\n", + " dist_coords,\n", + " {\"long_name\": \"Distance along track\"},\n", + " ),\n", + " \"z\": (\"z\", z_coords, {\"units\": \"m\", \"long_name\": \"Depth\"}),\n", + " \"t\": (\n", + " \"distance\",\n", + " t_coords,\n", + " ), # Preserves time reference along distance dimension\n", + " },\n", + " name=var_name,\n", + " attrs={\"units\": units, \"long_name\": f\"{var_name} velocity component\"},\n", + " )" ] }, { @@ -163,19 +287,28 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 30, "id": "6433742a", "metadata": {}, "outputs": [], "source": [ - "# distance from start as 1d array\n", - "distance_1d = distance_from_start(adcp_ds.isel(trajectory=0))\n", - "\n", - "# calculate velocity components and direction\n", - "Uabs, Uparallel, Uperp, direction = calc_velocities(adcp_ds)\n", - "\n", - "# land / sea bed mask\n", - "landmask = xr.where(((adcp_ds[\"U\"] == 0) & (adcp_ds[\"V\"] == 0)), 1, np.nan)" + "# distance from start as 1d array, and add as new column to adcp_df\n", + "distance_1d = distance_along_expedition(adcp_df)\n", + "adcp_df = adcp_df.with_columns(pl.Series(\"distance\", distance_1d))\n", + "\n", + "# calculate and add velocity components and direction to adcp_df\n", + "adcp_df = calc_velocities(adcp_df)\n", + "\n", + "# convert velocity components to 2D xarray DataArrays (dims: distance, z)\n", + "Uabs = get_velocity_2d_array(adcp_df, \"Uabs\", units=\"m/s\")\n", + "Uparallel = get_velocity_2d_array(adcp_df, \"Uparallel\", units=\"m/s\")\n", + "Uperp = get_velocity_2d_array(adcp_df, \"Uperp\", units=\"m/s\")\n", + "direction = get_velocity_2d_array(adcp_df, \"direction_deg\", units=\"degrees\")\n", + "\n", + "# coord arrays and landmask/seabed mask\n", + "distance = Uabs[\"distance\"].values\n", + "depth = Uabs[\"z\"].values\n", + "landmask = np.where(Uabs == 0, 1, np.nan)" ] }, { @@ -186,21 +319,21 @@ "## Plotting\n", "\n", "
\n", - "Note: The plots produced next are a starting point for your analysis. You are encouraged to make adjustments, for example axis limits and scaling if the defaults not best suited to your specific data. Use your preferred AI coding assistant for help!\n", + "Note: The plots produced next are a starting point for your analysis. You are encouraged to make adjustments, for example axis limits and scaling if the defaults not best suited to your specific data.\n", "
\n", "\n", - "We are now ready to plot our transect data. We will use distance from the start of the transect/expedition for the x-axis, and water column depth for the y-axis. The ADCP data will then be plotted according to the colour map for diagnostic. The profiles across the transect are likely to be different depths because some parts of the ocean are of course shallower than others." + "We are now ready to plot our data. We will use distance travelled by the ship for the x-axis, and water column depth for the y-axis. The ADCP data will then be plotted according to the colour map for each diagnostic. The profiles across the trajectory are likely to be different depths because some parts of the ocean are of course shallower than others." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 31, "id": "93693258", "metadata": {}, "outputs": [ { "data": { - "image/png": "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+eVO7xk1alSXr998800Arr32Ws4880xuvvlmPv7xjzNy5Ehmz55NS0sLAKtXr2bYsGFEUVSzndGjR+fLN5fly5ezaNEigiComT73uc8BsGrVqm7fW1dXx2c+8xnuuOMOvPckScJPf/pTPve5z1EoFPLtQ9p53nAfzz33XI/bX716NTvssEOn+aNHj86H3Vbfv9NOO72/E9CFs88+m9/97nc8//zzNDc3c/vtt/PlL3+ZMAz7bR9CCCE+WOzWboAQQohaP/nJT4A0Qcl3vvOdTstvvfVWLr/88pp577zzDuPHj695DbDjjjsCMGjQIL797W/z7W9/m7/+9a/813/9F+effz5hGPKd73yHYcOGsXr1asrlck3nYtmyZQAMHz682/YWCgXK5XLNvL50FIcPH87IkSO5+uqru1y+xx579Pj+L3zhC/zkJz/ht7/9La2trbz99tt84QtfqNk+pMlRPvrRj3Z6f0NDQ7fbHjZsWH4OOlq2bBnDhg0DYMSIEUB7J7s/HH300YwbN4758+ez7777sm7dOs4444x+274QQogPHun4CSHEAFIul/nP//xPJk2axLx58zotnz17NrfddhuXXXYZSql8/s9+9jPOP//8/PV//ud/MmjQIPbaa69O2xg7dizf+MY3uOOOO/KhoFOmTOG73/0ud911F5///Ofzde+44w7CMOTAAw/sts1jx47Nt1P1y1/+stN6URTR2traaf6RRx7Jtddeyy677MLIkSO73U93Dj30UHbaaSduu+02WltbGTduHAcffHC+/B//8R9paGjg1Vdf5Ytf/GKftj1lyhTuu+8+1q1bl3cQ161bxy9+8QumTp0KwO677864ceO48cYbOeOMM2quS0+qT1dbW1s7dT611px55pnMmzePxx57jMMPP1xKQQghhNgk0vETQogB5Je//CWrVq3i3//93/OORUdnnnkmX/nKV3jkkUc49NBD8/k33HADzjk+/vGP8+CDD3LjjTcyd+7cPDZt8uTJHHvssey9994MGjSIRx99lGeeeSbvCB111FEcdNBBnHXWWaxYsYKPfvSj3H///dx4443MmTMnf6rVlZNOOonp06cze/Zs/umf/olnnnmGW265pdN6H/nIR1i9ejU//OEP+Yd/+AcKhQJ77703s2fP5s477+Tggw9m9uzZ7LHHHjQ3N/OXv/yFxx57jHvvvbfHc6a15vOf/zzz58+nUqkwe/bsms7X4MGD+e53v8s555zDihUrOOqoo2hsbOTNN9/k0UcfZerUqfzLv/xLl9u+6KKL+OUvf8m0adM477zzUErxne98h5aWFr71rW8BadmKH/zgBxx//PEcdthhnHXWWTQ1NfHiiy+yfPnyvGxDV+cD4N///d856qijMMbwD//wD/ny0047jblz5/LMM8/w3//93z2eAyGEEGKjtnZ2GSGEEO2OPfZY39DQ4Jubm7tcvmbNGl8sFvPskNXMkM8995yfOnWqLxQKftSoUf7CCy+syTD5b//2b37ixIl+8ODBvq6uzu+1117+6quvrtn2e++958855xw/evRoHwSB32233fz3v/9975zL1+kqq2eSJP6SSy7xu+yyiy8Wi/5Tn/qUf/XVVztl9Vy/fr0/6aST/JAhQzzgx44dmy9bvXq1//rXv+7HjRvngyDwTU1N/qCDDqrJuNmT559/3gOdMnx2dN999/mpU6f6hoYGXygU/IQJE/yXv/xl/8ILL+TrdJWh9Pe//72fNm2ar6+v93V1df6www7zixcv7rT9//t//6+fOnWqr6+v9/X19X6fffbxN998c7fbjuPYn3322b6pqckrpXxX/yV/6lOf8jvssEOPmU2FEEKI3lDeb6QyrxBCCCG2uHfffZdddtmFr3/961x22WVbuzlCCCG2cTLUUwghhBhAVqxYwUsvvcTVV1+Nc46zzz57azdJCCHEdkDKOQghhBADyH333cfBBx/Mk08+yU9+8pMuy0kIIYQQfSVDPYUQQgghhBBiOydP/IQQQgghhBBiOycdvw3MmzePMWPGUFdXx7HHHttl4V4hhBBCCCGE2JbIUM8OFixYwFe/+lVuvfVWxo8fz9e//nW89zz66KMbfa9zjjVr1lAoFHpdvFcIIYQQQogtzXtPW1sbQ4YMQeuB/xyoUqkQx3GP61hrCYJgC7Vo2yQdvw4+9rGPcdRRR3HFFVcA8NprrzFhwgT+9Kc/MXHixB7fu3r1aoYPH74FWimEEEIIIcSmW7VqFcOGDdvazehRpVKhUIxwSc9dljFjxrB06VLp/PVAyjlkSqUSzzzzDN/97nfzeePHj2fcuHEsXry4U8dvw788VPvPD951MG+2/S/vtL3LW60x62PLm62DWFMKWVMKWddqSbzCo7L3QaAdUeCoC2IG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WLt2LVEU8fLLL3PhhRfm6/7tb3/r18Z2Z8WKFRx00EEcf/zxPProowwaNIglS5bUBE2eeOKJeO95/PHHef311zn11FMZPXo006dPB+Dhhx/mjDPO4Prrr2fy5MlcdtllHHPMMbzwwguEYdjrtlhtCWxEYIoYHWJMlCZtUdmpVp1PufeuPbGLShO7KB2gbYg2lkpSIqm04ZIyLimTJKV0cuU0IYuuJlsxaJsmW8kTsBiLTmyn5C6QJnbxPk3sorRuT/CST5WaZDTVtuaUThO7aA3dJXfRhlCHRDok1AFBUI+xRbQJwSd4F9dsV2vbvq0srW213TXt1+mx+SRO2+gdymbn0KYJboQQQgghxPZhW3/id/bZZ3PyySdz4YUXdjl6ckvoc8fv8ssv3xzt2CTz5s1jzz335D/+4z/yebvttlv+/bPPPsuiRYt46aWX2H333Zk4cSKzZ8/mmmuuyTt+1113HSeccAIzZswA4Oabb6apqYn777+f4447bosejxBCCCGEEKKdRqHpuoe3LWT1XLVqFV//+te3WqcP3kfH74tf/OLmaMcmue+++zjqqKM49thj+f3vf89uu+3GlVdeyZQpU4A06+hOO+1UE0w5bdo0rrjiClpbWykWizz55JNccskl+fL6+nomTZrE4sWLu+z4VSqVmqGkra2tm+8AhRBCCCGE+ADraUin2wae+J100kn86le/YubMmVutDX3u+EE6hPP222/ntdde49vf/jZNTU088sgj7LjjjjVP2raUpUuX8sMf/pBvfetbXHLJJdx1110cccQRvPjii+y6664sX76ckSNH1rynqakJ5xwrV65k55137nad5cuXd7nPK664oqajKIQQQgghhNg8tFLobjp+28JQzyFDhnDRRRfxwAMPsPfee3dK7nLppZdu9jb0+cnoo48+ykc+8hEeffRRbrvtNtatWwfA4sWLmTNnTr827qyzzkIp1e00depUAJxzTJ48mW9+85vst99+XHnllXz4wx/m9ttvB8B736/tArjgggtoaWnJp2ox+8AUsDrK4vuySYeoPPasPY4vL9Jeje/TAdrUrosyWXxfiSRuJam0EseteQF3l8XIVWP4tAkxtpjG0dkQrYM09k8H6fINYvE8Duc9zsfZVMkKuKdF3PEuLdyexdGRxfzlRda1RneIp+sYA6iURmuL1SEFG1EwBWzWNhMUcUmMi7M4xer78ng+U7sfpfN4xKSSngelNCasIyg2YguNBNEgTFiPNhHKvK+/aQghhBBCiAFIK43pZtrw99uB6KmnnmLixIk0Nzfz+9//nsceeyyffvvb326RNvT5t+N/+7d/4zvf+Q7nnHMODQ0N+fxp06ZxzTXX9Gvj5s2bV5MsZkNRFAEwatQo9thjj5ple+yxB3//+9/z5Rs+uVuxYgVaa0aMGAHAyJEju1xnwoQJXe47CIJOPXUhhBBCCCFE/9vWn/gtXLhwazeh70/8nn/+eY455phO84cNG5Y/9eovQ4YMYaeddup2ampqAuDAAw/k1VdfrXnvq6++yi677ALAAQccwBtvvFFTguLhhx9m7733plgs5ut0vCAtLS0sXryYSZMm9esxCSGEEEIIIfqmmtylu0lsXJ87fqNHj67pQFUtWrSI8ePH90uj+mrWrFksXLiQa665hldffZUrr7ySP//5z3zhC18AYJ999uGQQw5hxowZPPPMM9x7771cddVVfO1rX8u3cc4553DnnXdy00038cILLzB9+nTGjBnD0UcfvVWOSQghhBBCCJEyWvc4iY3r81maNWsWZ599Nvfffz8Af/7zn/mP//gPzj33XM4999x+b2BvHHTQQdxxxx1cd9117LPPPvz85z/ngQceYOzYsfk6d955J42NjUyePJkzzzyT8847Ly/lAOlQ1fnz53PZZZex//778/bbb3Pffff1qYafEEIIIYQQov/pjfwTG9fnGL+vfe1rDBo0iK9+9as0Nzdz7LHHMnr0aC699FJOP/30zdHGXjnppJM46aSTul0+evRo7r333h63MX369JrO4PthddAhsUtWvN1GefFxr1yaJMUBurZwudEh2gRpkhdtUSbAu0qa1CVuJa60EidpYpc4aSN2pTTxCi7djtJ54XefJWVJk8lkBdw7fCgcPkvs4lA4vFd58hQXl/EmwmcF3bVJO7/pNl1NApdq0pgNi8O3n4+IwAQUTIGCLWJMIU06Y8N0P66SnosO71fKgO6i4HwlPXZXac3XN0ERbQqYQn23bRBCCCGEENu2bT3GbyB4X6kPqx2k5uZmmpubO5VBEEIIIYQQQoj+kmbw7LqHZ1T/Z/DfHvW545ckCU8//TRLly5FKcWuu+7KiBEj0DK2VgghhBBCCLEZaKV7eOInHb/e6FPH77777uMrX/kKb7zxRs38XXbZhfnz53PEEUf0a+OEEEIIIYQQQp74bbped/yeffZZjj/+eE499VS++tWvsueee+K958UXX+Taa6/luOOO46mnnmKvvfbanO0d8Grj+9Li7Vrb9sLk3uFUJYu5M3lcWrVgeQ3n8iLnSdyG61C0fcNYu/btdP3ktWMx9VBHaKUw2hJmxeONCvK2VovHq6zIvFJpO9NQvABNGu+nAe/iNLYwW6fj8ShjCWwdxaCBxMUU7CBsWJ8WlzcRcbkF5+L0Pd6lXzvG+mlbe2w2wnR4rW2UF7kHeO5XW78+ihBCCCGE6H9pCpdunvghHb/e6HXH76qrruJzn/scN9xwQ838iRMnctNNN9HW1sb3v/99br755n5vpBBCCCGEEOKDSymF6uaJXzezxQZ6HZj32GOPccYZZ3S7/IwzzmDRokX90ighhBBCCCGEqLJorDJdT1LOoVd6/cTvrbfe6rFA+/jx43nrrbf6pVFCCCGEEEIIUdXzEz955Ncbve74tbW19VjMPAxDSqVSvzRKCCGEEEIIIaq0Mphucll0l+1T1OpTVs/vfOc71NfXd7msubm5Xxq0rbNZ0XZjQrQKUCZNklJN3uJcBaU1eI3yHZKhdHhE3TFxi3cxLimRZMXbnYvxuM47puvELtWEKzpL1BKYiCRLqGJ1SGCK6TJlsbaA0VFWQD4rIq/TYwDQBGhj0727CmQJYPJ9d0zuoi1aB1hbJHINeO+IggaCsAETFNJjSyr5sSql04QxWbKWartVh0Lu3od4pVFJnLbHhGhjpXC7EEIIIcR2Li3n0F3Hbws3ZhvV647fIYccwtNPP73RdYQQQgghhBCiP+nsX9fLRG/0uuP3yCOPbMZmCCGEEEIIIUTXjDYY3XUXz8gjv17p01BPIYQQQgghhNjSVPavu2Vi46TjJ4QQQgghhBjQJMZv00nHr59pZbJEKgHahBiTJktBaciSmChl8CpN0FJNapK+qL2ZvU/wcUISp4ldkqRMkpRwLsb5pGbdPMFJh2Qo7QurCV4CrI4ITIJWCqNDrCnkiV+sLaJtiDZhmrQlS7KiswQuXrk0aQvkCV6qSWtqErvkiVksQVCXzkMThg2YsB4dFHFJCZeU8UmaaMbjYIPH90rrNLlMtl1jwXuLN+n50jZq35ckeBFCCCGE2G6ZHrJ6Gsnq2SvS8RNCCCGEEEIMaD39oV/6fb0jHT8hhBBCCCHEgGaU7eGJX9elzkQt6fgJIYQQQgghBjStVLeF2qWAe+9Ix6+fGROmkw7RJkiLt2ubx/Kpapyf1iinUaQxcl0+us6Km7ukTBy3EcdZAXfvaoq4V4u/d/v4W2u0SguyW1Ooaau1hbxYu7XFPCZRa5sWRzcdirR7l39fjfNTOq7dl9JZbKDDmAhr69EqwJiQwNZjg3q0trg4je/zrpIWZVcG5cBrBz5BkRaP19rmsX/thdzb4yO7jGkUQgghhBDbFaVUD0M9/RZuzbZJOn5CCCGEEEKIAS0d6mm6WSZP/HpDHpUIIYQQQgghBrSOmdy7mt6PefPmMWbMGOrq6jj22GNZtmxZt+tefvnlHHDAAURRxEEHHfR+D2Orko6fEEIIIYQQYkDTymZP/TpPWvV9EOOCBQu4/PLLue6663j88cdZu3YtJ554Yrfrx3HMKaec0uM6A50M9RRCCCGEEEIMaD2Xc+h7jN+1117LrFmzOP744wG4+eabmTBhAkuWLGHixImd1p87d27+9bXXXuvz/gYC6fj1M6MjjI5QxqJNmCdKqep4wyqlwdNeBD3jfZImcPEO52KSSitx3EriyulrX0mX+c43eecEKCab0kLsxoR4HAqdJXcpYkyYJn8xIdpEWQH3NDGN1jZtn9b4pILWQZ5WRgMu0Z323T5DY4MizgTo2GKjBrQNAfIkNRvy3qE7ng+tef6BRzd63oUQQgghxParN1k9W1tba+ZbawmCoNP6pVKJZ555hu9+97v5vPHjxzNu3DgWL17cZcdveyBDPYUQQgghhBADms4eSHQ3AQwfPpy6urp8uuKKK7rc1qpVq3DOMXLkyJr5TU1NLF++fLMfy9YiT/yEEEIIIYQQA5pC5yXMOi9LR8GtWrWKYrGYz7e2666O72LU3AfBdvHEr1wu841vfIOddtqJuro6Jk6cyN13312zzrJlyzjuuOOoq6tjhx124Morr+y0nQULFjB+/HiKxSJTpkzh5Zdf3lKHIIQQQgghhOiGVqbHCaBYLNZMXQ3zBBgxYgRa605P91asWNHpKeD2ZLvo+M2bN48777yTW2+9lRdeeIF/+Zd/4cQTT+Qvf/lLvs6JJ57I6tWrefzxx7n++uv59re/zc0335wvf/jhhznjjDOYM2cOTz31FKNHj+aYY46hXC5vjUMSQgghhBBCZHoz1LO3oihi3333ZeHChfm8119/naVLlzJp0qT+bvqAsV10/BYvXsxnP/tZDjvsMHbddVf+7d/+jcGDB7NkyRIAnn32WRYtWsSNN97IxIkT+fSnP83s2bO55ppr8m1cd911nHDCCcyYMYO99tqLm2++mTfffJP777+/T23R2qK0xZgI0yFRCtWEJV1kJPI+6XJb3jt8EqcJXVyZJCkTu1L2OsH5NEGKp5rIZYPL6V3NtqvZkLRKk7wYExHYeqytJ4gasGE9xhbSxC4mPQ6UThPVaIsyQfZ9kC9Lk79scEwd91n9QNoIrYP8HGgTYoICOihigmL6vQ0xtpjv+/3WZBFCCCGEENuX/q7jN3PmTK6++mruuecennnmGU477TQOPvhgJk6cyJtvvsmee+7Jk08+ma//t7/9jSVLlrBs2TKam5tZsmRJ3tfYVmwXv1lPnjyZX//61/z973/He8/dd99NuVzmE5/4BABPPvkkO+20E7vvvnv+nmnTpvHcc8/l2X+efPJJDjvssHx5fX09kyZNYvHixVv2YIQQQgghhBA10iGdtpvJbHwDG5g+fTrf/OY3OfvssznwwAOpr6/nZz/7GQCVSoWXXnqJlpaWfP1vfetb7LfffsyfP58lS5aw3377sd9++/Xb8W0J20Vylzlz5rB8+XJ22WUXrLUUi0X++7//m5133hmA5cuXd5m1xznHypUr2Xnnnbtdp7vMPpVKhTiO89cbpo8VQgghhBBC9I+e6/i9v2dZc+bMYc6cOZ3mjxs3rlMCmFtuuYVbbrnlfe1noBjQT/zOOusslFLdTlOnTgXgpz/9Kffffz/33nsvf/zjH/nmN7/JySefzEsvvQRsnsw9V1xxRU262OHDh/f7PoQQQgghhBD9P9Tzg2hAP/GbN28eF154YbfLoygC4Pzzz+fKK6/k2GOPBWCfffbh4Ycf5sc//jH//u//zqhRo7rM2qO1ZsSIEQCMHDmyy3UmTJjQ5b4vuOACzjvvvPx1a2srw4cPT+PZTBoDl04BSmtwwAbF1TsWMPfeobKYPO8d5OskJK6Ux/d570hcgsfhOhZA73DDV4u/t39fG+dXDYI1WZydsUWMLWZtj9pj+pRJ4/qyeDsNeG3TQ/EOrS1OGTqW0tzw2NLi76CVTuMCM9pYdFBEJZX2AvZa5zGSSssHWQghhBBCpHpK4qLl18VeGdAdvyFDhjBkyJCNrtfS0oIxtWN7tdY4l3Y+DjjgAN544w1eeeUVdtttNyDN4rn33nvntT4OOOAAFi5cyGmnnZZvc/HixcyaNavLfQZB0G2KWCGEEEIIIUT/UZj2hwWdln0w6/L11YDu+PXW0Ucfzdy5c9lhhx0YN24c999/Pw899BD/+q//CqRPAA855BBmzJjB1VdfzdKlS7nqqqv4wQ9+kG/jnHPO4cgjj+TQQw/lwAMP5LLLLmPMmDEcffTRW+mohBBCCCGEECBP/PrDdtHxu+666zj//PP5whe+wLvvvsuECRNYsGAB06ZNy9e58847OfPMM5k8eTKDBw/mvPPOY/r06fnyadOmMX/+fC699FKWLVvGpEmTuO+++wjDcGsckhBCCCGEECKzOZK7fNBsFx2/IUOG8KMf/Ygf/ehH3a4zevRo7r333h63M3369JrOoBBCCCGEEGLrk47fptsuOn4DidYB2oRoE2XJUrIi6DrP19Jr3ju8Swu4x65EnFTypC7Vwu2+JsFLh3HPboNlpIlWtA7w3qF1gDERNqjHBvWYoJgXZE9X1h3ep9EmTepSLUCvTLqeNhbvdJaQJsnbXX0f2qJ8ui1jwnSedyilMbaAN2HNfqpJXVBGntsLIYQQQggg+x2726Geqsv5opZ0/IQQQgghhBADmkKhuqlEp5COX29Ix08IIYQQQggxoMlQz00nHT8hhBBCCCHEwJbVeu56mZRz6A3p+PUzncXRaW3RNspv0DzeboO4u7xgu6oubi/eXo3TS5I0vi925ZrC7R0Ltddus0MR9Y7xdr5awD1Ii7frMI3vC9M4P7TuMjYw3YBBG1AmrV2oIa2TmMUv4kgrqHTYd/UvM9VzoHRQsz0TBF3EIbb/NUf+eiOEEEIIIYA0D0Q3+R+6my9qScdPCCGEEEIIMaClD1aCbpZt4cZso6TjJ4QQQgghhBjQJMZv00nHTwghhBBCCDGwKV1TbqzTMrFR0vETQgghhBBCDGgy1HPTScevv2UZh5QOsq8WvGPDXEPebZDkJSvGrpTOCrdnRdqTmCQpE7t0AnC+fWtpgpe0cHrHx9wdE7tUKXSW3MWmHx4bYYJiWsQ9aki3nZRwLgbncK5Sk+xFZUlr0qQuDmUsOrE4F6cF6hPXKeGM1jYvLF8t+l4t9q5siJa/0AghhBBCiI2QoZ6bTjp+QgghhBBCiAFNadNtOQelu8hILzqRjp8QQgghhBBiQJMnfptOOn5CCCGEEEKIAU06fptOOn5CCCGEEEKIAS3Nn9F1chelN8ymIboiHb9+pk2aAEWbLMmLMnmyk2rik46ve9LVXy9qEruQJV3Jkqfk23TtCV9QOm2DcnliF+diFDpLvKLTVEjVdEhJh+1UE8dkyViqqXKrSVo04E2UzvcuO17dngxG6XxdpTTaRHnSm6rnfrVwo+dUCCGEEEJ8sCmtUd2k7+xuvqglHT8hhBBCCCHEwCZ1/DaZdPyEEEIIIYQQA5pWNh2t1uUyyerZG9LxE0IIIYQQQgxs8sRvk0nHr58ppduLtyuTxrx1WO590h43R8e4vwSPRuXF0nX+tatYv2p8X8f9AvgkzlZIl2sd5N87QPkYlcX70V12pCxGsKsi8NV4PrRGEaCtQ3mbxxZWC9a3rx7k+1DGppPSeVF3IYQQQgghNkbrIP29tstlktylN6TjJ4QQQgghhBjYOiYj7GqZ2Cjp+AkhhBBCCCEGNKVUD3X81BZuzbZJOn5CCCGEEEKIAU3rHpK76GQLt2bbJB0/IYQQQgghxMAmyV02mXT8+pnKEqYobfPi5STgXW3xduicoKUT3cMN3g3vKunXjkXUtaW6FZeU29tXTbrSYR817fOd29zxGL1yaK3bC8Z7h3K2y3UhTfSiTZgWt+8usYwQQgghhBAbUCZAma6Tuygj5Rx6Qzp+QgghhBBCiAGtp4cG8jChd6TjJ4QQQgghhBjQpOO36Qb8WVq0aBFHH300TU1NKKV49dVXO62zbNkyjjvuOOrq6thhhx248sorO62zYMECxo8fT7FYZMqUKbz88st93oYQQgghhBBiy1Pa9jiJjRvwZ6m5uZl/+Id/4NOf/jRnnHFGl+uceOKJeO95/PHHef311zn11FMZPXo006dPB+Dhhx/mjDPO4Prrr2fy5MlcdtllHHPMMbzwwguEYdirbQghhBBCCCG2DqU1qpt6fd3NF7UG/Fk66qijuPTSS/nkJz/Z5fJnn32WRYsWceONNzJx4kQ+/elPM3v2bK655pp8neuuu44TTjiBGTNmsNdee3HzzTfz5ptvcv/99/d6G71VTeqilOn0SNp7B97liV7yed1tq5ooZsPtZElh3Abv9d7hXFyTkCVN4mIg24bWFq2C/APS1aPxajvpJrFLNauS0jZN1mJDTFBEB0VMWI+xxXQK6zFhfT5fB4U0sYsO5JG8EEIIIYTotQ1/L+7u9+S+mDdvHmPGjKGuro5jjz2WZcuWdbvu+vXr+fKXv8zgwYMZPnw4s2fPJo7j93s4W8U2/9v3k08+yU477cTuu++ez5s2bRrPPfccra2t+TqHHXZYvry+vp5JkyaxePHiXm9jQ5VKhdbW1ppJCCGEEEII0f/SIZ1BN1PfBzEuWLCAyy+/nOuuu47HH3+ctWvXcuKJJ3a7/jnnnMPvf/97HnroIe666y7uvPNOLr300k05pC1um+/4LV++nJEjR9bMa2pqwjnHypUre1xn+fLlvd7Ghq644grq6uryafjw4f11SEIIIYQQQogO+vuJ37XXXsusWbM4/vjjmThxIjfffDOLFi1iyZIlndZ99913ueOOO7jmmmuYNGkShx12GJdffjnXX389SbLtFI/fajF+Z511FvPnz+92+ZQpU3jkkUc2uh3v/Sa35f1s44ILLuC8887LX7e0tDBixAja2iq0tpUxxqBtut2kXCaJy8SVCkmlQlypgItxPiFJ0kfEWoNWoLTHJBaCMjEl4lKZtlJMqZRQSRzO+5qhnm2lGGNivK4Q+zLagkKn63hHXC7jkgrOVfAuJqmkX3VisEkFbBmT2HSfQFIu4eIK3lVwLm2DdSE2MSidkFRKnYendhi26r0Dly3XHWr4ZcNDjfUonaQfUmNpK1X6fO6FEEIIIcT7V/39qz9+j95S2soJynQ9tLKtnHa+NhyBZ60lCDrX/iuVSjzzzDN897vfzeeNHz+ecePGsXjxYiZOnFiz/h//+Ee890ydOjWfN23aNFatWsWrr77KHnvs8T6Pasvaah2/efPmceGFF3a7PIqiXm1n1KhR+ZO7qhUrVqC1ZsSIEQCMHDmyy3UmTJjQ621sKAiCmhtp7dq1AHx48uW9anf/WbKF9yeEEEIIIbYHbW1t1NXVbe1m9Mhay5gxYxjedFiP6zU0NHQagXfxxRczd+7cTuuuWrUK51yPIwI7Wr58OUOGDKn53b+pqSlfJh2/jRgyZAhDhgzZ5O0ccMABvPHGG7zyyivstttuQJrFc++996ZYLObrLFy4kNNOOw1In84tXryYWbNm9XobGzNo0CAAVq5cOeA/QB9Era2tDB8+nFWrVvX6mootR67PwCXXZmCT6zNwybUZ2D7o18d7T1tbW7/8Lr65BUHA0qVLN5pIxXuPUqpmnrVdd3X6+qSzq/U33Ne2YMCXc1i/fj2vvvoqb731FgAvvvgi69evZ5dddmHYsGHss88+HHLIIcyYMYOrr76apUuXctVVV/GDH/wg38Y555zDkUceyaGHHsqBBx7IZZddxpgxYzj66KMBerWNjdFZlsy6uroP5A+QbUWxWJTrM4DJ9Rm45NoMbHJ9Bi65NgPbB/n6bEsPKjYcabepRowYgda6yxF/Gz4FhHR04Jo1a6hUKnk7qu/tav2BasAnd/nDH/7AfvvtxzHHHAPAsccey3777cf//M//5OvceeedNDY2MnnyZM4880zOO++8mvp706ZNY/78+Vx22WXsv//+vP3229x33315Db/ebEMIIYQQQgix7YuiiH333ZeFCxfm815//XWWLl3KpEmTOq3/sY99DKUUjz76aD7v4YcfZvjw4XzoQx/aIm3uD8pvS1GdA1hrayt1dXW0tLR8YP9yNJDJ9RnY5PoMXHJtBja5PgOXXJuBTa6PuPnmm5k1axa33nor48ePz+vyLVq0iDfffJNp06Zx6623csABBwBw6qmn8sc//pEFCxbQ3NzMKaecwmmnnbZNlXQY8EM9txXWWi6++OJuxxKLrUuuz8Am12fgkmszsMn1Gbjk2gxscn3E9OnTeeeddzj77LNZs2YNhx9+ODfccAOQ1ut+6aWXaGlpyde//vrrmTlzJocffjjWWk499VS+9a1vba3mvy/yxE8IIYQQQgghtnMDPsZPCCGEEEIIIcSmkY6fEEIIIYQQQmznpOMnhBBCCCGEENs56fgJIYQQQgghxHZOOn5CCCGEEEIIsZ2Tjp8QQgghhBBCbOek4yeEEEIIIYQQ2znp+AkhhBBCCCHEdk46fkIIIYQQQgixnZOOnxBCCCGEEEJs56TjJ4QQQgghhBDbOen4CSGEEEIIIcR2Tjp+QgghhBBCCLGdk46fEEIIIYQQQmznpOMnhBBCCCGEENs56fgJIYQQQgghxHZOOn5CiPfl9NNPRynFueee2+XyuXPnopTawq3qvTVr1jB37lyefvrprbL/W265BaUUr7766lbZf9XmvE4bbntznvM//vGP1NXV8eabb/b7tnvrS1/6EuPGjctfL126lLlz5/Laa691WnfcuHF86Utf2nKNe5+mTp3K1KlT89dLlixh7ty5rF69utO6SikuvPDC972vK6+8kl122QVrLRMnTsy3OXfu3Pe9zb6YNWsWxxxzzBbZlxBCbA3S8RNC9Flrayt33XUXAHfccQdxHG/lFvXdmjVruOSSS7Zax++D4PTTT+eJJ57IX2/Oc/6v//qvTJ8+nR133LHft91bF110Effcc0/+eunSpVxyySVddvzuueceLrrooi3ZvPfl+uuv5/rrr89fL1myhEsuuaTLjt+mePLJJ7ngggs46aSTWLRoEbfddlu/br83zj//fB5++GEefvjhLb5vIYTYEuzWboAQYttzzz33sHbtWo4++mjuv/9+HnjgAf7pn/5pazdrsyqVSkRRtLWbsU3Zaaed2GmnnTb7fp5++mkWLlzItddeu9n31ZMJEyb0et399ttvM7ak/3zkIx/ZIvt58cUXATjrrLMYP378FtnnhnbYYQf++Z//me9973scdthhW6UNQgixOckTPyFEn/3kJz9h6NCh3HLLLRSLRW699dZevW/t2rXMnDmTMWPGEEURe+yxB1dddRXe+3ydRx55BKUU//M//8PMmTMZMWIETU1NnHLKKaxZs6ZmeytWrODkk09m8ODBDB06lC9/+cv8z//8D0opHnnkkW7bsXTpUnbddVcAZsyYgVIKpRS33HILkA5vO+igg/jFL37BfvvtRxRF+VOP6667jsmTJzNs2DCGDBnCgQceyH333ddpH83NzZx//vlMmDCBKIoYPXo0n/nMZ3jnnXe6bdcf//hHRo0axfHHH09bW1uX6xx99NHsv//+nea//fbbWGv5wQ9+kM97/fXX+fznP09TUxNRFDFx4sSaJ1Ld6c11gvT8n3322ey8885EUcTOO+/MF77wBUqlElA71LOncz5z5kxGjRpFpVKp2f769etpaGhgzpw5Pbb3hhtuYJ999uGjH/1ozfxx48ZxyimncMMNN/ChD32IQqHAxz72MRYuXNhpG7fffjv77rsvhUKBESNG8IUvfIG33367Zp3/83/+D/vttx+DBg2isbGRvffem/nz5+fLOw71fOSRRzj00EMB+OQnP5kfb/W+7DjU88knn0QpxS9+8YtO7frKV75CU1NTzbm54YYbatp62mmnbfQJ3MyZM/nQhz5UM2///ffvNNz4ggsuYOTIkfm17jjU85ZbbuHLX/4yALvttlt+TEuXLq3Z7jXXXMOuu+5KQ0MDU6ZM4YUXXuixbVOnTs3PxYQJEzY6vPOBBx5g8uTJFItFGhsbOe6443jppZfy5d/73veor6+nXC7n8z7zmc+glOI3v/lNPu+GG27AWsvatWvzeSeddBIPPvggf//733tssxBCbJO8EEL0wZtvvum11v6ss87y3nt/8skn+yiK/OrVq2vWu/jii33HHzFJkviDDjrI19XV+e9973v+wQcf9F/72tc84OfMmZOvt3DhQg/4cePG+ZkzZ/oHH3zQX3PNNb5QKPhTTz21Zh8HHXSQb2xs9Nddd51/4IEH/IwZM/wuu+ziAb9w4cJuj6Gtrc3ffffd+b6feOIJ/8QTT/jly5d7772fMmWKb2pq8uPGjfM33XSTX7hwoX/mmWe8995/4xvf8DfeeKP/zW9+4x944AF/zjnneMDff//9+fZLpZKfPHmyLxaL/tJLL/W//vWv/V133eVPP/10/+KLL3rvvV+wYIEH/CuvvOK99/7BBx/0gwYN8meeeaaP47jbtv/0pz/1gH/hhRdq5n/ve9/zxhi/bNky7733f/vb33xTU5P/6Ec/6m+77Tb/wAMP+C9/+cteKeXvvffeTb5Oq1ev9h/60If8sGHD/Pe//33/m9/8xv+f//N//IknnujXrl3bads9nfMXXnjBA/7OO++sOaYf/ehHXinl//d//7fb8+G99+PGjfPnnHNOp/ljx471O+20k99zzz39f/7nf/p77rnHH3jggT6KIv+Xv/wlX2/+/Pke8CeeeKK/7777/A033OCbmpr8brvt5tetW+e99/6xxx7zSik/a9Ys/9BDD/kHH3zQX3311X7evHn5dr74xS/6sWPHeu+9f++99/x//Md/eMBfc801+fG+9957edu++MUv5u/dY489/Oc+97ma9pdKJT9s2DA/c+bMfN55553nrbX+3HPP9Q8++KC/+eab/ZgxY/wBBxzQ433z3//93x7wf/3rX7336fXTWvtisejnz5+fr3fggQf6E044IX89ZcoUP2XKFO+998uXL/cXXnihB/xdd92VH1NbW5v33nvAjx071n/qU5/y9957r7/rrrv8uHHj/IQJE3ylUum2bS+88IKfM2eOB/zdd9/tn3jiCf/3v/893+bFF1+cr/urX/3Ka6394Ycf7u+9915/xx13+AkTJvgRI0b4N954w3vv/R//+EcP+EcffdR7771zzg8fPtwXi8Wae/ikk07yBxxwQE1bVqxY4QF/0003ddteIYTYVknHTwjRJ/PmzfOAf/zxx7333j/wwAMe8D/84Q9r1tuwQ/GLX/zCA37BggU165122mk+DEO/YsUK7317x2/DTt4555zjoyjyzjnvfdpR6qqz8M///M8b7fh57/3rr7/uAX/DDTd0WjZlyhSvlPJ/+tOfetxGkiS+Uqn4T37yk/7YY4/N5990000eqOlgbahjx+/222/3QRD4iy66qMf9ee99S0uLHzx4sD///PNr5u+7777+qKOOyl9Pnz7djxgxwq9cubJmvcMPP9zvu++++ev3e50uuugir7X2Tz/9dLdt3XDbGzvnhx12WM28/fbbzx9xxBHdbt9775ctW+YB/+Mf/7jTsrFjx/ogCPLOjvfer1271g8dOtSfcsop3nvv4zj2I0eO9FOnTq1572OPPeYBf/XVV3vvvf/ud7/rhw4d2mNbOnb8vG+/lx966KEu29ax43f55Zf7QqHg16xZk8+75557POAXL17svU/Pn9baX3LJJTXb+u1vf+sBf88993TbtlWrVnmllL/lllvybQ8ZMsRPnz7dn3TSSd5779etW+ettTWf5Y4dP+87/8GiI8B/6EMf8uVyOZ931113ecD/7ne/67Zt3nt/ww03eMC//vrrnbbZseO3//77+w996EM1HcnXXnvNW2v97Nmzvffp53Lo0KF+7ty53nvv//SnP3mllP/617/uDzzwwPx9o0eP9uedd16ntuy0005+xowZPbZXCCG2RTLUUwjRJ7feeiu77bYbkydPBuDwww9nzJgxGx3uuWjRIrTWnHzyyTXzTznlFMrlck0SEKBTdr29996bUqmUD5X8/e9/jzGGT3/60zXrffazn6157ZwjjuN8SpKkV8c5bty4PLNgR3/84x/5p3/6J0aNGoW1liAIeOihh2qGmv36179m9OjRHHvssRvdzw9+8AO+9KUvcfXVV3PppZdudP1ischnPvMZ7rjjjnw43nPPPcczzzzDqaeemq/3wAMPcPTRR9PY2Fhz/EcccQTPPPNMzfC2jnp7nX7961/z8Y9/vN9i1c4++2wWLlzIK6+8AsBTTz3Fn/70J84888we3/fWW28B0NTU1OXyAw88kF122SV/3dDQwDHHHJMfx0svvcTy5cv5/Oc/X/O+gw46iLFjx/Loo48C8PGPf5x3332XU045hV/+8pedhh1vqlNOOYVSqZQnTQK47bbb2GOPPTjggAMAeOihh3DO8fnPf77mmk6aNInBgwezaNGibrc/bNgw9tlnnzxxycMPP8yUKVM4/PDD86GvixYtIo7jTYpv++QnP0kQBPnrvffeG4C//e1v73ubVc3NzTz99NOceOKJWNueomDXXXflE5/4RH6ttNYccsghNce6zz77cMIJJ/CHP/yBdevW8ec//5lly5Z1eaxNTU35fSWEENsT6fgJIXrtqaee4s9//jPHH388a9asYc2aNaxbt47jjz+eJ554gpdffrnb965evZphw4Z1SpAyevTofHlHw4YNq3ldfV819u3tt99m6NChNb9kAowaNarm9aWXXkoQBPk0bdq0Xh3rDjvs0Gne3//+9/+fvTuPj6JK9wb+q3OqqruTEMISCBEBQRYVEDeWqxI295HBFb0ielHAAWYQeUeGAZVFEMcZF0SUQYERN4YZGe8V3IniiIIzCirjoIyAbCEQ1iSd7qpzzvtHLd2d7g5JCBDw+X4+RdJV1dWnlm5yus7zPOjfvz/27duHp59+GqtXr8bnn3+OK6+8MiEmr6SkpNrZJV977TWcdtppuOGGG6q1PgAMHToU27Zt8+PFFi9ejAYNGuDnP/+5v05xcTFefPHFhH03DAO//vWv/TamUt3zVFJSUqeJW6677jrk5eX5MXPPPfcc8vPzce2111b5PO+4p0u8U/l68OZ5ZR+8/Ul1vvPy8vzlBQUFWLp0KbZt24brrrsOubm5GDBgAL766qtq7mHVWrdujd69e/vZLA8cOIDly5fj9ttv99cpLi4GAJx55plJ5/XQoUNpz6mnX79+fievsLAQffv2Rd++fbF7927861//QmFhIfLz89GhQ4da78eR3rdHY//+/VBKHfFcAc6+fvbZZwiHw/6+XnTRRQgGg/j4449RWFgIwzBw8cUXJ20rFAohHA4fdXsJIaS+oayehJBq+9Of/gQAePTRR/Hoo48mLX/xxRfx8MMPp3xu48aNsW/fPkSjUZim6c8vKioCADRp0qRGbWnRogX2798Py7ISOn+Vk6eMGDEiIeNogwYNqrX9VLXt3n77bRw8eBB//vOfEzo95eXlCes1bdoU33zzTbVe569//StGjBiBPn36YOXKlX4HqyoFBQVo1aoVXnrpJRQU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4I477sAll1wCwOnEpjNw4EAEg0E8//zzuP/++49TKwkhpwq640dIPTFr1iw0btwYv/vd71Iub9euHbp27QogNqRx1apVuOmmm5CTk4MePXoAAA4dOoQxY8YgPz8fgUAAHTt2xBNPPAGllL+t0tJS/PKXv0SrVq0QCATQvHlzDBgwAP/+97/9dZ566imcddZZCIVCaNSoES688MKEOy+VbdmyBWeccQYAYPjw4dA0DZqmYdGiRQCc4W2XXHIJ/u///g/nnXceAoGAf9djzpw56NWrFxo3boycnBz07NkTy5cvT3qNsrIy/OY3v0G7du0QCASQl5eHG264Abt3707brn/+859o3rw5rr/+elRUVKRc5+qrr8YFF1yQNH/Xrl3QdR1PPvmkP2/z5s247bbbkJubi0AggG7dulV5XDzVOS8AsGfPHowaNQqnn346AoEATj/9dNx+++2IRCIAEod6VnXMx4wZg+bNm8OyrITtl5aWokGDBpg4cWKV7Z0/fz66du2Kc845J2F+mzZtMGTIEMyfPx9nnnkmgsEgzj//fBQWFiZt46WXXsK5556LYDCIpk2b4vbbb8euXbsS1nnllVdw3nnnISsrCw0bNkSXLl0wb948f3n8UM8PP/wQffv2BQBcdtll/v56fyjHD7dbu3YtNE3D//3f/yW16xe/+AVyc3MTjs38+fMT2nrXXXcd8a7KmDFjcOaZZybMu+CCC5KGG0+aNAnNmjXzz3X8UM9Fixbhf/7nfwAA7du39/dpy5YtCdudPXs2zjjjDDRo0AAFBQXYsGFDlW3r06ePfyzatWt3xOGdb7/9Nnr16oVQKISGDRti0KBB2Lhxo7/897//PTIzMxGNRv15N9xwAzRNw/vvv+/Pmz9/PnRdx6FDh1K+zp133ok//elP2LFjh7+v8UN5N27ciOuuuw45OTkIhULo2bMn3n777Sr3dcqUKZg6dSoAwDAMf7vxhBB48MEH0aJFC+Tk5ODaa6/F9u3bk7ZVm+sgnSN9Vtx5553+ddC/f3//WFR1jXPOcdNNNx3zoauEkFOUIoSccLZtq1AopG699dZqrb9w4UIFQLVs2VL9+te/Vu+995566623lBBCXXLJJSojI0P9/ve/V++884761a9+pQCoiRMn+s+/++67VbNmzdTzzz+vPvroI/X666+r8ePHq08//VQppdRLL72kOOdq6tSpauXKlWr58uXqkUceUc8//3zaNlVUVKjXX3/df61PP/1Uffrpp6q4uFgppVRBQYHKzc1Vbdq0US+88IIqLCxU69evV0opNX78ePX888+r999/X7399ttq9OjRCoBasWKFv/1IJKJ69eqlQqGQmjZtmnr33XfV0qVL1d13362+/fbbhOPy/fffK6WUeuedd1RWVpYaOXKksm07bdtfffVVBUBt2LAhYf7vf/97xTlXRUVFSimlfvzxR5Wbm6vOOecctXjxYvX222+r//mf/1Gapqk33njDf95DDz2k4j9eq3te9u3bp84880zVuHFj9fjjj6v3339fvfLKK2rw4MHq0KFDSduu6phv2LBBAVBLlixJ2KfnnntOaZqm/vOf/6Q9Hkop1aZNGzV69Oik+a1bt1YtW7ZUnTp1Uq+99ppatmyZ6tmzpwoEAurf//63v968efMUADV48GC1fPlyNX/+fJWbm6vat2+vDh8+rJRS6uOPP1aapqmxY8eq9957T73zzjvqqaeeUrNmzfK3c8cdd6jWrVsrpZQ6ePCgeuaZZxQANXv2bH9/Dx486Lftjjvu8J/bsWNHddNNNyW0PxKJqMaNG6sxY8b48yZMmKB0XVf33Xefeuedd9SCBQtUfn6+6t69e5XXzV//+lcFQG3dulUp5Zw/xpgKhUJq3rx5/no9e/ZUN998s/+4oKBAFRQUKKWUKi4uVpMnT1YA1NKlS/19qqioUEopBUC1bt1aXX755eqNN95QS5cuVW3atFHt2rVTlmWlbduGDRvUxIkTFQD1+uuvq08//VRt27bN3+ZDDz3kr/vWW28pxpgaMGCAeuONN9TLL7+s2rVrp5o2baq2b9+ulFLqn//8pwKgPvroI6WUUlJK1aRJExUKhRKu4VtuuUV17949bbs2bdqkrr76apWbm+vv6xdffKGUUmrHjh2qadOm6owzzlCLFy9W//u//6uuuOIKxRhL+CyobNu2bequu+5SANTf//53f7tKKbV582b/GN56661qxYoVatGiRapJkyaqd+/eCdup7XWgVPK1V53Pik2bNqnZs2crAOqZZ55Rn376qVq3bl2V17hSSi1dulQBOOJ7mBBCKqOOHyH1QFFRkQKgfvOb31Rrfa+Dc++99ybM/7//+z8FQC1cuDBh/l133aVM01R79uxRSil1zjnnqHHjxqXd/ujRo9V5551Xs51QsT+y5s+fn7SsoKBAaZqmvvzyyyq3IYRQlmWpyy67TA0cONCf/8ILLygACR2syuI7fi+99JIyDEM98MADR2x3eXm5ys7OTjr+5557rrrqqqv8x8OGDVNNmzZVe/fuTVhvwIAB6txzz/UfV+74Vfe8PPDAA4ox5v8hnErlbR/pmPfr1y9h3nnnnaeuuOKKtNtXKnY9/vGPf0xa1rp1a2UYht/ZUUqpQ4cOqUaNGqkhQ4YopZwvMpo1a6b69OmT8NyPP/5YAVBPPfWUUkqpxx57TDVq1KjKtsR3/JRSqrCwUAFQ7733Xsq2xf/x/fDDD6tgMKgOHDjgz1u2bJkCoNasWaOUco4fY0xNnTo1YVt///vfFQC1bNmytG0rKSlRmqapRYsW+dvOyclRw4YNU7fccotSSqnDhw8rXdfVs88+6z8vvuOnVPIXFvEAqDPPPFNFo1F/nveH/yeffJK2bUopNX/+fAVAbd68OWmb8R2/Cy64QJ155pkJHckffvhB6bruf04IIVSjRo3UlClTlFJKffnll0rTNHXvvfeqnj17+s/Ly8tTEyZMqLJdd9xxhzrttNOS5o8fP15xzhOOg23bqkOHDkf8PPLeF5U7w977o3In77HHHlMA1I4dO/z1ansdKJV87VX3s+K9995TAFRhYaE/r6prXCmnwwhAvfzyy1W2iRBCKqOhnoScxK677rqEx6tWrQJjDLfeemvC/CFDhiAajfpJQS666CIsWrQIM2fOxD/+8Y+kbKEXXXQR1q1bh1/+8pd4//33UV5enrBcSgnbtv2putlG27Rp42cWjPfPf/4TP/vZz9C8eXPoug7DMPDee+8lDDV79913kZeXh4EDBx7xdZ588knceeedeOqppzBt2rQjrh8KhXDDDTfg5Zdf9ofjff3111i/fj2GDh3qr/f222/j6quvRsOGDRP2/4orrsD69evTDm+r7nl59913cdFFF9VZrNqoUaNQWFiI77//HgDw+eef48svv8TIkSOrfN7OnTsBALm5uSmX9+zZE61atfIfN2jQANdcc42/Hxs3bkRxcTFuu+22hOddcsklaN26NT766CMAznW2f/9+DBkyBG+++SYOHDhQq/1MZ8iQIYhEIli6dKk/b/HixejYsSO6d+8OAHjvvfcgpcRtt92WcE579OiB7OxsrFq1Ku32GzdujK5du2LlypUAgJUrV6KgoAADBgzwh76uWrUKtm2jX79+td6Pyy67DIZh+I+7dOkCAPjxxx9rvU1PWVkZvvjiCwwePBi6Hgv7P+OMM3DxxRf754oxht69eyfsa9euXXHzzTfjH//4Bw4fPox//etfKCoqqvW+rlq1Cj179kwYPss5x6233op169alfX9VxzXXXJPwuPIxPJrrIJXaflZUh/e+9N6nhBBSXdTxI6QeaNKkCUKhELZu3Vqj57Vo0SLh8b59+9C4ceOkhCl5eXn+cgB4+umnMXLkSCxYsAAXXXQRmjVrhnHjxvkdvKFDh+LZZ5/FmjVrcMUVV6Bx48a4/vrr/bijadOmwTAMf+rfv3+t2gsA27ZtQ//+/bFv3z48/fTTWL16NT7//HNceeWVCTF5JSUl1c4u+dprr+G0007DDTfcUK31AWeft23b5sfSLF68GA0aNMDPf/5zf53i4mK8+OKLCftuGAZ+/etf+21MpbrnpaSkpE4Tt1x33XXIy8vzY+aee+455Ofn49prr63yed5xT5d4p3nz5inneWUfvP1Jdb7z8vL85QUFBVi6dCm2bduG6667Drm5uRgwYAC++uqrau5h1Vq3bo3evXv72SwPHDiA5cuX4/bbb/fXKS4uBgCceeaZSef10KFDac+pp1+/fn4nr7CwEH379kXfvn2xe/du/Otf/0JhYSHy8/PRoUOHWu9H48aNEx575yVdzGpN7N+/H0qpI54rwNnXzz77DOFw2N/Xiy66CMFgEB9//DEKCwthGAYuvvjiWrVl3759aduhlML+/ftrtV3gyMfwaK+Dymr7WVEdoVAIABAOh2u9DULITxNl9SSkHtB1HX369MF7771Xo0yXlRMYNG7cGPv27UM0GoVpmv78oqIiAE4HEwCysrLwyCOP4JFHHsHWrVvxl7/8Bb/5zW9gmiYeffRRaJqGkSNHYuTIkdi/fz/effddjB8/HoMHD8aaNWswYsQI/OxnP/O336BBg1q1F3C+GT948CD+/Oc/J3R6Kt9lbNq0Kb755ptqvc5f//pXjBgxAn369MHKlSv9DlZVCgoK0KpVK7z00ksoKCjAq6++ihtvvNH/Iwtwjt+ll16KCRMmpNxGfn5+yvnVPS9Nmzat05p5hmHg7rvvxty5c3H//ffjtddew/jx4xPu7KTitSfdH9qpkuns3r3b75h7f2R7+xevqKgIF154of/4xhtvxI033ojS0lJ8+OGHmDBhAq688kps374djB39d5O33347hg8fjq1bt+Kdd95BNBpNuBPp7eu7776LRo0aJT3fW55O37598cQTT+DTTz/Fhg0b0K9fP+Tl5eGss87CypUrsXLlSj9ZR33UqFEjaJqW9lzF73/fvn0RjUaxatUqrFq1CiNGjICu67j00kuxcuVKbN68Gd27d0dmZmat2tK4ceO07dA0LanzVpeO9jpItX5tPiuqw+uMN23atNbbIIT8NNEdP0Lqid/85jcoKSnxvxGubPPmzUe8E1JQUAApZcLQNgB4+eWXYZomevbsmfSc1q1bY/z48ejSpUvKjlWjRo0wePBg3Hzzzf7y/Px8XHjhhf7UsWNHALFv0WvyTbTXwYsfyvbdd9/hk08+SVjv8ssvR1FRUcosjZWddtpp+PDDDyGlRN++fZMySaaiaRpuu+02/OUvf8GKFSuwffv2hGGeAHDllVfiq6++wjnnnJOw/96UrsNe3fNy+eWXY+3atVi/fv0R2+s50jEfOXIkDh48iJtuugmRSATDhw8/4jbbtGmDYDCYslYeAHz22WfYtm2b//jw4cNYvnw5evXqBQDo2LEjmjdvjtdeey3heatXr8bWrVtRUFCQtM2srCz87Gc/w8iRI7Fr1660d0Rqeo3ddNNNCAaDePnll7F48WL07t07IYvkZZddBsYYfvzxx5Tn1Muamk7v3r3BOccDDzyApk2bonPnzgCcu2Ovv/461q1bd8Shj7V539SVzMxMXHDBBVi6dGnCkO2tW7di9erVCeeqc+fOyM3NxWOPPYaysjL07t0bgLOvH3zwAT766KNqDfMMBAIp97WgoACfffZZQkZTIQSWLFmC8847r8ovmI72GB7tdVBZbT8rqrMvmzdvBgD/c5cQQqqL7vgRUk/07t0bjz/+OO677z58++23uPPOO9GqVSvs378fH3zwAZ5//nm88sorfkmHVK666ipccskluOeee7Bnzx6cc845WLFiBZ5//nlMnDjR/4a4V69eGDhwILp06YKsrCx89NFHWL9+Pe644w4AwIgRI9CgQQP06tULzZo1w3fffYfFixfj8ssvr3IfmjdvjiZNmuC1115D165dkZmZiTPOOKPKb8sHDBgAXdcxdOhQjB8/Hrt27cJDDz2EVq1aJRRj9koI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eOmll5DNZpN5jjnmmGR6fX09xo4di6VLl1Zdn+/7yGazZQMREREREXW/OIdCrYE2rctdPc855xz84Q9/wGWXXbY1tmez/OY3v8FLL72Ee+65p+r0VatWYcCAAWXjmpubYYzBmjVrsPvuu9ecZ9WqVVWXedNNN+H666+vnGA0IFPF11JCOB6E0ZAmk4yzgR8m7ogLuKcySTHxpCh5KgOVykDVNUDFCV9cF06mIQlwjQu1A+VJXozRkK4Hk22tmBYXkQcAnQ8TmpigAJVKoy5dLAqvpEDW11GhdgFtKx+jF7SBsiIqIm7gug48R8HXBkoIOFLAkYCKcr5kHIU6R6F3ykVDykF9KkzsEhckL76BK7MzCaWSfRVKJQlwgPBCtn4BJp8Li44rGRZtz9TDqW+EzNQj1TwknL8kmUtS0FzKskQtwvHgNPSGihPsxAXQpYKNjq2NxrUXJ4QpTQyjpITrKCgpooQ44T44mYYkSUx8fuP1xdvDQupERES0qxNRosOq05jUs1O63PBramrCt771LTz66KM44IADKoq2z5o1q9s27pJLLsGdd95Zc/qECRPwwAMP4PLLL8cf/vCHmgXkbZUGy5aaOXMmrr766uR1NptFv379un09RERERES7uo7r+O2cT/yOO+44/O///m+3La/LDb9nnnkGo0ePRmtrK55++umyad1dzH3OnDm45pprak5PpVJ4+eWX8f7775d18dRa4+KLL8b8+fPx1FNPYeDAgRVP7lavXg0pJfr37w8AGDBgQNV5RowYUXXdruvWbGgSEREREVH3EUpWLaMVT9uRffvb364YZ63FP/7xj25dT5cbfgsXLuzWDehIU1MTmpqaOpzn05/+NF566aWycccffzwuvvhifP7znwcAjBkzBu+++y7eeOMN7L333gDCLJ4HHHAAMplMMs/ChQtx4YUXAgDa2tqwdOlSTJ8+vZv3ioiIiIiIukI4YY3lqtP0jt3X88c//jG+//3vV/RSrKur69b1dLnh19PU19dj1KhRZeNc18WQIUMwfPhwAMCBBx6I8ePHY8qUKbj11luxYsUK3HLLLfjBD36Q/M2ll16KE044AUcffTQOO+ww3HDDDRgyZAhOOumkbbk7RERERETUjlCqgyd+O3ZXz09+8pOYOHEidtttt7Lx/+///b9uXU+nGn7HHXccvvnNb+Koo47qcL61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d+ONN3brBnSHOXPmYN9998WPfvSjZNzee++d/P7iiy9i8eLFeO211zBy5EiMHj0aV1xxBW677bak4Td37lycddZZmDJlCgDg3nvvRXNzMx555BFMmjRpm+4PEREREREVFbSB2EWSu5xzzjn4wx/+gMsuu6xbl9vlht8Xv/jFbt2A7rBgwQKceOKJOOWUU/D0009j7733xuzZszFhwgQAYdbRoUOHlmXGmThxIm666SZks1lkMhksW7YM119/fTK9vr4eY8eOxdKlS6s2/HzfL+tKms1mt94OEhERERHtwrTtoJzDTtbVs6mpCd/61rfw6KOP4oADDqhI7jJr1qzNWm6XY/yAsAvn7NmzcdFFF2H16tUAgCeeeKIs7m9bWrFiBX784x/jsMMOwx//+EdMmDABxx9/PN566y0AwKpVqzBgwICyv2luboYxBmvWrOlwnlWrVlVd50033YS6urpk6Nev31bYMyIiIiIi8rVJ8ly0H3a25C7PPPMMRo8ejdbWVjz99NN48sknk+Gpp57a7OV2+YnfokWLcPLJJ+Pwww/HE088gW9+85tobm7G0qVL8cwzz+BXv/rVZm9Me5dccgnuvPPOmtMnTJiAJ554AsYYHH744fjmN78JAPjUpz6FP/zhD/jZz36Gb33rW7Bb4VuAmTNn4uqrr05eZ7PZisafULWLuAPF4u3JvFImiUmk60aJSiQKQbFwe/uLXkcF08O+zfH6BLrK6rB4O1BSyF0bOFLCj8a37z+thIARIinkDgDaGhQCnSSeUdG0upIC7p6SkFLA+IWyZC7lx6r4nUScAEc6HrQx8LWGlBJeKgPARkliCslxDY/hZn2nQUREREQ9UEdJXHa2J34LFy7cKsvtcsPv61//Or7zne/g0ksvRa9evZLxEydOxG233datGzdnzpyyZDHtpVIpAMDAgQOxzz77lE3bZ5998M477yTT2z+5W716NaSU6N+/PwBgwIABVecZMWJE1XW7rlvx2JWIiIiIiLpf/FCh1jTatC4/Fvnb3/6Gk08+uWJ83759sXbt2m7ZqFhTUxOGDh1ac2hubgYAHHbYYVi+fHnZ3y5fvhx77LEHAGDMmDF49913y7qiPv744zjggAOQyWSSeUpb121tbVi6dCnGjh3brftERERERERdU6ubZzzQpnW54Tdo0KCqsXyLFy/G8OHDu2Wjumr69OlYuHAhbrvtNixfvhyzZ8/GK6+8gvPPPx8AcOCBB2L8+PGYMmUKXnjhBTz88MO45ZZb8OUvfzlZxqWXXor7778f99xzD15++WVMnjwZQ4YMwUknnbRd9omIiIiIiELadlTLb3tv3Y6hyw2/6dOnY9q0aXjkkUcAAK+88gp+9KMf4corr8SVV17Z7RvYGUcccQR+/vOfY+7cuTjwwAPx0EMP4dFHH8WwYcOSee6//3707t0b48aNw8UXX4yrr746KeUAhF1V77zzTtxwww045JBD8MEHH2DBggWs4UdEREREtJ3tSgXct5Yux/h9+ctfRkNDAy6//HK0trbilFNOwaBBgzBr1ixcdNFFW2MbO+Wcc87BOeecU3P6oEGD8PDDD3e4jMmTJ5c1BjdHWbKWeFyc1CUeYQyEVEkSFaFUksAE0c84yYs2NkzoEoSJXbJ+UHysbUyVxC4dq0imYjQAt3y60eG21Ui8ElNRAhUlJZSIkrsYCyVskghGiTipi0CdI5FxHXiOguco2CCfrMMaXTx2UsFqA6FkSWIXFznfj45D+Ddp14WSAq5SUFGiFyIiIiLa+eS1gd1F6vhtLV1u+AHFBlJraytaW1sryiAQERERERF1F23CodY02rQuN/y01nj22WexYsUKCCGw1157oX///pBMn09ERERERFuB30HLb2er47e1dKnht2DBAnzpS1/Cu+++WzZ+jz32wJ133onjjz++WzeOiIiIiIhIWwu5i9Tx21o63fB78cUXcfrpp+MLX/gCLr/8cuy7776w1uLVV1/FD3/4Q0yaNAnPPPMMRo0atTW3d4fQvnB7PC6O87NSA1EMXDKvlJVxfkqhoDUKgUYu0Cho3WENk5qiZUMqCMeDiOLphONBuG7Z+uL5iiyklFGR9iimT4gkLVC1L1i0jeL7ZFiwvc5RKHgWGUci7Si4SsJVCjrrJ0XjhVJlcX4AymL+wt2QULK470qKsifNbz99X9eOCxERERHtEAIDiBoP9gI+8OuUTjf8brnlFvzbv/0b7rrrrrLxo0ePxj333INcLof//M//xL333tvtG0lERERERLuugrawNeo2+Kzn0CmdDsx78sknMXXq1JrTp06disWLF3fLRhEREREREcVYzmHLdfqJ3/vvv99hgfbhw4fj/fff75aNIiIiIiIiihWMhanxZC/oahjULqrTDb9cLtdhMXPP85DP57tlo4iIiIiIiGLaAqJG+449PTunS1k9v/Od76C+vr7qtNbW1m7ZoB2dULLdawVhVLEYepRIJUn0EidaUe2TqoRJTbSvo4LtGoUgLNy+6Ufa1adJ14N0vbBou1SQrgfheMlP4bhJ4fh4aE/JqAy9CR+5KymL44CocLtMEtBkXJVsq6fCAu6ZqPB60EGR+CSxS0miHCUEjBSIeyizhAgRERHRrkEbC1HjyV6XEx/uojrd8Bs/fjyeffbZTc5DRERERETUnQo6fHZRTVBjPJXrdMPviSee2IqbQUREREREVB2f+G25LnX1JCIiIiIi2tYY47fl2PDbmqQC2hUlt7r4Oo7zQ0msWmnRciEltPEr4/s6+FajNN4OQLEwu1KwRkG4brGAu+uWx/kl81aPnVNREXdtTLieMJyvTLhtUQF3ERZwzzjhPmUchbTrwHUUTBAWb49jHONYv9KYvrigvCg5Pq5SkFERdyVEtF2M9SMiIiLambGr55Zjw4+IiIiIiHo0bQBhak+jTWPDj4iIiIiIerRAW9gafTo1+3p2Cht+RERERETUo2mDOJqo+jTaJDb8iIiIiIioR9MWtUpVM7lLJ7Hh191kZSH2WEVSFxSv36SIe8l8gIAxFr42URH3YvH2agXcO0pyUlaY3fEglIyKtntR8fjwNaoUTo+XbYyFFKIkGY2p+s2LNhYm2r606yRF3jOug4znIO06sH4e1mjYkq9ohFRlyW9q7p8xm9xfIiIiItp5+AFganz008G23ZYdFT85ExERERFRj6Ztx8PWMm/ePAwfPhyZTAYTJkzA66+/XnNe3/fx9a9/Hfvvvz/q6uqwxx574IorrkBra+vW28AuYMOPiIiIiIh6NF+HT/2qDlupnMPjjz+OqVOnYsaMGXjmmWcwaNAgnHzyySgUClXnb2trw4svvohZs2bhhRdewH333YcFCxbg8ssv3zob2EXs6klERERERD3a9kjuMnfuXJx11lmYMmUKAODee+9Fc3MzHnnkEUyaNKli/t69e+PRRx9NXu+99964/vrrcemll+Lee+/dOhvZBXziR0REREREPZrpoJunibp6ZrPZssH3/S1a57Jly3DMMcckr+vr6zF27FgsXbq008tYs2YN+vbtu0Xb0V34xG9rkypJ5BKzuvg8OkmiIssTuwipoI2BtgYFrSuSuwBAYIodmjeZ6ERKCBUmdpHR+qTrRePc4u9RAphSSggYKeADUFIUv22REtroaP3hXhobJYCJeNH+KeEi7TpwlYKSEoHp3DN5ISXefvq+Ts1LRERERDsnPwBk+w/VERMld+nXr1/Z+GuvvRbXXXfdZq9z1apVGDBgQNm45uZmrFq1qlN/v27dOnz/+9/HJZdcstnb0J34xI+IiIiIiHq0ziR3Wbt2Ldra2pJh5syZVZd1ySWXQAhRczjqqKO2eHvb2tpw6qmnYtSoUbjqqqu2eHndgU/8iIiIiIioRzMdxPhFlb6QyWSQyWQ2uaw5c+bgmmuuqTk9lUoBAAYMGFDxdG/16tUYMWJEh8vP5XL413/9V3ieh1/96ldQqnqpsm1tp3jiVygU8NWvfhVDhw5FXV0dRo8ejd/85jdl86xcuRKTJk1CXV0dBg8ejNmzZ1cspyvpWomIiIiIaNuomdEzGrqiqakJQ4cOrTk0NzcDAMaMGYOFCxcmf9fW1oalS5di7NixNZedz+cxadIktLW14eGHH0Y6nd6s/d0adoqG35w5c3D//ffjpz/9KV5++WV87nOfw9lnn42///3vyTxnn3021q1bhyVLluD222/HzTffXJZdp6vpWjujNFautDh7WDC9MpauGm0stLFl8X2BCYdqRdyllLDGwGoDWyuOLl63jOL7UplwcLyy2azRsMZASQkpJaQUSTF2AJBCQEmRvI4Za6GTIusCnlJwVfHvtDEQUYyhdF1IxwsHNxzCYyQ7dXyIiIiIaOenTcfD1nDppZfi/vvvxz333IOXX34ZkydPxpAhQ3DSSScl8+y777548MEHAYR1/M4880wsX74c8+bNQ0tLC1auXImVK1dunQ3sop2i4bd06VKceeaZOOaYY7DXXnvh61//OhobG/H8888DAF588UUsXrwYd999N0aPHo3TTjsNV1xxBW677bZkGaXpWkeNGoV7770X7733Hh555JHttFdERERERAQAvhYdDlvDxIkTceedd+KGG27AIYccgg8++AALFiyA5xUflrz22mv46KOPAADvvfcefv/73+Mf//gHPvnJT2Lw4MHJ0BPsFA2/cePG4X//93/xzjvvwFqL3/zmNygUCjj88MMBhKlYhw4dipEjRyZ/M3HiRLz00kvIZrPJPF1J1+r7fkXKWCIiIiIi6n7b44kfAEyePBkrVqxALpfDokWLsM8++5RNt9biggsuAADsueeesNZWHXqCnSK5y4wZM7Bq1SrssccecBwHmUwGv/71r7H77rsDqJ2K1RiDNWvWYPfdd+9yutabbroJ119//dbZISIiIiIiShgD2BoNvFrjqVyPfuLX2VSrv/jFL/DII4/g4Ycfxl//+ld885vfxLnnnovXXnsNALZKK3vmzJll6WLXrl3b7esgIiIiIqKoq2dQY9hKXT13Nj36iV9nU61+4xvfwOzZs3HKKacAAA488EA8/vjj+MlPfoLvf//7GDhwYNVUrFJK9O/fH0DX07W6rgvXdSvGty+ALqSCBQCjIZQqK96+KTpKkqKjRC756Dl2aVIXXVLEXQoBJQSsKaY2ar++JMlMVKw9TqgiXS9M9qJk2d9ZoyGkhBKliV0k4ny6xpZ/dxAndSkV/40qKewulIJ0vIoELkzsQkRERETtaQMIPvHbIj264dfU1ISmpqZNztfW1lZRH0NKCRM1QsaMGYN3330Xb7zxBvbee28AYRbPAw44IKn1EadrvfDCC5NlLl26FNOnT+/GPSIiIiIioq4KAgGB6k/2bMAnfp3Roxt+nXXSSSfhuuuuw+DBg7HnnnvikUcewZ/+9CdcddVVAMIngOPHj8eUKVNw6623YsWKFbjlllvwgx/8IFnGpZdeihNOOAFHH300DjvsMNxwww0V6VqJiIiIiGjbM3zit8V2iobf3Llz8Y1vfAPnn38+1q9fjxEjRmDevHmYOHFiMs/999+Piy++GOPGjUNjYyOuvvpqTJ48OZkep2udNWsWVq5cibFjx1akayUiIiIiom2PDb8tt1M0/JqamnDHHXfgjjvuqDnPoEGD8PDDD3e4nMmTJ5c1BomIiIiIaPsLu3Oyq+eW2CkafjuEKFmJACBM+Huc9CVWlhRGSViEyVsK2iCvDQq689lJrdGwpkoiGakArYEosYuIk7uk0sn6459Waxi/ACEVlFRQUkAJCUiDOCFsnFzGtMucGo+PE7ooJeA54XK1tfAcF9bVsKY8OUyY3CXejh6ddJaIiIiIthWDOLdg9Wm0SWz4ERERERFRjybZ1XOLseFHREREREQ9muMDokbnNxtUH0/l2PAjIiIiIqIeTfGJ3xZjw28riIugt2eNTmL9knk7KFQe1yHU1qKgbVnh9mqUDIusa79GfF+yfVGReSnDIuqOF/4sKTAf/73VJini7iqFgtSAieP8wnVqYyGFSOL8SovKh8XbQzKK9zPGACqMMWy/nSzcTkRERETteYGBqNHCs5otv85gw4+IiIiIiHo0ZQxEjUd+1rDh1xls+BERERERUY8mjYGs0fAzbPh1Cht+RERERETUozmBD2mrh1MZ7W/jrdkxseFHREREREQ9mjQaUtTIYdFBbgsqYsOvm9VK7AKEiUvCRCnFAumbYqyFNjZK8BIlVBHFhClxwpdiEhVblpilfYF4IRUsogQvSkUF3F2oVCZcHwplCV6s0bBawyZF3CUAEyZ4AaCkBWCShC7xtsbbqaIi7FKIskQvBa3hKcUi7URERES0SVIXUPNToy5sy03ZYbHhR0REREREPZowAYSo3vQThoX8OoMNPyIiIiIi6tGE1RC2em+5WuOpHBt+RERERETUs+kcgBrZO9nVs1PY8NtKkjg+o5O4P6tNEmO3NSgpK+uYSFUR8BrH+pUOHWlfZD2J8wOgrICSKoztiwvOG5PMF8f2KSmTn0AxTvHtp+/brH0lIiIiol2I1eFQaxptEht+RERERETUs5kAqBHjB8b4dQobfkRERERE1LOZAiBq9JszrOPXGWz4ERERERFRz2YDwIja02iT2PAjIiIiIqIezZo8bI3kLpZP/DqFDb+toDRZSly0HQiLu1ttIFRUyF2pisQpm1JavD1+raSMfoqo4LpJ1ieUAkyUaAZh4fakcHyNpC7Fwu0m2j63rPA8ECZu0cbAVQrGWEAaqGh6abH2OKlLuK3h75JF24mIiIioC6wJYFH9iZ9ljF+nsOFHREREREQ9m9WArfHwgFk9O4UNPyIiIiIi6tGMzgO2eldPw66encKGHxERERER9WxWA7ZWchc+8esMNvyIiIiIiKhHM6YA1EjuYhjj1yls+HWzaoldKhK81Lg22ydQaa99YpeyaVJACZkkbol/CqlgpSqGwproDVOSYEUolSSeab894bIM4BbXo42Nfo+XYSARJnnx2l1RKiq0KaUomZ+IiIiIqPPC5C61p9GmseFHREREREQ9mrUatkZXT8uunp3S4x/BLF68GCeddBKam5shhMDy5csr5lm5ciUmTZqEuro6DB48GLNnz66YZ968eRg+fDgymQwmTJiA119/vcvLICIiIiKibc/qfIcDbVqPf+LX2tqKQw89FKeddhqmTp1adZ6z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23RbSl111VWYPHkydtttt2TcH//4R5xxxhm48MIL8Z//+Z947rnn8M1vfhMff/wxvvOd73TbumfOnIm//OUv3ba8adOmYf78+fjWt76FsWPHYuHChfja176GlpYWXHPNNcl8L774Ij7zmc/g+OOPx+9//3u89dZbuOqqq/Dee+/h/vvv75ZtueCCC3DxxRdXjN9nn326vKzHHnsMTz75JA499FAIISoaPLFHH30Up5xyCk4//XTMnDkTAHDXXXfhtNNOw+9+9zucfPLJAIC2tjYcc8wxSKVSuO+++yCEwDXXXIOjjz4aL774Iurr67u8jTGtNY499lisWLECV199NUaPHo3W1lb87W9/wy9+8Qu8//77GDBgQJeW+b3vfQ977LEHZs+ejaFDh+K5557Dddddh4ULF2LJkiWQMvwO+lvf+hYuueSSsr9dsWIFzj33XJxyyill4y+88EIsWLAA3/3udzF8+HD86Ec/wvHHH4+//OUvGD169Gbv//jx4wEAixcvxuc///lk/OLFi1FXV4fnnnsOLS0taGhoKJt20EEHoXfv3gDCL6bGjh2L6dOnY+TIkZu9LURE3c4S0U5v3rx5FoB94403as6zcOFCC8AuXLhw221YJwGw1157bZf+JggC6/t+t23DW2+9ZQHYu+66q9uWuaX++te/WgD2b3/7W9n40aNH2/Hjx5eNu/76663ruvaDDz7YonXGx+G4446zAOxvf/vbsumHH364nTBhQpeX+/bbb1spZcV5vvTSS206nbZr165Nxk2aNMl+4hOfsIVCIRl33333WQD2r3/9a5fX3R4AO3PmzC1eTkxrnfx+3nnn2WHDhlWd79xzz7VDhw61QRAk44IgsLvttps955xzknE/+MEPrJSy7P385ptvWqWU/f73v79F2/rYY49ZAPahhx7a5L501qpVqyrGxefrscce6/BvZ82aVXGNP//88xaAvffee5Nxvu/bkSNH2n/913/t8vaVyufzNpPJ2ClTppSN/+xnP2unTp1qM5mM/eMf/5iMb2lpsY7j2K985Stl83/605+2X/rSl7ZoW4iIuhu7ehJRTdZa3HLLLdhnn33geR4GDx6Myy67DBs3bkzm+exnP4tjjz227G+am5uRSqXQ1taWjD/vvPOqdpMqpbXGNddcg8GDB6Ourg5HHXUUXn755Yr5qnX1FEJg5syZmDNnDvbaay94noeXXnoJALBo0SJMnDgRvXr1Qn19PY4//nj87W9/q1jugw8+iMMPPxwNDQ1obGzEmDFj8Nvf/hYrVqzAXnvtBQCYMmVK0v1s/vz5AKp39Xzttddw2mmnoampCZlMBocddhgeffTRqvvxxhtv4OSTT0ZDQwOGDRuGWbNmwRjT4bECwqdBBx54IPbff/9k3DvvvIPnn3++7GkFAJx//vnwfR9/+MMfNrnczjjzzDNx8MEH45prroG1douXt2zZMhhjcOKJJ5aNP+GEE5DL5ZLt9n0fjz76KM466yy4rpvMd9ZZZ8HzvKrdIre3+InWphQKBdTX10MplYxTSqGhoaHsevjtb3+Lww47DJ/4xCeScXvttVfNbqFdsW7dOgDAoEGDqk7v7L6Uam5urhj36U9/GgAquii399Of/hSHHHJI2TX+29/+Fq7r4uyzz07GOY6Dc845B3/84x+Rz+e7vI0xz/Nw2GGHlXUbNcbgz3/+MyZOnIgxY8aUTVuyZAmCIEieFMbOOecc/PznP++27sdERN2BDT+iXYjWGkEQJMOmYr5mzpyJK6+8Ep/5zGfwu9/9Dl//+tcxf/58nHzyyckH0WOOOQZLlixJPmy9+OKLWLt2LYQQeOqpp5JlLVy4EEcffXSH67vuuuswe/ZsnHfeeXjooYdw3HHHVXTx6sj8+fOxYMECfO9738OCBQswZMgQLFiwABMnTkRDQwN+9rOf4b//+7/x8ccf48gjj8Q777yT/O0Pf/hDnH766RgwYADuu+8+PPDAAzjttNOwYsUKDB48GL/5zW8AADNmzMBf/vIX/OUvf0m63rX3/vvv44gjjsALL7yAuXPn4pe//CWamppw8sknV214nXbaaTjmmGPw0EMPYdKkSbj22mtx3333bXJ/H330URx55JFl4+KG8qhRo8rG77XXXqirq8Mrr7ySjDPGlF0PtYZqjVAhBG688Ua8+OKL3dK9Mm7seJ5XNj6VSgFA0lD/xz/+gVwuV7F/6XQaI0aMKNs/a+1m71+tv92apk6diuXLl+Omm27CmjVrsHr1asyaNQsrVqzAZZddlsz38ssvV+w/AOy///5l+w+gU/tfeh84+OCD4TgOLr74Yjz44INYv379VtnXRYsWAQA++clP1pznz3/+M5YvX44vfvGLZeNffvnl5Houtf/++6NQKGD58uXJuPb3vFpDqfHjx+O1115L4hlfeuklrF+/HkceeSSOPPLIsobf4sWLIYSoeB+OHz8eGzdu7Nau0EREW2y7Pm8kom0i7urZfjj88MOTedp39Vy7dq1NpVL2i1/8Ytmy/uu//ssCsA8//LC11tpnn33WArBPPPGEtdbaW265xR5wwAH22GOPtd/4xjestda++uqrFoD9wx/+UHMb161bZ+vr6+3FF19cNn7OnDkVXT2vvfZa2/72BcAOHjzYtrW1lY0fMWKEPeaYY8rGffTRR7Zfv352+vTpyeuGhgZ72mmn1dy+jrp6Tpgwoax741e/+lWrlCrrihcEgR05cqT91Kc+VbEfpV3WrLV21KhR9jOf+UzNbbHW2pUrV1oA9ic/+UnZ+J///OcWgH311Vcr/ma33XazkydPrlj/pobSY9/+OBxxxBF27733TrrVbm5Xz5dfftkCsLfffnvZ+Ouvv94CsFOnTrXWWvvnP/+55rV0+OGHl53rWtd9+6H9Nd7RvKtXr+7yvpXqqKuntdYuWLDANjU1Jevr1auXXbBgQdk8ruvaq6++uuJvZ86caZVSyev4XG1qaL89d911l62vr7cArBDC7rfffvZrX/uafe+997Zo32PvvvuubW5utscee2yH802dOtW6rltxzD/zmc/YsWPHVsz/pz/9yQKwixcvTsYNGzasU8fgrbfeSv4m7u76wAMPWGutve222+yIESOstdb+8Y9/tKlUyuZyOWuttePHj7f7779/xbYUCgUrpbQ33XRT5w4KEdE2wOQuRLuQBx98sCy5S69evWrO+/TTTyOfz1d0GTznnHPw7//+71i0aBFOOeUUHHTQQejbty8ef/xxTJgwAY8//jiOOeYYDBw4MMmA+Pjjj8N13YpvxUu99NJLaG1txVlnnVWxvm984xud2r8TTjgBmUwmef3GG2/gH//4B775zW+WfatfV1dXlgVwyZIlaGlpwdSpUzu1nk1ZvHhxRVc8pRTOPfdczJo1Cxs3bkRjY2Myrf2Tw1GjRuG5557rcB3vv/8+gMpudDbqdlkt66lt1yVz6tSp+OxnP7vJ/RkyZEjNabNnz8b48eMxf/58XHTRRZtcVi377bcfPvOZz+Daa6/F8OHDk+QucVbPuIthV/bvX//1X/HMM89sct39+/evGDd58mR86Utfqhjf1NS0yeVtrqeffhqf//zncdJJJ+H8889PuhP/27/9G37/+9+XPTHvzP4PGTKkU/sfP1WNXXTRRTjjjDPwyCOP4Mknn8SiRYvwve99D3fffTeeeuqpsm6XXdXS0oJTTz0VjuNg3rx5NefL5/P45S9/ic9+9rMV58da26n9B4Df/e53ner6WXqNjxs3Dp7nYfHixTjzzDOxePHi5N41btw4BEGApUuXYuzYsVi2bBn+/d//vWJ5ruuid+/eyfuUiKgnYMOPaBcyatSossZIR+JYn8GDB5eNdxwH/fr1S6ZLKTFhwgQsXLgQ3/72t7F48WJceOGFGDhwIL71rW9h48aNWLhwIT796U93mG3wgw8+AAAMHDiwbHz71x1pv61xV60LL7wQF154YcX8e+yxBwBg7dq1AFCR8XRzrVu3Dp/61Kcqxg8aNAjWWqxfv76s4de3b9+y+VKpFHK5XIfriKe3/9AeLys+P6U2bNhQtq5BgwZ1KkNjR3FdRx55JE444QTMmjUL559//iaX1ZF58+bhvPPOSzK2NjY24j/+4z9wySWXJOe2o/1bv359WaOkb9++SabFjlTbv8GDB+PQQw/drP3YXJdffjn2339//PznP0/GHX/88TjiiCNw5ZVXJl8G9OnTp+b+9+nTJ3nteV6nMlxWa0T16dMH5513Hs477zwAwMMPP4zTTz8d1157LX71q191ddcAhNfsKaecgjfffBOLFi3q8P328MMPY8OGDRXdPIHwvFYrXRF3Sy29xvfbb79OxaA6TvHjUCaTwaGHHpp8MfTkk09i9uzZAMIvyw466KCki2cul6uI7ytdDmP8iKgnYYwfEVUVf3hauXJl2fggCLB27Vr069cvGXf00Udj6dKleOqpp/Dxxx9jwoQJSUNv0aJFeOKJJzYZ3xd/sP/www/Lxrd/3ZH2H2Djbbz55pvxzDPPVAy/+93vABSf+Gwq0URn9e3bt+K4AeGxFEJUNPQ2R7xv7WOw4oZP+6Q4K1asQFtbW1n5jlmzZsF13U0Os2bN6nBbbrrpJrz77ru44447tmifdtttNzzxxBN477338NJLL2HlypVJw+WII44AAIwYMQKpVKpi/3K5HN58882y/bvvvvs6tX+TJ0/eou3uLi+99FKS9KTUpz/9abz66qvJ6/33379q0qNXXnmlbP9XrFjRqf0fMWLEJrft1FNPxUEHHVQRQ9hZvu/jjDPOwLJly/DII4/ggAMO6HD+++67D/3798dJJ51UMW3//ffHW2+9VZY8Cgj33/O8si+3RowY0aljsGLFirJljR8/Hi+99BKWLl2KDz/8sKy3QhznFzcMazX81q1bV/VpMhHR9sInfkRU1WGHHYZUKoX/+Z//wcSJE5Px999/P4IgwIQJE5JxRx99NAqFAm644QYcfPDBSXe4I488ErfeeivWrFmDY445psP1HXjggaivr8cvf/nLsnn/53/+Z7P3YZ999sGee+6Jl19+ucPuov/yL/+ChoYG/OQnP8Hxxx9fdZ74yVpnvsGfMGECfvCDH2DFihVJsW6tNe6//3586lOf6rCLbWftueeeSKfTePPNN8vG77HHHjjooIPw85//vKzr5c9+9jO4rluWNbM7unoCYUKQM844A7Nnz8aQIUM69ZRtU+sbMmQIrLX4wQ9+gH333TfJmup5Hk444QT88pe/xHXXXZc8qfnVr36FfD5flgxoS7p6bg+DBg2qur3Lli0rq9N4yimn4Gtf+xrefPNNDB8+HEDYyPvzn/+MOXPmJPNtTlfPNWvWoKGhAel0umye1tZWvPPOOzjwwAO7vF/GGJx33nl47LHHsGDBAhx22GEdzv/hhx/if//3fzFt2rSyzK2xU045Bddeey0eeOCB5IlgEAS4//77cdxxx5Xtz+Z09QTC9/CcOXMwe/ZsDBw4EHvvvXcy7YgjjsA999wDrTU+8YlPVH1/rFy5ErlcbrPqPhIRbS1s+BFRVX379sWVV16Jm2++GfX19TjppJPw6quv4pprrsERRxxRFpc2atQoDBgwAI899hiuuuqqZPzRRx+Nr33ta0ilUhg3blyH62tqasIVV1yBm266Cb169cJxxx2HZ555Bvfcc89m74MQAj/60Y9w6qmnolAo4KyzzkL//v3x4YcfYsmSJdhjjz1w5ZVXolevXrj55ptx+eWX44wzzsB5552HXr164fnnn0c6ncbll1+OgQMHol+/fvif//mfpJG61157lT35jF1xxRWYP38+PvOZz+D6669HY2Mjbr/9drz++utYsGDBZu9PKc/zkhij9mbPno3PfvazuPjii3Huuefiueeew4033ojp06eXpemPG1jd4YYbbsCoUaOwatWqsi8FgLDcxYoVKyqeqrT34x//GOl0GnvttRdWrlyJ++67D0899RQee+yxsu6Y1113HcaNG4ezzjoLl156KVasWIGrrroKZ555Jg455JBkvn79+lU9P53x3nvv4emnn64YP2zYsOTp9AUXXID77rtvk10JV69enWSx/Oc//4m2traku+R+++2XPKW7/PLL8bWvfQ2f+9znktjan/70p1iyZAluvfXWZHlTpkzB3Llzceqpp+LGG2+EEALf+ta3sPvuu5cVnfc8r8vdVZ944gl86UtfwgUXXIAjjzwSTU1NePvtt/HDH/4Q69atw5VXXpnMO3/+fPz7v/87Fi5cWFHOpNSll16KBx54ADNnzkR9fX3ZcR06dGhFl8+f//znCIKgajdPABg9ejTOPvtsfOUrX4Hv+9hrr73w4x//GG+99VZZN1kAm3yyWMvhhx8OpRR+97vf4YwzziibduSRR6KlpQULFy6sGt8HAEuXLgVQ+2kgEdF2sZ2SyhDRNrS5BdyNMfY///M/7ciRI63runbQoEF22rRp9qOPPqr4+7POOqsi22Kc8bOzWR6DILAzZ860AwcOtOl02k6YMCHJ9tiZrJ61im4vWbLEnnzyybapqcmmUik7bNgwe/bZZ9slS5aUzffAAw/YMWPG2HQ6bXv16mXHjBljf/e73yXTH3zwQfvJT37SOo5jAdh58+ZZayuzelpr7d///nd76qmn2sbGRptKpezYsWMrMlHG+9G+0PwXv/jFDjM/xm6//XZbX19vW1paKqb9+te/tgceeKD1PM/uvvvu9vrrry8rDL65OspuesEFF1Q934ceemjVLIzt/fCHP7QjR460qVTK9unTx5522mkVxeljixYtsocddphNpVJ2wIABdvr06ba1tXWz9qk9dJD98bvf/W4y35lnnmkHDhy4yeXF761qQ/uC9T/72c/smDFjbFNTk21qarJjxoyx//3f/12xzLffftuefvrptlevXrahocGeeuqpZZkpN9c777xjv/GNb9gxY8bY5uZm6ziO7d+/vz3xxBMriq3PnTvXArCvvPJKh8vsKLNm+/231toDDzzQjho1qsNltrW12SuuuMIOHDjQplIpO2bMmLJ7V3c49NBDLQB76623Vkzbe++9LQA7f/78qn970UUX2UMOOaRbt4eIaEsJa7uh8i4REW1zGzduxNChQ3H77bdXZF/tKVpbW9GnTx/87Gc/q8jYuqPbbbfdMH36dHz961/f3puyXXzuc5/Dhg0b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GTIEgKlTp3LllVcydOhQAGbOnElKSgofffQR/fr1q6hbE0IIIYQQQpTxVM/rrruO6667LubxU045hUWLFpX6uiWRH6vcdttthUpG5Aef5aFajPh17tyZTz/9lO3bt6O1Zu7cuQQCAf76178CsGzZMho1akSrVq0i7+nZsydr164lNzc3ck5+4AiQkJBAx44dY9brCAaDhWqFCCGEEEIIIcqeNpxit6pk3bp1XHzxxYX216pVi71795Zbu9VixG/06NFkZmbSpEkTXC4XPp+POXPm0LhxYwAyMzOLrMXhOA579uyhcePGMc/JzMwsss1HH32UcePGlc8NCSGEEEIIIQ5Twdgjfrp8yy+UtdTUVDZt2kSzZs2i9i9ZsoS0tLRya7dSj/jdcsstKKVibt26dQPg7bff5qOPPmLevHl899133H///Vx99dVs2LABAK1j/JAcgzFjxpCTkxPZyjM6F0IIIYQQ4kSmDbvYrSoZOXIkw4cP56OPPgLgxx9/5IUXXuDuu+/m7rvvLrd2K/WI36RJk3jggQdiHs+vZn/fffcxceJELr30UgDatm3LggULePnll3n66aepV69eoZG73bt3YxgGderUAaBu3bpFntOiRYsi23a73bjd7iKPhRKmKJRWmJYHFUxAB2tg6xpYrgR0gRok2jDRykAbZvh16JhjKIKGg6bw0LXGQHH4BzySZAWbOBtcthvDcaGcouN65ZhoI9xPxwQnlOBFhxO7KK0wbBem7SbRnUeyO5eUQA7xcbkYBHERxMTGQwCvjk5+YxO6D4vDSWvMAklgbGVywGuQG3+AJFW1huWFEEIIIUQFUU5oi3WsCrnjjjtITExkxIgRZGdnc+mll5Kamsr48eO56aabyq3dSh34JScnk5ycfNTzcnJyME0zap9hGDhO6IegQ4cO7Nixg02bNtGyZUsglMWzTZs2kSKPHTp0YOHChdx4442Ra6anpzNy5MgyvCMhhBBCCCFEaWkziDaLnsWnqVpTPQGGDBnCkCFDyM7OJjs7u9CSs/JQqQO/kurbty8PP/ww9evXp1mzZnz00Ud89tln/POf/wRCI4BdunRh6NChTJkyhW3btjF58mSeffbZyDVuu+02+vTpQ/fu3enUqRMTJkygQYMG9O3bt4LuSgghhBBCCAH5Uz1V0cd01Zrqads2K1euZNu2bSilaN68OXXq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S7z66qu8/PLLUdf94IMPCAaDfPvttzz88MOMGjUqErz5/X4uvPBCHMdh4cKFpKen079/f2zbBmDcuHF89NFHvP3223z//ff89a9/5YILLuDgwYOF+n/uuefyzTffALBs2TJ27dpF48aNAZg3bx65ubl8/fXXPPPMM2zbto1+/frRr18/1qxZw5133smQIUP4+uuvo645fvx4nn76ab755ht++eUXrrjiCt58803mzZvHm2++ybRp0/jwww+L/Kx37drFDTfcwLhx49iwYQMffvghZ511FgBz586lfv36PPvss+zatYu5c+cCkJeXx5gxY1i9ejX//ve/WbhwIePGjYu67qpVq0hPT+fTTz/lnXfeiXmtIy1dupS6devSsGHDIo/v2LGDrl270rNnT1566SWUUgDs3buXf/3rX/z3v/9l9uzZvPzyy1x00UU4jsM333zDrbfeytChQ9m9e3fkWg0bNiQ1NZWlS5cW2ZYQQogTiBZCCFFuunbtqseMGVNof15engb0v//9b6211oMGDdLXXnut1lrr9957T7dq1UoHg8FC7wsGgxrQCxcuLLbdxx57THfv3j3yetCgQfq0006LOqdVq1b6+eef11prPXPmTJ2SkqKzs7MLXSs3N1f7fD69du3aqP0tW7bUb7zxRpHtb9q0SQN669atUX1IS0vTtm1H9t177736nHPOiXrvgAED9OWXX6611nrr1q0a0LNnz466N6WU/v333yP7evfure++++4i+7JixQpds2ZNfejQoSKPN2zYUM+aNavIY/nefvtt3bx588jrsWPH6sTExELXLMm1nnnmGd2uXbuofQsXLtSA3rRpk27evLn+5z//GXV81qxZWimlMzIyIvt69+6t//KXv0ReW5alExIS9AcffBD13jPOOEM/+eSTxfZJCCFE9ScjfkIIUQF0eFpi/mhOQb169UIpRYsWLbjllluYP39+sdMYITSKdOGFF9KwYUMSExN5+OGH2b59e9Q5p59+etTr1NRUMjMzAVi3bh0dOnQgPj6+0LW3bNlCbm4unTp1IjExMbJt2bKFn3/+uVT33a5dOwzj8P/1bNiwgU6dOkWd07lzZzZs2BC1r02bNpHv69WrR0pKCnXr1o3aV3Ck68g227ZtS1paGoMHD+add94hEAgU288ff/yRv//97zRp0oQaNWpwww03FPo8W7ZsSWJiYvE3XIS8vDy8Xm+Rx7p168Yll1zCE088UehYSkoK9erVi7yuV68ef/nLXyKvTdOkdu3ahT4Hn89Hbm5uqfsphBCiepHATwghKsD69esBaNasWaFjSUlJrFmzhhdffBGPx8OQIUO47LLLYl7r0KFDXHzxxTRv3pw5c+awcuVK7rvvvsj6wXxutzvqtVIqkuq/uMAyKysLCK3dW7VqVWTbsGEDt99+e4nuN9+RgeXRAtp8BfuulCr2Xo7kcrlYtGgRs2fPpl69etxzzz2ce+65xQZ/l156KUop3nrrLVasWMFzzz1XqNRCUUFySdSuXZv9+/cXeaxPnz589NFH7Nq1q9Cxou65JJ/DH3/8QZ06df5UX4UQQlQfrorugBBCnIief/55GjduzJlnnlnkcY/HQ9++fenbty8DBw6kY8eOZGZmkpKSgmEYkbV3EBo1279/P48//jjJyckAhUanjqZNmza89dZb5OTkFApoTj31VDweD7t27eLss88u3Y0eRevWrVmwYEHUvm+++YbWrVuXaTumadK9e3e6d+/OqFGjqFevHqtWraJDhw643e6oz3PPnj1s2bKF9957j/bt2wOh8gslceS1itKuXTu2bt2K3+8vNPI3bdo0hgwZwgUXXMDixYupXbt26W70CH6/n59//pl27dod03WEEEJUfTLiJ4QQ5Sw7O5uMjAx+/fVXFi1axLXXXsubb77JSy+9hMtV+O9vH374IS+88AJr167l559/Zvbs2dSpU4fatWujlKJx48YsWLCAzMxMsrKyaNKkCW63m2nTpvHzzz/z0ksv8Z///KdUfbzmmmtITExkwIABfPfdd2zcuJHp06ezZ88eatasye23386tt97KnDlz2Lp1K9988w33338/P/zwwzF9NrfeeiurV6/moYceYuPGjUydOpX33nuPO++885iuW1B6ejqPP/44K1eu5JdffuH111/H6/XStGlTAJo2bcqSJUvIyMjgwIEDnHTSSZx00km88sorkc9/+vTpJWrryGsV5cwzz6RGjRosX7680LH8YvctW7akd+/eRSbPKY3ly5cTHx9f5gG7EEKIqkcCPyGEKGfPPvss9evXp1WrVgwZMgS3283y5ctjpvNPTk5m9uzZnH/++bRt25Zly5bx4YcfYpomAE888QRvvfUW9evX5/bbb6du3bq8/PLLTJs2jTZt2vDpp59y3333laqPXq+XTz75BMdx6NKlC+eccw5z586NBKZPPvkkw4cP5x//+AennHIKV155Jdu3bz/mEammTZvyn//8h/fff5/TTz+dZ599lhkzZnDuuece03ULqlmzJl988QUXXnghp556Km+//TZz586NrJd7+OGHSU9Pp3Hjxlx22WWYpslbb73Fp59+yl/+8hemT5/O+PHjS9TWkdcqitvt5tprr+Xdd98t8rjL5eLf//43tWrV4uKLLyYnJ+fP3Tjw7rvvcs011+DxeP70NYQQQlQPSpd0gYUQQgghysS2bdvo1KkTGzdupGbNmuXSxqFDhzj55JP55ptvSEtLK5c2hBBCVB0y4ieEEEIcZ82aNWPy5Mls27at3Nr45ZdfeOaZZyToE0IIAciInxBCCCGEEEJUezLiJ4QQQgghhBDVnAR+QgghhBBCCFHNSeAnhBBCCCGEENWcBH5CCCGEEEIIUc1J4CeEEEIIIYQQ1ZwEfkIIIYQQQghRzUngJ4QQQgghhBDVnAR+QgghhBBCCFHNSeAnhBBCCCGEENXc/wfzxk74qhUdbAAAAABJRU5ErkJggg==", + "image/png": "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xRd1xBHxBRsbG2XfffdVf8SM5cuX6/5CoSCzZs0aM6/XX3+9LFiwQPL5vOy3337y3HPPvcGlIIQQQgghhIzEMowJl8nO448/ru5xn//85+XQQw+Vgw8+uLa8973vnZwjfhBwgajLjjvuqAYWHBN7e3vF8zw1lM4+++zasa+88oq8EaxatUre/e53y5FHHin33nuvNDQ06DzaeqfJo48+Wh0q77//fnnppZfkmGOOkZkzZ8qxxx6r+++++2454YQT5KqrrtKh2AsvvFAOP/xweeqpp8R1EzGR14tlJefHZiRmlFOBFl1XoZZAxVogppKJoCQ7I4mDikQ25i2bKloCsRcIxCTn+WKG1do59UItppNPrlmXnukMvy6EYWrCLlhPj8M2rEdhoKIriXiMpelhaffaxDJtFXixDFtcy9PzPDsvjpWXQh5KRbmaaA3Sya7jV/qScmVL6GuZsnowIj8ph2WLGXsS43smbgORlzhtB8MUKxV4qeUfFfUGyOASQgghhJA3nqk+4nfyySerwAtspbFmT05Kw++iiy6SycbFF1+shui3v/3t2rbttttumIV933336dAq5tXutttucvrpp8vll19eM/ygsHPUUUfpECy47rrrdPrqHXfcoSOFhBBCCCGEkM2DKYYuY++b/HR2dspnP/vZzWb0vS7D75Of/KRMNqAyiiHTI444Qv7yl7+o0YepnJiuCTCsOmfOnGHOlBCn+cpXviKlUkmnduKY888/v7a/WCzKXnvtJQ888MCYhp/v+8OmkiIdQgghhBBCyMZnoimd0RQY8fvoRz8qv/rVrzQE3pQx/LIpnD/84Q9l0aJFGtYBI2O///3vZauttho20vZGsXjxYvnOd74j55xzjhpvN998sxxyyCHyzDPPyDbbbCMrV66U6dOnDzsHeY6iSFavXi1bb731uMdg+1jAaKw3FAkhhBBCCCGbBtMwdBl73+Sv9ZaWFvnyl78sd955p0ZEGCnucsEFF0w+ww8+dPB9e9e73qXG3pe+9CU1kDAy9tBDD8lPf/rTjZa5k046Sa6++upx92NED3mAAYf8IC9g9913V4saxikqGL59G5uzzjpLzjjjjGEjfghkD3+4kb5mCKyuxKEGNK/3rUv86MLEx63ex09EwrAqZs0fzxLLTvz01HdOnf8QrD3xsasHAeThJ1efHoKy1wLGR5GYaSB1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5z//+Q2p8//4j/+QY489VrbaaivZXHz5y1+Wn//858MMP5R3LMMPx+H4yc5VV12lS73hhzKNZfhtCA8++KCcddZZ8tGPflTuu+8++cEPfiBvNF/84hfl7rvv1oUQQrZE7M2dAULI1AMvrb29vXLYYYfJHXfcIXfeeaf84z/+o2zJVCoV8Txvc2djSjFnzhxdNjUwJO+55x654oorZHOycOHCdT529913l6nAW9/61jfkOs8884x+nnTSSbJgwQLZHMyaNUs+8IEPyH/913/JgQceuFnyQAghmxKO+BFC1pv//u//ltbWVp2umM/n5cYbb1yn82AsnnrqqTJ79mw1onbYYQe59NJLJY7j2jG///3vdXrX//3f/+mxHR0dMm3aNPn4xz+uI0b1rFq1Sj72sY9JU1OT5udTn/qUnofzkc54YCRmm2220e/HH3+8Ho8F5QGY2vbud79bbrvtNn1BR16zUY8rr7xS9tlnH2lra5OWlhbZe++95fbbbx91jYGBAR1BgDGA82fOnCkf/vCHZcWKFRNOV5wxY4YceeSRUi6XxzwGxvYee+wxavuyZct0ity3vvWt2raXXnpJ/uVf/kXrD3nA9Ln6EakNaaes/k8++WTZeuut9Th8fuITn1AjeeRUz4nqHNdCuX3fH5Z+f3+/NDY2yplnnjlhfq+55hrZZZdd5G1ve9uo6ZToN9i/7bbbSi6Xk7e//e1qJI7khz/8oey66656DPocyoE6red//ud/tD80NDRIc3Oz7LzzznL11VePOdUT/e+AAw7Q7+9973tr5c36Zf1UT4x2YR/620g+85nPaPvV1w3KU5/X4447bq0jcKhj1EE96Ecjpxtj1G369Om1tq6f6om2wj0Gtttuu1qZ0Lb1XH755drWaLv99ttPnnrqqQnzhvSzusD9srbpnfhDE+5BPHvQDh/84Afl2Wefre2H4VYsFqVarda24d5Dur/97W+H1SPuGfT3DIw4/vrXv5ZXX311wjwTQsiUJCaEkPVgyZIlsWma8UknnaTrH/vYx2LP8+I1a9YMO+7cc8/Fm2NtPQzD+N3vfndcKBTi//qv/4p//etfx//+7/+ux5x55pm14+655x7dNn/+/PjUU0/V4y6//PI4l8vFxxxzzLBrIL3m5ub4yiuvjO+88874+OOPj+fOnavnI53xKJfL8S233FK79p///GddVq5cqfv322+/eNq0aZqH73//+5rWY489pvs+//nPx9dee23829/+Vq95yimnaDp33HFHLf1KpRLvs88+cT6fjy+44IL4N7/5TXzzzTfHn/70p+NnnnlGj7n++uv1vOeff17XUc6Ghob4xBNPjIMgGDfvP/7xj/W8p556ath21KllWfHy5ct1/ZVXXtEyvO1tb4t/8IMfaF4/9alPxYZhxLfeeusGtxPae9ttt43b2trib37zm1of//M//xMfffTRcW9v76i0J6pzlAXbb7rppmFl+u53v6v5ffHFF+OJQDuhHUYyb968eM6cOfGOO+4Y/+///m/885//PN577721v/7973+vHXf11Vfr9ZH322+/Pb7mmmu07rbbbru4r69Pj/nDH/6geTnttNPiu+66S+vlsssuiy+++OJaOp/85Cf1mqCnpyf+9re/remi/2blxfYsbzg+Y4cddog/8pGPDMs/+hHqF/dBxhlnnBHbth1/7nOf0zxcd9118ezZs+M999xzwn7zs5/9TPPy8ssv19oP9zH6KMqfgfo56qijauu4F7AAtNXZZ5+t6aA/Z2VC2wJsR7ne9773aR/DMWibhQsXxr7vj5s3tD/6BM5HH0Gar776ai1N9KOMX/3qV5rvgw8+WK/xox/9SNPv6OiIX3vtNT3mb3/7m55377336noURXF7e7uWtb4Pf/SjH9V6q2fVqlV6Lu57QgjZ0qDhRwhZL/Ciixej+++/X9dhUGD9O9/5zrDjRhoUt912m67D4KnnuOOOi13X1ReuesNvpJGHF3u8sOMlDuCldyxj4QMf+MBaDT/w0ksv6XF4yR8JXnTxkv/II49MmAaMJLzQvve9742POOKI2na8NCLtegNrJPWG3w9/+MPYcZz4y1/+crw2BgcH46ampviLX/zisO277rprfOihh9bWjz32WH0ZXr169bDj8MKMYze0nZBXvIA//PDD4+Z1ZNprq/MDDzxw2Lbdd989PuSQQyasDxi6SPN73/veqH0wQlCvmbEDYJS2trbGH//4x3UdxtL06dPj/ffff9i5MPSQLow7cMkll+h5E1Fv+NX3ZRiKY+Wt3vC76KKL9I8b3d3dtW0wVHH+Aw88UKs/1Pn5558/LK0//vGPehyOH4/Ozk7t0zfccEMt7ZaWFu0nMIAAjFwYlfX3cr3hN9YfLOrBdvwxoFqt1rbB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sY95P/nJT7Su//Ef/+HFYjHv4Ycfjrb75je/qfsLGeh1Wb16tfeRj3zEa2lp8X7wgx9oe/z3f/+3d8IJJ3gdHR199t1fm+NcMP++++6rOKdbb71V6/uPf/zD6w9cJ1yH3kycOFHvuylTpnj/8z//4z344IPevvvu6yUSCe/vf/97tN5tt92mx0fdcf/ccccd2nY777yzt379el3n6aef1rrMmjVL72G0yw033OBdd9110X6+9KUv6THBunXrvB/96Ee63xtvvDE6X8wP64b1Q3bddVfvC1/4QkX9cR+hfc8555xo3kUXXeRZluX913/9l9Zhzpw53vjx471p06b1e9/88pe/1Lq8++670fUzDEPvUZx/CNrn+OOPj6bxLKAAXKtLL71U94P7OTwnXFuA+Tivz3zmM3qPYR1cm8mTJ3vFYrFm3XD9cU9ge9wj2Of7778f7RP3UQh+O1DvQw89VI/x05/+VPff1tbmLV68WNf561//qtvh9wK4ruu1trbquZbfw1/84he13Wrx9ttve0ceeaTeC+G5Pv/887psyZIlesyddtpJn6///d//9Q477DCtW/lvQW9wXqeeeqrW749//GO0X7Bw4cKoDfH7iv3cfffdWvcZM2ZU7GdT74Nq995AfivQFriPUT/c16jziy++2O89DnAPYPmGnmFCCOkNAz9ChgAILPAP+de+9rUBrR8GOOedd17F/P/7v//T+VheDl6K4vG4t3LlSp3Gy8j5559fc/944d977703+jzClyy85PcGL7p46XnhhRf63QeCJLzQfvrTn/aOPvroaD6CRey7PMDqTXngh+DVtm3vG9/4xgbr3d3d7TU0NPRp/7322ss74ogjoumZM2fqi+mqVasq1sMLM9atFfgN9LqgrnjJDV+Eq9F73xtq84MPPrhiHq4rXqYHcj/efvvtVV9w0a5hsAMQlDY3N3snnXSSTuMlGX9YOPDAAyu2RaCH/SK4A9/97nd1u/4oD/wA/mCAfSBQ3NDL99VXX+0lk0lv7dq10TwEqth+/vz5UfuhzfFHjnIQQGA9rF+L9vZ2vacRSIT7bmpq0vsEARBAkItg4pZbbqka+FX7g0U5mI8/BhQKhT4v/n/605/6bTvcE1gP59h7n+WB3z777KPHKA8k33nnHa13+DuB5xLX6vLLL9dpPMc4d/wGIbANGTt2rAZQ/YFr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5X20xbIs1QoUQj033Grb1T4nQgghhBBCehpxWEjkWm/GNE0MHToU8+e/2ul2so1sS/qwqmdzc7Oq3Td//nxVgkGUNkeMGIGRI0eitrZWbSN1+SQ89JZbblHqn0cddRRuvvnmYimGF198Efvssw/uuOMObLfddqqcw3vvvYfPP/+8WM5hZftYGZIPuGDBAiUSs2zZMioK9TLEMJdwXF6b3gevTe+F16b3wmvTe+G16d3w+oTI138x+sQJIxFuvR3R1nBdt9NtxOgrdcqQPmj4vfzyy9h11107LMh+7LHHFouvn3zyyXjhhRdQVVWFM844Q4VilnLffffhiiuuUNuKouddd92FjTbaqLi+K/voqtwspWR7H7w2vRdem94Lr03vhdem98Jr07vh9SHrM73e8OtL8GHSe+G16b3w2vReeG16L7w2vRdem94Nrw9Zn+n9vl1CCCGEEEIIIasFDb9uRGKLL730UiaW9kJ4bXovvDa9F16b3guvTe+F16Z3w+tD1mcY6kkIIYQQQggh6zj0+BFCCCGEEELIOg4NP0IIIYQQQghZx6HhRwghhBBCCCHrODT8CCGEEEIIIWQdh4YfIYQQQgghhKzj0PAjhBBCCCGEkHUcGn6EEEIIIYQQso5Dw48QQgghhBBC1nFo+BFCCCGEEELIOg4NP0IIIYQQQghZx6HhRwghhBBCCCHrODT8CCGEEEIIIWQdh4YfIYQQQgghhKzj0PAjhBBCCCGEkHUcGn6EEEIIIYQQso5Dw48QQgghhBBC1nFo+BFCCCGEEELIOg4NP0LWAx544AFomtZh+89//qO2efnll9W8THsb0q/LLrusOC+vZdmapL6+Xh33gw8+aLdul112UW1t8P777yMej2PevHmtlv/jH//AlltuiWg0ilGjRuE3v/kNPM9b7ePNnDmzeO+89NJL7dZ/73vf+9ZjIf278sorMWbMGEQiEYwfPx4333xzh9u+/vrr+O53v4tYLIbBgwfj7LPPRjqdRndQ7rMiTcZ1VZG+Hnvssdhss81gmiZGjx5ddtt//etfagxra2vRr18/7LDDDnjyySfbbTdnzhwcfPDBqK6uRlVVFQ466CDMnj0b3UFjYyMuvfRSbLrppkgkEqofEyZMwMknn4zFixev8v4effRR/PjHP1b3oVyvjTbaCBdeeCGamppabSdjVG7cN95441bbZjIZnHvuuRgyZIja5/bbb49XX311tc/9mmuuUcdrO5Zvv/22Wj5p0qR275F+GIaBhoYGNf/DH/4Qp59++mr3hRBCuhuz2/dICOm1PPLIIxg+fHirZfLlrq9xwgknYJ999lnjht/ll1+uxm+rrbZqte7222/H2kK+dB533HEYNmxYcdlzzz2nvmgff/zxuPHGG/G///0PF110kfqifd1113XbsS+++GL897//7bb9nXbaaepHil/96leYPHkypkyZgl/+8pdobm7GJZdcUtzu448/xp577om9995bGUozZsxQ4yDG78MPP9wtfREjRAydtojRsqq8+OKLeO2117DNNtso46GtwVPg3//+Nw444ABlxMnYCnfffTd+9KMf4Z///Cf2339/tSyVSmG33XZTxvGf/vQntU8Zn1133VWNjRhr3xYxvvfYYw9l4J9//vmYOHEikskkPv30Uzz00EOYP38+Bg4cuEr7/O1vf4uRI0fi6quvVp8fuR/lRxS5vm+++SZ0PfwNWq77Kaec0uq90o8jjjhCjUspcm8//fTTuOGGGzB27Fj84Q9/UPeD3I/S52/LTjvtpKZiRB555JHF5TIvP7BI3+V+rKioaLVuiy22UEa4IOcm9++ZZ56JDTfc8Fv3hRBCup2AELLOc//99wfycZ82bVrZbaZMmaK2kWlvQ/p16aWXrtJ7XNcNHMfptj7MmDFD9ePuu+8Oegvvv/++6tOnn37aavnEiRODnXbaqdWyyy+/PLAsK1iwYEG3jMNee+2lpk899VSr9TvssEOw8847r/J+Z82aFei63u46n3766UE0Gg2WLVtWXHbggQcGG2ywQZDL5YrL/vSnP6n+yJisLrKfiy++OOguPM8rvv7JT34SjBo1qsPtjjjiiGD48OHq3i0gr4cNGxYcfvjhxWU333yzGqvSz/M333wTGIYR/O53v1utvr744ovq/P/xj3+s9Fy6yuLFi9stK1wvOV5nXHHFFe3u8Q8//FAtu++++4rL5LO+4YYbBj/4wQ+C1SGbzQaxWCw48cQTWy3//ve/H5x00klq3XPPPVdc3tzcHJimGfziF79otf22224bnHrqqavVF0II6W4Y6kkI6eyHIdx0003Ky2Hbtgqr+tnPfqZCwQp8//vfVx6C0vcMGDBAeSPEM1HgJz/5SYdhUm29DeK5kOPIr+sSMvjZZ5+1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", "text/plain": [ "
" ] @@ -245,18 +378,18 @@ "for idx, ((key, var), ax) in enumerate(zip(PLOT_DICT.items(), axs, strict=False)):\n", " # adcp data\n", " mesh = ax.pcolormesh(\n", - " distance_1d / 1000,\n", - " adcp_ds[\"z\"],\n", - " var[\"data\"],\n", + " distance / 1000, # distance in km\n", + " depth,\n", + " var[\"data\"].T.values, # transpose to match (distance, z) dims\n", " cmap=var[\"cmap\"],\n", " norm=var[\"norm\"] if var[\"norm\"] is not None else None,\n", " )\n", "\n", " # seabed\n", " ax.pcolormesh(\n", - " distance_1d / 1000, # distance in km\n", - " adcp_ds[\"z\"],\n", - " landmask,\n", + " distance / 1000, # distance in km\n", + " depth,\n", + " landmask.T,\n", " cmap=mcolors.ListedColormap([mcolors.to_rgba(\"tan\"), mcolors.to_rgba(\"white\")]),\n", " )\n", "\n", @@ -281,7 +414,7 @@ " # axis labels\n", " ax.set_ylabel(\"Depth (m)\")\n", " if idx == len(axs) - 1: # bottom panel only for single column of subplots\n", - " ax.set_xlabel(\"Distance from start (km)\")\n", + " ax.set_xlabel(\"Distance (km)\")\n", "\n", "# legend for sea bed\n", "tan_patch = mpatches.Patch(color=mcolors.to_rgba(\"tan\"), label=\"Land / sea bed\")\n", @@ -299,8 +432,8 @@ "The resultant figure shows various components of the velocity field, derived from ADCP data.\n", "\n", "1) Absolute velocity\n", - "2) Along-track velocity (where positive values indicate flow in the overall direction of the ship's track across the the transect)\n", - "3) Cross-track velocity (where postive values indicate flow to the left of the ship's direction).\n", + "2) Along-track velocity (where positive values indicate flow in the ship's travel direction between waypoints, i.e. the angle changes as the ship turns).\n", + "3) Cross-track velocity (where positive values indicate flow to the left of the ship's direction).\n", "4) The direction of the flow, expressed as degrees from North.\n", "\n", "You can use these plots as a starting point to consider how flow dynamics vary over the cross-section. You may find some diagnostics more useful than others, depending on your specific aims!" @@ -309,7 +442,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -323,7 +456,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.14.6" } }, "nbformat": 4, diff --git a/docs/user-guide/tutorials/Argo_data_tutorial.ipynb b/docs/user-guide/tutorials/Argo_data_tutorial.ipynb index d1e4470d..de30d535 100644 --- a/docs/user-guide/tutorials/Argo_data_tutorial.ipynb +++ b/docs/user-guide/tutorials/Argo_data_tutorial.ipynb @@ -30,21 +30,17 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 76, "metadata": {}, "outputs": [], "source": [ - "import xarray as xr\n", + "import parcels\n", + "import polars as pl\n", "import matplotlib.pyplot as plt\n", - "import cmocean.cm as cmo\n", "import numpy as np\n", "import cartopy.crs as ccrs\n", "import cartopy.feature as cfeature\n", - "import matplotlib.colors as mcolors\n", - "from matplotlib.collections import LineCollection\n", - "from mpl_toolkits.mplot3d import Axes3D\n", "import plotly.graph_objects as go\n", - "\n", "import plotly.io as pio\n", "from IPython.display import HTML" ] @@ -79,18 +75,18 @@ "source": [ "#### Load data\n", "\n", - "We are now ready to read in the data using the `xarray` package. You can carry on executing the next cells without making changes to the code…" + "We are now ready to read in the data using `Parcels`, specifically the `parcels.read_particlefile()` function. You can carry on executing the next cells without making changes to the code…" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "# load argo data\n", "\n", - "argo_ds = xr.open_dataset(f\"{data_dir}/argo_float.zarr\")" + "argo_df = parcels.read_particlefile(f\"{data_dir}/argo_float.parquet\")" ] }, { @@ -108,12 +104,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 79, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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9EEaN26MxYsX82wQERER5YJ7jxIRERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQZYG7sAREREZJ7S0tIw5uMP8Nexw7C2scND9erj/Q8/gZubm7GLZpLY0kZERERGCWwvvzAUzikhmPxWX3z+SlfU9kjE4492x9o1q3lGcsDQRkRERCUuKSkJBw/sg4+HMwKv38a9qFjUq1kBrRtUwv9O/cUzkgN2jxIREVGJs7e3x+y5C3Di+FFcvBKCO3cuIfzuXbRu2x5vjnqHZyQHDG1ERERkFO3at1cXyh92jxIRERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQYwtBERERFpAEMbERERkQaUisV14+PjDfa8hnpuKh48R6aP58j08RyZPp4j01ZSWUHToc3a2hq+vr5wd3c3dlGIiIjIjPn6+qpcYkgWOp1OBw1LTk5GSkqKsYtBREREZsza2ho2NjYGfQ3NhzYiIiIic8CJCEREREQawNBGREREpAEMbUREREQawNBGREREpAEMbUREREQaYBahbeXKlejUqRPKlCkDCwuLbEuEyG1ZLydPnky/Pzg4GF26dIGfnx/Gjh2bfvvVq1dzfKy9vX2Jvj+tmzhxIho1agRnZ2eUL18ew4YNQ2hoaKZjLly4gA4dOsDBwQGVK1fGTz/9lOl+niPjnyN+joxr0qRJqFWrFhwdHdXalX379lWfGz1+hkz/HPEzZFr69eunzsm2bdtM5nNkFqEtLi4OHTt2xAcffJDrMcuWLcOtW7fSL3Xr1k2/Tyq+devWWL9+PTZv3oz9+/dneuzBgwczPTYoKMig76e02bdvH95++20cO3YMa9aswdmzZ/HEE09kWouvV69e8PDwwNGjRzFmzBgMHz4c27dvTz+G58i450iPnyPjCQgIwMyZM3HmzBns2LEDVlZW6nMj+Bky/XOkx8+QaViwYEG2XQ5M4XOk6R0R8uuZZ55RP3ft2pXrMWXLloWPj0+O90VERKB79+6oV6+eWvFYrmckJzC3x9KD/fnnn5muT58+Ha1atUJkZKRqHd24cSOuX7+OEydOwMXFRQXq3bt3Y8aMGaoFlefI+OdIj58j4xk4cGCm6xMmTED9+vVx+/ZtHD58mJ8hEz9H3t7e6jZ+howvKCgI48aNw4EDB1ChQoX0203hu8gsWtryY+jQofDy8kLbtm2xYcOGTPeNHj0aI0eOVM2YiYmJ6Natm9HKaQ7CwsJUXTs5OanrR44cQdOmTdWHRE8+IPJFpMdzZNxzpMfPkWmQFoKFCxeiZs2a8PT05GdIA+dIj58h40pLS8OQIUMwfvx4+Pv7Z7rPFL6LzKKl7UG++OILVfGyBcWqVavQp08fbNmyBZ07d1b3N2vWTPVT37t3TwW7rBo0aKD6pvWkBUIeTwUn/8jlr0/50Oj3cLtz5062epf/5DKOqeI5Mu45EvwcGZ90yQwePFgNCalRo4ZqGbC0tORnSAPnSPAzZHzTpk1TY3dl3G5WpvBdxNAG4KOPPkqvkMaNG+PatWuq+0cf2oTsJ5bTCRDr1q1DxYoV06/LAEUquNTU1PSu7ClTpqTfnt+d1niOjHeOBD9HxicDpGUSVUhICKZOnYonn3wSe/fu5WdIA+dI/v/iZ8i4zp07p86JjN3NiSl8FzG05UCC29y5c/NdiXICqlWrVqCKp+xN0tItcP78eTVGQP7S0ZOxHnJ7RvKXTcYuBZ4j456jnPBzVPKku1r+L5KL/MUv46OkJYefIdM/RzKTNCt+hkrW4cOHVZjOGKqEdHFK62iVKlWM/l3EMW05OHXqlJrKSyVD/np58cUXcejQIWzduhXlypXLdL/8xyZ/+cTExKTfJjOvmjdvzlNkIucoJ/wcmcZ5ky5sfoZM/xzlhJ+hkl/i4++//1YtofqLmDNnDiZPnmwSnyOzaGkLDw9XXZ6XLl1K/yDIVGtJuzKjVJKyVLp8cGRNt0WLFqlxBwUZlJ211UGaRvXjFChvI0aMUE3G+gkg8peOkL9e5DzJTBxZ8+b5559XM3rkr6ElS5aov055jkzjHMnnhZ8j43r//ffVl47MWJPZiLImmMxUk+UHpAuGnyHTPkf8DBmfm5ubumQljTgyKUG+143+OdKZgQULFkhHdLbLzp07dRs3btTVr19f5+TkpHNxcdE1a9ZMt2rVqnw975UrV3J8XrncunXL4O+rtMitDqV+9c6fP69r3769zs7OTlexYkXd/Pnz8/XcPEclc474OTK+wYMH6/z8/HS2trbqp1y/cOFC+v38DBlfXueInyHTBEC3detWk/kcWfxbKCIiIiIyYey/IyIiItIAhjYiIiIiDWBoIyIiItIAhjYiIiIiDWBoIyIiItIAhjYiIiIiDWBoIyIiItIAhjYiIiIiDWBoIyIiItIAhjYiIiIiDWBoIyIiIoLp+z+VoBDlG2+erAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -128,11 +124,12 @@ "ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", "\n", "# plot trajectory\n", - "for i, traj in enumerate(argo_ds[\"trajectory\"]):\n", - " # extract trajectory data\n", - " lons = argo_ds[\"lon\"][:].sel(trajectory=traj).squeeze()\n", - " lats = argo_ds[\"lat\"][:].sel(trajectory=traj).squeeze()\n", - " cycle_phase = argo_ds[\"cycle_phase\"][:].sel(trajectory=traj).squeeze()\n", + "for i, argo_id in enumerate(np.unique(argo_df[\"particle_id\"])):\n", + " # extract argo data\n", + " argo_dat = argo_df.filter(pl.col(\"particle_id\") == argo_id)\n", + " lons = argo_dat[\"x\"]\n", + " lats = argo_dat[\"y\"]\n", + " cycle_phase = argo_dat[\"cycle_phase\"]\n", "\n", " # plot\n", " ax.plot(\n", @@ -157,14 +154,14 @@ " label=\"Waypoint\" if i == 0 else None, # only label first for legend\n", " )\n", "\n", - " # add marker where cycle_phase == 0 and temperature is not nan\n", - " temp = argo_ds[\"temperature\"][:].sel(trajectory=traj).squeeze()\n", - " mask = ~np.isnan(temp)\n", + " # add marker where cycle_phase == 3 and temperature is not nan (i.e. vertical profiling sites)\n", + " temp = argo_dat[\"temperature\"].to_numpy()\n", + " mask = ~np.isnan(temp) & (cycle_phase.to_numpy() == 3)\n", " if np.any(mask):\n", " ax.scatter(\n", " np.array(lons)[mask],\n", " np.array(lats)[mask],\n", - " s=10,\n", + " s=20,\n", " color=\"crimson\",\n", " zorder=5,\n", " transform=ccrs.PlateCarree(),\n", @@ -176,10 +173,10 @@ "latlon_buffer = 10.0 # degrees (adjust this to 'zoom' in/out in the plot)\n", "ax.set_extent(\n", " [\n", - " argo_ds.lon.min() - latlon_buffer,\n", - " argo_ds.lon.max() + latlon_buffer,\n", - " argo_ds.lat.min() - latlon_buffer,\n", - " argo_ds.lat.max() + latlon_buffer,\n", + " argo_df[\"x\"].min() - latlon_buffer,\n", + " argo_df[\"x\"].max() + latlon_buffer,\n", + " argo_df[\"y\"].min() - latlon_buffer,\n", + " argo_df[\"y\"].max() + latlon_buffer,\n", " ],\n", " crs=ccrs.PlateCarree(),\n", ")\n", @@ -198,11 +195,17 @@ "\n", "ax.legend(loc=\"upper right\", fontsize=12)\n", "\n", - "n_days = float(\n", - " (argo_ds[\"time\"][0].max(skipna=True) - argo_ds[\"time\"][0].min(skipna=True))\n", + "argo_lifetimes = [\n", + " (\n", + " argo_df.filter(pl.col(\"particle_id\") == argo_id)[\"t\"].max()\n", + " - argo_df.filter(pl.col(\"particle_id\") == argo_id)[\"t\"].min()\n", + " )\n", " / np.timedelta64(1, \"D\")\n", - ")\n", - "plt.title(f\"[{n_days:.1f} day(s) Argo Float lifetime]\", fontsize=12)\n", + " for argo_id in np.unique(argo_df[\"particle_id\"])\n", + "]\n", + "u, counts = np.unique(argo_lifetimes, return_counts=True)\n", + "n_days = u[np.argmax(counts)] # use the most common drifter lifetime for the title\n", + "plt.title(f\"[{round(n_days, 1)} day Argo Float lifetime]\", fontsize=12)\n", "\n", "plt.tight_layout()" ] @@ -221,12 +224,12 @@ "**TIP**: This 3D plot is interactive! You can click and drag to rotate the view, scroll to zoom in/out, and hover over points to see more information.\n", "
\n", "\n", - "**Important**: This plot supports plotting only one Argo float/waypoint at a time. If you have deployed multiple Argo floats at different waypoints, you will need to make your selection via the `WHICH_ARGO` variable below. (Hint: you can see how many waypoints with Argo floats there are by running the cell immediately after this one first.)" + "**Important**: This plot supports plotting only one Argo float deployment/waypoint at a time. If you have deployed multiple Argo floats at different waypoints, you will need to make your selection via the `WHICH_ARGO` variable below. (Hint: you can see how many waypoints with Argo floats there are by running the cell immediately after this one first.)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 80, "metadata": {}, "outputs": [ { @@ -239,13 +242,13 @@ ], "source": [ "print(\n", - " f\"There is/are {len(argo_ds['trajectory'])} Argo float(s) waypoints in this dataset.\"\n", + " f\"There is/are {len(argo_df['particle_id'].unique())} Argo float(s) waypoints in this dataset.\"\n", ")" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 81, "metadata": {}, "outputs": [], "source": [ @@ -254,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -263,8 +266,8 @@ "\n", "\n", "\n", - "
\n", - "
\n", + "
\n", + "
\n", "\n", "" ], @@ -279,10 +282,10 @@ "source": [ "fig = go.Figure()\n", "\n", - "traj = argo_ds[\"trajectory\"][WHICH_ARGO]\n", - "lons = argo_ds[\"lon\"][:].sel(trajectory=traj).squeeze()\n", - "lats = argo_ds[\"lat\"][:].sel(trajectory=traj).squeeze()\n", - "depth = argo_ds[\"z\"][:].sel(trajectory=traj).squeeze()\n", + "argo_da = argo_df.filter(pl.col(\"particle_id\") == WHICH_ARGO)\n", + "lons = argo_da[\"x\"]\n", + "lats = argo_da[\"y\"]\n", + "depth = argo_da[\"z\"]\n", "\n", "fig.add_trace(\n", " go.Scatter3d(\n", @@ -301,10 +304,7 @@ " )\n", ")\n", "\n", - "n_days = float(\n", - " (argo_ds[\"time\"][0].max(skipna=True) - argo_ds[\"time\"][0].min(skipna=True))\n", - " / np.timedelta64(1, \"D\")\n", - ")\n", + "n_days = float((argo_da[\"t\"].max() - argo_da[\"t\"].min()) / np.timedelta64(1, \"D\"))\n", "\n", "fig.update_layout(\n", " scene=dict(\n", @@ -330,7 +330,7 @@ "\n", "Let's now have a look at the vertical profiles of temperature and salinity collected by the Argo floats during the expedition. We can produce plots for each variable, showing how they vary with depth. \n", "\n", - "Choose below which variable you would like to plot by setting the `PLOT_VARIABLE` variable to either `\"temperature\"` or `\"salinity\"`.\n", + "Choose below which variable you would like to plot by setting the `PLOT_VARIABLE` variable to either `\"temperature\"` or `\"salinity\"` (depending on which [sensors](../documentation/full_sensor_list.md) you configured for your VirtualShip expedition).\n", "\n", "The vertical profiles are recorded by the Argo float at each of the ascent/descent locations we've seen in the previous 3D plot. This time the drift periods are not shown.\n", "\n", @@ -341,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 83, "metadata": {}, "outputs": [], "source": [ @@ -350,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 84, "metadata": {}, "outputs": [ { @@ -359,8 +359,8 @@ "\n", "\n", "\n", - "
\n", - "
\n", + "
\n", + "
\n", "\n", "" ], @@ -388,11 +388,11 @@ " },\n", "}\n", "\n", - "traj = argo_ds[\"trajectory\"][WHICH_ARGO]\n", - "lons = argo_ds[\"lon\"][:].sel(trajectory=traj).squeeze()\n", - "lats = argo_ds[\"lat\"][:].sel(trajectory=traj).squeeze()\n", - "depth = argo_ds[\"z\"][:].sel(trajectory=traj).squeeze()\n", - "var = argo_ds[VARIABLES[PLOT_VARIABLE][\"ds_name\"]][:].sel(trajectory=traj).squeeze()\n", + "argo_da = argo_df.filter(pl.col(\"particle_id\") == WHICH_ARGO)\n", + "lons = argo_da[\"x\"]\n", + "lats = argo_da[\"y\"]\n", + "depth = argo_da[\"z\"]\n", + "var = argo_da[PLOT_VARIABLE].to_numpy()\n", "\n", "# mask out NaNs (temp/salinity not recorded when drifting)\n", "mask = ~np.isnan(var)\n", @@ -447,7 +447,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -461,7 +461,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.14.6" } }, "nbformat": 4, diff --git a/docs/user-guide/tutorials/CTD_transects.ipynb b/docs/user-guide/tutorials/CTD_transects.ipynb index bcefcb82..b51e17ee 100644 --- a/docs/user-guide/tutorials/CTD_transects.ipynb +++ b/docs/user-guide/tutorials/CTD_transects.ipynb @@ -9,12 +9,12 @@ "\n", "This notebook demonstrates a simple plotting exercise for CTD data across a transect, using the output of a VirtualShip expedition. There are example plots embedded at the end, but these will ultimately be replaced by your own versions as you work through the notebook.\n", "\n", - "We can plot physical (temperature, salinity) or biogeochemical data (oxygen, chlorophyll, primary production, phytoplankton, nutrients, pH) as measured by the VirtualShip `CTD` instrument.\n", + "We can plot physical (temperature, salinity) or biogeochemical data (oxygen, chlorophyll, primary production, phytoplankton, nutrients, pH) as measured by the VirtualShip `CTD` instrument (dependent on which [sensors](../documentation/full_sensor_list.md) you have configured).\n", "\n", - "The plot(s) we will produce are simple plots which follow the trajectory of the expedition as a function of distance from the first waypoint, and are intended to be a starting point for your analysis. \n", + "The plots we will produce are simple plots which follow the trajectory of the expedition as a function of distance travelled by the ship, and are intended to be a starting point for your analysis. \n", "\n", "
\n", - "Note: This notebook assumes that each waypoint in the expedition is further from the start than the last waypoint. The code will still work if not, but the resultant plots might not be very intuitive.\n", + "**Note**: This notebook assumes that each waypoint in the expedition is further from the start than the last waypoint (i.e. waypoints arranged as a transect). The code will still work if not, but the resultant plots might not be very intuitive.\n", "
" ] }, @@ -30,13 +30,13 @@ "The first step is to import the Python packages required for post-processing the data and plotting. \n", "\n", "
\n", - "Tip: You may need to set the Kernel to the relevant (Conda) environment in the top right of this notebook to access the required packages! \n", + "**Tip**: You may need to set the Kernel to the relevant (Conda) environment in the top right of this notebook to access the required packages! \n", "
" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "c7f9f2ee", "metadata": {}, "outputs": [], @@ -45,8 +45,9 @@ "import matplotlib.colors as mcolors\n", "import matplotlib.patches as mpatches\n", "import numpy as np\n", - "import xarray as xr\n", - "from matplotlib import pyplot as plt" + "from matplotlib import pyplot as plt\n", + "import polars as pl\n", + "import parcels" ] }, { @@ -60,7 +61,7 @@ "Next, you should set `data_dir` to be the path to your expedition results in the code block below. You should replace `\"/path/to/EXPEDITION/results/\"` with the path for your machine.\n", "\n", "
\n", - "Tip: You can get the path to your expedition results by navigating to the `results` folder in Terminal (using `cd`) and then using the `pwd` command. This will print your working directory which you can copy to the `data_dir` variable in this notebook. Don't forget to keep it as a string (in \"quotation\" marks)!\n", + "**Tip**: You can get the path to your expedition results by navigating to the `results` folder in Terminal (using `cd`) and then using the `pwd` command. This will print your working directory which you can copy to the `data_dir` variable in this notebook. Don't forget to keep it as a string (in \"quotation\" marks)!\n", "
\n", "\n" ] @@ -84,7 +85,6 @@ "\n", "You should now consider which variable from your CTD casts you would like to plot. Which ones are available to you will depend on which sensors you deployed the `CTD` instrument with (via the `virtualship plan` tool and/or your `expedition.yaml` file). Below is the full list of valid variable choices...\n", "\n", - "`CTD`:\n", "- \"temperature\"\n", "- \"salinity\"\n", "- \"oxygen\"\n", @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 44, "id": "8de8b4ae", "metadata": {}, "outputs": [], @@ -117,13 +117,13 @@ "We also define the `VARIABLES` dictionary here, which we use to store some parameters for the plots related to each variable choice (e.g. labels, what units each is in, and which colour map we should use for the plots).\n", "\n", "
\n", - "Tip: You don't need to change anything here, but should you wish to change the colour scheme (`cmap`) for any CTD variable you can do so. At the moment it's set to use relevant cmaps from the cmocean Python package, which has developed specialist colour schemes for oceanographic data applications.\n", + "**Tip**: You don't need to change anything here, but should you wish to change the colour scheme (`cmap`) for any CTD variable you can do so. At the moment it's set to use relevant cmaps from the [cmocean](https://matplotlib.org/cmocean/) Python package, which has developed specialist colour schemes for oceanographic data applications.\n", "
" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "id": "b32d2730", "metadata": {}, "outputs": [], @@ -195,9 +195,8 @@ "outputs": [], "source": [ "# load CTD data\n", - "filename = \"ctd.zarr\"\n", - "ctd_ds = xr.open_dataset(f\"{data_dir}/{filename}\")\n", - "if ctd_ds[\"trajectory\"].size <= 1:\n", + "ctd_df = parcels.read_particlefile(f\"{data_dir}/ctd.parquet\")\n", + "if np.unique(ctd_df[\"particle_id\"]).size <= 1:\n", " raise ValueError(\"Number of waypoints must be > 1\")" ] }, @@ -208,12 +207,12 @@ "source": [ "## Data post-processing\n", "\n", - "Before we can continue, we need to do some post-processing to get it ready for plotting. Below are various helper functions which perform tasks such as calculating the distance of each waypoint from the start, capturing only the downcasts of the CTD casts, as well as some other utility methods. " + "Before we can continue, we need to do some post-processing to get it ready for plotting as a 2D distance × depth plot. Below are various helper functions which perform tasks such as calculating the ship's cumulative travel distance, as well as some other utility methods. " ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 51, "id": "785b2b35", "metadata": {}, "outputs": [], @@ -230,74 +229,76 @@ " return 6371000 * c\n", "\n", "\n", - "def distance_from_start(ds):\n", - " \"\"\"Add 'distance' variable: meters from first waypoint.\"\"\"\n", - " lon0, lat0 = (\n", - " ds.isel(trajectory=0)[\"lon\"].values[0],\n", - " ds.isel(trajectory=0)[\"lat\"].values[0],\n", - " )\n", - " d = np.zeros_like(ds[\"lon\"].values, dtype=float)\n", - " for ob, (lon, lat) in enumerate(zip(ds[\"lon\"], ds[\"lat\"], strict=False)):\n", - " d[ob] = haversine(lon, lat, lon0, lat0)\n", - " ds[\"distance\"] = xr.DataArray(\n", - " d,\n", - " dims=ds[\"lon\"].dims,\n", - " attrs={\"long_name\": \"distance from first waypoint\", \"units\": \"m\"},\n", - " )\n", - " return ds\n", - "\n", - "\n", - "def descent_only(ds, variable):\n", - " \"\"\"Extract descending CTD data (downcast), pad with NaNs for alignment.\"\"\"\n", - " min_z_idx = ds[\"z\"].argmin(\"obs\")\n", - " da_clean = []\n", - " for i, traj in enumerate(ds[\"trajectory\"].values):\n", - " idx = min_z_idx.sel(trajectory=traj).item()\n", - " descent_vals = ds[variable][\n", - " i, : idx + 1\n", - " ] # take values from surface to min_z_idx (inclusive)\n", - " da_clean.append(descent_vals)\n", - " max_len = max(len(arr[~np.isnan(arr)]) for arr in da_clean)\n", - " da_padded = np.full((ds[\"trajectory\"].size, max_len), np.nan)\n", - " for i, arr in enumerate(da_clean):\n", - " da_dropna = arr[~np.isnan(arr)]\n", - " da_padded[i, : len(da_dropna)] = da_dropna\n", - " return xr.DataArray(\n", - " da_padded,\n", - " dims=[\"trajectory\", \"obs\"],\n", - " coords={\"trajectory\": ds[\"trajectory\"], \"obs\": np.arange(max_len)},\n", + "def distance_along_expedition(df):\n", + " \"\"\"Array of cumulative meters travelled across CTD waypoints.\"\"\"\n", + " d = np.zeros_like(df[\"x\"], dtype=float)\n", + " for ob in range(1, len(df[\"x\"])):\n", + " d[ob] = d[ob - 1] + haversine(\n", + " df[\"x\"][ob - 1], df[\"y\"][ob - 1], df[\"x\"][ob], df[\"y\"][ob]\n", + " )\n", + " return d\n", + "\n", + "\n", + "def ctd_build_2d_arrays(df, varname):\n", + " \"\"\"Build 2D (n_casts x uniform-depth) arrays from df. Ordered by their cumulative expedition distance.\"\"\"\n", + "\n", + " # by cumulative distance\n", + " cast_order = (\n", + " df.group_by(\"particle_id\").agg(pl.col(\"distance\").first()).sort(\"distance\")\n", " )\n", "\n", + " profiles_z = []\n", + " profiles_var = []\n", + " cast_distances = []\n", + "\n", + " for row in cast_order.iter_rows(named=True):\n", + " pid = row[\"particle_id\"]\n", + " cast = df.filter(pl.col(\"particle_id\") == pid).sort(\n", + " \"z\", descending=True\n", + " ) # sort by depth (descending)\n", + " profiles_z.append(cast[\"z\"].to_numpy())\n", + " profiles_var.append(cast[varname].to_numpy())\n", + " cast_distances.append(row[\"distance\"])\n", + "\n", + " # pad to uniform depth dimension with NaN\n", + " max_len = max(len(p) for p in profiles_z)\n", + " n_casts = len(profiles_z)\n", + "\n", + " z_2d = np.full((n_casts, max_len), np.nan)\n", + " var_2d = np.full((n_casts, max_len), np.nan)\n", "\n", - "def build_masked_array(data_up, profile_indices, n_profiles):\n", - " arr = np.full((n_profiles, data_up.shape[1]), np.nan)\n", + " for i, (pz, pv) in enumerate(zip(profiles_z, profiles_var)):\n", + " z_2d[i, : len(pz)] = pz\n", + " var_2d[i, : len(pv)] = pv\n", + "\n", + " return z_2d, np.array(cast_distances), var_2d\n", + "\n", + "\n", + "def build_masked_array(var_2d, profile_indices, n_profiles):\n", + " arr = np.full((n_profiles, var_2d.shape[1]), np.nan)\n", " for i, idx in enumerate(profile_indices):\n", " if idx is not None:\n", - " arr[i, :] = data_up.values[idx, :]\n", + " arr[i, :] = var_2d[idx, :]\n", " return arr\n", "\n", "\n", - "def get_profile_indices(distance_1d):\n", - " \"\"\"\n", - " Returns regular distance bins and profile indices for CTD transect plotting.\n", - "\n", - " Bin size is set to one order of magnitude lower than max distance.\n", - " \"\"\"\n", - " dist_min, dist_max = float(distance_1d.min()), float(distance_1d.max())\n", + "def get_profile_indices(distances):\n", + " \"\"\"Regular distance bins and profile indices for CTD transect plotting. Bin size is set to one order of magnitude lower than max distance.\"\"\"\n", + " dist_min, dist_max = float(np.min(distances)), float(np.max(distances))\n", " if dist_max > 1e6:\n", - " dist_step = 1e5\n", + " dist_step = 1.0e5\n", " elif dist_max > 1e5:\n", - " dist_step = 1e4\n", + " dist_step = 1.0e4\n", " elif dist_max > 1e4:\n", - " dist_step = 1e3\n", + " dist_step = 1.0e3\n", " else:\n", - " dist_step = 1e2 # fallback for very short transects\n", + " dist_step = 1.0e2 # fallback for very short transects\n", "\n", " distance_regular = np.arange(dist_min, dist_max + dist_step, dist_step)\n", " threshold = dist_step / 2\n", " profile_indices = [\n", - " np.argmin(np.abs(distance_1d.values - d))\n", - " if np.min(np.abs(distance_1d.values - d)) < threshold\n", + " np.argmin(np.abs(distances - d))\n", + " if np.min(np.abs(distances - d)) < threshold\n", " else None\n", " for d in distance_regular\n", " ]\n", @@ -315,25 +316,24 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 52, "id": "f59824a1", "metadata": {}, "outputs": [], "source": [ - "# add distance from start\n", - "ctd_distance = distance_from_start(ctd_ds)\n", + "# add distance along expedition\n", + "ctd_distance = distance_along_expedition(ctd_df)\n", + "ctd_df = ctd_df.with_columns(pl.Series(\"distance\", ctd_distance))\n", "\n", - "# exract descent-only data\n", - "z_up = descent_only(ctd_distance, \"z\")\n", - "d_up = descent_only(ctd_distance, \"distance\")\n", - "var_up = descent_only(ctd_distance, VARIABLES[plot_variable][\"ds_name\"])\n", + "# downcast only data\n", + "ctd_down = ctd_df.filter(pl.col(\"raising\") == 0)\n", "\n", - "# 1d array of depth dimension (from deepest trajectory)\n", - "traj_idx, obs_idx = np.where(z_up == np.nanmin(z_up))\n", - "z1d = z_up.values[traj_idx[0], :]\n", + "# build 2D arrays: (n_casts x uniform-depth)\n", + "z_2d, distances, var_2d = ctd_build_2d_arrays(ctd_down, plot_variable)\n", "\n", - "# distance as 1d array\n", - "distance_1d = d_up.isel(obs=0)" + "# 1D depth array from the deepest cast\n", + "deepest_idx = np.argmax(np.sum(~np.isnan(z_2d), axis=1))\n", + "z1d = z_2d[deepest_idx, :]" ] }, { @@ -344,10 +344,10 @@ "## Plotting\n", "\n", "
\n", - "Note: The plots produced next are a starting point for your analysis. You are encouraged to make adjustments, for example axis limits and scaling if the defaults not best suited to your specific data. Use your preferred AI coding assistant for help!\n", + "**Note**: The plots produced next are a starting point for your analysis. You are encouraged to make adjustments, for example axis limits and scaling if the defaults not best suited to your specific data.\n", "
\n", "\n", - "We are now ready to plot our transect data. We will use distance from the first waypoint/CTD cast for the x-axis, and water column depth for the y-axis. The data for the chosen variable will then be plotted according to the colour map. The CTD casts are likely to be different depths because some parts of the ocean are of course shallower than others.\n", + "We are now ready to plot our transect data. We will use distance travelled by the ship for the x-axis, and water column depth for the y-axis. The data for the chosen variable will then be plotted according to the colour map. The CTD casts are likely to be different depths because some parts of the ocean are of course shallower than others.\n", "\n", "There are a few extra steps below which arrange the CTD casts into regular distance bins, so as to clearly demonstrate where along the transect we made CTD casts and indeed where there are gaps.\n" ] @@ -360,7 +360,7 @@ "outputs": [ { "data": { - "image/png": "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ALxUWlqqHj161DjXvXt3HT582OtYlm6Te/DBB/Wb3/xGW7Zs0X333acbb7xR9913n7Zs2aI+ffrooYce8vqNAQAAANjDyc8Z+sMf/qB7771X1dXVkqTq6mrdf//9uvHGG72OZakztHLlSr322msKDQ2tcT40NFQzZszQVVddpUceecTrNwcAAADge35Qs9hmxYoV+uKLL/Tkk0+qffv2+vHHH1VaWqpu3bppxYoVntdt3ry53liWiqEffvhBXbt2rXWsa9eu2rNnj8WpAwAAAMCpu/XWW30Wy1Ix5Ha7GzQOAAAAoPG4jf9soLB06VLNmjVL33zzjaKiojRr1qxTuqXtuOuvv95nc7NUDJWXl+vJJ5+UOcmDXCoqgvu5OQAAAABO9N5772nSpElavHixLrzwQhUXF2v//v0NjpuTk6PNmzertLS0xvmbb77ZqziWiqFevXrpzTffrHPciapNuc9julVlS9xAUm28frxVvdzGZUtcAACAQOQva4ZmzpypWbNmqX///pKkmJgYxcTENCjmjBkzNG/ePKWlpalVq1ae8y6Xy55iaM2aNV4FBQAAABDcDh8+rE8//VSjR49W165ddejQIfXr10+PP/64EhISTjnu008/rc2bNyslJaXBc+RP6QAAAIDDGGPfIR3rwhw/srOza51DYWGhjDF66aWX9P777+vbb79V8+bNNW7cuAZdW2xsrE4//fQGxTjOUmcIAAAAAI472V4CPxUeHi7p2Dqe5ORkSdLs2bPVpUsXHT58WK1btz6l937kkUd000036a677lJ8fHyNscjISK9iUQwBAAAADuNW0+8mFx0drY4dO8rlOnEuVoqpuuL+4x//0N/+9rca8Vwul+dBrFZRDAEAAACwxe9//3s98cQTuuSSSxQbG6t7771XF198sadrdCpuuOEGTZgwQWPHjq2xgcKpoBgCAAAAHKYBjRef+tOf/qSCggKlpaVJki666CK99NJLDYp58OBB3XvvvbV2nLzFBgoAAACAw7htPLwRGhqqRx99VPn5+crPz9frr7/eoJ3kJGnMmDF66623GhTjODpDAAAAAALGnj17NGbMGHXv3v2EwqquZ6PWhmIIAAAAcBhjmn4DBbucf/75Ov/8830Syy+Loc2bNyszM1O5ublyu91KSUnRgw8+qL59+3pes379ek2aNEnffPONfvnLX+rp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YgEAGgfFEICg1L9/f4WFhSkiIkJRUVE699xzdfvtt+vAgQOe11x44YXKy8urN9aaNWsUHR1t42wb5uGHH1ZqaqpKSkr06KOPNvV0anjxxReVnp7e4Djjx4/XrbfeWu/rpk+frrvvvrvB71ebMWPGaOPGjdqyZYst8QEAvkcxBCBoPfTQQyopKdGhQ4f02muvac+ePTr//PO1f//+pp6aT+Xm5qpbt24nHa+qqmrE2fie1fl/8cUX2rFjh4YMGWLLPEJCQvTb3/5WTz31lC3xAQC+RzEEIOi5XC6lpKRo8eLFioqK0vz58yWd2PF5+eWX1aVLF0VERCgxMVH33XefDh48qMsuu0xFRUUKDw9XeHi41q5dq927d2vQoEFq27atYmJiNHToUO3cudMTa/z48crMzNQ111yjiIgInXXWWVqzZo1nvKKiQrNmzdIZZ5yhiIgIdevWTZs3b5YkVVZWesbatGmjyy+/XD/++GOt19azZ0+tXr1a06dPV3h4uD744ANlZ2dr2LBhuummmxQbG6vp06ersrJSd955pzp27Ki2bdtq9OjRNbpkLpdLCxcuVEpKilq3bq1x48apoKBAo0ePVmRkpM477zx99dVXJ83x/Pnz1bFjR0VERKhTp0567rnntGXLFt144436/PPPPbnbvXu3tmzZoj59+ig2NlZt27bVmDFjdPDgQU+s/v37649//KMGDx6s1q1ba+HChXr55Zf11FNPKTw8XOecc06tc1i6dKn69u2r0NDQWsf379+v7t27649//KPnv9HEiRN11VVXeeJ+8cUXeuaZZ5SUlKS2bdueUPhcfPHFWrZs2UnzAADwMwYAglC/fv3Mn//85xPO33333aZnz57GGGNWr15toqKijDHGlJaWmmbNmpl//vOfxhhjCgsLzaZNm0543XG5ublmxYoV5ujRo6aoqMhcddVVZuDAgZ7x66+/3oSHh5sPP/zQVFVVmfvuu88kJyd7xm+77TZz/vnnm6+//tq43W7z1VdfmZ07dxpjjJk2bZoZMGCA+fHHH015ebm5/fbbzYUXXmj5Wu+55x4TGhpqXnjhBVNZWWkOHz5sZs+ebc4991yza9cuU1JSYkaPHm0GDRrk+RpJZsCAASY/P9/k5eWZX/ziF+acc84xH330kamsrDTXXXedGT58eK3vv2PHDtOyZUuzfft2Y4wx+/btM5999pkxxpgXXnjBpKWl1Xh9Tk6OWbt2ramoqDD79u0zF154oZk4cWKN62nbtq3ZuHGjcbvd5siRI+b66683t9xyy0lzYIwxo0aNMjNnzqxxLjk52SxZssR888035swzzzTz58/3jF1//fUmIiKixjV27tzZTJ061ZSXl5uVK1eaFi1amH379nm+Jj8/30gyP/74Y51zAQD4h2ZNXYwBgD9JTExUQUFBrWPNmzfX9u3blZ6erujoaP3qV786aZxOnTqpU6dOkqTTTjtNd999t37961/L7XYrJORYU37o0KEaMGCAJGnChAmaOXOmDh48qNjYWD377LN699131aVLF0nSWWedJUkyxuipp57S+vXr1a5dO0nSnDlz1Lp1a/3www/q0KGDpes899xzNX78eElSs2bN9NJLL2nOnDnq2LGjpGOdnMTERP34449q3769JGnatGlq06aNJKlfv34KCQnRhRdeKEkaPXq0fv/739f6XqGhoTLGaNu2bUpOTlZ8fLzi4+NPOre0tDTPx/Hx8Zo6daqmTZtW4zVjx45Vz549JUktW7a0dM2FhYWKjIw84fynn36qrKwsPfzwwxo7dmyNsSFDhtS4xsWLF+u+++5TixYtNGjQIEVFRenzzz/3XM/x+IWFhZ7/PgAA/8VtcgDwE3v27FFsbOwJ51u3bq1ly5bp7bffVocOHdSnTx+tXr36pHEOHDigsWPHqkOHDoqMjFTfvn1VUVGhkpISz2sSEhJqxJekkpISHThwQEeOHPEUQj+Vn5+vw4cPq2/fvoqOjlZ0dLQSEhLUokUL/fDDD5av83jRc1xeXp6neJOk9u3bKywsrMYGEj+db6tWrU74vLS0tNb3OuOMM/TXv/5VCxYsUHx8vAYPHqycnJyTzu3bb7/VFVdcofbt2ysyMlLXXnut8vPz65y/FTExMSouLj7h/F/+8hedccYZuvrqq08Y+/k1RkREqFWrVjXO/fS6j8ePiYnxen4AgMZHMQQA/6eqqkpvv/22+vfvX+v4xRdfrBUrVig/P1+jRo1SRkZGjU7PT9155506cuSINm/erOLiYn300UeSjnV26tO2bVu1atVK33777Qljbdq0UatWrbRx40YdOnTIcxw9elS/+c1vLF/rz+eclJRUY03Tvn37VF5e7rOtxa+++mqtXr1a+/fvV1pamsaNG1frPCTpxhtvVGJior788ksVFxdr8eLFJ+Tt519XW5yfS09Pr3Vd02OPPaaWLVtq1KhRqqys9OayTvDll18qPj6erhAABAiKIQCQ9NVXX+n6669XUVGRpk6desL4/v37tWTJEpWUlKhZs2aKjIz0LMSPj4/3dHSOKy4uVqtWrRQdHa2DBw9q9uzZluficrmUmZmp22+/Xd9++62MMdqxY4d27dqlkJAQ3Xjjjbr99ts9naCDBw/qf//3fxt0/ddee63mzp2rH374QaWlpZo6daoGDhzouUWuIXbs2KF//OMfOnr0qFq0aKHw8HA1a3bsLu34+Hjt3btXR48e9by+uLhYERERioyM1A8//KBHHnmk3veIj4/X999/X+drhg8frrVr16q6urrG+dNOO01vv/22ysvLdeWVV6qiouIUrvKYVatWaejQoaf89QCAxkUxBCBoTZ8+3fOcoZEjRyohIUGffPJJretZ3G63Hn/8cXXo0EFRUVFauHCh/t//+38KCQnRWWedpRtuuEFnn322oqOjtW7dOs2ePVvffvutYmJi1Lt3b1122WVeze2hhx7SxRdfrIEDByoyMlKjRo3yrGV64IEHdMEFF2jAgAGKiIjQ+eefr5UrVzYoF3feeacuueQSXXDBBerUqZMqKyu1ePHiBsU8rqKiQjNnzlR8fLzatGmjVatW6cUXX5QkDRgwQL169VJiYqKio6O1e/duzZ8/X++8844iIyN1xRVX6Morr6z3PSZOnKg9e/YoJiZGqamptb6mW7du6tKli959990TxsLCwvTWW2/JGKOMjAyVl5d7fZ1ut1svv/yyJk+e7PXXAgCahstYuWcDAAAH2LBhg2677Tb961//8nnsV155RcuXL9fLL7/s89gAAHtQDAEAAAAIStwmBwAAACAoUQwBAAAACEoUQwAAAACCEsUQAAAAgKBEMQQAAAAgKFEMAQAAAAhKFEMAAAAAghLFEAAAAICgRDEEAAAAIChRDAEAAAAISv8fLr8RdyuAUmcAAAAASUVORK5CYII=", + "image/png": "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69atOy4mUZmj6OjokMetMxhavny53HPPPbo0dZ8+faRv374VUdg333wjI0eO1I9VpHbppZee6NcHAAAAALVSAY8qqx2u0tp1BkOPPPKIPPnkkxWV3KqzcuVKXfGNYAgAAABoeG7bM2RKncHQ0qVLbV0A6f333w/XOQEAAACAcRRQqEVZ0ExEHQj6jI3tZKVBc9XeAqqanMHxAQAAIonb9gyZEtKnw++++04GDRqkr/2jruVTuQEAAACAazNDw4cPl27dusnzzz8vsbGx5s4KAAAAwAlz+56hFStWyOuvvy579+6VhQsXyueffy5FRUW64JuxYOhf//qXfPbZZxIVxXIjAAAAIFK5eZncCy+8oMts33LLLTJv3jx9rHHjxjJlyhRd2C0UIUU1V155pfzzn/8M7WwBAAAAIExmzJihi7xNmzatIknTpUsX2bx5c8hjhZQZevbZZ6V3797StWtXSUlJqdL3+OOPh/ziAAAAAMLPzcvk9u3bp4MfxefzVdyW3zeWGZowYYL89NNPEggE9BVfKzcAAAAAMC09PV3eeuutKscWLFgg5557rtnM0Ntvv60ryrVu3Vq8wFT5a7WGk9Lax6O0NgAAQLg+b7p3JmfOnCn9+vXTBRQOHz4sI0aMkOXLl8uSJUvMBkOqpHaTJk1CfhEAAAAACAeVAdq0aZO88sorOknTrl07HSC1adPGbDA0btw4ue666+QPf/iDtGrVqkpfWlpayC8OAAAAIPzcumcoEAhIamqqbN++Xe65556THi+kYCgrK0vfLlu2rMpxtVlJnRgAAAAAmBIdHS1xcXFSWloqp5566kmPF1IBhWAwWG0jEAIAAAAih9qjbqo1tAceeEBGjRolX3/9tRw4cEAOHjxY0YxmhgAAAACgIf3ud7/Tt/Pnz68op21Z1gmtVqszMzR8+HD55ptvan2O6lfPAwAAABAZe4ZMtYam9guVt++//1638vthzwxdc801MnDgQGnRooVceuml0qlTJ2nevLlOQ3377be6jJ268NH06dPFbUqCIa0itM1v+YyN7WQlAXP/cfmDPqPjAwAAoH60b98+bGPVGQxdf/31MmzYMHnvvff0xYyeffZZfZHVxMREycjIkClTpshVV10lUVF8uAcAAAAiQVDcv0yuOnPnzpWw7xlS6+/69++vGwAAAIDIZkVAoQNT4uPjqzzes2eP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", "text/plain": [ "
" ] @@ -371,8 +371,8 @@ ], "source": [ "# regularised transect\n", - "profile_indices, distance_regular = get_profile_indices(distance_1d)\n", - "var_masked = build_masked_array(var_up, profile_indices, len(distance_regular))\n", + "profile_indices, distance_regular = get_profile_indices(distances)\n", + "var_masked = build_masked_array(var_2d, profile_indices, len(distance_regular))\n", "\n", "xticks_reg = np.linspace(\n", " float(distance_regular.min()),\n", @@ -409,7 +409,7 @@ "We can also also plot a 'filled' version without the distance bins, to give an alternative view of the evolution across the transect which is not dominated by gaps and white space. This time we will also add a 'sea bed' to the plot.\n", "\n", "
\n", - "Note: It is important to remember that the gaps do actually exist in reality and this is a caveat which must be considered when interpreting the transect derived from CTD casts. Indeed, if you look at the x-axis of the plot below you will see that the deployments are not necessarily regularly spaced and some gaps are larger than others.\n", + "**Note**: It is important to remember that the gaps do actually exist in reality and this is a caveat which must be considered when interpreting the transect derived from CTD casts. Indeed, if you look at the x-axis of the plot below you will see that the deployments are not necessarily regularly spaced and some gaps are larger than others.\n", "
" ] }, @@ -421,7 +421,7 @@ "outputs": [ { "data": { - "image/png": "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caM+/vhjbdq0SUFBQbrrrruUk5NTFGnjd7t27VL79u11yy23aOPGjUpMTNT999/v2D5w4EB9/PHHmjdvnnbv3q158+YpJibGsZ3PjXld6TP2448/qnLlylq0aJG2b9+ufv366f7779eaNWscz7/azwYKR3p6utq3b68RI0bk2laQ36VXe5969Ojh9Bk9fvy4qlatqm7dunnsnArTlV4fPz8/Pfjgg/rqq6/0888/a8KECRozZozeeecdxz5X+37wh8WLFzu9RvXr1/foeaEEMFAiNGnSxBg1apTj8f79+w1Jxo8//ui9pEqAxMREQ5Jx5syZXNvatGljjB49+qoxbrvtNqNnz56eSM8ykpOTjSpVqhiHDx82JBlfffVVrn3yer3T09MNX19fY82aNY51586dM2w2m/HFF194PG/8T7du3Yy+ffvmuW3btm2Gn5+fsW/fvgLH43NjDu58xu644w5j2LBhjsdX+tlA4Vu9erUhycjKyspze37/d7n6Pn333XeGJGPPnj1u5+oNV3t9/tCtWzdj0KBB+W7P6/tBfv9/AdeCzl4JcPHiRW3dulXt27d3rIuNjVX16tWVlJTkxcys7+TJkypVqpTTfSFdcfjwYa1atUp9+/Yt3MQsxG63q0+fPho/frwqV67s0nOzsrKUk5OjoKAgx7rAwED5+voqMTGxsFNFPnJycvTFF1+oRo0aatu2rSpUqKDbb79d27ZtkyQtX75cNWvW1OLFi1WlShXVrVtX48ePz7f7yufGPNz5jJ08eVLly5eXdPWfDZiDO+/TggULdNNNN6l27dpFmGnR2LZtm77//nvdcsst+e6T3/eDvn37KioqSrfeequWL1/u6VRRAlDslQBpaWmy2+2KiopyWh8ZGakTJ054KSvru3jxoiZMmKA+ffq4fTPVt99+WxUrVlR8fHwhZ2cdM2bMUEhIiPr16+fyc8uWLau4uDiNHz9eaWlpyszM1MiRI5Wdnc2Y1iKUmpqq9PR0TZs2TQ888IBWrFihKlWqKD4+XmfPnlVycrIOHjyolStX6sMPP9TUqVP1n//8R88991ye8fjcmIern7GPPvpIu3bt0oMPPijp6j8bMAdX36eMjAx98MEHlvuDzE033aRSpUqpcePGGjJkiOPn+K/y+34wadIkffTRR1qxYoXatGmjv/3tb44x6IC7KPZKAMMwvJ1C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Udu2bbVt27Y8z3fNmjWqUaOGJCk2NlY2m03Jycnq27evHnzwQY0YMUIRERHq3r27JGnFihVq0KCBAgMDVatWLb311luOWMnJybLZbFqyZImaN2+uoKAg3XbbbUpLS9MHH3ygmjVrqly5cho2bJgMw8j3PVi4cKHq1aunUqVKKTo6Wo888oiky53Xo0ePql+/frLZbGrbtq0kadmyZWrZsqXKlCmjihUravDgwbpw4YIj3rhx43TLLbdoxowZqlSpkpo3b55vrL9KSUnRt99+q06dOuWbb0pKiurXr6+BAwfKMAwtWLBAlStX1vvvv68aNWooJCREQ4YMcbwv4eHhqly5st555x2nOJ07d1ZiYqKOHj2a77EAACULxR4AeNiQIUN09OhRbd68Ode2jRs3auzYsXr11Ve1d+9eLV682FHk/fDDD5Kkjz76SMePH9esWbMkXR4DNn36dP3000969dVXNW/ePL322mtOcZctW6asrCz98MMPGjdunJ5++mlHwXbx4kXdcccdstvtWr16tZKSktStWzfl5ORIksaPH6/PP/9cCxcu1I8//qibb75Zt99+u86dO5cr/5tuuknr16+XJG3YsEHHjx9XlSpVJElLly5VRkaGvv/+e7344otKTk5W165d1bVrV23btk1PPvmk+vfvr++//94p5oQJE/TCCy9o/fr1OnTokO6991698847Wrp0qd555x3NmTNHn332WZ6v9fHjx9WvXz+NHz9eu3fv1meffaZmzZpJkpYsWaKYmBjNnDlTx48f15IlSyRJmZmZGj16tLZu3ar3339fq1ev1vjx453ibtmyRUlJSVq5cqUWL16cb6y/SkxMVFRUlCpVqpTn9iNHjqhNmzaKj4/Xq6++KpvNJklKS0vTe++9p08//VSLFi3Sa6+9pjvvvFN2u13r16/Xo48+qgEDBig1NdURq1KlSoqOjlZiYmKexwIAlEAGAKBQtGnTxhg9enSu9ZmZmYYk4/333zcMwzD69OljPPjgg4ZhGMaHH35o1KlTx8jKysr1vKysLEOSsXr16ised8qUKUa7du0cj/v06WNcf/31TvvUqVPHePnllw3DMIz58+cbkZGRxoULF3LFysjIMIKCgozt27c7ra9du7bx9ttv53n8vXv3GpKMgwcPOuUQGxtr5OTkONYNHz7cuPHGG52e26NHD6N79+6GYRjGwYMHDUnGokWLnM7NZrMZv/76q2Ndhw4djKeeeirPXDZt2mSULVvW+O233/LcXqlSJSMhISHPbX9YuHChUaNGDcfjsWPHGiEhIbliFiTWiy++aDRq1Mhp3erVqw1Jxt69e40aNWoY//rXv5y2JyQkGDabzUhJSXGs69Chg3HDDTc4HmdnZxulS5c2li1b5vTcJk2aGNOmTbtiTgCAkoPOHgB4mPH7JYd/dG3+7LbbbpPNZlPNmjU1aNAgLV++/IqXKEqXu0V33HGHKlWqpJCQEI0bN06HDx922qd+/fpOj6Ojo3XixAlJ0k8//aS4uDgFBwfnir1//35lZGSoZcuWCgkJcSz79+/XgQMHXDrvRo0aycfnf//N7N69Wy1btnTap1WrVtq9e7fTugYNGjj+XaFCBUVGRioqKspp3Z87Wn89ZsOGDRUbG6u+fftq8eLFunTp0hXz3Llzp+655x5VrVpVZcqUUb9+/XK9nrVr11ZISMiVTzgPmZmZCgwMzHNb27Ztddddd+n555/PtS0yMlIVKlRwPK5QoYJuuOEGx2NfX1+Fh4fneh2CgoKUkZHhcp4AAGui2AMAD/v5558lSdWrV8+1LTQ0VNu2bdMrr7yigIAA9e/fX3fffXe+sX777Td17txZNWrU0EcffaTNmzdrxIgRjvGAf/D393d6bLPZHNPyX6mYPH/+vKTLY/G2bNniWHbv3q3HH3+8QOf7h78Wk1crYv/w59xtNtsVz+Wv/Pz8tGbNGi1atEgVKlTQv//9b910001XLPi6dOkim82md999V5s2bdJLL72U67YIeRXGBREeHq4zZ87kua1jx476/PPPdfz48Vzb8jrngrwOp06dUkREhFu5AgCsx8/bCQCA1b388suqUqWKmjZtmuf2gIAAderUSZ06dVKvXr3UokULnThxQpGRkfLx8XGMpZMud8fOnDmj5557TmFhYZKUqwt1NQ0aNNC7776r9PT0XEXMddddp4CAAB0/flzNmzd37USvol69elq1apXTuvXr16tevXqFehxfX1+1a9dO7dq109NPP60KFSpoy5YtiouLk7+/v9PrefLkSe3fv18ffvihGjduLOnyrRIK4q+x8tKoUSMdPHhQFy9ezNXhmzNnjvr376/bb79da9euVXh4uGsn+hcXL17UgQMH1KhRo2uKAwCwDjp7AFCILly4oJSUFP3yyy9as2aNHnzwQb3zzjt69dVX5eeX++9rn332mf7zn/9o+/btOnDggBYtWqSIiAiFh4fLZrOpSpUqWrVqlU6cOKHz58+ratWq8vf315w5c3TgwAG9+uqr+uSTT1zKsWfPngoJCVGPHj303//+V3v27NHcuXN18uRJlS1bVo8//rgeffRRffTRRzp48KDWr1+vUaNGaceOHdf02jz66KPaunWr/u///k979uzR7Nmz9eGHH+rJJ5+8prh/lpSUpOeee06bN2/WoUOH9NZbbykwMFDVqlWTJFWrVk3r1q1TSkqKzp49q3LlyqlcuXJ6/fXXHa//3LlzC3Ssv8bKS9OmTVWmTBlt3Lgx17Y/bkBfu3ZtdejQIc8JcFyxceNGBQcHF3qRDgAovij2AKAQzZw5UzExMapTp4769+8vf39/bdy4Md+p98PCwrRo0SLdeuutatiwoTZs2KDPPvtMvr6+kqTnn39e7777rmJiYvT4448rKipKr732mubMmaMGDRpo5cqVGjFihEs5BgYG6ssvv5Tdblfr1q114403asmSJY5idNq0aRo8eLD++c9/qm7durrvvvt0+PDha+48VatWTZ988ok+/vhj1a9fXzNnztQbb7yhm2666Zri/lnZsmX1zTff6I477tB1112nhQsXasmSJY7xb+PGjVNSUpKqVKmiu+++W76+vnr33Xe1cuVK3XDDDZo7d64mTJhQoGP9NVZe/P399eCDD+qDDz7Ic7ufn5/ef/99lS9fXp07d1Z6erp7Jy7pgw8+UM+ePRUQEOB2DACAtdiMgg6iAAAALktOTlbLli21Z88elS1b1iPH+O2331SrVi2tX79esbGxHjkGAKD4obMHAIAHVa9eXTNmzFBycrLHjnHo0CG9+OKLFHoAACd09gAAAADAgujsAQAAAIAFUewBAAAAgAVR7AEAAACABVHsAQAAAIAFUewBAAAAgAVR7AEAAACABVHsAQAAAIAFUewBAAAAgAVR7AEAAACABf0/DO1Vq3Qz5PMAAAAASUVORK5CYII=", + "image/png": "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F0jv3r2lsKpZs2a266nttddeM/t1UWEtoFW9enWzFm3dunXlo48+Cvg16UZn+3navHmzeV3p3zbdp6/JN954w+/7jx49apZnqlixovm92qZNG1mzZk2IHo0zLVmyxPysakE8fW1lXeRaF+ju37+/XHzxxaZqek7rKOfl71Ygr3GnXou8vN7y8rsvXK4FnI9gDz4LFy6Uhx56SObOnStr166V33//Xfr06cMVcqDPPvtM7rnnHhNI6HIjO3bsyPG5Sk1NlQEDBkj79u1z7EfXoNTqtJlt0aJFBXD27vu50euck7Ndf31juWHDBnnrrbfM86jrgl577bWSkZEh4SS319B3330n119/vdx4441myRtdK/XNN980VZEz7dy5Uzp27GgCYb0W+ntHjy+s9BpkvZazZ882r4uuXbua/VptWl8vzz77rKlQrf/qm+ZAXpNudbafp6+++sp82KCVu7dt22aCDH2drVq1yvf9+vtUv//tt982yzjp61q//7fffgvp43ISXaNYf17HjBmTbZ9eZw3itBp6o0aNgv67ldfXuJOvRV5eb3n53Rcu1wJhQKtxAqpJkybW/fff77sY3333nVZqtb766isukMOtXbvWPFdHjx71237nnXda99xzjzVhwgTr8ssv99uX0zYEZt++fVa1atWs/fv3m+v/0Ucf5en6p6SkWJGRkdaqVat8237//XfL4/FY77//ftg8DWd7Db322mtW6dKl/bbptejSpYvvdq9evayBAwfafp7h6qqrrrL69u1rvt66dasVFRVlffvtt+f1mnSjYH6eOnfubI0aNcp3+5JLLrFmzpzp9/16/b744gubzz78rFy50lybtLS0HPe3a9fOGjduXMB/t/L6Gg+na5Hb6+1cv/vC8VrAucjswdChVfpppn7SlCkhIcEMK1q3bh1XyeGOHDkiRYsWNUNGMn3yySdmyMfUqVNz/T59znXYkg4PGTFiBJ9iB8Dr9Zqs3aRJk8ynuGc62/VPS0szn4Rr9iGTDtOJjIw0n/CGk9xeQ7qmqWaXNJunK/zs379f3n//fencubPZr49fb9eqVctkPitUqCBXX321bN26NcSPyBn0eq1YscK3vqyuDVu7dm0zpLNatWpy0UUXmdde1kzwuV6TbhXMz5P+zixbtqzvtq7Tq9km3a59LViwwAzDq1+/foE8hsLozL9beXmNh6usr7e8/O5z87VAwSPYg5GcnGzeKJQvX97visTHx8uhQ4e4Sg4P1CdPnmze5OmCwZnzV2677TYznEv/mOakVatW8sILL5iA5PHHH5fVq1fLX//6V/PGHOc2c+ZMM2xJh+ic6VzXv1SpUmaYmP7x1p89ne8yduxYM0cjnObJnu01pB8WvfPOOzJkyBCJiYkx8050yJIO41I6V0eHQj366KNy0003yfLly82bGp3DotevsNNhrxps6PVQ+/btk71798qHH35o5v/o/Op//vOf8vDDD+fpNelmgf486QcQOozu5ptv9m178sknpVy5cuZvngaK06dPN2+49XqiYP5u5eU1Ho7OfL3l5XefW68FQiTUqUU4w4EDB8xQBB06kNVll11mTZ48OWTnhbNLT0+3rr/+eqt58+bW8ePHfdv79+9vjR49OqAhmzpcRF8DGzZs4LKfw44dO6xKlSpZP/30k29b1iFzebn+u3btMj9fOtRMh6D17t3batq0qTV8+PCwvf5ZX0N6bRISEqyHHnrI2rJli7Vs2TKrZs2a1sMPP2yO1f16bNahTKdOnbLi4+OtF154wSrs6tata40dO9Z3e8iQIeZ66TDNTLNmzTLXOC+vSbfL68/T559/bpUsWdJ66aWX/LZPnz7datSokblemzZtsu6++24zHPbIkSMF/EjcP4wzt79b53qNh+O1yOn1lpfffeF4LeBcpz9OQaGnn2hqBa0zs3j6CdSZ2T44g2ZidYjXN998YzIqWT+B1ttaie6xxx7zHavv/fQTVC2WoUNCzqRDRsqUKWM+TWzevHmBPpZwo0ObNWOg2aqsunTpYibZf/755+e8/jrscf369eaTXM1AxMXFmcn3OrQnXGV9DWmhixo1asi4cePMvoYNG8rx48flzjvvlPvuu8/8ztFhdllfi1q1VDOCOoSxMNOhh7t37/YN4VQ61EszTnpNM+m1y6w4ea7X5EsvvSRulpefJy2E0a1bN5NR6du3r2+7Djd+8MEHTeXStm3bmm1aQVEzey+//LJ5zcL+v1vneo2Hm9xeb3n53ee2a4HQItiDob9UtILWypUrfcOG9A2bDiVo2bIlV8lhNHDQYYJffvmlfPrpp35zT5QO/Th16pTv9rx588yxOuQut2Dixx9/NOXHdZ4mzk7L2p8ZEDdo0EDmz59vKifqEJ28Xn8t3a30edQ361oBMFxlfQ198cUX5g1NVvqBUuYwYR3aqW+ov/32W99+fZOuv3PODFgKm+eff97MIdMAJuuQWR36pm/2Mufj6bXT4V95eU0WFrn9PGmFRA18dUkArXJ45pw/bTm9XjU4QcH83TrXazycnO31lpfffW66FnCAUKcW4RzPPfecVaJECWvJkiXW5s2brQ4dOlhXXnllqE8LORg6dKhVrlw5a926ddbBgwd9TYfH5CSnYYT/93//Z3366afW3r17rRUrVljNmjWzWrdubWVkZHDNg3C2IXM5Xf/ExERzvFa9ff31163y5ctbt99+e1hd+7O9hvSxRUREmKFH+hh1vw5NvOWWW3zfr0ObihYtar344otmGN6IESOsChUqWMeOHbMKq9TUVKtMmTLWv/71L7/tOkysXr16VteuXa2vv/7aXN/KlSv7hsXmpDAN4zzbz9O2bdusuLg4czvr78us1Yv157NFixbWl19+ae3Zs8cMQ4yJiTHDY3FacnKyqc79zDPPmNfWxo0bze3MoZjbt283t/X3wG233Wa+1muZ179bwbzGnXgt8vJ6O9fvvnC6FnA+gj34mTZtmlWxYkXzS+jaa681v6DgPPrHJaemb7rzGmzonBZ9rqOjo60aNWqYP8SHDh0qoEfgPoEGezo3Q6975vWfMmVKrsG6U53rNbRo0SKrfv36VmxsrFWlShUzf+rM5UE0GNS5UfpBU/v27c0bpcLslVdeMb9/f/vtt2z7vv/+e7N0hV5Pvd6TJk0662umMAV7Z/t50p+/nH5fDhgwwG/e+o033miCxOLFi5v5ZBpA4n8WLlyY43XUeWtKr/uZ+3T+XiB/twJ9jTvxWuTl9ZaX333hci3gfB79X6iziwAAAACA/MXSCwAAAADgQgR7AAAAAOBCBHsAAAAA4EIEewAAAADgQgR7AAAAAOBCBHsAAAAA4EIEewAAAADgQgR7AAAAAOBCBHsAUMAGDhwo/fr1c9V1X7hwoVSrVk0iIiJk0aJFoT4dR/F6vdKwYUP59NNPze1Vq1aJx+OR9PT0fLuPzz//XOrXr2/uCwCATAR7AJBP2rdvb97Ea4uNjZXatWubwG7Lli1+x82ePVv++c9/nrM/DQa0Lw0OnOzUqVNy++23y+jRo+Wnn36SPn36iFNVrVo134LRvPb12muvSenSpeXKK68Uu1x++eVStmxZefnll227DwBA+CHYA4B8dPfdd8vBgwdl165d8txzz0laWppcdtll8s477/iO0Tf+2tzi559/lhMnTkj37t2lUqVKJtA908mTJ8UtAn0s8+bNk/79+4vdNFv81FNP2X4/AIDwQbAHAPmoePHiUrFiRalevbrJ9L300kvmjf7f//53E/jlNIxz1qxZUqtWLSlSpIjJFk2cONFsv/DCC82/HTp0MBk+/T6lQWTjxo3NfdWoUUMeeOABvyGBmf2PHz/eZHsqV64sTzzxhN95fvfdd/LXv/5VSpUqZQLPq666Sn777TezLyMjw/Sp51KyZEnzOLZu3Zrj49Wso567SkhIMOe5b98+cw4333yzjBkzRsqVKyfXX3+9OWb58uXSoEED81j18b3wwgu+vvT79PuXLFkizZs3N0GjnldycrK8/vrrJlN6wQUXyKhRo8SyrFyfg1deeUUuvvhiKVq0qHkuhg4darbr49DM46233mruR2+rZcuWSatWrcxj1WulWco///zT158+H1dccYXMnDlTqlSpYs4tt77OlJSUZIZvduvWLdfz1WN0COawYcPM49JsoV77V1991VzbEiVKyJ133ul7XuLi4sz+F1980a8fDbbXrl1rzgsAAEWwBwA20zfq+gZ806ZN2fZt2LBBJkyYIP/6179kz549ZshfZpD35Zdfmn/ffPNNky3U4Z9K52U99thj8vXXX5vve/bZZ+Xpp5/261cDGA0utQ8NVu69915fwKaZqc6dO5t+Vq5cKevWrZNevXqZYEJNmjRJ3nvvPRM0ffXVV2aI4NVXXy2///57tvNv06aNfPHFF+br9evXm/PUuXtq6dKlkpqaauaTabCpwVzPnj1N03PRLOigQYPM/qwmT54sjz/+uOn3hx9+kBtuuMEENtqf/quZsnfffTfHa633rwGYPgbNrupxzZo1M/s0iNTMowbXepzeVpqVHDdunBluqwGWXhP9/qw2b95srtOHH35onqPc+jqTBl/ly5c3QWJODhw4IO3atZNOnTqZ51IDR6UBrg7J1Izw4sWLzfN7zTXXmOdMr4t+eDBkyBA5fPiwry+9Dw1u9T4BADAsAEC+aNeunTVu3Lhs20+cOKFpKOvVV181twcMGGDdfPPN5us33njDqlu3rpWWlpbt+3Sbft/KlSvPer/Tp0+3OnTo4Lut/V9yySV+x+h9PPnkk+brBQsWWPHx8daff/6Zra/U1FQrNjbW2rZtm9/2OnXqWP/+979zvP89e/aY89y7d6/fOSQkJFgZGRm+baNHj7Yuu+wyv+/t06ePdf3115uv9fu1n8WLF/s9No/HY/3yyy++bV26dLHuueeeHM9l48aNVqlSpazjx4/nuL9KlSrWwoULrbN55ZVXrFq1avluT5gwwSpRokS2PvPS1xNPPGE1atTIb5s+n/o49brp/fzf//2f337tUx9zUlKS32O+9NJLfbfT09Ot4sWLW8uWLfP73iZNmliPPvroWc8JAFB4kNkDAJtlDjnMzNpkpcMUdbsOURw+fLgkJiaedYii0syNZuY0k6ND/DRzt3//fr9jdFhgVprxOXTokPlaM4ItWrSQYsWKZetbh3dqNk6HNWrfmU23f//99wE97kaNGpnqnJk006b9ZtW6dWuzPSsd5pmpQoUKEh8fb7JjWbdlzWideZ9a+VKHlOpQUs3CaQGZs9mxY4dcd911ZuitDuXUzOCZ17NOnTrmOgRKs4Y6ZDUnOvTz2muvlUceeSTbPn3M+jgz6deXXnqp73ZkZKQZznnmddChr/r8AQCgCPYAwGbffPON+bdmzZrZ9ul8OR3SqIU1YmJizLBGnUuXm+PHj5u5WTqXS4d36tBQnReXOR8wU3R0tN9tDSgzy/KfLZj8448/fHPxdOhiZtOA7I477gjocZ8ZTJ4riM3p3PW8z/ZYzhQVFWXOXYc+aoB03333maGmZwv4evToYfrU+ZUbN26UOXPmZFsWIafAOC80IDt69GiO+7p27WqGy+ow0DPl9Jjzch1+/fVXM0cSAAAVxWUAAHs9+eSTZh5b06ZNc9yvQZ4W8NCmhVVatmxpsnCa3dHMWOZcOqVBlwYPDz/8sJQpU8ZsOzMLdS6aOdPAJiUlJVsQU69ePXM+GoBoIZL8pEVTVqxY4bdN55/p9vykWS8taqNN5ypq0KcBq2YzNWDKej2PHDlispZvvPGGKXqjNBuYF2f2lVumce/evWae5JkZPp17qMG9zodcvXq1CQzPh96HZl/1PgEAUGT2ACAfaRVHra74448/mgyTVqTUoiJafEOzTmfSAiK65t62bdvMG3XNSGlmRt/4a+ZGg0QNkDT406ybDjXUIEMDBT1e+3377bcDOse+ffuaIYm6Ht5//vMf2b17t8yfP98EPlqdUzN4WgBEM4caqGhAdv/998v27dvP69pon1oE5cEHHzT3OXfuXBNkaaGW/KJFVDQQ1oynFnfRap8aZGnVUqX/rlmzxjxHx44dM9U9tT3zzDO+66/XIi/O7CsnGuDr0FAtxHOmzAXodYholy5dciyAEwi9Dw3e8ztIBwCEL4I9AMhHWp1RqzTWrVvXZG00MNM34bmV3tfsnAYYuuC2zjXTipYaAGp2Sul8Ls3CaZ8ahOncNa3MqMGeZui0OqQO4wyEBj8ffPCBGQLYtm1bsw6gVpPMDEYfffRRs/zAP/7xD7noooukd+/eJnt4vpknDY40MH3rrbfMnEK9VrqMhA6zzC8arH7yySdmTqNmKbWiqD62zPlvOr9RA0INonW4rF5nvb56HXVOnAZ6Wg00L87sKyf6/GvAr0tH5ESvuVYA1SUydHiuZluDpfehgbxmZgEAUB6t0sKlAADAHrrkhBam0WymBqN20LmcumSHZmG1OA0AAIrMHgAANtLCPLoguwZ9dtEhq7qWIYEeACArMnsAAAAA4EJk9gAAAADAhQj2AAAAAMCFCPYAAAAAwIUI9gAAAADAhQj2AAAAAMCFCPYAAAAAwIUI9gAAAADAhQj2AAAAAMCFCPYAAAAAQNzn/wFuuMiZbNJ8MwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -435,15 +435,15 @@ "fig, ax = plt.subplots(figsize=(10, 6), dpi=96)\n", "\n", "mesh = ax.pcolormesh(\n", - " distance_1d / 1000, # distance in km\n", + " distances / 1000, # distance in km\n", " z1d,\n", - " var_up.T,\n", + " var_2d.T,\n", " cmap=VARIABLES[plot_variable][\"cmap\"],\n", ")\n", "\n", - "seabed = xr.where(np.isnan(var_up), 1, np.nan) # sea bed\n", + "seabed = np.where(np.isnan(var_2d), 1, np.nan) # sea bed\n", "ax.pcolormesh(\n", - " distance_1d / 1000, # distance in km\n", + " distances / 1000, # distance in km\n", " z1d,\n", " seabed.T,\n", " cmap=mcolors.ListedColormap([mcolors.to_rgba(\"tan\"), mcolors.to_rgba(\"white\")]),\n", @@ -452,7 +452,7 @@ "tan_patch = mpatches.Patch(color=mcolors.to_rgba(\"tan\"), label=\"Land / sea bed\")\n", "ax.legend(handles=[tan_patch], loc=\"lower right\")\n", "\n", - "ax.set_xticks(distance_1d / 1000)\n", + "ax.set_xticks(distances / 1000)\n", "\n", "ax.set_ylabel(\"Depth (m)\")\n", "ax.set_xlabel(\"Distance from start (km)\")\n", @@ -464,7 +464,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -478,7 +478,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.14.6" } }, "nbformat": 4, diff --git a/docs/user-guide/tutorials/Drifter_data_tutorial.ipynb b/docs/user-guide/tutorials/Drifter_data_tutorial.ipynb index ec22454e..13479eca 100755 --- a/docs/user-guide/tutorials/Drifter_data_tutorial.ipynb +++ b/docs/user-guide/tutorials/Drifter_data_tutorial.ipynb @@ -28,11 +28,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ - "import xarray as xr\n", + "import parcels\n", + "import polars as pl\n", "import matplotlib.pyplot as plt\n", "import cmocean.cm as cmo\n", "import numpy as np\n", @@ -63,7 +64,7 @@ "source": [ "# set data directory path\n", "\n", - "data_dir = \"/path/to/EXPEDITION/results/\" # set this to be where your expedition output data is located on your (virtual) machine" + "data_dir = \"/path/to/EXPEDITION/results\" # set this to be where your expedition output data is located on your (virtual) machine" ] }, { @@ -72,18 +73,18 @@ "source": [ "### Load data\n", "\n", - "We are now ready to read in the data using the `xarray` package. You can carry on executing the next cells without making changes to the code…" + "We are now ready to read in the data using `Parcels`, specifically the `parcels.read_particlefile()` function. You can carry on executing the next cells without making changes to the code…" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "# load drifter data\n", "\n", - "drifter_ds = xr.open_dataset(f\"{data_dir}/drifter.zarr\")" + "drifter_df = parcels.read_particlefile(f\"{data_dir}/drifter.parquet\")" ] }, { @@ -107,12 +108,12 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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ExPr9bqgoCCMHz9evhT/7rvv1uu16enp1fqiNnU6nU4+JmI58ZziZ6+xaq71lFekGI9gAclkA6cW5rh4KA/JcTnQWKrgFW5Vo0yaazk1BMvq9pSTuJLdqEJnamoqNm/ejN9++63erzUajYiLi5P7gtaXuLwuplWq7+/18vK6q0KnOJnEMRHLiecUP3uNFespwNvHG7EPAvoyI1RqM6jNa/Z2YznxnLrVbvacuq2hMzc3Vx6RnpCQID8/fvw41Gq1HPYqLoGLS+Oir+Z9991X4/Wvv/66HErFNsLs2bMRHByM8PBwFBUVYebMmcjKysLIkSPrfSA+Pj547rnn8OWXX9b7tURERHeCxlLNgqdmo14DiVatWiVPXyTmzhRiYmLk54cOHarcZuHChRg9ejRUqpq7FvNwitBaQUx/9MILL6BNmzbo378/CgoK5H6ZIkA2hJg/VFyiJyIiIqLGxUySpGbZe1k0EdvY2MjzgPLyevPDy1YsK55T/Pw1dqynWFaN8fL6zWQnxebpJCIiIiKqwNBJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERKY6hk4iIiIgUx9BJRERERIpj6CQiIiIixTF0EhEREZHiGDqJiIiISHEMnURERESkOIZOIiIiIlIcQycRERERNf3QuWzZ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", "text/plain": [ "
" ] @@ -127,10 +128,11 @@ "ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", "\n", "# plot trajectory\n", - "for i, traj in enumerate(drifter_ds[\"trajectory\"]):\n", + "for i, drifter_id in enumerate(np.unique(drifter_df[\"particle_id\"])):\n", " # extract trajectory data\n", - " lons = drifter_ds[\"lon\"][:].sel(trajectory=traj).squeeze()\n", - " lats = drifter_ds[\"lat\"][:].sel(trajectory=traj).squeeze()\n", + " drifter_dat = drifter_df.filter(pl.col(\"particle_id\") == drifter_id)\n", + " lons = drifter_dat[\"x\"].to_numpy()\n", + " lats = drifter_dat[\"y\"].to_numpy()\n", "\n", " # plot\n", " ax.plot(\n", @@ -160,10 +162,10 @@ "latlon_buffer = 3.0 # degrees (adjust this to 'zoom' in/out in the plot)\n", "ax.set_extent(\n", " [\n", - " drifter_ds.lon.min() - latlon_buffer,\n", - " drifter_ds.lon.max() + latlon_buffer,\n", - " drifter_ds.lat.min() - latlon_buffer,\n", - " drifter_ds.lat.max() + latlon_buffer,\n", + " drifter_df[\"x\"].min() - latlon_buffer,\n", + " drifter_df[\"x\"].max() + latlon_buffer,\n", + " drifter_df[\"y\"].min() - latlon_buffer,\n", + " drifter_df[\"y\"].max() + latlon_buffer,\n", " ],\n", " crs=ccrs.PlateCarree(),\n", ")\n", @@ -182,10 +184,16 @@ "\n", "ax.legend(loc=\"upper right\", fontsize=12)\n", "\n", - "n_days = float(\n", - " (drifter_ds[\"time\"][0].max(skipna=True) - drifter_ds[\"time\"][0].min(skipna=True))\n", + "drifter_lifetimes = [\n", + " (\n", + " drifter_df.filter(pl.col(\"particle_id\") == drifter_id)[\"t\"].max()\n", + " - drifter_df.filter(pl.col(\"particle_id\") == drifter_id)[\"t\"].min()\n", + " )\n", " / np.timedelta64(1, \"D\")\n", - ")\n", + " for drifter_id in np.unique(drifter_df[\"particle_id\"])\n", + "]\n", + "u, counts = np.unique(drifter_lifetimes, return_counts=True)\n", + "n_days = u[np.argmax(counts)] # use the most common drifter lifetime for the title\n", "plt.title(f\"[{round(n_days, 1)} day drifter lifetime]\", fontsize=12)\n", "\n", "plt.tight_layout()" @@ -197,17 +205,17 @@ "source": [ "### Add temperature data to the trajectories\n", "\n", - "The VirtualShip drifters will sample sea surface temperature (SST) as they flow throught the ocean. We can add this information to our trajectory plot by colouring the drifter trajectories by the temperature recorded at each time step." + "The VirtualShip drifters will sample sea surface temperature (SST) as they flow through the ocean. We can add this information to our trajectory plot by colouring the drifter trajectories by the temperature recorded at each time step." ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { - "image/png": "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nJxJY9nZQBk8ERERERGRHKEMnoiIiIiIZA2T5pkujWbRFBERERERkb5AGTwREREREckexgOTxvtXGs2iKSIiIiIiIn2AMngiIiIiIpI1DIb0jsEzaSs7GyiDJyIiIiIikiOUwRMRERERkexh/DSPwdMsmiIiIiIiItIHKIMnIiIiIiJZw6Q5g2eUwRMREREREZG+QBk8ERERERHJIum+T53ugyciIiIiIiJ9gDJ4IiIiIiKSPTSLZo8ogyciIiIiIpIjlMETEREREZGsYfCBNM6iiTJ4IiIiIiIi0gcogyciIiIiItlDY/B6RBk8ERERERGRHKEMnoiIiIiIZA9l8HpEGTwREREREZEcoQyeiIiIiIhkDc2i2TPK4ImIiIiIiOQIZfBERERERCR7aAxejyiDJyIiIiIikiOUwRMRERERkeyhDF6PKIMnIiIiIiKSI5TBExERERGRLJLeWTTRLJoiIiIiIiLSFyiDJyIiIiIi2UNj8HpEGTwREREREZEcoQyeiIiIiIhkDZPmDJ5RBk9ERERERET6AmXwREREREQkixjSO9OlSWPZmacMnoiIiIiISI7IqQxee3t7pqvQJ7W3t+vYZQm1RXZRe2QPtUV2UXtkF7VH9si2tsimunSL8dObZMvxMXg5EeC5rktFRQUDBw7MdFVERERERLJGRUUFrpsTX/nlOOVEawcCAbZu3Uoymcx0VUREREREsobrugQCgUxXo3uUweuRnAjwoDPI63P/eUVEREREpCvjpzcGU4AnIiIiIiKSXoeGXe3aui7tr5XLl65axpjcnidURERERET6hEQicVKGXfXJS1ePkwI8ERERERGRHKH74ImIiIiIiOQIBXgiIiIiIiI5QgFeH/LEE08wa9YsCgsLsSyry/XJa9eu5TOf+QwVFRVEo1Gqq6t57LHHDivjxz/+MRUVFeTl5fGpT32Kurq6Lut/+ctfUllZydSpU3n77bcB+P3vf08oFOpys8x33nkHy7L4j//4jy77L1q0iPPPP78X33XmHe24d3R08IUvfIExY8Zg2zbf+973Dtu/qqoKy7IOezz66KMf+prnn3/+YdvfeeedqfWe57FgwQLKy8u5/PLLaWlpAeC6665j+vTpXcq67777sCyLJ554osvy8ePHc9NNN53AEclOPW2nm2666bBj/ulPf7rLNjo/uurpMb/ttts488wzyc/Pp7y8nHnz5rFnz56jvqbOje7raTuB+o7uOtoxB9i0aRMzZ84kEolQVVXF/fff32W9+o2To6ftpH5DspUCvD6kra2NCy64gG9961uHrautrWXIkCE88sgjrF+/nnnz5vHZz36W559/PrXNb37zG374wx9y9913s3LlSg4cOMAVV1yRWr99+3buuOMOHn30UebNm5f6kJk+fTqJRIJXX301tW1NTQ1DhgyhpqamSz1qamoO6yj6uqMdd8/zyM/P55vf/CYTJkw44v6rV69m9+7dqccvfvELIpEIF1100VFf9/rrr++y34IFC1LrHn74Yerq6li2bBlFRUX84he/ADrb6rXXXiMWi6W2PVJb7d+/n7feeiun2qqn7QQwZcqULsf8gQceSK3T+XG4nh7zl156iRtuuIE1a9bw5JNP8re//a3LZ9KH0bnRPT1tJ/Ud3Xe0Y55IJLj44ospLi5m9erVfP/732fhwoX85S9/SW2jfuPk6Gk7gfoNyVJG+pwVK1YYwCQSiaNu94lPfMJ89atfTT2vrq423/nOd1LP33nnHQOY2tpaY4wx69evN5MnTzatra1m9erVZtKkSaltTz/9dHPzzTenns+dO9f86Ec/MtFo1DQ0NBhjjGloaDC2bZvnnnuuF95l9jnWcZ8xY4b57ne/e8xyPv7xj5srr7zyqNscq6y77rrLLFq0yPi+b37605+ar3/968YYY+rr6w1gXnjhhdS2VVVV5s477zTV1dWpZX/4wx9MMBg0bW1tx6xvX3Oi7bR48WJz7rnnfmi5Oj8+XG+dGytXrjSAaWxs/NBtdG6cuBNtJ/UdJ+5Ix/zJJ580oVDIHDhwILVszpw55rLLLvvQctRvpNeJtpP6DclWyuDlsL179zJgwAAAYrEY69at44ILLkitHzFiBFVVValfkMaNG8dpp51Gv379uOCCC/jBD36Q2nb69OldflWqqalh1qxZTJo0iZdeegmAF198EcdxmDp16sl4e33Sjh07WL58OXPnzj3mtr/+9a8pLi7mjDPO4Pbbb8fzvNS62bNnU1NTQyAQ4Fe/+hWLFi0CoKSkhNNOOy3VVjt37mTfvn3Mnz+fjRs30tTUBHS236RJk4hEIr3/JvuwdevWUVZWxqhRo7j22mtpaGhIrdP5kX579+4lHA4TjUaPup3OjZNHfUfve+2115g8eTIFBQWpZbNmzeqSzfkg9RuZcbztpH5DspECvBz1+OOP8/bbb/P5z38egH379uH7PoMGDeqyXUlJCfX19annS5Ysoa6ujj179nS5FGT69Om88sorJBIJ3nvvPd5//32qq6uZNm1a6gPq0Id/Xl7eSXiHfdNvf/tbKioqmDVr1lG3mz17Nv/7v//LihUruPbaa7n11lu7jHvo378/tbW17Ny5k02bNlFZWZla98FO44UXXuCcc85Jjct8+eWXgc62mjFjRu+/wT7s7LPP5sEHH+TZZ5/l9ttv54UXXuCyyy7DfOBOMjo/0icWi3HLLbdw1VVXHfXGszo3Ti71Hb2vvr7+iMfzw8afqt/IjONpJ/Ubkq1y8/btH3ErV65k3rx53HvvvQwfPhygy4fNsRQXFx+2bMaMGbS1tfH666+zZcsWpk6diuu6TJs2LdWB1NTUMHPmzF55D7lqyZIlzJkzB9s++m8r8+fPT/17/PjxOI7Dddddxy233IJlWQBYlkVZWdlh+86YMYOHHnqIZDJJTU0N5513HkCq05g+fTq1tbVdfkkUunS848ePZ+zYsZxyyim8/vrrTJo0KbVO50fv8zyP2bNnA/Czn/3sqNvq3Di51Hf0vu4cU1C/kSnH007qNyRbKYOXY1avXs0nP/lJfvrTn3LllVemlhcXF2PbdpdfXAH27Nlz2C9UR1JeXs4pp5xCTU1NlwG/55xzDmvXrqW+vp433nhDA4GPYuXKlWzatOm4LrP5ZxMnTqSlpYW9e/cec9sZM2bQ0tLCG2+80aWtzjvvPGpqalK/xp577rndrsdHyciRI+nfvz9btmw55rY6P06c7/vMnTuXDRs2sGzZMvLz87u1v86N9FLf0ftKS0uPeDxLSkoO21b9RuZ0p50OUb8h2UIBXg6pra3lwgsv5Hvf+x4LFy7ssi4UCjFhwgRWrFiRWrZlyxa2bt3KWWeddVzlz5gxI/VBdOjXvX79+nHaaadx++23Y4xh2rRpvfeGcsySJUuYOnUqo0aN6va+69atIxqNHvFXwH9WUVHByJEjefzxx9m6dSuTJ08GOjvmN954g2eeeYbq6uou4wrkcNu3b6exsZGqqqrj2l7nR/cZY5g/fz6rVq3i2WefTY0Z7g6dG+mlvqP3TZkyhTVr1qRuUwCwfPnyIx5P9RuZ0512OkT9hmSNDE3uIidg3759pra21txzzz0GMGvWrDG1tbWmubnZrF+/3gwcONB8+ctfNrt37049Pjgb3X333Wfy8/PNE088YdauXWtmzpxpzjvvvON+/SVLlphoNGpCoVCXWbS+8pWvmPz8fHPmmWf26vvNFkc77sYY89Zbb5na2lozceJEM3/+fFNbW2v+/ve/dymjvb3d9O/f3/zqV786rPydO3ea0aNHm1dffdUYY8zmzZvND3/4Q/P666+bd9991zz88MOmpKTEfOMb3zjuOs+bN8/k5+ebadOmdVk+btw4k5+fb2644YbuHoas19N2+s///E/z4osvmi1btpjly5ebiRMnmqlTpxrP847r9T+K50dPj/mCBQtMcXGxefXVV7t8biWTSWOMzo3e0tN2Ut/RfUc75rFYzIwcOdJcfvnl5s033zT33XefCQQCh82UqH4j/XraTuo3JFspwOtDfvOb3xjgsMeKFSvM4sWLj7juqquu6lLGbbfdZsrKykw4HDaXXHKJ2b1793G//tatWw1gpk6d2mX5I488YgBz/fXX98bbzDpHO+7GGDNs2LDD1s2YMaNLGQ8//LAJh8OpqY8/aMuWLV3K2759uznvvPNM//79TTgcNmPGjDE//vGPTTweP+46P/DAAwYw3/72t7ssv+aaawxg/vCHP3TnEPQJPW2nz3zmM6asrMwEAgEzbNgws2DBAlNfX3/cr/9RPD96esyPtC9gtmzZYozRudFbeuMzTH1H9xzrmG/YsMHMmDHDhEIhU1lZae69997DylC/kX49bSf1G5KtLGO6OdpXREREREREspLG4ImIiIiIiOQIBXgiIiIiIiI5QgGeiIiIiIhIjlCAJyIiIiIikiMU4ImIiIiIiOQIBXgiIiIiIiI5QgGeiIiIiIhIjlCAJyIiIiIikiMU4ImIiIiIiOQIBXgiIiIiIiI5QgGeiIiIiIhIjvj/KjwK3PlO6jEAAAAASUVORK5CYII=", + "image/png": "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", "text/plain": [ "
" ] @@ -224,11 +232,12 @@ "ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", "\n", "# plot trajectory colored by temperature / salinity\n", - "for i, traj in enumerate(drifter_ds[\"trajectory\"]):\n", + "for i, drifter_id in enumerate(np.unique(drifter_df[\"particle_id\"])):\n", " # extract trajectory data\n", - " lons = drifter_ds[\"lon\"][:].sel(trajectory=traj).squeeze().values\n", - " lats = drifter_ds[\"lat\"][:].sel(trajectory=traj).squeeze().values\n", - " var = drifter_ds[PLOT_VARIABLE][:].sel(trajectory=traj).squeeze().values\n", + " drifter_dat = drifter_df.filter(pl.col(\"particle_id\") == drifter_id)\n", + " lons = drifter_dat[\"x\"].to_numpy()\n", + " lats = drifter_dat[\"y\"].to_numpy()\n", + " var = drifter_dat[PLOT_VARIABLE].to_numpy()\n", "\n", " # segments for LineCollection\n", " points = np.array([lons, lats]).T.reshape(-1, 1, 2)\n", @@ -265,10 +274,10 @@ "latlon_buffer = 1.0 # degrees (adjust this to 'zoom' in/out in the plot)\n", "ax.set_extent(\n", " [\n", - " drifter_ds.lon.min() - latlon_buffer,\n", - " drifter_ds.lon.max() + latlon_buffer,\n", - " drifter_ds.lat.min() - latlon_buffer,\n", - " drifter_ds.lat.max() + latlon_buffer,\n", + " drifter_df[\"x\"].min() - latlon_buffer,\n", + " drifter_df[\"x\"].max() + latlon_buffer,\n", + " drifter_df[\"y\"].min() - latlon_buffer,\n", + " drifter_df[\"y\"].max() + latlon_buffer,\n", " ],\n", " crs=ccrs.PlateCarree(),\n", ")\n", @@ -289,8 +298,8 @@ "sm = plt.cm.ScalarMappable(\n", " cmap=cmo.thermal,\n", " norm=mcolors.Normalize(\n", - " vmin=float(drifter_ds.temperature.min()),\n", - " vmax=float(drifter_ds.temperature.max()),\n", + " vmin=float(drifter_df[PLOT_VARIABLE].min()),\n", + " vmax=float(drifter_df[PLOT_VARIABLE].max()),\n", " ),\n", ")\n", "sm._A = []\n", @@ -298,10 +307,16 @@ "\n", "ax.legend(loc=\"upper right\", fontsize=12)\n", "\n", - "n_days = float(\n", - " (drifter_ds[\"time\"][0].max(skipna=True) - drifter_ds[\"time\"][0].min(skipna=True))\n", + "drifter_lifetimes = [\n", + " (\n", + " drifter_df.filter(pl.col(\"particle_id\") == drifter_id)[\"t\"].max()\n", + " - drifter_df.filter(pl.col(\"particle_id\") == drifter_id)[\"t\"].min()\n", + " )\n", " / np.timedelta64(1, \"D\")\n", - ")\n", + " for drifter_id in np.unique(drifter_df[\"particle_id\"])\n", + "]\n", + "u, counts = np.unique(drifter_lifetimes, return_counts=True)\n", + "n_days = u[np.argmax(counts)] # use the most common drifter lifetime for the title\n", "plt.title(f\"[{round(n_days, 1)} day drifter lifetime]\", fontsize=12)\n", "\n", "plt.tight_layout()" @@ -344,7 +359,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -358,7 +373,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.14.6" } }, "nbformat": 4, diff --git a/docs/user-guide/tutorials/Ship_underwater_ST_plotting.ipynb b/docs/user-guide/tutorials/Ship_underwater_ST_plotting.ipynb index 5b2559ad..7be07acc 100644 --- a/docs/user-guide/tutorials/Ship_underwater_ST_plotting.ipynb +++ b/docs/user-guide/tutorials/Ship_underwater_ST_plotting.ipynb @@ -30,13 +30,13 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "c7abdbb5", "metadata": {}, "outputs": [], "source": [ + "import parcels\n", "import numpy as np\n", - "import xarray as xr\n", "import cmocean.cm as cmo\n", "import matplotlib.pyplot as plt\n", "from cartopy import crs as ccrs\n", @@ -66,8 +66,6 @@ "metadata": {}, "outputs": [], "source": [ - "# set data dir path\n", - "\n", "data_dir = \"/path/to/EXPEDITION/results/\" # set this to be where your expedition output data is located on your (virtual) machine" ] }, @@ -78,19 +76,18 @@ "source": [ "#### Load data\n", "\n", - "We are now ready to read in the data using the `xarray` package." + "We are now ready to read in the data using `Parcels`, specifically the `parcels.read_particlefile()` function." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "2cd63a8f", "metadata": {}, "outputs": [], "source": [ "# load underway temperature and salinity data\n", - "\n", - "underway_st_ds = xr.open_dataset(f\"{data_dir}/underwater_st.zarr\")" + "underway_st_df = parcels.read_particlefile(f\"{data_dir}/underwater_st.parquet\")" ] }, { @@ -121,13 +118,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "id": "78d5bd8d", "metadata": {}, "outputs": [ { "data": { - "image/png": "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jvF2D3qeW3r16pXVHm9vb7Vjx457nuNOl/Bu59alzx9//PGeZe3s7JSLi4sKCAhQP/30k/rjjz9U7969FaCWL19+18c+9dRTysPDI9s4r/DwcGUwGO56Cc9sNmddvn711VdztPG//xZWrFihALVnz56sY506dVLNmzfPVuf169cVoFasWHHPNo8ePVrZ2dlluzStlFzCE6WT9EAVIyNGjCAiIoKhQ4cSERHBpUuXeO6557J6QW5dLho6dChWq5Vnn32W8+fPExUVxauvvsrFixezlQMYPHgwe/fu5auvvmLbtm189dVXHDx4kN69e2f9+rRYLJjN5qzbreNKqaxLX/+llMpx7IsvvuDZZ5+lVatW9O7dm02bNtGoUSNGjhyZVSY/zpPfTp8+zbVr13j66aezHW/ZsiWVKlVi27Zt+XKeESNGsGTJEmbOnElMTAx//vknw4YNQ6fTZXu9RowYwf79+xk9ejTXrl3j1KlT9O/fH61Wm63c9evX6dmzJ05OTixZsoQtW7YwevRoPvjgA6ZOnZpV7r/Pt9lszvac5uY5L1euHF999RU9e/akVatWDB48mO3bt6PRaJg0aVK+neeWjz76iP3797N06VJCQkLo2rXrbWeX3o+tW7fy6quv0r9//xyv9+1YrVYSExNZunQpTz31FB06dGDRokXUqlWLDz/88K6P3bNnD507d8bJySnrWMWKFWnRokWOshs3bqRt27Z4eHig1+sxGAycOXOG06dPZ5Vp06YNNWvWzNYL9fXXX1OnTh2aNm2adSwyMhIvL69s9Xt4eBAUFMR7773HnDlzOHv27B3j9vLyIj09nZiYmLu2T4jSQBKoYqRFixZ8+eWXLFmyhAoVKhAQEEBcXBwDBgzAaDTi7u4OQFBQED/99BN//vknVapUwc/Pjz179vD6668DmV96AKtXr2bhwoUsWLCAIUOG8NBDDzFkyBAWLFjAmjVr+P333wFo3749BoMh6zZhwgQA3N3db/tBemu8xa14bken09GnTx+uXLmSNZaoIM7zoG6d99Zz9l++vr759kXy9ttv88ILL/Daa6/h4eFB06ZN6dChA/Xq1ct27qeffprRo0czbdo0fHx8qFmzJuXLl6dz587Zyn300UeEhYWxfv16evXqRZs2bZgwYQJvv/02//d//8eNGzcAsj3fBoMhKyF0c3O743N+63LQnVSsWJGWLVty4MCBrGP5dZ6goCBCQ0Pp2bMna9euxdvbm9GjR981ntw4cOAA3bp1o127dnz77be5eoyHhwfu7u40aNAg65hWq6V9+/YcPnz4ro+NiorCx8cnx/H/PXbo0CE6d+6Ms7Mz3377LXv37uXAgQPUrVs365L9LcOGDWPJkiXcvHmTS5cusW7dOoYOHZqtTFpaGnZ2dtmOaTQaNmzYkPWDplq1agQFBTF79uwc8Tk4OACQmpp61/YJURro711EFCUvvfQSgwYN4ty5c7i6ulKxYkUeffRRmjRpkm0wba9evejevTtnzpzBaDRSuXJlhg0bRsWKFfH39wfIGqcSGhqa7RyNGzcGMsdpPP7443z99dfZ1iPy8/MDMsepLFu2jJSUlGzjk06ePInRaMw2MPh2bvUy3OqBKKjzPIhbyVl0dHSO+6Kjo2nUqFG+nMdoNPL1118zdepUwsPDqVChAi4uLnh6ejJixIhsZSdOnMh7773HhQsX8Pb2xsfHhxo1atCyZcusMseOHaNKlSo5kpDGjRtjMpk4d+4cnp6e2ZIcgODgYCDzOT9x4kSOOE+ePEnNmjXv2Z7/7TUsiPMYjUbq1Klzz2TlXo4dO0bHjh2pV68eS5cuzfWg9Fq1at323HfqMf2vcuXK3Xbtrv89tnTpUvR6Pb/99lu2uGJjY7NNJgF49tlnGTlyJPPmzSM2NhYHB4ccPWkeHh5ZPzz+KygoiPnz56OU4siRI8ycOZOXXnqJgICAbJMbbiW7np6ed22fEKWCba4ciju52xio2zl69KjS6/Xq559/vmu5iIgI5ebmpj788MOsY99//70C1IYNG7KVXb9+vQLU/Pnz71rnX3/9pQA1b968rGMmk0lVr15dde3a9a6PNZlMqmHDhsrf3/+u5e73PPczBspoNKo33ngj2zGz2ax8fHxyrMe0a9cuBagZM2bkuv67jYG6ndmzZys7O7t7vhfWrl2rALVr166sYwMGDFAuLi451tkaOXKkAlR4ePhd6/zss8+UTqdT58+fzzp28eJFpdfr1SeffHLXx166dEm5uLjcds2g/DxPcnKyqlSpknrkkUfuWu5uY6DOnDmjfHx8VMOGDVV8fPw94/2vmTNnKkAdOHAg65jFYlE1atRQLVu2vOtjczsG6rXXXlPOzs7Zlq3YtGmTAnIse6GUUkOGDFFVq1ZV5cqVU4MHD85x/3PPPacqV658z7bFx8crQH300Uc56r/dEg8yBkqURpJAFRGLFy9WixcvzloActasWWrx4sVq69atWWUuX76s3n//fbVq1Sq1YcMGNWXKFOXq6ppj8HFGRoZ67bXX1LJly9SmTZvUjBkzVLly5VTLli1Venp6Vrn4+Hjl5+enypUrp2bNmqU2b96sZs2apXx8fFTFihVVYmLiPeN+8sknVdmyZdWcOXPUxo0bVa9evZSdnZ36888/s8r8/PPP6sknn1Q//PCD2rx5s1q4cKFq2bKlAtTChQtz9fzk5jxKKXXgwAG1ePFitWjRIgWoPn36ZD2391o4sF69eio4OFj98ccf6sCBA1nr3dwaWPz000+rtWvXqrlz5yofHx9VtWrVez5H165dyzp/q1atlJeXV9bfJ06cyCr3xx9/qE8//VT98ccfauXKlWr48OFKq9VmW9tJKaUOHTqkJk2apNauXavWrl2rRo0apYxGY47FMffs2aP0er1q1KiRWrRokdq4caMaPXq0MhgMqkePHvd8vpOSklTlypVVSEiIWr58uVqxYoWqU6eOCgwMzNbmN954Q7322mtq0aJFavPmzWr27NnK399flSlT5p7riOXlPC+++KJ677331JIlS9TWrVvVDz/8oEJDQ5XRaLztJIL/ulMCdfXqVVWpUiXl5uamVq1alWMh0P8uTDp+/Hil0+lUWFhY1rHU1FRVo0YN5e/vr+bPn6/WrFmjunfvrrRardq4ceNdYzp58qQyGAyqefPmatmyZWrRokWqevXqqkKFCtkSqHXr1mW99zZu3KhmzZqlypUrp8qXL3/bBOrIkSNZg+z/99+GUv/+aPrvBJMjR46oNm3aqNmzZ6sNGzaodevWqb59+yq9Xq8OHjyY7fH16tW77XpukkCJ0kgSqCLi1ofe/97++yEZHR2t2rdvrzw8PJTRaFQ1atRQn3zySbZfp0pl9r506dJFeXt7K6PRqIKCgtSoUaNum0CEh4er559/XgUEBCg7OzsVEBCgXnjhBXXlypVcxZ2SkqJef/115ePjo+zs7FTjxo1zfFHt2bNHtW3bVnl7eyu9Xq9cXV1V+/bt1bp163L9/OTmPEqprJWkb3e7V0/Ozp07VYMGDZSdnV2O3qsFCxaoOnXqKKPRqNzd3dUzzzyTNevxbm59ed/u9t/6t27dqho1aqScnZ2Vo6Ojat68uVq5cmWO+o4fP65atGihypQpo+zt7VX9+vWzLTD6X3v27FGPPvqo8vX1VY6OjqpmzZpq4sSJuZphqVRmT1LPnj2Vi4uLcnZ2Vo8//niO5/Dbb79VjRo1UmXLllU6nU75+Piofv365Sp5yut5mjVrptzd3ZWdnZ0KCgpS/fr1U0ePHr1n/XdKoO722vzv+2Xs2LG3fQ9FRkaqp59+Wrm5uSk7OzvVtGlTtX79+ly1e8OGDapevXrKaDSqwMBA9dVXX912Ic0ZM2aogIAAZW9vrxo1aqQ2bNigWrdufdsESimlqlWrpho1anTb+2JiYpS9vX223tyrV6+qZ599VlWtWlU5ODgoNzc39dBDD+X49xkeHq40Go36/fffc9QrCZQojTRKFcJUJiGEsJGtW7fStm1bNm7cSOvWrbMtQlrSnDlzhurVqzNnzhwGDRp02zIDBw7kypUrbNy4MU91T506ldmzZ3P+/Pmstcsgc/ZsWFgYVapUYc6cOfm+LpcQRZXMwhNClAoPP/wwBoPhjht1F2dXrlxh69atDB48mHLlyuVYafy/xo4dy86dO/O0/ENaWhqff/45EyZMyJY8QeYirgU5kUOIoqrk/hQTQgigYcOG2WYB3prdWZLMnTuXCRMmUK1aNX7++ees5QZuJzAwkHnz5nHt2rVc1x8WFsaIESPo379/jvv27duXNaM2ICAgz7ELUVzJJTwhhBBCiDySS3hCCCGEEHkkCZQQQgghRB6VmDFQJpMJs9ls6zCEEEIUU7f2GiyOCuM7sDg/PwWhRCRQJpOJgIAAIiMjbR2KEEKIYsrPz4+wsLBilySYTCYCKnkTGRVXoOcprs9PQSkRCZTZbCYyMpKbN2/edvZJdHQ0vr6+NoiscEk7SxZpZ8ki7SzaUlNT8fDwwGw2F7sEwWw2ExkVx/ULn+FgXzCxp6aZ8Ap6vVg+PwWlRCRQtzg4ONw2gbrT8ZJG2lmySDtLFmmnKGj2djrs7Qvma10pa4HUW5zJIHIhhBBCiDwqUT1QQgghRGll/ed/BVW3yE56oIQQQggh8kh6oIQQQogSwKqsWAtorFJB1VucSQ+UEEIIIUQeSQ+UEEIIUQIoZS2w2XIyCy8n6YESQgghhMgj6YESQgghSgCZhVe4pAdKCCGEECKPpAdKCCGEKAFkFl7hkh4oIYQQQog8kh4oIYQQogRQShXgLDxVIPUWZ9IDJYQQQgiRR9IDJYQQQpQAMguvcEkPlBBCCCFEHkkPlBBCCFECWJXCWkBjlQqq3uJMeqCEEEIIIfJIeqCEEEKIEkDGQBUu6YESQgghhMgj6YESQgghSgClrAW4DpT0QP0v6YESQgghhMijPCdQhw4don379jg6OuLm5sYTTzyRdZ/ZbGbs2LH4+/tjZ2dHtWrV2LBhQ9b9kZGRdOjQgfLlyzNmzJis42FhYWg0GgIDA8nIyMhWn0ajYevWrffZPCGEEKJ0uLUXXkHdRHZ5SqD+/vtv2rVrR8uWLTlw4AC7d++mb9++WfcPGTKEZcuWMXfuXE6fPs3cuXMpV65c1v1jxoyhRYsWrFq1ivXr17Nr165s9UdHRzNnzpwHbJIQQgghRMHK0xio0aNH06NHD8aPH591rEaNGgAcO3aM+fPnc+rUKSpXrgxAQEBAtsfHxcXRqVMnateujZ+fH3FxcdnuHzZsGJMmTeL555/HwcHhPpojhBBClE4yC69w5boHymKxsG7dOgIDA2nTpg0+Pj506NCBo0ePArB69WoqV67Mr7/+SsWKFQkODmb8+PFYLJasOt555x2GDRuGvb096enpdOzYMds5Bg8ejJ2dHTNnzsyn5gkhhBBC5L9cJ1DXr18nJSWFjz/+mH79+rF27VoqVqxI+/btiY+PJywsjIsXL/LHH3+wZMkSpkyZwpdffsnUqVOz6mjcuDGRkZFERkayZs0a9PrsHWAGg4GxY8cydepUEhMT86+VQgghRAl3ayXygrqJ7HJ9Cc9qzey+6927N0OGDAHg66+/ZtWqVaxcuRKr1UpGRgbz5s2jUqVKAISHhzNjxgzef//9rHoMBgPe3t53PE///v2ZOnUqn376KaNGjcpTY6Kjo2976S8tLY3o6Og81VUcSTtLFmlnySLtLNpSU1NtHYIoZnKdQHl6eqLT6QgODs46ZjAYCAoK4vLly/j4+GBnZ5eVPAEEBwdz5cqVPAWk0+kYP348gwcPZtiwYXl6rK+v720TqOjoaHx9ffNUV3Ek7SxZpJ0li7SzaCsJCZSMgSpcub6EZzQaqV+/PufOncs6ZjabCQsLw9/fn6ZNm5Kenp4tYTp37hwVK1bMc1B9+vQhKCgo2+U/IYQQQoiiIk+z8F5//XUGDRpE27ZtCQ0NZcaMGQB069YNR0dHatSoweDBg/nkk0+Iiopi8uTJjBgxIs9BaTQaJk6cSJ8+ffL8WCGEEKI0UgW4XpOsRJ5TnhKop556iuvXrzNy5EhiY2Np1KgRGzduxNXVFciciTds2DBCQ0Px9vZmyJAhvPnmm/cVWNeuXalfvz579uy5r8cLIYQQQhSUPO+FN2LEiDv2KgUGBrJu3bo8BxEQEIC6zQj/3bt357kuIYQQojRSWFEFNFapoOotzmQzYSGEEKVORkYGBw4cwGQyUbZs2awFoIXILUmghBBClCpfzpjOymW/UqdqOYxGHbHxqZwMu2nrsB5YQa7XJOtA5SQJlBBCiFLjypUrrFqxiI/f7IVGo8FisbJo7T7atm/Ptp0y5lbkniRQQgghSg0PDw8cnN0ZNXMNVquFjAwzPfr05dkBzzFu/Ae2Du+BWAtwFl5B1VucSQIlhBCi1HBwcOC3FatzHC8JC2mKwiUJlBBCCFECyErkhSvXK5ELIYQQQohMkkAJIYQQJYAVa9Y4qHy/5aEHasqUKVSvXh1HR0c8PDzo1q0bZ86cybpfo9HkuB0+fPiuda5evZqaNWtib29Pw4YN2bt37/0+TflGEighhBBC5JvKlSszc+ZMTpw4webNm9HpdHTp0iVbmV9//ZWoqKisW0hIyB3rO3XqFD179uSpp57i0KFDtGjRgs6dO3Pzpm2XnpAxUEIIIUQJYP1nLfKCqju3/ncf2wkTJlCnTh2uXr2Kj48PAG5ubvj6+uaqvm+++YZGjRoxevRoAD7//HNWrFjBggULeO2113IdV36THighhBBC5Epqamq2m8lkumf5efPmERwcjJeXV9bxgQMH4u3tTatWrVi9OuesyP/av38/7dq1y/pbo9HQrl079u3b92CNeUCSQAkhhBAlQOZK5AU1DiqzB8rDwwNHR8es26RJk24by6pVq3B2dsbJyYnVq1ezdu1atNrMlGPSpEksXbqUtWvX0rp1ax577DE2btx4x3Zdu3YNb2/vbMe8vLy4du1aPj1z90cu4QkhhBAiV27evImDg0PW33r97dOItm3bcvjwYaKjo5k2bRr9+vVjx44dGAwG3n///axyDRs2JDw8nOnTp/Pwww/fti5VRLeRkR4oIYQQpZ7FYrF1CA/s1hiogrpB5kKk/70ZDIbbxuLk5ESVKlVo2bIlixYt4tixY6xdu/a2ZRs2bMjFixfv2C4fH58cvU3Xr1/P0StV2KQHSgghRKmUnJzM+vXrWfHbIiKvXLJ1OCWaUuqOvVVHjhwhICDgjo9t3LgxW7ZsyXZsy5YtNh1ADpJACSGEKEUiIiJYsfw31q9dhTKlElqrAs91qoGTY302brPtoOQHVVT2wnv33Xfp3r07fn5+XL16lSlTpuDp6UmLFi1YtWoV169fp0mTJuj1en777Td++OEHVq1alfX4kSNHEhERwfz58wF48cUX+fLLL5k8eTLdu3fn66+/JiEhgf79++d7O/NCEighhBAlllKKw4cP89uSRRzYtxt3Fzta1K3E6OfbYm/37+WntPS7zyYTuRceHk6fPn24fv06Xl5etGrVik2bNlGmTBn0ej3Tp0/n/PnzaLVaatSowdKlS3n00UezHh8VFUV4eHjW39WrV2fp0qW8/fbbjBs3jlq1arFmzRo8PDxs0bwskkAJIYQo8mJjY9m6ZQuxcbHYGe0IqlyZpk2botFocpRVSrFly2YW/vgDl8LOU62iBy3rB9F7xGNZM8FKoqKyDtTChQvveF+nTp3o1KnTXR8/b968HMe6du1K165dcx1DYZAESgghRJFjMpnYsWMH69f+ztHDh3Cy01I/2I+yLvYkmCzsWPszUz+08tG0GVSrVg3ITJzWr1/H9E+mUL2SG31ahVCuV10bt0SUVJJACSGEKFJOnjzJKy8NplH1cjSpHcDTrR/L0dPUvjlEX49j2PNPMfnTWdStW5c+PbtR2deRsUMewdnR3kbR205RGQNVWkgCJYQQosiwWq307tWD2lXKEeDnxqXIGxw7G0F8cjoJSekkJKfi7e5C1QruuLo4kGayEBgYyEdTJtGhkT9tGle3dRNEKSEJlBBCiCJDq9Vy4uQpjh8/zq6d2/F2KUMtb288PDzw8PDAzc2N8PBw/jx4gMvhYfy2ch0eHh5s2biOz997Esi8lHf2UjQHjl/izKXr2Nvp6d+1MRV8bTvouKAVlTFQpYUkUEIIIYoUjUZD7dq1qV279m3v/9/7bty4gSkjnZ9X7+V02HVSTYo69RpQv3Uv/v7xB9xdDfh4lCms8EUpIQmUEEKIYs3R0ZE+Tw2kbr0GDKlUiR3bt7FqxW+cPHKQQT2aUtnf19YhFgoZA1W4JIESQghRLCUlJfHzTwu4fCmMuLhY1q/5HXu9olltf0Y8GYqLk8O9KxHiPkkCJYQQoliJjY1l+qcfs3v7Zjq3rE698p64VvPBo2MVDHqdrcOzGVWAY6CUjIHKQRIoIYQQRVpKSgp79uxh+9ZN/PXnAbCk83ibEHq93fu2C2kKURgkgRJCCFFkHTlymBEvv0iLugHUqVae7kM7oNeV3l6mu7EqhVUV0Cy8Aqq3OJMESgghRJGjlGL5st/4+ouPmfRKN1ydZTyTKFokgRJCCFEkJCQksHHjRlav/I0r4WFUD/Dkw9d6lupxTXlhQWEpoLFKBVVvcSYJlBBCCJuJj4/ny5mfs3vHNvSYaVizPE+1q4K3R31bh1bsyCW8wiUJlBBCCJvYvWsn77/7Bk8/Wp+JL3WUsU2iWJEESgghRKGyWCxMmjiOk4d2MfW17jg62Nk6pBJBtnIpXFpbByCEEKL0uHLlCt26PIJD2mVGDekiyZMotqQHSgghRKFY9tsSvpz+MW8OaF/iN/a1BRkDVbgkgRJCCFGgUlNTefO1V1Ap0Xz0Zi+ZVSdKBEmghBBCFIjk5GTm//A9vy5cQP/ODQmt09bWIZVosoxB4ZIESgghRL66cOECMz77hFMnjvBIs2p8+nYvmWEnShxJoIQQQuSL+Ph49uzexa/zZ9OrfV0Gdepp65BKFRkDVbgkgRJCCJEvRgwfykuDB/D+4EcL5XyXo26w9+hFTl+6TnxiGl5uTlSr5Enj2oH4ebsXSgyi9JIESgghxANb/OsiXHTJlHFxJCOx4M5zNiyKP/ac4vyVGKoG16Tr48/ySmgonp6eXL58mc8++5QnX5vBr9NHUM7breACKYJkHajCJQmUEEKIB7LwpwUs/OFrxr3crUDqN5ktbN57kg17z1CtRm1eeudDateujUajAeDgwYP836h3uXD2FHWrleOXz14tdcmTKHySQAkhhMgzk8nE5k2b+HH+d9irJCa+8jhabf6vzayU4vn3v8HV3ZfVa9bj4uKSdd/Cn35k3nffEFjOlW5talPx8Vr5fv7ixKIUlgIaq1RQ9RZnshK5EEKIXIuOjuaF556l6yOt2bbyOwZ2qs6rz7QvkOQJQKPR8O2kwXQIrUTfPt25dOlS1n3h4WFYLGauXE/im6W7iUtILpAYhLgdSaCEEKIEMplMJCUl5WudG/74g369u9GtSTk+easX/bo0wdujTL6e43aMBj2dH6qDk97Ed3O/yTr+7sjRbNy6m1Xrt/LhtNmMm7UKk8lc4PEUVdYCvons5BKeEEKUEBaLhQsXLnDs2FE++3gyep2G4SPeolefJx+47nVr1zJ35hQ+frMndkZDPkSbO1arlT+PX+DHNYd4/e33eazb49nuP3v2LCuW/ca2rRtxsDcSl5iCl7trocUnSi9JoIQQohhKTU1lx44d7Nqxlb9PHCclORGNsuDn7UqAb1kmDu9KWRcnRn4x64ETKKvVyidTP2DSK10KJXmyWq0cPR3O5v1nibyRTMvWbVm6ch1ubpkDwxMSElizZhUL5n2Lp4uehxoEMf7FhzEYSvdXmqwDVbhK97tNCCGKEavVymfTPmbr5g1gyaBONV/qVqvAI082Ji4hmegbcVy9mcDVmGS+XryLm/FJPNT2kQc+79GjR9FjYskff3IxIhazxYJWA6890x63Mk750LLMth07Hc7mA+eIuJ5Ey9ZtGPnBDFJTU1m3ZhUvDHyG9PQUlMWCg52eOlXLMXbwwzjYG/Pl/ELklSRQQghRTGg0GtzdPdAbDFhQHLsQw7HzMdg7OOJfqRL+AdUIqVUZf39/ypYtS0xMDOfOnmX+/B+oU6cuNWrUwM7OLs/nrVevHs8PewNvH18aNmyI0Wjk7NmzvP3qYCa/1hOd7v6G0yqlOHo6nE37zxB5PZkWD7XmvYmfE3HlCnO+msmrw54jqLw7jWv5M+q5h0p9D9O9WAFLAdYtspN3oxBCFBMajYbnBr3Ac4NeyHZcKcXevXtZ/fsyNqxfgyUjDUd7AxW8y+Dn5YJBr+W7LcsIi4zBig5HJxdq161HvQahtGvXDienO/ciWa1W/vrrL04cP8ovP/1ARnoqbp4+fDl7DgMHv8Kkb77mrYEdcXTIXWKmlOLYmXA27TvLleuJNG/ZhvcmfE5wcDAAI4YPw5x4haHdQ/Otd0uIgiAJlBBCFFPh4eHM+24O27duomagF60aVKZX0w733Lg3NS2DC5evsnPVd8z/fi6Lf1sBwF9//cXkD8aSlpKCVVnAakUpC4HlPWhRN4DHB7XFoNdx/MxlHu/SgU+mf8mIdyfy9rtv8PEbPW+bRJktFs5fusrJC5GcCrvBjfhUmrV4iHfGf0b16tWzlf31l5/JiAvnpX7t8u9JKkUKcrac9EDlJAmUEEIUM2azmZeHvkDCjSt0al6dT9/qmbUqd2442Bsp4+LIgRMRTJwyjYyMDMaPHc2ZY/t59el2lHW9e89PSLWKTHrFkw9Gv0Gj5u145/2xjP54AvWrV6JTjyrs2vgn56/EcDUmCaODE7Vr16VJu6d4MTQUX1/fO9YbVLkqX168SmJyKi5ODrlujxC2IAmUEEIUMTdv3uTUqVMAtGjRIsf9e/bsIT0+8oE27Z31y3bGTvoYNBoefaQtPdrUpO+wx3L9eBcnB8a/3I1tB07x+SfrcXX3o+dzb2Fvb0+dNk8yoH59KlasiFKKmzdvEh0dzdGjRzl27Bje3t74+Pjg6emJXv/v11Bw9eoMGvIKH303l4mvdL/vtpVWFpV5K6i6RXaSQAkhhA0ppfj7779Zv24127dsIi01iTLO9vj7liU+MZUvZzjww48LMRj+XT6gRYsWfDA+g0/nb6RmoBfOjnZYLFbKujpRt3qlXJ23T8eG/PTNx+i0MGFYJ1ydHfMcu0ajoU3jGrRpXIOfVu3hyuVwWrZ6iMTEBCaOG01kxGWUxYSbqyMeZRxxc7EHIC4pnZj4FOISU1BoQKtDWS04GPV4uzvj51UGq9VaYKubC5EfJIESQggbOnLkCE/07MZbzz/K+8+1wd4u+zpLM37aTHh4OJUrV846ptVqWbdhC2FhYezZs5vkpETsDQb+PPwXu45s46UnW9/zvPVr+FO/hn++taP3I40YMWUyRqORX3/4kue6N8Pbo26+1S/uTcZAFS5JoIQQwobq1q3Ly6+M4Jdlizl4MoJyns74ebliNOpJTc3g7KXobL1Pt2g0GgIDAwkMDMw6lpSURJ/unQoz/Cx2RgPT3uqNvY8z7w6yTQxCFCZJoIQQwoY0Gg0jXn+T4a++xsWLFzl//jwXzp8lISMdjb2W738chb9/Zk+R2WwmIiKCq1evZt6io7gaFUFUVCTXrl4l5uY1nu0aarO2ODnaY7QzkmGzCEo3GQNVuCSBEkKIIkCn01GlShWqVKkCdMx2n1KKZb8t5YvpHxNU3gM3VwfKOtvh7upI5bLONPb3xa1M5ULdo06I0i7PI/QOHTpE+/btcXR0xM3NjSeeeAKAS5cu0a5dO7y9vbG3t6datWpMnz4922MjIyPp0KED5cuXZ8yYMVnHw8LCsrqjMzL+/e1iNpvRaDRs3br1/lonhBAlwORJE9m2agGfvNmT1/q3Z8DjzXm8fUNahdagVtWK+HqVleRJZI2BKqibyC5PCdTff/9Nu3btaNmyJQcOHGD37t307dsXAL1ez9NPP82GDRs4deoUEyZMYPTo0fz4449Zjx8zZgwtWrRg1apVrF+/nl27dmWrPzo6mjlz5uRDs4QQomRQSrF54zoG9WqFUbYyEaLIyNO/xtGjR9OjRw/Gjx+fdaxGjRoAlC9fnkGDBmUdDwgIYPHixezatYtnnnkGgLi4ODp16kTt2rXx8/MjLi4uW/3Dhg1j0qRJPP/88zg4yCJqQojSQSmF1WpFd5sVxJVSKDRcirxBQHkvG0QnigsZA1W4cp1AWSwW1q1bx7vvvkubNm34+++/qVOnDtOmTaNOnTo5yh89epRdu3Yxbdq0rGPvvPMOXbp0oW/fvjzyyCN07Jj9Ov/gwYNZtmwZM2fO5O23336AZgkhRNFhtVqJjo7mteFDSUqKR1ksmWscaTQoZUVZLWg0oJQGjU6PVqPDaGePt48Pg4e+zC+Ll/Nkr8cZ0qsJNatUsHVzhBDkIYG6fv06KSkpfPzxx3zyySeEhoYyc+ZM2rdvz7lz5yhTpgwAzZs359ChQ2RkZDBx4kSefvrprDoaN25MZGQksbGxeHt75ziHwWBg7NixvPXWWwwdOlR6oYQQxVpsbCzfzf2G1b8v57133+blXg3uuU3KLSaTmWsxCbz/5su89Np7/LJkOZM/GM/cZUto3bAyXVrXueeed6J0sSoNVpX7LX3yWrfILtdjoKzWzCFkvXv3ZsiQITRo0ICvv/4ajUbDypUrs8otWrSIP//8k7lz5/LZZ5+xdOnSbPUYDIbbJk+39O/fHy8vLz799NO8tkUIIWxCKcWVK1dYu3Ytkz+cyFNP9qRLx7Y891R3HFLO8dnbPank55nr5AnAYNBT3sedSSN68PN3M5j33bdMmDSFNRu2U6FWW978eAmHTlwswFYJIe4m1z1Qnp6e6HQ6goODs44ZDAaCgoK4fPly1rGKFSsCUKtWLaKiopg0aRK9evXKdUA6nY7x48czePBghg0bluvHQeYg9Nv1WqWlpREdHZ2nuoojaWfJIu0sukwmE+Hhl4iNuUlaaipKKeyNepwcDLRr0YhuHVqi12fvHdI6uGH0y/saTUZg3NgmRN+I54+1q0Cro3qNmny34FdO/X2Sc8kJVK7oVWRm4d1vO23NmpZu6xAemKxEXrhynUAZjUbq16/PuXPnso6ZzWbCwsKyFnn7X1arNdtGkbnVp08fJk+ezNSpU/P0OF9f39smUNHR0XfdAbykkHaWLNLOomnJr4uYM3s6XVrWpE71ilQq6/LvnRYgCaxJ5FhM0ugXSkbkgfs+rzvg7gRp6Sa2rljNlgPn8ClfiWYt2zB37hzqBLnzRKdQm1/We9B22kpGusnWIYhiJk/Zzeuvv86gQYNo27YtoaGhzJgxA4Bu3bqxfPlyUlJSaNCgAXq9nt27dzNt2jTGjh2b56A0Gg0TJ06kT58+eX6sEEIUlMWLfmHO7M+Y8lpPDDZaUsDezkCnVnXo1KoOkddiWL19NempqazbfZpVWw7z1bhn72tjYFH8ySy8wpWnT4CnnnqK69evM3LkSGJjY2nUqBEbN27E1dUVo9HIpEmTOHXqFACVK1fmww8/5KWXXrqvwLp27Ur9+vXZs2fPfT1eCCHyi8lk4p23XiflxkWmvtHL5r08t/h5uzO490NYrVYOHr/Aqm0nOHUhksZ1qtg6NCFKvDz/hBoxYgQjRozIcbxz58507tz5voIICAhAqZzp7e7du++rPiGEyC9JSUk80asbjzarTJtH2hXKOa1WKylpGTg72ueqvFarpXGdKpI4lXJWNFgpoFl4BVRvcSbL2gohxF289carPNG+Jg1rBWYdU0qRmJzG8TPhHPw7gmsxidz6Dejj4ULdqr7UrxmIq/N/x2QqklLSuBGbyI3YBG7GJhKTkE5sYho345NISsnAqjSkZ5hIN5lJTU2nSe1KDHuydeaaUUKIIkUSKCGEuIOUlBR27dyFNi2YdbtPkZCUhlZvQKvVU9bNnYahTXhr7JsEBQVlPebixYts2byRL5duJObmdXQ6LVqtjoGDKrL8t8NodHpu3Izh6tVrXL92DScne7w9yuLs5IBRp8HVyRE7owF7ox6DXovJbMHOKAmUuDeL0mApoPWaCqre4kwSKCGEuANHR0f+PHyM06dPU758edzc3NBo7v5FUq1aNapVq8aQodnHf27Zspmb16Nxc7UntKoHVR8OpmqAL472dgXZBCFEAZEESghRKl2+fJmtW7eg1WixKkVc7E1ibl4nJuYmN2/cID4uFmU1Y7WY/9l2RQto0Wi0aLRaDAYjHp6eeHp64unlg5dPOby8vPD09CQ4OBgXF5ds57saFUm/TvUIKO+VpwU1hcgtRcGt1yST8HKSBEoIUaqYTCae6PU4DroMGtUoj06rRSmFi7MDvp4OuFTyoIxLxXsO4DaZLSQkphCXmExcwiVunjrJhT/TSUhO5/zlm5jR06p1O7p2607NmjWpU68BKy+F8cv8baxZt5Gu7Rrx4Rt9C6nVQoj8JgmUEKJUmfH5ZzSv6U2nVrUfqB6DXoeHmwsebi63vd9ktnDkVBgzJr/Lpag4Xhj6Cts3r6essz0TXu9H54fqPtD5hfhfshde4ZIESghRKpw8eZJR772Jr6uOoU+2vmd5q9WKUqDT3d8AboNeR6OQyjQKqQyA0a8cU1/rfl91CSGKHkmghBAl3o4d25k05h3eHdQRTzdXABKSUrhw+RoXI24QHh3PtZgkLFaFRqvj2o1Yjp88zUfvPEPrxjVsHL0QuSM9UIVLEighRLGmlCI5OZlLly6xfu1qtm3dhMVswsW1LP837gNq1qyJm5s7V2/EM23+ZjQaHUqjxd3Di5ohtanerBW1DQaSEhO5cP4MJ48fo5zGyv99/hoB5b1s3Twhip0pU6Ywb948wsPDcXBwoEWLFnzyySdUq1YtW7mDBw/SrFkzmjRpws6dO+9a5+TJk5kzZw5RUVH4+/vzxhtvMGTIkIJsxj1JAiWEKHaUUuzcuZN5337NlUsXcHGyw8vNmQbVyzPmhXYYDXpuxiYy+q1heJcPolOXx3l31FgyMtKJirzC6b9PcP3aNXZs/oP9OzZS0deN8l4uVPfzoGPfxjjlcgVwIYoSCxq0BbRiuCUP9VauXJmZM2dSuXJlEhISGDduHF26dOHs2bNZZVJTUxkwYABt2rQhNTX1rvXNnz+fDz/8kB9//JG6deuydetWBg8eTOXKlXn44Yfvu00PShIoIUSxkZGRwcTxY9izazu1K/vwZOtalPOuf9uyHm4ujH+5GxcuX+XkzsUYDToMeh3lXJ1o1rE6ZV0b3HNNJyFE3vXp0yfb3xMmTKBOnTpcvXoVHx8fAN599106deqEi4sLGzduvGt9+/bto3379jz++OMADBw4kC+++IKDBw9KAiWEELkx9v/ex41rfPpWz1wnP0EVfQiq6FPAkQlhe1aVeSuouoEcvUV6vR6DwXDHx6WmpjJv3jyCg4Px8sq8JL5p0yY2bNjAX3/9xZQpU+557mbNmvHmm29y4sQJatWqxc6dOzl79izt2hXO3pR3IgmUEKLIS01N5YvPP+PS6cM8NfhRW4cjRKnl4eGR7e+xY8cybty4HOVWrVpF3759SUlJoVq1aqxduxatVkt8fDwvvPACCxcuxN4+d5fKn3nmGSIiIqhTpw5arRaNRsPcuXNp3LhxfjTpvskGS0KIIiMtLY21a9fw4QfjiYuLA+Ds2bN0fqQt9innee+FTrYNUIgi7NYsvIK6Ady8eZOUlJSs26hRo24bS9u2bTl8+DDbt2+nRo0a9OvXD5PJxKuvvsqTTz5J06ZNc92uzZs388UXX7BgwQIOHTrEzJkzefXVV9mxY0e+PG/3S3qghBBFwunTp3mu/5O0bxJMBe8y9On+KI5OLqQmJzB2SKc7LlgphCg8Dg4OODg43LOck5MTVapUoUqVKjRu3Bg3NzfWrl3Ltm3buHLlCp988glwa701hV6v58SJEwQHB+eoa8yYMbz44os89dRTANSuXZuDBw8yffp0WrVqlb8NzANJoIQQRcK8b+cw4um21KxSAYDmDXJ+kAoh7syKBmsBzcJ70HpvJUl//PEHGRkZWcdnzZrF3r17mT9/PoGBgbd9bEpKCjqdLtsxrVaL1VpQO//ljiRQQgibU0pxYP9u+r3V09ahCCEe0Lvvvkv37t3x8/Pj6tWrTJkyBU9PT1q0aEGZMmWylfX29sbR0ZGQkJCsYyNHjiQiIoL58+cD0LlzZz7//HPq1KlDSEgIe/bsYf78+cycObNQ2/W/JIESQthcZGQkeo1VlhUQ4gEUlZXIw8PD6dOnD9evX8fLy4tWrVqxadOmHMnTnURFRREeHp7195gxYzCbzbzyyitcvXqVihUrMmHCBJ5//vk8tyM/SQIlhLC58uXL07pDF75ftpOnuzbFaJCPJiGKq4ULF+a67Lhx43LM4ps3b162v41GI1OmTMnVkgeFST6lhBBFwnsjRzP7yy+Y9P060lKSQFn/mbKsBa0W0KCUFWUx4erkgK+HMz4ezlQq506l8l64ON17YKsQJVlR6YEqLSSBEkIUOovFwtQpk9ixZRMvDHmJxb8uxM+vAkopvL19SEtzJS0tjfS0dBQKlBWLxYq7hzdNm7ckuHpNXFxcuHw5nFMnjrN62WHiYmOxWjJwcTRSydeNCj6uBJT3ooKvBwa9LhcxWbkek0DE1RiirscRHZOCZ1kHHmkRgqO9XSE8K0KI4kQSKCFEodu9ezeXTuxh6muPYVe+HBX7NuFGbAIajQY7oyd2RgN2Rj1Ggz7buKj4xBSOnTnKih83cf7KDdAaqVy1Gl269aRJk6YEBAQQGxvLmTNn+PvkSXacOML51VvJSE9FWS38W5UClfVfaHUG9AYj9o5ORF+7QcSVCDLS06hRpSI1K/tRLaBcYT9FQuSZ9EAVLkmghBCFbuvmP2jdqFpWcuRgb6RiOc97Pq6MiyMtG1anZcPqQObsvYirMRw/so6NK34k6kYCWp0Rb99y1GvQiI6du2E2m0lKSiIxMZ6kxMR/bgkkJSeSnJRMUlIiqSmppKWmYNBk0L5+eer1a4a/n6cMahdC3JEkUEKIQle+QiVuXtr9wPVoNBoq+HpQwdeDTv9ZT+9mXCJnw06zfcU+dDoNDkY9DvYGHOyNuDsYcXSzw8HeAwf7cjjYGbG3M0iyJIq9orwOVEkkCZQQotDVrVefuVuW06ZJrQKp36OsCx71XMj9ZhFCCJE3sheeEKLQ1a9fnwy9G6u3HbV1KEKUGEoV7E1kJwmUEKLQabVa5nz3A3HKg6NnIpi5cAtnwqJsHZYQQuSaXMITQtiEVqtlysefEh0dTUiderwx4mWG9GhIZX9fW4cmRLEks/AKl/RACSFsrkaNGvz0yxI+X7iTLXtPYjJbbB2SEELclSRQQogiwd3dneW/r0PnU5eRM1bx0Xfr2XHgFEoGXwiRK7d6oArqJrKTS3hCCJtRSpGWlsauXbs4c+YUZ0/9TXJyEiG167Bjxw60GmjeoBo6nXx4CyGKFkmghBA2M+vLGfh6e3FgyzL8vFwIreSBo4MHZrOVp9s8haEYbypsMpn5df1Bpn+3gnXfvU85P1tHJEo6VYDrQClZByqH4vvpJIQo9nbt2Maot16hmlPJWrHpTFgUX/6yAw+fCjzxWBvcyzjbOiQhRD6TMVBCCJupWbM2yalptg4jX1ksVr78ZTsvjXgLU+I13ni2g6xyLgqFUpoCvYnsJIESQthMuw4diU1ItXUY2WzZ9zffL7//bWZWbjnMMwMHM33aR7wxoAM6nXzMClESyb9sIYTNhIaGcjM+mWs3420dCgA/r9lHWIIDB49fuu86jAYtdvb2TP34U2Yu3EJSShpWqzUfoxTi9qwU4Cw8GQOVg4yBEkIUmuTkZJYu/pVjR/+iz5NP07hJE5o0bc7Qwd/QtUU1WodWt1mPTdS1WM5FpfLr0hmMfOdN3vh4Ce6ujvh4uODr4US1Sr4E+ftg0OvuWIdSCndXR44e/ounn+7P+XP9mb1sHYmJiTz9rD9vvfkp3ds3YFDvNoXXMCFEgZAESghRaF4dPpTKHlZaVPVj/KjXefXt/6Nu3fqsXreJLz7/jHenr8Tfx5VOLWtQLaDcHetJTE7l6KlwrsYkkpZhITXdRGq6mdS0jMz/TstAoUGj0aDRaLFarWg1Ci93Z7zdnPEq64CPZ1l8PMuQkWHm1IVIft9+nG++X4hSipdeeY3k5MFER0dz5swZYmNjORwZw49/bCYjNRkNVtBo0Wo1gAY0GpQCnd5I+Yr+vDj0WdasWUNERAQWi4WMjDSU1cpzPVvTrV29Qnu+RekiK5EXLkmghBCFQinFlUsXeK13TwCe6RLKnl07qVu3PkajkTfffpc3336XY8eO8f3cr/lq8RJqBvng5uKAvVGHVSlOXLhGTEI6bu6eNG/VmqZNquPs7Iy9vT1xcXFcv36da9HRREaEczn8Ei6urlQKCCIwqAp+5cuj1+sxm81EXLnCpUsX2L37IkajHRUrhfBQe3/GjX6PmJtXKefpiqO9EaNBh9Gg42ZcMpei46nfMJQXXnyJqlWrotFouHr1KkePHuXYkb84euQQN65dI+zcKaZ/OJJAv7JUruBJ6171cXFywOhXnurODW38Kggh8oskUEKIQpGcnExsfDLvf74Ci9VKeoaFTz6fhdlsZs43X3Hm9N/UaxBKSEht3nj7PVxcXNi3bx8RERFcvXqV1ORkuvbpitls4vzZ0+zfu5v1a35HWc1olAVvdxd8PZwp5+lCk0B3ejRpSEpaOlHXbhBx9Bx/bUvmakwSN+KSQKNHo9ECCqvVytXLZwitWYGXe9XH1dnxtvErpTgbFsWbw5+n9cNdeP3Nd2jXugU9OzQkqIIHgzrXpKxraOE+qUL8h1KZt4KqW2QnCZQQolA4Ozuz/8/DZGRkoNfr0Wq1nD17lm1bN5N4aS8tq3pz7vgG9m1cQmJyOokpaRj0euzt9DjYGbAz6jkWcxqvso7U9HGnQ62QOyY7tzg62OHp5krtYP8Hjl+j0VAt0I9Jr3Zn3JcreeqZAQRULMcTnRo/cN1CiOJHEighRKEyGo1Z/+3s7IyLoz11mtcGIKiij63CyjWNRkPDmv58+cXnlHH35sLlq8UiblHyWQtwJXKZhZeTLGMghLAZX19f0k0WW4eRZ4+1rYezOYpr0VdISCpZC4EKIXJHeqCEEDZjNpspjot0azQaurapS9c2dW0dihBZCnLFcFmJPCfpgRIFzmKxoGQEoriNCxcu4GBnsHUYQgiRZ9IDJQqEyWRi1Mi3SYiP59TJYxjsHVm7fjN6vbzlxL/8/f05fuSQfBIJkQ9kHajCJT1QokBs2bIFa/wlOjfyZtKrj2O1WNBq5e0msnNwcEBptFgsstWJEKJ4kd99Il+YTCYW/vQj6RkZ1KvfgKtXo/BxdyGwgjeffP8HH06dJgmUuK2ybu6cPrGXmlUq2DoUIYq1zHWgCmoMVIFUW6zJN5rIFx9NnsS+Tb9iijrAG68OpXPnrizddJRxs1Zx6O9LNGnS1NYhiiLK378S3y7bTXqG6Z5llVLsOHiKNz5azJBx84i+HlfwAQohxG1ID5R4YBcuXGDPjg18OKIHT701m0e7dMXDw4Pd+w+RlpaGpjhOsxKFxtXVlff+70PGfDiad57riIeby23LHT19ifm/H0Br50JKuok+HUPx8SxTyNEKUXRZVeatoOoW2UkCJXJFKcVXs2ay+vdlaFD4lKvI3O/nA/DRlA/o06E+Go2GCuXL8fG0zwHQarU4Ot59pWghANq1b4+buzsTxryPj6uWp7s24UZsIodPXeb4+atcuHyVI8dPUb9OTZrW9eKZQT1xdrS3ddhCiFJMEihxT+np6bw05AW8HdP4cHhnAEbP/iPr/lH/N57+/XpRsZwHerkoLO5T/fr1Wfb7Wnbu2MGM6Z/g7eNLbJyGmwlpVAsoxyv9WtMwJEjG0glxB7IOVOGSBErckcVi4aUhg7h08Rw924XQrF49AKxWK6aMjKxyFStW5NsfFjLo2b5kmMwopeSynbgvVqsVk9mMg4MDF04f56GGQbza6zEc7e1sEo9SihuxiZwNi+J6bBIpaWaSUjNISk0ntGZFWjYMtklcQgjbkwRK3FFaWhqxsbHotFpWbT+Js6M9tatVRKvV4mBQtG7RmCrVgpn11VwqV67Mz4tXoNPpJHkSuZKRkcGlS5dwcckc82SxWOjdoxtB3nY806EWvp6hhRpPSlo65y9d5dzla1y4Esu12GR0BiO+5cqTmJxGfHw80dFRJCUmUtnfh5rdZGKEKFoUGlQB7VlXUPUWZ5JAiTtycnLi16UrAIiPj6fnY48w7a3y6HRaRr7wKEaDjgPHL9Kj26N06NiZlct/o2Wr1kycNNnGkYuiTilFn57d0FlTGP7WWHx9fTl9+jQuRhMDe7QrlPOfPHeFXUcucikyFis6DHYOBFevSauHn+G5OnWoUKECu3btZPz/jaRuFW8erhtIpfKN8XZ3lcuIokiShTQLlyRQIlfKlClDn37Psmb7Xh5rWw/7f7bfaFKnMhV93bgcdY7W9SsSHFLbxpGK4sBisZCWksAnb/biclIsv/z8I0/2e5qoG0kFegn4RmwCa3Yc569TkTRu1oK+L7zDhQvnWb3yNxLibrB393ae7PcUFStWZP4P37Psl+/54OXOODrY5hKiEKLokp9RIteeeLIfC9fsx2S2ZDvu5+1Ok7pVOXgygs6du9goOlGc6PV6nFzcSM8wEVjek2/nfAVAvQahnL0Une/ns1isTJm7jrmrTtCx91CWrFhLenoGH4x5m/DD6xneqyFTX+vBuKGdGTPqPY4cOcKyX75n3EuPSfIkio3MhTQL7iaykx4okUNSUhLLlv3G4T/3ExMTg4eHBxcunMeSnsyAx5uh0+bsHYi+EYe7d3nKlJF1eUQuKSt6nQ6tVkuVCmU5duwYzz73Au+/MZQJrzyOXqfLl9OkZ5j4+Lv1PPHsMLr37MXcOV/z4YTRPPtYKAMf7pWt7LGzl+n4aBfeffNV3n/+YblUJ4S4I0mgRA7nzp3ji2kf8s6gLrjWDSIxJY3ezVvgdJd1d1ZtO8bgoW8WYpSiuNNqdcQlJuMAuLs6EhcXx0MPPcTAF0cw6esvGT2kKzrdgyUw+4+e58c1f/LOyDE4OTnRsX1r2jQM4NO3e9+27h1/XSS4jg8P1fPHrYzTA51biMImyxgUrjx/Oh06dIj27dvj6OiIm5sbTzzxRNZ9Z86coW3btjg4OBAQEMB3332X7bGRkZF06NCB8uXLM2bMmKzjYWFhaDQaAgMDyfjP9Hiz2YxGo2Hr1q330TRxv+rVq8egIa+wZPt5Fvxxmk/mb+FaTALpGSauxyQQE5+E1frv5q8ms4Xj56/RsmVLG0YtipsJH07lwznriEtIJj4xmfT0dAB69XmCvgNeYuyXK7gSffO+6k5JS2fS16s5eU3PqnWbCQyqzOTx7zHx5Ud5vF39OyZm58OvcWD3Frq2qXvf7RJClA556oH6+++/adeuHSNGjGDGjBlotVr+/vtvIHMz2S5dulCvXj0OHDjAvn37GDJkCJUqVaJ9+/YAjBkzhhYtWvDRRx8xdOhQOnbsSIsWLbLqj46OZs6cObz88sv52ERxP4YMe5khwzJfh3179/LGiJfw8fXF29uHtLQ0kmOj+L+hXdFoNPy+5TDPvTBUli8QeVKzZi0+mj6b+Ph4jG4BBAUFZd3X+4knqVy1Gl/O+JSI8G20qh+As4ORDJMZk9mKAhztDNSoUh4/b/ds9d6MS2TiV2uYMHkaLVq2AmDyB+MY8Uz7e65efubcBcZOe0Xey6JYkh6owpWnBGr06NH06NGD8ePHZx2rUaMGAGvXruXy5cscOnQIFxcXQkJC2LZtG1988UVWAhUXF0enTp2oXbs2fn5+xMXFZat/2LBhTJo0ieeffx4HB4cHbJrIL02aNmXXvkPZjo0a+S5HTl2ibvVKbDlwhrcmzbFRdKI4q1evPtHR0Xz6+Zc57qtfvz5zv19AUlISq1evIj09HXt7B+zt7VFKsX37Nj4Z/S0/fTwM9zLOWY/7btluPvtyLnXq1AEyF+e8cOECvk80vGc8cz54kcAK3vnXQCFEiZXrS3gWi4V169YRGBhImzZt8PHxoUOHDhw9ehSA/fv3ExoamrUoHkD79u3Zt29f1t/vvPMOw4YNw97envT0dDp27JjtHIMHD8bOzo6ZM2c+aLtEAXNydMRisRJxNYZaderj5CTjRcSDU0oxYvhQHu/yCP369ODDiePZtGkTrq5lKFOmLHGxN1m44Htmz/iYjJjzTH69D26u/773UlLTuR6fkZU8paenM2zIC3RuUT1X46lqVa1YYG0ToqDJLLzCleseqOvXr5OSksLHH3/MJ598QmhoKDNnzqR9+/acO3eOa9eu4e2d/Zebl5cX169fz/q7cePGREZGEhsbm6MsgMFgYOzYsbz11lsMHTpUeqGKsG1bNzF1xGNs2XeCps3b2jocUUJs2rSJ5BthfPBSR5JT0jh/+SrHti1CKdDrNLg62/NKn4a4OP372WAyW7gSdZO/ToWz/a9LTJo6DYC//vqLt19/hV7tatGyYS1bNUkIUULlOoG6NWi4d+/eDBkyBICvv/6aVatWsXLlSlQu01ODwXDb5OmW/v37M3XqVD799FNGjRqV2/BEIdq/fz+Bvq6kpKWzZsdJZj832tYhiRLioYceYvIHY4lPTKGMiyN1gitRJ7jSbctmmMzM/HkLN5OsVK9Zk4bNujHqkz5cvXqV5/o/hTnlOv/3Yodsl/eEKMlkDFThynUC5enpiU6nIzj4380zDQYDQUFBXL58GR8fH06dOpXtMdevX8fLyytPAel0OsaPH8/gwYMZNmxYnh4bHR19216rtLQ0oqPzf3G+oqaw2hkVGcGwV17jXPh1Znz9A87OzoX6/MrrWbL8bzvfeud9HFz1GJ3u3AOdnJLGufDrjHh/Mr6+5YDMWbtbtmwmPvYmrwwdeNdlN2xB6+CG0a9w9/ezheLaTmtauq1DEMVMrhMoo9FI/fr1OXfuXNYxs9lMWFgY/v7+uLq6Mm3aNJKSknB2zvzFt3nzZpo0aZLnoPr06cPkyZOZOnVqnh7n6+t72wQqOjoaX1/fPMdR3BRGO9PS0hgz6l3ef7ELm47F0uuJfgV6vtuR17Nk+W87o6Oj+fyTSXz8Zi8y4m9ffuOek2w/GsXXc+dl9Wb/sX4dUyeNpW+nBjStWwXiIsmIK6QG5JLRL5SMyAO2DqPAFdd2ZqSbbB3CA5O98ApXnmbhvf766wwaNIi2bdsSGhrKjBkzAOjWrRv29vaUL1+e559/nrFjx7Jv3z4WLlzI2rVr8xyURqNh4sSJ9OnTJ8+PFQXL3t6eT6bP5Ivp05jx5de2DkeUIHFxcTzdtxdvPtP6jmXOXIxkx7Foli5flbVK+PZtW/nik4l8/EZPDAZZG1gIUTjy9Gnz1FNPcf36dUaOHElsbCyNGjVi48aNuLq6ArB69WqGDBlCw4YN8fHxYfbs2VlLGORV165dqV+/Pnv27Lmvx4uC06HDI3To8IitwxD55GZSMh7Otp9FOWL4UF7q3ZSK5Txz3KeUYs/hc/y89hDLfl+XbYsVH99yaLQaklLSKeuq43pMAuFRN7h6I4EMs5X0DDM3E1KJuhbH+q37mDZyIA+FBuc4hxDFnfrnVlB1i+zy/HNtxIgRjBgx4rb3BQcH39eq4QEBAbcdhL579+481yWEyL1dZ8KYv/MQXeoF062BbWeqxdy4RrXA7GNnzBYLG3efZN2eU7Tv8Cgr12zIsd9icHAwzw95ne+XL+XmzRuUL1+BasE1CG5eBa1Wy7ZtWzl8egd2enhrcHfqBFcozGaJXEhISsXB3ohBnz/7HwpRGKS/W4hS6u+Iq/y46y9MZgsr/jzJjcRknnso1CarcCulsFgysh3b89dZfln/F3369Wf1uK8wGo1kZGRgsVjQ/c9Gw9179qJ7z17s27uHBT98x+5d29m8cT0WUxqNa1VkyoiueJR1QRQ9CUkpDBr9HSP6P0zLhtVtHU6xJrPwCpckUEKUQhE345m5fi8ZFjMajcJq1bDrzCVuJqXyeqdW6B9wE9+80mg03Pp4TkxOZfLcddQLbcXv6zbj5OREREQEz/Xvh5O9ltiEFLp060m9+g0JCgrC398fvV7P559NY/vGlQzp0wpPtyoYZTxUsTD12/UMevElrkUcundhIYoQ+YQRopSJT0nliw07Sc7IQCnQ6kCjVSgrnI26wZno69Qs71PocRnsXVj6x352Hg7j4+mzKVOmLNOnfcy5c2cIu3COd5/vQHkfdywWKweOnWfn74f59UYi0TcSSDdbaVyzAuNe6ib72BUzDg52dOjQgQ9Gr6VnB1tHU8wVYA8U0gOVgyRQQpQiGWYzX27aSWxaMno9WMxgtWjRaRUaraJX4xCbJE8AC3/9jdWrV9P/1fp4enrSvWtHBnVvTOvONXB1bpCVGOl0WprWq2qTGEX+a90wiB3bt2LVOZCUknbPDZ+FKCokgRKilFBK8fW2XVyOjUGj1aDTARrQWBQWC3QMqUbHOrabnebg4EDv3r0BeKJXd4b1aU6NyuUL7Hw34xI5cfYyUdcTeeLRxtJzZQNR12JZt+sUPfs2pVKlAOISkiWBegAFuWed7IWXkyRQQpQS83Yc4MTlaHQGhVJarCh0GoVWCw0DKtCveV1bhwjAls2b8XKyFEjydCX6Jmt2HOfEhWscOnKS+IREGtUNpmeHhrKGVCFRSjHjp81EXE/E27c8n375PVWqVOGVA/vQ62QWnig+5BNDiFJg2f7j7Dx9CY1GixUrBkNm4mRVGqr4eDK0fdMi0QOjlOKjyRMY/cLD+VrvyXNXWLDqAOUqBlG/cUdOXVrIawO78Gir2jg62OXrucTdaTQaIm+msnbjjmzHTSYTen3hTl4oaWQWXuGSd6sQJdzmI5dYvPs0FgtYrWA1abCYNGg04OfmyvD2LdEV8qy7Ozl8+DABPs64Ot95H7y8uBRxnXGzfmfHqWTGT/kcvd7A9vW/MXZIR3o90kiSJxup7FeGFwcNyHbMZDJlWyBViKJO3q1ClGCHz1/nm99PkJasIy1Vi8WSuVdWRobCSe/Ay+1a4mA02jrMLFs2baBRrYoPVEd8Ygq/bTjI29N+Y8XeSF4Y/i5JSYlMHvMm7WuXZdSLnSnj4phPEYv78WKfVkRcDst2rF6DRhw4esE2AZUQt8ZAFdQtt6ZMmUL16tVxdHTEw8ODbt26cebMmRzlDh48iMFgoGXLlves89q1awwYMAAPDw8cHR0JDQ0lKioqL09PvpMEqghKSkpiyeLFfPjBeMLDw20djiimLt+IZ9ryA2SYLZCuJ/2fJMpsBnuDgZfatcTjn42/i4o9u3YQUi1vCVT0jTi27D3OnCU7ePez3/hi8UFqP9SbxSvWUaasG/Nmf8yTbQIZ+9JjBAf5FVDkIq+sVmu2vwe/OJQ9p2LYdeisjSIS+aVy5crMnDmTEydOsHnzZnQ6HV26dMlWJjU1lQEDBtCmTZt71peWlka7du1ITk5m7dq1HD9+nDFjxmBnZ9seZBkDVQQtWfwrY0a/x6ih3RkxpD9+laoxZvwH+Phkn15utVrZsmUL+/fuJiU5iYcf6cTqVb8zYOBz6PXy0pZm8ampfLpmF2nWNDDqUSbQZOgxY0WLlkGdQgnwcrN1mNkopUhMiMXR/u4fionJqew+dIZTl25yKSqWSoGVad6yDc/3akiNGjWws7MjPDyc7o91ole7EAYM6XLX+kThS0pJo6xb9j0P7e3t+WXxbwx4pi8ZJjNtm9SwUXTFV1EZA9WnT59sf0+YMIE6depw9erVrO+xd999l06dOuHi4sLGjRvvWt+cOXNIT0/nl19+yfpuCwoKymML8p/0QBVBA597nmmfzmDVnotYFdy8coqH27bi4sWLWWWsVisvDhrIyh8/p4LdNezSLnHl8iV+/eVnGUdQypnMZmZv2UmSKQkHBysGezMYLVh1VjRmHf1b1qFhUMEtD3C/Lly4QHkv17uWib4ex6gZK/EN6cDID2bwx5ZdzP1+Ac8PGkS9evWyfpEumPcdA7rUp1XDaoURusijxesO8niP3jmOGwwGFvz8K9uPX+P4mcs2iEzcS2pqarabyWS6Z/l58+YRHByMl5cXAJs2bWLDhg1MmjQpV+dcvXo1TZo0YdCgQXh7e9OwYUOWLFnywG15UPJNW0T1ebIvv6/ZwE9LVvPkoNfxcnPmreHP0bnDQ7z1+qusWbOa/Qf2cyEqkZ/XHyXFWIFGjZuxbsNmSaBKMaUU3+3dRWRiLAYj2Dlasbe3YjRa0RktdGkeQOfGtv/ldjtHjhymvNedLymevhDJh99uYN5Pi3nmmf5Urlz5jjMHr1wJx8Upfwaii/y1YfcJzA4+9H3q6dver9Pp+P6Hn5i7/ADXYxIKObpiThXwDbLGIN263SkJWrVqFc7Ozjg5ObF69WrWrl2LVqslPj6eF154ge+//x57+9yt+RUWFsbixYspU6YM69evp3///vTt25ddu3bl+SnKT3Kdp4hzdnamR4+efDLlAxrXqsDRc1dJz0ina9fH6Nr1sWxlo6Oji8RUdGE7y08c5MzNKHR6beaoTy1oNAo0FupVq8jADjVtHeIdde7chS8++xj/cpnbtZgtFsxmK9dikzh4MoKgqtVZsnw1Hh4e96zrnZH/x9vDn2PsS4/ds6woPEdOXWL33zdYtHjZXcu5uLgw5/sFPPt0H8p5lsHXwwVvN0f8y3lQq2oF7IyGQopY/K+bN2/i4PDvj5M7DRdp27Ythw8fJjo6mmnTptGvXz927NjBq6++ypNPPknTpk1zfU6r1UqFChX4/PPP0Wg01K9fn23btvHdd9/RokWLB27T/ZIEyobWrl3N93O+IjU1BTRa/PzK0++ZgTz00EM5epGWLF/NH3+s4+lXO1ChQgUbRSyKsj1Rx/jz+lkMdhrMWgUaUCYNGqxU8fbk1SK+2ra9vT0zv5rLpo0bMBqNOBjtMRiN1PDxYdz0thgMufvStFqtLPhhHvWry7+T/JJhMnPtZjwmk4WACl739T66HHWD+asPs+z3tehysWBmUFAQO/f8SXx8POHh4Vy6dIkTx46w4vttpKUmAwoXByMBfu4E+JWlir8vPp5livR7vKAVxhgoBweHbAnUnTg5OVGlShWqVKlC48aNcXNzY+3atWzbto0rV67wySefAJn/XpVS6PV6Tpw4QXBwzt0QfHx8cHJyyvbaBgcHc+iQbTeglgTKRuLj4/lk8gQmj+iOg70RpRRR12NZ9fMMJvzfuwx9+TWe6Nsvq3y5cuUYMOA5G0YsirIryWc4GrsLJ2c7kjWGzH0/NVqUUni7OGeu9VQMLu3WqhVCrVohD1TH8wOeJshTS9d29fInKMGew2d556Of6Nq5E/E3t/Pc402oVTX3syXjEpL5aN4mflmyEicnpzydu0yZMtSuXZvatWvTtWvXbPcdPXqUOXPmMOvXzcTGxlKpoh8vPdGcOsGV8nQOUfBuJUl//PEHGRkZWcdnzZrF3r17mT9/PoGBgbd9bNOmTVm+fDlKqawk6ty5c/j7+xdK7HdS9D9RS6gF8+fRvW0IDvaZa/BoNBr8vN0Z8HgLXun3EDM+/9TGEYriIjU9moi4tXjZJePulIqzcwZGezMGOyturnYMfeghHG083bcwpaWlodOW3l6IgtA6tAaLpo/g5tUIBr/8BrvOpDJu1u9EXI25bfkMk5mU1HQATl2I5P9m/s6XX3+Pr69vvsUUExPDqy+9QCWnON54pjUDe7YiNTWNz+dvyLdzFDdFZR2od999lz179nDp0iX2799P37598fT0pEWLFlSrVo2QkJCsm7e3N46OjoSEhGD8Z026kSNH8uyzz2bVN3ToUK5cucL777/P2bNnmTt3LitXruSFF17I76cwT6QHykbCL4XRvLI7N2IT+PtCFK0a/ttt+eSI6XR59BHefnMEDUObUb9+5u70ZcuWzVXXtyg9LJYkYhI3UVarRRkVRl0qOq0ZrdYRU5qep6o3x8vZxdZh5iur1crMGdPZsmkDoY2b0rxVa0JDQ7N6Nn76ZQlzvvmK1z+aT/+ujWgU8u+geZPZwuGTF9l99BInzkbQokFlBjxuuzEUxUlAeS+mvtGT4R+MZ/bcBbi4uPDCc88waXgXXJ0zFyZNTcsgOuomU6evxMvLm/i4m6A1sGLNRsqUKZOv8fz80wJ6ta9Dm8aZyx00ql2Zx1rX5Ur0zXw9j8i78PBw+vTpw/Xr1/Hy8qJVq1Zs2rQp1++BqKiobGsgVq5cmVWrVvHGG28wffp0qlSpwi+//JKncVQFQaNU8d9jOTU1FUdHR1JSUm57bTY6Ojpff/nkh3179/DOG6/g7unF+Qth/DhlUFbXZEJSCiaThdiEZM6GRXMuIpbE5HSuxSTQrccTjHj9zdvWWRTbWRCknZms1gzi49djssSSYc0gxZpOoiWda2Yr19LsaOzViRruVQsx4vuT19dz5DtvYZcRQdfWdTl1PoLj56P5++JVMiwaKvoH0Kfv07Rr157k5GSmfDiRA3t3Ui/Yj7PhN0g3a7geE09yUhJ1q/vTrXUItYML5zKA0S+UjMgDhXKughATn8TKzUdIVK58Nec7tFotBw8e4I1XXqRiOS/iE1MwWbV8+NGn1K/foMBnA//fqPeo6ZlKSLX8ef3S0k007jXyjt8jRdmt78AuC99HZ1cwA+wt6SZW9/uwWD4/BUV6oGzg779PsnTJr3Tq+jjNmrfi3JlTvPnx97g4OZBusqLV6dEbjKSmpuLr7kCXVjWpHlSeLXtPEn5ZViYXmb0wyUk7wJqIXvvvP2OtRoOGdKr7hBJYtugnT/fj6JE/mfxKFzQaDXVrBFC3RkDWfVHXYtmw5Bs+mjSW2nUb8vzgoYwZN5G9e/cSHBzMi4MG0O2h6nRsWfueC3aWdhaLlb9OXmTboQtE3UzGr3xFHu/xDN179Mwq06hRKD8v/h07Ozvc3d3R6XRER0cXylIqfZ/qz9Sxr+dbAiVEXkkCZQOfTfuIehX0uBrN/PTVZNwr1mLtpl2kp6fnGGB56tQpvp0zm/lr1lIzpA4Tc7nwmCjZMlIPoiw30Wi0aFDoNXrQaNBqdLg418CnjG27tgtKRkYGWmW+40yrct5u9O/WjP7AmbAoPp/0LpeuxtOwURMmjH2fwd0b53mrmNLEbLGw69AZdvx1kaQ0xUNt2jP6wzeoUqXKHR9jq1nBtWrVwr6MH0dOh1O3kHoRi7r/LNdUIHWL7CSBsoGRo8Yy8Jk+vNm/Pa/2f4Rxs1YSHh6ebWn6r7+axdnTf3Pjxg26Pd6Dj6d9bsOIRVGSkfo3yhyB9p85IEqj0CgLOq0WO0NFXJxb2zjCgnPkyBGqVPS8d0GgWkA5qgWUw2Kxcj48mq4NO+PqLJce7uZGTCJf/LiRV0e8yUvDhxf5JQFef+tdvpj8riRQwiZkFp4NBAYGsmjpKn7aeJpZC7dQxlFP5cqVeX/ke0Dm5Zn/+7//w985iWAfLRcvhtk2YFFkmNOvgOk8Oo0OrUaLVqNBiwatVodB54aLc+sSvRJ95nYvedsAWafTUi3QT5KnXPD1Ksu8yYP59JMpNl9jJzd8fHyISUixdRhFxq11oArqJrKTHigb8fX1ZdGS5ezdu5eYmBje/WAW1apl7tul1Wr5+9QZ+vbuTnR0FBu2TLNxtKIosJhiUOlH0SgFWi16rR6zVYNSFjRaO+ydWqPVluwVmuPjYnB2lEQov6WkpbNuxzGuxSZz4lwU33z7Aw0bNrR1WPdUtmxZEpPTbB2GKKUkgbKxO03D9PDwYO2GLZw8ebJUzDgTd2cxJ2NN/xOwZB5QCo1Gi16rwaL0GB1boNPnbYHC4qhixUqs3buOFg1zrlYs7k9SShrvfPobI94cyZMhIfj7++Po6GjrsHJFq9WCRpZ2ySKDoAqVJFA2dO3aNY4fP05qaioeHh5Zt7Jly6LVatHr9dSpU8fWYQobs1pNkPYnGms6Ci1orIACpUGDDoN9PXQGd1uHWSge7dyZed99w4XLVwmq6GPrcIo1s8XCtv2n+H3bccZOmMLDHTrYOqT7pM22QrUQhUUSqAKQkZHBxYsXOXfuHDduXCchPo7E+DjiE+KJuXmTqMgIrJYMyjrbE+jnhr1RT2JKOvHJ6cQnpXHq3BUWL/udqlVL5jR0kXtWqxXSDqGxJgEaNIAVLfBPEmWoit7Oz7ZBFrLPZ35F316PMXH4Y5R1Lfm9bvntZlwiyzcf5sSF6/To3ZcVa2fg7Jy3cWVFSWDlqkRcjaGC7703mS7pCmMvPPGvEp1AXb9+nakfTqRpsxZ8P3cWWp0BD08vHu3ajV69+mTbRToxMZHNmzeh1+np8j/7LUHmQmXnzp0jNjaWuLg4YmNjiI25QVxsDLGxMcTHxRFzMwaLOQOdxkp577L4eTlTxskORwc7PJ3tcPKyx6VuIB5l69zx15LJbOGtT5bIZTuRKf0YWDK3y9BoNChAqxRWNGgM/ugdSl+S7evry8yvv+eVYYN4+YmWBAeVrgTyfl2OusH3K/aisy/DsOGv8dlDrUtEr03rdh04vG+FJFCi0JXYBCoiIoJn+vZiSK+m1K7qy5QR3VBKEZeQwqZdK/hp/jymTZ/J/v17+e3XXzClJdKoZnnCImP469AB6tZvxF9/7ufYkcOkJCdg0EJF37K4Otnh5GDA2dGOMo72VPBywDnAAxenCjg72j3wDKi5S3cw/LW3cXEpWdtviLwzaq6A+Rqg+edmRYMGhQatzhOtfW0bR2g7ISEh/LZyHc89+xR1AyN4tFVtnBztbR1WkWS1Wlm09gB/X0li+sx5VKpUsjbabdWqFct+/oaubW0die0p8rZnXV7rFtmV2ATqyxmfMbR3M2pWqUDml0/mL3i3Mk707hhKzXNXmDz6VapW8uTNp5vh4vTvzJ5VW49wePNZggN8eLR/C+wLaGn827kYGU/PXn0K7XyiaLKkR2GvvwL8572nNKDRoNG5oHFsVCJ6Dx6Em5sbS5evYuHPP/HRj79gSU+iVf1AWjUKllXG/3Ep4jqf/7SVpwa8wKQvB5XI94yvry8xiTITTxS+EptARURcpmvDO/9Cr1mlwj/JVU5d29QtqLDuSTaRFxZzHCrjCEpZyep90qjMn4AaO3BohEZmHgGg0+l4pv+zPNP/WeLi4li2dAkffr8YjSWN9qFVaN24RolMGu7FYrHy8+p9nL+axg8Lf8PPr+Re5jSbzVjMFluHUTTILLxCVWJX3IuJicHB3mjrMPLkZlziPwOERWllMadiTtmH1ZqBwoqy/jNYHAA92NVHq5VLVbdTtmxZnhv0AitWrefbH38jxSGI//tiBQlJpWuhxYuXr/H2tKXUadGVJct+L9HJE8CJEycIDvDCZLZkTroQopCU2B4oU0YaumK0IvPFy9f47MctzJ4739ahCBuxWs2kp+xCa00BjRalwIpCmzl0HI19CFqDm63DLBY8PDx4d+QoDj/ahVHvvYGLvZaH6gfSpG4VjIaS+bFntlj48fe9hN80s2DR8lI1EeWvUxF88N1WEuLiqFXZm+7t6uLp5mrrsAqdzMIrXCXzkwTo1ecppi9YwWv9H7Z1KHd1PSaBZZsOE34jnUW/rcLb29vWIQkbUEqRlrIXqyUOAK0mc4Vxq7KCAq2xKlpjye5JKAj16tVj9brNREREsHTJr4z9ajV2Ogst61WieYNqJWas1OkLkcxevJMXhrzCJ089XaouW9atW5ddew8Cmf+Odu7cydQJI5n8Wg8bRyZKuhKVQMXFxWEymdBqtTz1zLOcOn2GlVsO0+eZxrYOLRulFPuPnmfVjpM4lfFi6Mtv0bJly1L1oSeyS0n5C4spEgBFZvJkubXWk94PnX012wZYzJUvX55XR7zOqyNe58aNG6xY/htTf1iGOT2ZkMo+lHW2p4yLA+kZJpJTM0g3Wank50ajkMq2Dv2ObsYl8seuExw4eYUateqycMnvpf4HmEajoVWrVkwppWMElSrAWXgyBiqHEpVADX+hHzqd9p83kaKsiwMNQ4vOF4/FYuWPXcdYv+cM7Tp04psfxpf6DzwBaWnnMKWfJTN/1oBSKI1CKStK54beoYGtQyxRPD09GfTCiwx64UUSExM5dOgQ165d4+aNa5R1ciagrBv29vaMfv89hlohtE7RSaKUUuw8dIa1O//GpawXzwx4ngkzOmVb006AVls6EyhRuErUv7r3BnUq1CUHckspxea9J1m57QS9+z7D2olzMRqL1wB3UTAy0qNJTz0MqH/GPWX+zFNKYVUOGBybSs9kAXJxcaF169bZjqWmpjL6/XfxKmtPOe+ytgnsNo6cusSCVQdp3b4jPy35BFfX0jfGJ7e0ulKaQMksvEJVohKooubWr8WlG4/S9fFerNkwC3t7mUElMpnNiWSk7UODFfWfJEmhUBoDZkLQ6UrGGJ3iIj09nX5P9KJzU38Gvt4LgISkVD5bsIk0k0JZLTzcpBoPN6tZYDFYrVb2HjnHpn1nMVus6HRaEpPTqBFSn4VLV+HuXjr2PXwQBoMdJrMFg76UJlKiUEgCVUD2HT3HonV/0faRzqxc+xlOTrJnl/iX1WoiI2UPKBMaNGgUaFCZSz1pdNg7NCElTXqeCtvly5e5Gh3BzVh3Ll6+RqXynuw9fIauvZ5l4HPP8clHU9Anny2Qc8fEJ7Fm+zEOnLxCp87dmPntRFxcXDCbzeh0OhwdHQvkvCVRnXr12X7gFO2b1bJ1KIVKZuHllJiYyOrVq9m1axeXLl0iNTUVT09P6taty8MPP0yjRo3uu25JoPLRrcHhSzYeoXHz1iz9/Q/pZhe3pdEoNGjRarRYlQWUCdCiQYu9Yz2MduWAaFuHWepUqVKFVes2s2XzZnbs2cGcFevRaLXMHNYegFat2zDyzaXYGw00qVsFjUZDSmo6kddiiboWi06nxdPdFS83V8q6Oua4/JqUkkZ45A3Co24QcS2Jy1fjSMuwoNEbcHf3pN/TzzF51qMPvCVUaff+6LH06dmNcl5l7rhgsijZrly5wvjx4/n5558pX748jRo1omrVqjg4OBATE8O6deuYNGkSAQEBvP/++/Tr1y/P55AEKh+kpZtYs/0I2w9dpN3Dnfh5iXSzi7vTaIzYu7QjPWkbFtN5NCoNNEaMDqHY2Ze+DYKLEg8PD3r36UPvPjm3VGrSpClLf/+DWV98zlufLsfezh5nF1cCgyoTWLkxZrOJw5fDiTxwhps3b2A1m7BYzKCsPPdiBZYtPUTVatWpXrcz7YODqVKlivzIKgB6vZ75Py2i+2OdGNTNSvUgPwwldP2v/5JZeP9q0qQJgwcP5vDhw1StevvP1PT0dNasWcOXX37J5cuXeeedd/J0jpL/jipAcQnJ/LhqH+HXUhjw/GDe/7gPBkPRG8Quih6rJZGMtCNYrfFoNAZQ6SilRacvb+vQxD24ubkxasw4Ro0Zl6fHRUdH07vPkwUTlMjBxcWFH35cxFdfzmDJ1q2kpaZQxknPyBcelYkZpcDp06dxdna+axk7Ozt69OhBjx49SE5OzvM5SlQCNfbLFbz+7MP4epYt8HMppZj63XreGzuVli1bFvj5RMliNkVjybiaObFF6wTo0GDElH4So50sbSFEfqhQoQIfTP4o6+9BA58hLiEFtzIyJrWku1fy9L/uZ5xyiUqgwqNieGTgB+z8ZSKuzg4Fe67IGwRWDZHkSdwXg10VTOnnUNYk0GhQWjuUAov5KhkZVzEafWwdohAlTmBgEJHXYiSBKmXGjBlz1/snTJhwX/WWqATq2wkDiIlPwsmh4Kd+h0fe4ODBQzzZ+3HKlStPh06defTRzjL4U+SKRqNBb1eV9NS/MhfMVCrzsoKC9LRjkkAJUQACqwQTeeIPalWtaOtQCoTMwru9HTt2ZPvbZDJx+vRpTCYTDRrc/0LFJSqB0mq1VPD1KJRztQqtQavQGqSlm4i+EcebI17GxWUBDz30UKGcXxR/BmMQ6emnwZp57T0ziQKL+SYZ6ZGAJONC5KegoCCO7sj7WBdRvG3ZsiXHsYyMDIYNG0bdunXvu175hH5AR0+HM/3HLYyf+KEkTyJPtFotRmMwSlmzprgoBcpqJT3tmI2jE6JwJCQkEBUVRWpqaoGfKyAggKgbiQV+Hlu5NQuvoG4lidFo5J133mHy5Mn3XUeJ6oEqTFeib/LV4p3UqBPKijWbcjVgLTU1lcOHD/Pnwf0kxMdjMqXj4lKGOvUaULt2bXx8cl62MZvNpKamYjKZ0Ov16PV6DAYDer0+TzNJ4uPjCQsL4+rVq9SpUwdfX988tVcUDDv7ymRknMFiSUApa+Z+eBowm2OBa4C8TqLkUUqxaeNGZs+czo1rkez/6yQLF/5C9x49CvS8Pj4+HD97hRWb/qRx7SDKebsV6PlE0Xby5EmsVut9P14SqPvwx+4T7Dl5nemzfyAwMPC2ZZRSnD59ms2bNrBvz05uXLuKXmulqr8X1fw9CXSyR6fTkZwSy9blB/l+ViyxiWno9Ha4uLiSlpZKeloKWqzY2xnQ6bRYrVbMZitmiwWLxcqtb9vMPWg1DHzhJeZ9+1XW37fWtlYWM04OBsp5lsHVyci82THEJKbRoFETxo6fhJ2dbBdiKxqNBjv7GqQk78183ZQmKzHWcB6oY8vwhMhXKSkp/DDvO5b++jN1q/pSL8iV7QnxHDj4JyEhIQV+fq1Wy+Ztu9i6ZQu/rVnJiWOr+eTtPjjal5DPQNkL77aeffbZbH8rpYiOjmb79u288cYb912vJFB5lJySxtpdp1m/aTu6/9mwMiwsjI0b1rN5w3pibl7D37cs9YPL8UKXWpR1bXzHOhvV/ne3d6UUqekZGPT6PO/jZPTzY/Krj+W6/I4/z9D5kXZ8OmPWA10HFg/GaAwgLfVvrJb4zLw3c0MXNCSRkXYZo33JHPAqSr6MjAwuX77MpUuXWL1yGceP/knHZsF8/EZ39h05z6FLGaz5Y0uhrp9XtmxZuvfoQfcePXj7zRFcu5lAQHmvQju/KHz/+12t1Wpp2LAhr7/+Op07d77veiWByqOfVu3F09uPj6Z8SHp6KlGRkURGXMFiTsfbzYkG1f14uVeD+15GQaPRFNqvoVYNq1GnWgXeeOVF5i/8jfLlZRFHW9BoNDjYh5CSsvufvzOHJmoAU8YpSaBEsXD+/Hm++vJzmrdszXdzZmG1mNFpFD4eLvi4O9GkWgUGduiVVX7lthMsWfmHTRcfbtCoMccPrSsxCZSsRH5733//fYHUKwlUHnVqGcLNuEQM+hsYXPU8VLUSnm4hxXZl2zIujrw1oD2Dn+/PytV/oNfLW8IWjPb+ZGScwmKJA/XPrngaLcqSQHpaOHb2/rYOUYjbUkoxd85XLP1lPoN7taB6JQ8+HH7vX/Ums5mYmBibbpLcrVt3nvhuNl3b1LNZDKLgXbhwAa1WS0BAAAC7du1i4cKFVK9enZdffvm+v79lFl4e+ft5Ur9mICHV/AkO8sPL3bXYJk+3VPD1oFOTIMaNGWXrUEo1O7sQNIBWo0Wj0aJFi1arxZpxFlWcf/6JEuv69es80etxLh7ZwtTXe1ItoFyu18J789n2PP/sU4Uy++5OnJyc8C7nz5XomzaLIV8pTcHeiqmnn36aPXv2AJmbDHfq1ImLFy8ydepU3n///fuuVxIoAYDZYiUjI93WYZRqBjs/9DqPzN4nbeZgcg0aNCoRS8YVW4cnRDbnz5/niR5debpDMP06N8nzIsLlfdzp17E2r7w0pIAizJ233h3FwjUHuRGbYNM4RME5efIkoaGhACxatIimTZuyevVqfv75Z3766af7rlcSqFLOarWycPU+jl/JYPLUabYOp9Qz2NdEq9WhQZeZPKFFozRY0s9IL5QoMo4fP87ggf0YM7QTlf3vf6mNutUrcTU6Mh8jy7tatWrhVbEai7ZetGkc+UHWgbq3DRs20K1bNwD8/f25cePGfdclCVQpFnkthnc+XUrlBg/z7bwFOWYqiMJnMJZDq3UjcxEKbeanlkYDKll6oUSRcPDAAUa8NIgJLz+Gp5vrA9V1NiyKhqFN8imy+zdt+kxmf/OdrcMQBaR58+ZMmjSJn376ia1bt/LYY5mz1c+dO4efn9991ysjhkupyGsxTP1+M/N+/BV/fxmgXJTo7KpjTtkL/JM7oUGDFUvGGbSG8rLforCZrVu2MHnCSCa90g0nR/sHrk+j0eTq/ZyQkMD+/fs5feokZ06f5Fr0Vdw9POjU+TEe6/b4A8dRYsg6ULc1a9Yshg8fztSpU5k+fXrWYPLVq1fz6KOP3ne9kkCVQjfjEpny3UZ+WrTsgbJvUTD0Rh+sGe5giv5nSShrZve5JRGLKRytXYCNIxSl0ZrVq5g1fTKTXu2OnTF/lh5wtDeSmHj3sUfr1q7hwwmjadOoGhV8ylC/gp5FJ6Iw2NlRvUbNfIlDlGyBgYGsXr06x/FPP/30geqVBKoU+nT+Jr7+doEkT0WY1hgMKdGZP/qUQmV2RWHOOIveWKnYz/wUxYfVamXe99+yeumPTBj+eJ4X+L2b2IRkTBmWu5ZZvWol9vYOXIiMwWQ2s+9EJHPn/UxQUFC+xVFSyDpQd5aYmMiCBQs4ffo0AMHBwTzzzDO4ut7/Zeg8XQsYN25c5syg/9y6d+8OwLx583Lcp9FoqFnz318IkZGRdOjQgfLlyzNmzJis42FhYWg0GgIDA8nIyMg6bjab0Wg0bN269b4bKLI7Hx5Npco1qVatmq1DEXehN3pjxhm0//TKK4VSVqyWREzpxX+wqyj6TCYTP3z/HR3atuDC4Y3839Cu+Zo8bdp7kiVbzzJ2wqS7lvviy6/4Y8supnz+Ha0ee551G7dK8iTyZNu2bfj7+/PRRx9x5coVrly5wscff0ylSpXYtm3bfdeb5x6oxo0bs2LFiqy/7e0zr4M/+eSTdOrUKVvZJk2a0LNnz6y/x4wZQ4sWLfjoo48YOnQoHTt2pEWLFln3R0dHM2fOHF5++eU8N0TkzqZ9p3lqyEhbhyFywWwNwGo9/U8PlMrc11ApTBln0BsDZCyUyDWlFGfOnGHtmlVcvnSRhIR4dDo9Dg6OODg44OCY+f929g6cOf03F86dRVkzaF4ngI9f747BkL8XK3YdOsPxCDNLl6/K9eK9FSpUoEKFCvkaR4lTkOs1FeN1oIYNG0b//v2ZPn161uemUorXXnuNoUOH8vfff99XvXn+V2EwGPD1zTlt1cHBAQeHf7cv2bVrF+Hh4QwYMCDrWFxcHJ06daJ27dr4+fkRFxeXrY5hw4YxadIknn/++Wx1ifyRkJTKmSvxNG3a1NahiFyw4oZGVxaL+WbmEgaazH/0ZnMCGWkXsHesYusQRRGz+NdFbNqwDq1WmzVAOzk5mYjLl6jo40qTEH8eru2Oo4MXVquVtHQTGSYzaemJpGfEkJ5opnMDD8o/WrXALhMnpaTx64ajrPlji+x8IApFWFgYw4cPz/ajU6PR8PLLLzNnzpz7rjfP794jR47g6+uLq6srHTp04IMPPsDNzS1HuXnz5tG8eXOqVq2adeydd96hS5cu9O3bl0ceeYSOHTtme8zgwYNZtmwZM2fO5O23376P5oi7+Wz+RiZN+UTGzxQjeruamC3bMy/hWUEpC1aNIiX9JHYOleW1FABcvXqVV18eQoWyWp5oXRulFFalQIHBoMOjbANbh5hl1i9b+WDyJ1lXL0T+kTFQt/fwww+zbdu2HENXtm3bRps2be673jwlUE2bNmX+/PlUqVKFsLAwRo4cyeOPP862bduyfZCnpqayePFiPv7442yPb9y4MZGRkcTGxuLt7Z2jfoPBwNixY3nrrbcYOnSo9ELlo9XbjtKgWTsaNQq1dSgiDwxGb9LT3LGYrmHVWLGisCorqDhS0k7j5FDd1iEKG1JK8fOPC/h+zpcM7/dQrha1PHj8AlsPnudqTBI6gxGrKYPy3q7UCvKhXdOaBXZpWCnFuh1HcfOtTPP/DN0QoqC1bNmS9957j61btxIaGopGo2H//v2sX7+ed955h++++3cNsOeffz7X9WrUAyxvfP78eapUqcKBAwdo1KhR1vGff/6ZF154gaioKMqUKXPPesLCwggMDOTs2bMEBgYSEhJC3759GTVqFAaDgS1bttw1S0xNTcXR0ZHDu//A3t4ux/1aBzesqbH31cbi5E7tTE1L59yVGFq2am2DqPJfWlpaqfj1equdSt1AsR+rUiisWNU/N+xx1HUq9r1Qpe31zC8Wi4UD+/fhaAT/ch65eh/ciE3kRkIGtevUzbaJb3JyMnv37KZBjYoPnEDd6XMo6nocaVYDderULZLj91JTUwkKCiIlJaXY/Xi/9R3Y8ovx6PJpiYn/ZckwsfOVscXy+QkMDMxVOY1Gw4ULF3Jd7wNdgK5cuTJly5bl4sWL2RKoefPm0b1791wlT/9Lp9Mxfvx4Bg8ezLBhw/L02IyoP9Ha5XzzGP1CyYg8kOdYipvbtdNssfD2tKXM+2npbceuFUfR0dElpi138287fYmNjyAtIwqr0oIyg0aLsmZg73wTN+cQW4f6QErf6/ngYmNj6dunB890qk3lGgGYou49M/PI6XCWbDnD4t9WYjBk/5xUSjH8xQHUeaPHA8d2p8/btav28nj/14vs8im23NRYFKyLFwtm5vID/QwIDw8nLi4ua1VPgIiICDZt2sTAgQPvu94+ffoQFBTE1KlTHyQ8AXy7dCdDXn5DZq8Uc/YOdTFbzZgxY1IWMiwmzFiISf0Lq9Vq6/BEIYqKiqJX9y682KMR9WoE5OoxYRHXWbD6MD/9siRH8gSZVwF8PV3yOdLsUtNMD7TmjhBFTZ4SqHfeeYedO3cSFhbGli1b6NmzJ82aNaNhw4ZZZebPn0+5cuV4+OGH7zsojUbDxIkTmTVr1n3XIWDV1iOYjZ70eeJJW4ciHpCD0RetweufxMmKBSsmZSHFFENM6glbhycKyY0bN3jqie68/WwbqgWUy9VjLBYrn/+4hfk//4qTk9Nty+zatZNaQTnHpeanlDQTLi4Fm6QJccuLL76Yq54ni8XCjz/+yI8//pjnc+TpEt6lS5fo06cPN2/exM/Pj44dO/LBBx9ku579ww8/0L9//we+xt21a1fq16/Pnj17Hqie0shktvDFT5vwD27ErK8n2jockU/KOjUiMf0yFvXPQHLAquBa4kE8HEOK/VgocW9fffkFz3ZpSAVfj1w/5tf1B+j/3BB8fHyyjmVkZHDt2rWsnuld27fQo1nFfI/3v8wWq7xHC5jMwvtXtWrVaNKkCcHBwXTu3JkGDRpQrlw57OzsiIuL49SpU+zatYvly5fTsGFDpk+fnudz5CmBWrRo0T3LnDp1Ks9BBAQEcLux7Lt3785TPYdOXsC/nGeePlxKmptxiXw4Zx3DX3+Pbo93t3U4Ih852ZXHaPQlKT0ic5o6AIo0Sxw3k4/j6VzbxhGKghafEEdIldv3It1O5LUYTlxKYNLM50hPT2fFimX88tN80pITsDfq8PANYMrHnxJx5TK+XgW7r5y/TxnOnDkjm5eLQvHWW2/x0ksvsWjRIhYvXszUqVNJSMjcd1Gj0RAcHEyHDh1Yv3499evXv69zlKhVzIb+3xwWfDy81CZQaekZjP9qHV/N/YHg4GBbhyMKgJdzM+LTFgOgUP9sNgxXk//E3bFWkZzdJPLP088M4J23RtAouByPt6uHo8O/s46tVivHzlwm8mosccnpxCakcvjvcH5evJxvvp7Nrz//QOuGlXn7mRY4O2bOBjx57gq9u3fGalUF3juUnGa6r4lFIg9kJfJsHB0dee6553juueeAzMW809LScHd3x2g0PnD9JSqBGjX8CermclBlSZOeYeL8xav88NOv8guvBHOxK4+T0Y+k9MjMLzxtZhKVbo4hJu0Eno7SC1WS1avfgPUbt/Pbb0uY9N0cnI1WmoZU5NDpKKJuJNOydRuqh7bEx8cXb29v7OzseOet16jqa8enb/fOkWDXrFKBccM6s/PPMwUee1xiarbLiEIUtrJly+ZrfSUqgXq87f11wxV3JrOFyXPXMubDGZI8lQLlnJtyzvRb5qAEK1kbd99IPISHg4yFKqmSkpJISEjA3d2dXr360KtXH8LCwli7ZhXv938kxyrLW7dsYcKYdxne9yGq3mXAuXsZZ7q1K/iVymMSUvDy8irw85RmMgaqcJWoBKo0iktI5oNv1jBsxDvy666UcHHwxynJj5SMSDRaDUoptBoNJksccSkncXOqZesQRT5r36YVZRx1uDjZczM+GY3ejmbNW9Gp82MMGfrSbS/dTvtoEh+90RO7AlpYMa8a1fRnwDP9+HzmbMqVy90MQiGKMkmgiimr1cqGPSdYveMUX8yeS0hICNHR0bYOSxSScq7NOH9jKRpAq9H+sx6Jhtjkw5RxqCFjoUqQhIQE3F0MjBnaJeuYyWzh+Jlwvv9iPOcvx6DTG7B3dOLzmV/j5+dHamoqFlNakUmeALq1rUvtKtd4tl8PmjRvzZP9niEkRHpM85X651ZQdYtsJIEqZq7HJLBp39/sPXqJbj2eYP2mb/JlMJwoXlzsKuJs50daRlRmEoUGrVaD2RpPYvoZysgeeSVGeHg4vh7Z108y6HXUrxlI/Zr/blFxJfomTz/RnVZt2nPs6BGefKToDWkIrOjNtLd6c+LsZWZOHUl4dDx6/f9+DamsL+vU9Az6D3yBAQNzvz+ZEIVFEqgi6GZsIqcvRhJ1I4GrMSlE3YjHZFFodQY8vXzo8+QAxn7aQRKnUs7XuSmX41aiVaDVaNBotGjRkJh8FFf7YPllX0KEhYXh7eZ4z3IVfD2Y/m4f/j4fQa32wdSsUjR3H9BoNIRU8yek2r3Ha1qtVqbPz1w+R5Koe5MxULcXFBTEgAED6N+/P0FBQflWryRQRUSGycya7UfZdTgMH7+KNG3ekmaNqxIQEIC/v3+x27xRFDxne3+c9OUwWa4BGrRkJkwWaxzJaWdxdqh29wpEsRB28Ty+nrmb/q/VaqlVtWAXxCxMWq2W1559mFcmz5YEKjfkEt5tjRo1ih9//JGJEyfStGlTBg78f/buOzyKqgvg8G+2pGx6JaRBSEhC7733XgRCU5o0sSCCgNho0psIYkERUQREBQWk996k955CEkJ62ZTdne+PQD5jCCQhyabc93lWyc7MnTMpu2fv3HvuUPr27fvSSwuJgRJGFPoomjnf/Em/ccuo+8oH/LTlJCoTcyIjwtn2528sWzybCe+MoFfXtvTo2oHvVn5DdHTWVc6F0svRqj4KlChIn4mnkNL/pBO0l4wcmZBf7t+9TVknW2OHYTSXbgTSqk17Y4ch5MLcuXPx9/dHo9Hg4OBA9+7duXkza6mMM2fOoFaradq0aY7bXrJkCZIk8fHHH+f4mOHDh7N//37u3LlDp06dWLRoES4uLvTv35+///47z+uJih4oI3rwMIJrd0JoVNuXgd0a4+flgrenC2qVMsu+ySlpHP3nJMMG/oKkMueVPv3pE9AXjebFXftCyaUx9cBM7Uya7jGybECS0vui0tKiiU+6jZXGx9ghCi/pwYP7uDRvYuwwjObX3edZ8f06Y4dRLBSVW3je3t4sX74cb29v4uLimDZtGl26dOHWrVsZ+2i1WoYMGULLli3RarU5avfatWssW7aMatXyVu+uXLlyfPTRR3z00UcsWrSIDz/8kI0bN+Ls7MyIESOYPHkylpaWOW5PJFBG1LCmLw1r5uw2i5mpmjaNqtCmURWStCks+uF77B0c6dq1awFHKRR1NppaPI7bndH7JMsykgSJyRdFAlUCpCQXrdl0+SEpOQWlQvHc60pN07Fu2wlq1W+esWafUDwEBARk+nrGjBlUr16d8PDwjHI7kydPpmPHjlhZWbFnz54XtqnT6Rg0aBBLly5l0aJFeYrrzp07/PTTT/z8889ER0czfPhwhgwZQkhICPPmzePIkSPs378/x+2V+AQqJi4RZ1djR5G/omITCI5IoG3btsYORSgCNGblME1yJCX1EZJCAZIEsozekIhOn4hKmfO104SiqBgPPvkPnV7PT3+d4FpgNCnaJIb2qE+t/6weER2byN4TVzly/gEjx7xD3379jRNscVQIY6D+21ukUqlQq7NPhLVaLatXr8bPzy+jkOrevXvZvXs3586dY+7cuTk6/YwZM6hSpQrdunXLdQL19ddf89NPP3H69GnatGnDrFmz6NmzJ6am/18KqWrVqlSpkrsaeiUygTIYDPx98AIfLlqLtaWGU4daGjukXJNlmQvXHxAdl0hKShrJaXpS0vQEPoxGp7Lip3W/YWZmZuwwhSLC3LQqsUk/I6FApbLGxqIudpaNkKSst4OF4kXO4/iMokaWZT78fBPDRr/L4n79SUhI4P33xrL7+A48XOxISErl5oMIHMuUpWfvfnyy+JVnlDgQjM3BIfNas1OnTmXatGlZ9tu6dSv9+/cnKSkJX19ftm/fjkKhIDY2lhEjRrBu3bocv4edOnWKNWvWcP78+TzF/MUXXzBkyBB+++23bIu4li9fnu+++y5X7Za4387j52/x3qwfSdIms/ST12nVIPMK41dvB2NqosLb08VIEb7Y1dvBfL/5BI2btaZ8hVpYWFhhYWGBRqOhbNmyYqFgIQuVQolSMkWSTFFKFiQl3yAlLRR7y2aYmhTd33XhxWRZb+wQ8sXx87do3rZzRo+SpaUlX69cxcWLF4mNjcXCwoLq1auLpOklFMYYqMjIyEyzwrP7ebVq1Yrz588TFhbGokWLGDBgAIcPH2bs2LH069ePhg0b5ui8KSkpDB48mK+++irPa9l9/fXXNG7cOEusOp2OY8eO0bx5c0xMTBgyZEiu2i1Rv6kfLPmDfUdO069bS94b3C7TSuUA5649YMjEZXw5bXiRTKAeR8fx7W9HsHUuzy8bt+Do6GjskIRiIin1LqZqp4zee9kgozPEo1TkfECkUDSlpOpI0+mfObmkOPnr4BXWbpyX5fnq1asbIRohr8zNzXNUVsfCwgIfHx98fHyoX78+dnZ2bN++nYMHDxIcHMzChQuB9DtGsiyjUqm4cuVKlg6C0NBQbty4Qbdu3TKe0+v1HDp0iNWrVxMcHPzCWFq1akVoaCjOzs6Zno+NjaVVq1bo9Xn7kFKiEiiNtT2ff/w6rRtWzrItOCySL9cfpnXTujSrW6nAYpi2bCN/7DzJ1LH9qF/Ni7LOdqiUz3/he/goir/2XyTocQqz5n2e5xkGQulkMBhITn2IAZ5UgpJAklGr7FCpRAJV3A0eOpIt+3fRq10dY4eSZ7cfhFHO2z/PPQhC8fc0Sdq1axepqakZz69YsYITJ06wZs0avLy8shzn5ubGpUuZy7IMGzaM2rVrM378+Byf+1mFhe/fv/9StaBKVAJlb6Z/ZvKkTU5lweo9fPXt97wzZgR7j1+hVYOCWS9s2jsBNK1TifGzVwNQxtkRPx8vLMxNcLazxMbKHDMTFSqVRHB4HOGR8bh6lGfkmA9p2LDhM3/Ier2effv2ERwcmN5Fa5CR5fSs3drGltatW4tVzksxbWogejkZCSm9B0pKXwrDVC1mLpUEA18bRPtV39C1ZQ1M1MXzJfvXXef4bNE3xg4jW+Hh4cz6bLqxwygxJk+eTM+ePXF1dSU8PJy5c+fi6OhIkyZNsLHJXBTW2dkZjUZD1apVM56bMmUKISEhrFmzBrVanWkbpPduOTk5vXA4i5eXF5KUXiOvbt26KP/VmaHX6wkPD6d//7xPUiief43ZaN84vWfJYDDw85YT3Ap8TJpB4o23ffj6+5/x9fVlz4GjrPz2K8Yv+JX2DX1p37TqC3uIcqtt46pc2LKAO4HhHL9wj3sPo0hISuXy7WCiY+Ix12hwdnambdt2DG3cBE9PT9zd3bMkT7du3eK7b7/i7Knj1K3shpuT9ZNfBpCQQIJ7t1N4a+03xGv1vPf+FK5fN6Nx48ZimZdSJF57C4NsQJKe1CKX038/NGZirFxJoFQqGTVmLJv3/knfjvWMHU6uJSQlk2Iwwdvb+5nb1/+ylrr1G+DjU/glN4KDg5k7awaBd6/Tu3Xx7/mXZQlZLpglnHLTbmBgIAEBAURERODk5ESzZs3Yu3dvluQpO6GhoQQGBuY11Awff/wxsiwzatQoxo0bl6m3Sa1WU65cOZo3b57n9iVZLs4r3KTTarVoNBp+WzYeM1MTDp25gbV7Dd6bMBGNRkNYWBguLuljnm7evMmJE8fR6/SsXfsze/ftx9HehhXTXse/gluBxyrLMjFxSYQ9jiHscQzhUQlERCXxKCqeNIOMQqFCpTZBq03C2c6cLk0rU8nb7YXrmsmyTJptNX79eSWX7oRhZm5Fi9bt6NS5KxUrVixR66L9++dZkuXkOmVZ5l7Ej8iG5PTkSZKQABOVI24OvQsjzJcmfp4vdvHiRb5e+DFj+rXI56jyn4lrPVIfns74eufhizhXasXgIUOz7Hvr1i1GDumLQqlm9vzPadiocb7EYDAY+OLzxdy/d5dH4WHExcfRrXsvRr0xJtNrYe9XemBnouXdwR1ITkmjfu8pJCUlFbuls56+B9afNxNlAdUM06emcWryJ8Xy+3Pw4EEaN2783HILeVGieqA+WLiBdh06UqNWW4aPGJVlxP3Vq1d5Z/RQujVPv83XpaEnneoPIig0stAGaEqShJ2NBXY2FlTyfnbCptcbUCikXCU9kiRhaWHOa90aAemVy89dvcH8qXsIfhSHm0d5pnw8zSif8oSCk5ASiN6Q9GQBewkFMiBhblpy1kMTYPfOHdSpVPAf8ArCsYsP+H5yj2du8/b2RlaYMHtsd2Z8/D6fzFxAo8YvX3X94MGDXD65m97t62Bv6465qQnrtx/gnbfOs3zFtxn7bfx9E68N6Mv9kAhcHG1f+rxGJ9bCy3D37t2MW3geHh4EBQVlu29eFxguUQnUyDFvM2nyB9luHz92DFPHdMXOpmgXFlQqX35slpmpmka1fGlUK73SeUh4FG+PHMSg19/g1UG5m6opFF3xyTcxyIYnPU8yhie37yzF7bsS5Z8zJ3mnT21jh5EtbXIqx8/f4vjFQHq/6sZPP2wjNTUNL1cb9JIpdnZ2zzwuNTUVU5UCC40ZI3s3YemShS+dQBkMBjas+5k6Vcrh7vL/mkV92tXhsx8OZtpXoVDQuGkzQh9dLRkJlJDBx8eHsLAwnJ2d8fHxQZIk/n3D7enXkiSJWXgA74x9N9ttiYmJmKkp8slTQXErY8/c93rx45+b2bNnN8tXfIOFRen8XpQUsiyTmBqU/sFQljEgo0BCrbLHRJWzsQZC8RAbG42FpugWzr1yK4gFq/5m/oJFNGvekoC+/ZFlmbNnzz631zskJATPsunJ1febjvPVqpdb8y41NZXhQ1+jspsZTetknlD08FE0FSpkHod179491v/yM7PeKTlLYhX/QTn54969exmTq+7du1cg5yhRCdTzXL58GW93hxfvWIIplQpe79WU89fu061TWxYt/ZJatYrup1rh+eKTA0nTJ6Z/kkJCkmUMgIWJp7FDE/KRwWBA1qe+eEcjqlvNm9+/GMviH7/D09MTFxeXjJlPz+Pq6sqJ87ew0qjx8PLFwyPvt57j4+MZ2K833Zp406hm1qTNQmNKfHxYxtdarZbhQwbyyaj22NtYkpySludzC0VPuXLlnvnv/FSiEijDc5Y8iI2NxUojZqYB1KxUnpkezkyf8i4t2nVn3Pj3S9Qg89IiJvkG+vS6FiglxZMSBmBtXnB1zoTCFxwcTBmHvNeqKQwGg4EHIY9xdbLhUXjYiw94wtzcnJNnznP48GGaNWv23H3v37/PTz+u4p8zp5AkBZaWllhZW6PRaAgNfUhE2EOG9WhAlYrPLt9ha23B5ctXuHPnDt7e3ixbuoSeLSvj6myfq2st0sQYqGxdvnyZQ4cO8ejRoyy5wowZM/LUZolKoLq0b82rg4cycvSYLNs0Gg3nrgXSqVn1LBXKSyNrSw0z3u7BH3v+oc8r3fjmu9Wi8nkxIssySanpgyJlQCcbkJAwU9phZlKC3hAErly5QjmXontL9syVe6zZcprGTZoTMHzSM4shPo+FhQUdO3Z84X4HD+wn7PZpPh3ZGgkJbUpqeomElDTsGtTE2rLRc49XKZWMeKUeM6e8RVhUEpKcxrz3isdMVeHlLFmyhAkTJuDr65vRO/rUy3QelKgEav74nny1fhNlXd3o2q17pm1NmzYlbcpnTJn6EV2a+tOucZVS3+siSRK929Wh+v1QBgZ0o3nL9rz3/iQxNqoYSEgJIVWfkFF5XCJ97IOlacF0VQvGc/niebzcit7wA1mWWbZ2HxrHcmzZvhdLy/Sq92FhOe+Byo0+AX1Z+fUXnL18l9qVvbDUmGGZy3Fhdat6U7fqs+tRlQSFsRZecbRw4UK++eYbRo4cma/t5n8pbiOSJIm3BrZm8fzZJCcnZ9neqlVrdu49hMHGl8lL/iDscUzhB1kEVSxfloUTeuMohdK1Qyt+2/irsUMSXiA2+SYyYEhPnZDTq2diI2bflTjXrl4uchXIwyJimP3tNmo26cDSZV9lJE//JcsyN2/e5MvlX9CvTw9GjxjK+nW/ZLqFYjAY2LTpD3p27cj6dWuzPaeFhQXf/7ieWHUFJiz6g2t3H+b7dQklU3JyMq1atcr3dovWX2U+MDVR075RRdat/Zlhw0dk2a5Wq5k4eQp9+w9kyMA+zBnXM9efYkoiSZJoUseP+jV8WPPXLxw/ephFny8zdlhCNhJSHkDG4i0SMjKmSms0ps4vOlQoZqZ8PI35cz7j57/P0KlxJZrU9s2XUid5ERkdz5frD2Jq5cikaYuoXTvrJBStVssPq75n7+7tPH4UhruzNXUquTG+fwMStSkcOrGFDt+uoGbtOqiUKk6dPEaDKh5MGdqcWSu/ws+/UraTW/z8/PCbOIkGjRrz10+fU6mCa0FfcvEixkA905tvvsn333/PnDlz8rXdEpdAAdT09+Tvs2eemUA9Va5cOQIGDOLi9cs0ri0+tT+lVikZ3qsZC3/YydEjR2jStKmxQxL+IykllFR9PBLpiwenLyIsYWkibt+VRBUrVmTlqh+JjY1l1XffMn7hH9T2d6VjkyqUcSy8sVHBYZHMX72Xr1b+iL+/f8bzp06e4OsVXxDxKByDLo3RY94m9u4R3uhRAxurzOOSNOam9G5fl87NqxMeGUtamo6AJq9kFDKeMKQds6Z/ym+btz43lurVq/PxlQf0bl8bjZkY0yo83/3799myZQtbt26latWqWSqSr1mzJk/tlsgEytzMhPj4uBfud/fObep4FK+S9IXljX4tmD17Olv+3m3sUIT/iNJef1IQTs5YugXAViNm35VkNjY2vDdhIu++N4F9e/fy85pVhIUEUq+KO20aVsLB1qpAz//Vr4f4dtXPVKxYMdPzf/y+kTY1HKnmWxtJkjBxdcHLtGo2raQzNzOhvFvWBdDtbSwxV6Zy9epVKlfOujD8U9bW1syZ/zkzPp3InHG9Sv141qfEGKhnU6lUvPLKK/nfbr63aETTv92FSqVGr9fz5tj3nrvv/fv3uXPtPEPbPnuJgdLOUmOGpYlMUFDQS9VmEfJfQkpgeteTLD15UTNgorLF0rTkrycnpFfPbtuuHW3btSM1NZVdO3fw/S8/ERkRSoOqHnRtWbNAxky1b+jPti1/Mm78+5meNxj0WFtq8i2JGdCpDjOmfsT6jZueu1+jxk1QmlphMMgolSKBErL3ww8/FEi7JWoQ+cZN29i8dSdbtu+hU6cu2e4XFBTEsEH9ebNf3ldhLg06NPLjx1XfGTsM4V+SUiJI0ccAPFk8OP0/lqaieGZpZGJiQtdu3flp3Ub+2LoHm3L1+GPP2QI5V9M6fuzeuS3L8wa9HqUi/xIYj7KOOFkY2PTH7y/c16BPNdp4sKJILuCHkFmp+82LiIhg8MA+fDi8HWWdn70+k5CuVuXyHNy/J9P6QYJxRSdff/JiZsAgPe2vl7Ez8zV2aIKRmZmZ8fY7Yzl5KahA/maVSgUY0khJScn0vLnGgqjYxHw917CejVm2ZD4xMTHZ7pNeoV2Xr+cVSg5PT08iIyMB8PDwwNPTM9tHXpWoW3gvotVqeW1AH8YPaoWLk62xwynyFAoFvuUcOH36NPXr1zd2OAKQkHL/yZw7BSAjS6BSWGBh6mbs0IQiQKVSUb6CD5Ex8Tja5X/18gZVy7F58x/06zcg47m33hnH66/1poZ//k1iUKtV1KjowsEDB+jRs+cz95FlmeRUPcFhkZkWDS7VxCy8DDNnzswor/HZZ58VyDlKTQJlMBgYPvQ1BrSv9szBi8KzdW5ahVUrvxIJVBGQkhpDsi4KJImn67ZIgJWJpxhEK2Tw8qpA+OPYAkmg2jaqxIKff8qUQLm4uFCvUUuOn7tFo1oVn3N07py5FsLi77Mfo6pUKvl5/e8M7NuTT0Z1xMm+aC93IxSuIUOGPPPf+anUJFAfTJpA9XKW1KmSu2UGSjtPV0ce3D1EfHw8VlYFO8tHeL4o7VVkWUZOn3yH9KQXykbcvhP+xb2cF+G3DlKlYv5P/jhy9ibtO3bO8vykDz6kc4fWaDSm1HOtly/nsrY0IzExMdsinQBly5blu9W/MGLIAN7s15RHkbHcexiDQQZLMzWuTtZ4lHWgrLNdRqmEkkzMwvu/u3fv5njfChUq5OkcpSKBunvnDtrHd+gS0MLYoRRLnZtWYtX3K3l33Hhjh1KqxabeezL7Lv0ho0ettMDaTNR/Ev7P3d2DW2eS8rXNlNQ0vvv9CImyBSunZ62vZ2FhwbYde+nRpT1VG3UlP1IVc1MTtFotlpaWhISEYG1t/cwPcd7e3nz9/U/8uGolXt716NOxJiYmJkRHR3P71g32XbnKva0XiYuOYMH7fVApS34iJYCPj09Gz/yzxgRKkoQsy0iShF6vz9M5SnwCdfXqVUJDAhnZR8y4y6tmdfyYsHAj74wdh0JR6uYdFAmpuniS0x7zZMWWjDIGFibu4mciAHDixAk+/XAipiro36lOvrV79sp9ftxyiklTptKpc9bep6csLS35fPnXBAUG8sXizZR1sKRBVQ/qVquAqYk62+Oe5cylu6QYlDg5OREYGEjtmjWY+dlnjHnzrWfu7+fnx+x5C7M836ZNm4x/f/P1CnYfPUGn5jVyFUuxIsZAZbh3716Bn6PEJ1AfffA+0z6cgBQp1k3KK6VSQZ1KbuzauYOOnbJ/ARUKTlTStfTbd8jpCZQsIUlgY+Zj7NCEIqJy5cqkpaUyfUz3fFueKvDhY37bf52tO/ZlWWRclmVSUlIwM/v/uapVq46TkzM79h7mzp07bNv6F5+t2klacgKVvMpQycuZyj7u2cZ35vJdNuw8R92Gzfjpl43Issy7b79BJR8Puvfo+VLXMnTYcLp3/LlkJ1BChnLlCr5nvkQnUDt37MDNToWZqZpUYwdTzPVoXYOFK5aJBMpIYlLuYUDOWP0OQCmZYGNWcleWF55v+RdLeOfd8Vy7dg1/f3+sra2Zv2gZi2Z9wEejsq+DlxuzV26jXqMWLPtiCc7OLrRo2Qpv7/TfuRnTPuHPTb/h5u7B0OGj6NmzF8p/3R7z9vZm7LvvMfbd90hOTubcuXMcP3qYL349TlxsFJKsx/DkFoqERHKajgaNmrHu923Y2dkhyzIzp39KWRsJXZozbm4vN9PU1NQUEzMNBoOhxPbaijFQ2UtNTeXUqVMEBQWRlpaWadvgwYPz1GaJS6BOnz7NwnmfUaZMWS5dusDcd7sZO6QSwdpSg5WpnvPnz1OzZk1jh1Oq6PRaElJCkRRg+NctPAsTVxQKMZ6jNDp79gzvvDuej6ZMws/v/2t51qtfH6W5PY+j4/JlFt64QW1JSUlDUjzi8f07zJzyG5HxehYsWUZFv0oM7FyfZnX92XrgN75cuoi27TsxeOjwLO2YmZnRqFEjGjX6/9p4er0ehULxzBmkMTExjBg2iBpe1sQlpjB1Zv4sAtupSw+2Hz5NlxaiF6o0uXDhAt27dycqKgqtVouNjQ3R0dGYm5vj4OAgEqinPnj/XT4Z1Z6omASa+DYqEgtNJiQlc/SfG4Q8iicoPJak5JT0hWAV6Z+8JElCkT6tiojH0QQ9DGfBpIFU9nE3duiZDOnekJnTPuL3zVmrEQsFJyLxKjIGZEPG0CckWcLaNP+mjAvFR0JCAu+Pe5v6tasxbcasLAlItx69OXPhbzo2q/nS5/KvkLnXp3XDqkRGx9O3d3d++mUjOzf9RIdmNejbsT4BHepx7J+bnDxxjLKv9M7ojVr2xVKuXL7IsOGjaNCgQUZbymwGcz948IAhrwbwVr+mGAwyQbFq6tb9/8y+6OhoAgMDiYuLIzY2ltiYGGxsbejSpesLy3mMHP0GXTusL7kJlBgD9Uxjx46lS5cuLFu2DFtbW06fPo1arWbo0KGMHj06z+2WuATK1NQUWyuLAl9YMycSk5L5decZrj2IZuDg12kdUBVvb29sbGyeTEeXOXnyBH/+8TuXLp4nOSkRNxdHavq74Whn/Pj/y9nBBjtzmRMnjtOwYaMXHyDki9iUOxmvXbKcPgZKoVBjZy4SqNJo3Ng36d+hBpsO3uT27duYmZlhbm6OmZkZZmZmeHh6cu5QcoGdX2NuiotLWapXr86Dh5GcuXQHR3trPMs60KSOH1Em5sz+bBqfTJ0JQJu27ZgxYzqHD+zF178Sg4eNolq1anh7e2dJeJKSkhgx9DU+GtEBZwdr3l/4O+v/yPyBrV/vHlT2ckBjpkZjqsLS3ITzj+NZ8cUSZs1bRK1atbKNXa1WI0lKdHq9mI1Xipw7d47vv/8epVKJSqUiOTmZChUqsGDBAgICAujbt2+e2i1xCVRAv1fZvG8vvdvVLfRzp6bp2HH4ErcCH/MoOgFTjRWj3xzLog4ds7xQJCcn88Gk8USH3qF7i2r0bdqhWNQpGdytIbNnTOWvv3cZO5RSQWdIJT4t7MlX6QWgDICV2gWV0sSYoQlGEhp8n8a9e3AvOJKP3hvJo8hYHkXG8OhxNDFxCSxevIiI6PxdWuXfzM1MkGQdBoOBz+Yt5sypk1y+ep9zPx/A3tqc/oNHcef27Yz9K1euTFDwQ6Z+8iGnjx1g/+bv2bJeT9CjONq068TEyVNQKpVcunSJd98axes96+PiZMuWA+fp0WcADg7/rzIeHR2NjYWK4b2aZokrMiaeJZ9NJjJRT49X+hDQtz92dlmX6xox+i2W/vQ9E4Z2KJhvkBGJMVDPZmFhQWpq+kjosmXLcvPmTSpXrowkSYSHh+e53RKXQA0Z9jp9+/yF89kbNKvjl2nbrfuhfLnhMOZmJjSuVo4W9f2xtjTPtq0bdx+ycc95EpIN6NLS6NGycpY2n9p38ip/HrjK6yPHMHR8G8qUKYNK9exv74njx5ky6T1e7VSLBh2L1x+xnY0FHk5m7N+3l1at27z4AOGlRCXdQJZ1/59992QguZ2YfVcqGQwG9GlpvDt3PWVc3HEp50eVOo7YOzjh4OiMp6cnjRs3pveOzQUaR/WKLhw+fJiWLVvStGkzAHQ6HQkJCSQnJ9On74BM+5uZmTFvwWL++ecsXy1fysPH91AqlezYuYPx709CqVTy/nvv8OHwdpRxtCE+Ucu+0/fYOXd1pnZiY2OxyeY128HWiomvdyAlNY0jZ08zbMB6FKYWODuXITlZiyzLtGzdnh49X+HmrRts2H6Kfp3+v8KCXm/I32+SUGQ0bdqUffv2UblyZXr27Mk777zDoUOH2LFjBy1a5L0+ZIlLoBQKBes2/M6IYYOIT7xI5+bVAUhKTuGLdYfYtGUnJiYmbN36F0s3rCMpIZpq3i7U8HPDr4IrEZFxnLx0l+MXA6noX5WFy1fj4eGBTqdjxNBBnL26BzNTE1JSdWjM1KhVCi7fDqNx89bs2PMVJibZ9wrodDo+/nAy92+cY/bYbvk21biwvdqlPjPnzKRlq9ZiCZECFpt8B4UspadPUvotPIWkxMGikrFDE4wgJiaGnQdO8OuG9QT07ZftfrEJWhKSkgvsNaZT06osnPUxC+eqsbN3on7DxowaPQZbW1vCwsKyPa527TqsXLXmmdsmffAxP6yYx+ThHVn522GmzZyTZZxUfHw8Cun5XSGmJmraNKpCm0ZVSNKmoE1OxcREhcEgc/LiYbp2XM7OvYd4b+xb/LL1KPFaPXeDI5FKQI+u6IF6ti+//BKtVgvAjBkz0Gg0nDx5kvbt2/Pxxx/nuV1JLohluwuZVqtFo9GQlJSEuXn6pxODwcCk98cReu8qU6Z8yJZfV+FZqyOvvvpapmOTkpI4efIkB/fv4Z+zp3F1daNj5+60btMGa+uss1guXLiASqXCwsKC+Ph4EhISqFmzZsZ5n2fBvDlowy7xStv8K3L3byau9Uh9eLpA2v6vv/adQ2dZnqnTC2aRxucJCwvDxcWl0M9b2EJDHxIqb8Ygp6SPgZJBkmQs1G5Ucs7+zbO4KS0/z/y4zqSkJL7/biXvjH2XlJQUPpoykcsXz6cnFZKKeYu+oFq1apw5fZpJ49/ik9GdCmRNvH+LS9By6uIdth65ybKvVmJvb5/n6/zkow84cWQ//lVqsmzFN1m2JyQkMOn9cdy6fpUavmVp18gfV2f7XJ3jj92nqd3mVTp06MD69euoWbMWVapUITU1Ncv7SHHx9D2wxiczUahzV7Q0pwxpaVyY+Umx/P4UlBKbQD119uxZ7t65xfSpH3Pg8AkcHR2NEmNwcDAjh/Rl3nu9CqzXpjATKIClP+/Bv1ZL3pvwfrYzagpCaXnDvRF0jFjpODKgQAKFhCSDm1UTylqXnMWdS8vPM7+vc9eunUyeMJZXu9THzNSEizdDqFizBRMnTwHgzp07jBj6KhOHtMKjbMG/7sXEJTJtxVaWf7OaSpUr56mNZxXnfBa9Xs+hQ4dYu2YVQffvUKeSG20bVc7RgsKHTl/FzL0Rw0dkXpLmee8jRd3/E6jPCjiB+rhYfX8eP35MYmJipqKaly5dYtGiRSQmJtK9e3cGDRqU5/ZL3C28/6pTpw5ubm58vXK10ZIngPffe4c3+zUvUbe8xr7ahq0HL9C5fStGvPE27dt3wMbGxthhlRjxunvoVeljnvSSjMIgg6TAXpO3NyehZGnfvgNVduzj0KGDJCdr6VLLge49emRs9/b2Zv1vf9K/d3emjulU4DOTba0tmDW2B+fP/5PnBEqSpBcmT5BeAqFVq1a0atWKtLQ09u7Zw49rfyT8YRANq3nSukEllEqJM5fvcvb6Q5K0aTjYaohLSCYmIY2Ppw3NU3xC8fLWW2/h6enJggULAHj48CHNmjXDw8ODChUqMHz4cFJTUxk+PGvtspwo8QnUU02bZp21UVi2//03DuY6yrs5GS2GgiBJEt1a1qR5HV8OnfiLX35YQapeQZOmLeja4xWqVatWohLGwmQwGEjSh6FSS8gySDLokbEyccJUlf3q9ELp4ubmxoABA7PdXqZMGb5Z9RNvDH+NOe/2RGNesHXxLDRmqBOV6PX6QuuVVqvVdOzUiY6dOpGSksL27dv5Zt1PyLJMm/Yd+WxkR+zs7AgLC8PS0pKyZcsWSlzGIMZAZXbixAnefvvtjK9//PFHypQpw/nz51EqlSxZsoQVK1aIBKqoSktLY8HcGcwb19PYoRQYGysN3VrXolvrWuj0ei7dCOSrBR9xNyQKV/dydOnei/bt2z9zTJnwbNEpgaSRjEI2TS+eSXoRTWtTLyNHJhQ3vr6+zFu0nMkT3ubdV1tSwaNMgZ0rLiGJlLQ0UlNTjXKbx9TUlJ49e9KzZ88s26ysil5tPaFgPXr0KNPtu71799K79/+LvHbr1o3p06fnuf2SuSBQEWNuqsbMtGDuSxc1KqWSWpW9eLN/SxZO6MXg9hW5cXwTQ/p1o1f3TuzY/jcGg5gu/CIRSdfRAwYkDBIYSC9g4KSpYuzQhGKoXv36rP99K0vWHiYiKq5AznHlVhAfL99Knbr1Cyx5kmWZNat/YPCr/fhi6RLOnDmTUd9H+H8PVEE9ihsHBwdCQ0OB9HFzp06donHjxhnb/7smXm6JBKqAqdVqFCrTUps0ONpZ0711bWa83Z3xAxuzd/P3dG7fmrt37xo7tCItMiUQA2BARm9I74EyUdtjrrY1cmRCceXs7Iy/vz/5PW8oMSmZOSv/Zvy89XTs3IPQ0IdMen8co0cMZdqnH+Xr+db+9CNHd/3K650rYZ5wnbVfzaJN8wYcOnQw384hlBzt2rXjww8/5Ny5c8ycORNJkmjdunXG9kuXLlGhQoU8ty8SqEIQ0H8gX67bn+8vXMWNjZWGwd0bM2FQM94c/io//rCq1H9PniVK+5D4tDjS9KCTJQyShE6WsDUpb+zQhGJGp9Nx/fp1lixeQOf2rYh7HIS9bf6OoUtN01PJy5n3h3XA3vAAC2UqTSua0r9lOZLCb7B44Xwg/XbK33//zYovl3Hnzp08nSsxMZHgqFRWbz5ODf/yvN6rKQsnBjD1o4nExRVMz1qxIhfwo5iZM2cOWq2WOnXqsHjxYr755hs0Gk3G9u+//5727dvnuf0SX8YAcj59WK/Xc+DAfn5a/T1paWnMXbAEDw+PfIlx6ZJFXP9nP2P6tSwxZQxehsFg4OctJwiJk/j621W5Gh9V0qe9X4rcy/2486SlJGNuaopCIaGQoH6Z17AxLbjxK8ZS0n+eTxXWdf704w/8tfkPtEkJSLIOV2cbavm6Ur+GT6EsF/Xv1yFZlvn2t8PcDorE3tocX08HnO0sOXkliPAoLU2at6TfgNfw9fV9YbupqamkpKRgZWXFvn17+XzRfKQnyxvFxMazdt2vuLvnfQH2klDGoNqHBVvG4NLs4lXG4KnY2FgsLCyyrA7y6NEjrK2tczTz81nEIPInUlNTGdC3N15Oaga1q8rj6HiWLV3E/IWf50v77743gYXzU/l24yFG98176fiSQqFQMLhHY67cCqZn1w4s//p7Kudx6nNJ8zApGJ0skSZLKJFQGMBSbVMikychf0VERLD+p++Y/lY3TE2MP+5SkiRGBzTP8nyzepUwGAxcvBHI3E/eJTginkZNmtN/4CAqVUqvsp+QkMChQwfZ8fcWbl6/iokSQh9F8suvm2ndug2txVJSWYhZeM+WXXkdZ2fnl2pXJFCkd3MPfrUfHeq506hm+hpjTvbWfP/n5nw9z/uTpjBn9ky+3XiIkX2aiSn+QJWK7kx7oxPj3xrOsFHv0O85U7JLgxhtFOHJ8agkFTqDEqWsQELG1rTciw8WSj2NRoNOb+BRZCypaTqOnLuLuamKmv4e+JYvWtP3FQoFNSuVp2al8siyzOWbQSye+T73Q2MwMTFFrdBTvWJZOtTwYkTH7kiSRHBYJNM//ZCf1200dviCIBKoiIgI3nlzNE2rOGYkT5D+ycnKXMndu3dfapDZf0358BM+X7yAed/v4P1h7VEVYgXvosrOxoK57/Xi619/4eCBfcxf9DmWlqWz1tGN+DtodSoUyOh1emSdCpUkU1bz4lscgmBhYUHfV4ex78ollCo1nfu/hV6v59d1P7PnxHXe7N/K2CE+kyRJVPPzpJqfJ7Isp6/5qMg6RNfdxYHwkL3Ex8eLsgTPIHqgCleuBpFPmzYNSZIyPZ5Vb+PMmTOo1eosxSsfPnxIu3btcHNz49NPP814/v79+0iShJeXV6YpqTqdDkmSOHDgQO6uKodmTvuEYQNfoUdjD1rU88+0be22k3hUqIKnp2e+n3fc+IkEDB7Dh59vKrApxcWNUqngrQGtaOBjRrdObdj+9zZjh2QU9+KC0RmUpBlUaPVKkvVqDFhTRpP/v4dCyTR8xCgWLlnGvAWLad26Ne3atWPlqh958Ehr7NByRJKkZyZPAPdDIijj5imSJ6FIyPUsvPr16xMaGprxWL16dabtWq2WIUOG0LJlyyzHfvrppzRp0oStW7eyc+dOjh49mml7WFgYK1euzG1IeXLz5k2uXzjBnHGvUNU385vTmct3uR+RxufLVmQZdJZfer7Sm8+/Ws3Cnw7z175zWWajRcbEc/LCLfYdv8yW/f8QHBZZIHEUNbUre7Fg/Cv8+ctXDOjbi6tXrxo7pEKTkJrIo6Qo9HoFekP6Q6dX4mzmLm73Ci9NrS7eNxziEpL4Yu0+Zs9bVCDt6/X6Amm3UIlZeIUq139RarX6uTNJJk+eTMeOHbGysmLPnj2ZtsXExNCxY0eqVauGq6srMTExmbaPGTOGWbNm8frrrxf4KP/FC+bQr2PtTM/FJWj5asMBbMtU4NvvfyzQ8wP4+fmxdccevly+lMmLN9KrTXWStClsP3YT57Lu1GvQCHsPBzwsLFj+1WLmjnulwGMqCkxN1Lw1oBXBYZHM+uhd9CpLPvhoKjVr1jR2aAXqesxdDMgZL1YGWUJvkPCyyr9byIJQ3CSnpLFhxymu3I9m+uwlL3VXQK/Xc+TIETb88hMhwYHIsgHZoEc26NHrdfkYtVAa5DqBunDhAi4uLlhbW9OuXTs+++wz7OzsgPQy6bt37+bcuXPMnTs3y7GTJk2iS5cu9O/fn/bt29OhQ4dM20eOHMmmTZtYvnw5EydOzOMlvdjRI4cJD76DSSNXDAYDkiSx6+hldhy/zez5i6hfv0GBnfu/FAoF74x9j+49erHpj98wdzBn459fZOmi/v7rpYUWU1Hh7uLAhKHt+Hr9Xl4fOpjTZ88V2vpaxnAvLvDJki3pi7fIMqgVJnhbiwHkQj4oZoNYdHo9Ww9c4MDZe4x9byILevR8qZ7YzZv/YOnCedSu5Ea3hv64d6+UaXtySho79h1/2bCNqiA7iorXb0/hyFUC1bBhQ9asWYOPjw/3799nypQp9OjRg4MHDxIXF8eIESNYt25dtjUV6tevz8OHD4mOjn7m9EG1Ws3UqVN5//33eeONNwqsF+rzJYvR6pRsPf2I+/eOExcbS9cevdmx57sCu2X3IuXKlWPcexOeuS02NhZzk5KbOGRHlmXmrPybrn2G8PXaIdmOiygJ0vRpRCQ/enJPXUZOr3BDWU0ZlIrS97MXhBPnb3H+fgK79h1+qQ9OQUFBvDf2TdzslCx8vxcmxfxWplB05Oo3qWPHjhn/rlatGpUrV8bHx4ezZ8+ybNky+vXrR8OGDZ/bhlqtfm7thUGDBjFv3jwWL17MRx99lJvwcmzj75syfS3LcpEeY7Jh/S80qJo/BT2LkyNnr+NbrQFDhg4zdigF7lbsXQzoUCjg6V08hQTeNmLwuJBfilcfQpPafvx9+Borv/2aOnXrk5CQwOPHj4l4FEZ05GN8/CrTuHFj3N2fPUZQp9Px+eKF7N3xF28PaIGnq6MRrqJwiVl4heulUnFvb29sbW25d+8eBw8eJDg4mIULFwLplaZlWUalUnHlyhX8/Pxy1KZSqWT69OmMHDmSMWPG5CqesLCwZ/ZaJScnExYWlqu2iorU1FRsbGxo1vd1FC9I8hTmdpi41iukyApe8861uX4/IsvPrjj/PLNzIfISySmpIBtAkkCWUcgSNimWJe5a/6sk/jyfxdjX+cZb40jQSNjbFGyJkPx8HZo3pw5RsQlEhQehVEo425ji5lgBlbIiScmpnDtzghPHdChVauzs7XF0dMLGxoaIiAhu37pJvVpV6NauEfDiD8iG5JR8iVkoPV4qgQoMDCQmJoby5cuza9euTCUIVqxYwYkTJ1izZg1eXl65ajcgIIA5c+Ywb968XB3n4uLyUku5FCUXL17k80XziAwPon+H2uisXtwDVZyWcsmpvX/tx9TUlG7de2Q8Vxx/ns9jkA3ERyVibmaaMRtTBqwNlni6lvyex5L288yOsa+zabPmvPvOGHQJj2hRx5talcoXyMy8/H4dsgFsJHiyujakpT9vDjiYACbp45eunw1h550wbgc9ppqPC20bVcE61ZzUhzk7T2pKWr7FbDRiEFShytVfz6RJk+jevTvu7u7cu3ePiRMn0qhRI+rUqZNlfIqzszMajYaqVavmOihJkpg5cyYBAQG5PrYkiIqK4s2Rg/loVGfcXWq/+IASbGSf5kxeNBv/SpWpWLGiscMpEPfjAknRp3/6laT0vyMJcDUtWpWjhaLv7t27XLp0iYoVK1KhQoVM41GtrKxYtfpnrl27xrYtf/LZDwfRpaUiywYMOh3Odhra1K9INT/PYjfe0MxUnVHVXBAKS64SqAcPHhAQEEBkZCSurq506NCBzz77rED+2Lp27UqtWrU4frx4z4rIi31799K5WRXcXRyMHYrRqVVKPhzZkVGvv8baDZtwdXU1dkj57k7c3Yzbs7JsQJIUSJJEBQsx/knIuWPHjvLplPG0rOPNzt8TePgoljQDSAoVTs5l8CxXnsSEeKKiIomJjkmftv9k0IxBNnD9QSR3QhMwVZzik9FdsLOxMPYlCbkkxkAVrlwlUBs2bMjxvtOmTWPatGk52rd8+fJZCkkCHDt2LMfnK0mcy5ThbFLqi3csJRztrJk8rC2v9e/Nuo2bjR1OvpJlmeCkh/y7f1zGgIOpAxYqjfECE4qVBw8e8PHk95g77hXMzUwybZNlmdj4JMIex6DxtMTa0glLC7Msy0hFRMWx8+gV1m87zqDJ37BoUn/8KpS8DyyCkF+KVz9tKVG7dm1OXXnIrztOlZoK5E/JskxcQlKWJW7cytgzYVBLBvR9JdNYu+IuNCkcrS7p/2NcpfT/lLN0N2JUQnHzxZIFvN2/eZbkCdKHRNhaW+BfwQ1PV0dsrS2euQank701r3VrxI9zR1LW2Z5hU75m97ErhRG+kE+e9kAV1EPITBTEKIIsLS3ZufcgX321grdnzOeP5e8WuzEJz9Mo4CMStf+f8eLpXhYTtQqlSoVKpcbR0ZGyLmXQJUXz+iuNMm5lero6MrZ/E06dPIGbm1uJKKp5O/b2k3/JIElPqj/JVLT2RhcnKiMXd7Iso9VqSUhIIDExkUuXLpGQkIBer0elUqFSqVCr1Zn+r1KpMDExoUyZMjkur3LzxnUGt+nw4h1zwMHWihWfvMaiH3cxce6PjBzQiTH9WpSo1yBByA8igSqiwsLC2PTrWr6eMazEvXAd3ziLNJ2ewIcR3A58RMijOHR6A3pZRjZAmk7HvYehdOjcg7V7zqKNO073FlWoVbk83p4uRJuaM2Xy+8xfuMTYl/LSAhOC0yuPP3mflGUJaxMrHDWOhMWV/Kn9JUlKSgo/rl7F1j83odclI8npybCpiRqNmQn9B49k159rMTNVoVRI6PUGdHoZvcGAXm9Ab5DR6QzoDQbiErSU8azIF8u/ztHff1pqcr6+TqjVKj4Y0Rnf8i7MXrGRWw/CmPlOT6wsCnaJLeEliVl4hUokUEVQYmIiwwb1Z/LrbXFxtDV2OAVCrVLi7emCt+ezp3WnpKbx++6zREQ8YsiwUVy/dpnfV+wE2cDgYW4sWPQ5tvaOfPhhwRRbLQwxyTHEpsYhI6NAAZKMJIGbRow7KQoiIyM5sH8/hw/u5eTpsxw9diLbJEWr1dI/4BUaVXbi05GtMTVRZ9nHxNUZz95Nc3z+7YcvMWzwQL5f/XOWFRISExOxsPj/IG+FUo1eb0CpzN8PW73a1sbLzYH35/3C4A9WsuSDAZR3c8rXcwhCcSUSqCJo/Li3GdK1Nq7O9sYOxWhMTdQM7NKQ7q2SWbt1A0GPU/h0xhzq1q1LWFgYwcHBHDt21NhhvpQbcbd52vVkkOUna+CBj3Xu6qYVJUW9qn9OBQUF4enpiZ2NFVZWlkybPjPb5CkpKYn+Aa/Qq0VF6lTJv59dp2bVsDh9g/59e/HzL79mlCT4YNIETh07hJunFxM/+Jjq1avToFETrtwOorpf/q+bWKtSOdYuHMPU5X/SffQ8yjjZ06djI7q3qklZZ7t8P5+Qd2IWXuESCVQRFBoSRI2enYwdRpFgqTFjdN8WRMbE8+X8j0jGghmz5lGxYkUCAvoaO7yXcj8uGIMMID0pPi6jUWnwsCx+xTMfhsRxcPdV/jl5gzHjO1ChYtEujPmiRK9s2bJcu3YNCwsLnJycsl3fE2DShHG8ks/J01PN6/mhVisYNXwoa9auR6vVcuncSZZO6U9IeBQLZ7yPhb0Hbdp35NrRPwokgQJwcbTlm2lDCA6L5O9Dl9i8+yRf/rSN35aNx9dL9JgKpVPJGlxTUkhKHkXGGjuKIsXB1orxQ9ozpGMlrlz8hxHDBhMSEmLssPJMm5bMI20khqfDxmUJg6ygrMal2PTgJKWksfn4LSYuPsJHHx9n3/Y7REYmse2Ps4UWgyzLJCUlERsbS3R0NI8fPyYxMfGZ+54/f46a1asiSRIKRXqtrfj4+Gfuq1Kp8Pf3x8PD47nJU0JCAnduXqFuASRPTx06e4fXBqevB/n7bxtpWC09SXIrY8/EYR1wUMfx7tix1KxUMMnTv7m7ODCqb0v+XjmZi1sXiuSpiElfhLzgHkJmogeqCFryxQreeH0g88b3Rq0q/jPN8pNbGXtMXMtiqOvMsFd78+a7E+n5Sm9jh5Vr12PuYDA8WbZFSk+iJKCCVXljhvVCsixzKSSEQzfuce72I2LjwBBrhqW5CSapGmRdElcvB+X7eJy4uDhCQ0N59OgRd+7cwd/fn3LlymUUVlUoFBgMhoz9mzZpzOEjmW/xmpiY0LhJYyZP+ZAWLVpmKcoqyzJRUVFERUWRkpKS5VG5cmU8PTMXN921cydNahRc4hIZHc/Zy3dodOsGDo6OrFq5ggXjX8m0j2dZe5ANlCsFi+UKQlEiEqgn4uPj+fvvbfy1aSNxsTFIkoSEhMbSis+XfUWZMmUK9Pw6nY5ff13Pn79vJORhCPUaNOGrDQcY+2qbAj1vcVWxfFnmje/F3O+WExMTw9Bhw40dUq7cjQtGRoGMnF7BABm1Qk0Fm4LvRciL8PhYDt+7ycWQYKLikklLldABkkqJTp1GilqJqcoUhcEUXVoixw/doGmrSnk617lz57h48Tznzpzm6tXLXLh4hUePozK2q1Qq5syeRcOGkwgPD+fcuXPodDqcnJxwdnbGyckJU1NTrl27xuVLl7h65QLxcXEkJyeTlpLM9i2b2bRxPampqRgMemSDHoNBD7IeKwszrC3MMFUrUauePiTUKiVL59+nW6+BjHnr7YxewuNHD9LMt+BuuTrYWbF2wRscOXOB1cv3MnZAM0z+s36dWqWkUS2/YtNzKRQcMQaqcIkE6omB/XrTqJIzo7vXyLSEwYOQCPr36caCJV9St27+rDAuyzLx8fEYDAZsbW2B9ARu/uyZfPnJIEzUjZj3/Q4u3gwiISmFMX1biGUVnkGlVPLhyM4s/Xkj0VFRvDdhorFDyhGdXkdQXAQ6WYEeHWn6VDRqM5w0zqgVWWdvGUuyLo3TIbc5F/qA4Jho9Dow6CWUKgnZIKFSyagUMmlqPakmOlJVatTJpshyEvt3XsxTAiXLMv369eXWrdtUq+yHn19Fxr03joaNmlKnTh2sra0z7e/s7EyHDh3Q6XQcOnSI1d9/y4N7t1Ggx72MLeXL2uLv5oiluyUmJraYqFUZD7VKmauk45W2dfh99zECeu3ihzW/YGVlRWhoGBclNR6uDs8sTpkf1ColrRpWplU22329XLG3tSyQcwtCXsydO5fVq1cTGBiIubk5TZo0YeHChfj6+mba78yZMzRq1IgGDRpw5MiRbNv7448/+PLLLzl37hyyLFOvXj3mz59PzZo1C/hKnk8kUE9YWGho27hKlkq+5dycmD22B9OnjKN1p1fo138gOp0OlUr1zFsAwcHBxMfH4+DggIODA3q9npCQEO7du8fuHds4d/Y0KoWMxtwkvQ6MZEL/gYPp1bsPbdt34F5QODUqlefTMV35YdNRTlwJ4YuNp0mMjyExIRFPFxsmDu9c4mpD5ZVCoWDcoLZ8teEAa39y5tVBQ4wd0gvdjAkiWa8HJB5rE4hJiUclKVHorLkZ+ZCK9mWN1ptgMBi4ERnCmdDb3IwMJVWnxyBLyLKUfqtRAiSQFKBWKzAxAZ1OJs1MJs0UXDR21KzjSesOOUueZFkmNjaWu3fv4unpibu7Ozdv3srRsYmJiezYsZ3Nv20g4lEoNSq60LVeRTy6563n60UkSaJP+7pUuhVMt05t6TvgNT6bM599e3czYcF3DOvRoFDGIf2XtaU51paiPpNAkakD5e3tzfLly/H29iYuLo5p06bRpUsXbt36/9+2VqtlyJAhtGzZEq1W+9z2Dh06ROfOnZk/fz6WlpbMmzeP9u3bc+3aNRwcjLdmrCQ/axG6Ykar1aLRaEhKSsLcPOsLSVhYGC4uz58VNOn9cTStaIqXu/MztxsMBvaeuMq56yEEhoSjMrdl7/6DREZGsnPndnZs20J4aDAuDlZYakyJS0gmJj4JhULC2d4KZzsLavl74OuV+c0xSZvCnuNXOXzuHpa2jjwKDeTLj1/L2H747A12HruOTg9mJgr0aSl88mbPLN34ACau9Uh9eDqn37Zi61nXmabTM3HRJnbtP1LkK5TfjQnhyMOLhCVFcTs6iDRZjySBPWVRoMZCpaGiXVnKmVrR2L9qoSRTkdo4ToVe5/LjIGKTk0CWkA1gMEjo9TIGg4SsB73+yf/TJHSpEilJYNCZ4u/oRseqXtSs5JjjeI8fP8bYt8cweOgIPl+8kBmffcarrw567jHJycms/XkN27ZsRpecQP2qHjSr44u9TeH2wGiTUzl16Q7HLz4gJj6FVJ2BU2fOs/GLcdlO7S/Nf5/FQXJKGvV7T8n2faQoe/oe6PPuLBTqgunFNqSlcXvpR3n6/ly6dInq1asTFhaWMRxm7NixqNVqrKys2LNnz3N7oP5Lp9NhY2PDunXr6N69e65iyU+iB+qJ9h06892yuUwZ2emZvTuyDCZqJdFxSZhZOuDv70+ndi2wNFNSt5I7w7tUxt6mfq7PqzE3pXvrWnRvXYug0MfsOS5nmmLdrI4fzer4vfT1lXRqlZJmtcrz64b1DBj4qrHDea4Ktm5UsHXjUVIM806tJSFNiyxLKJUqZINEQkoy5x7e53hyGntDb+Pn7EJNF098HVzzNZlK0aVyLvwmFx7fIyQ+ClmWkWXFk1mBTz9wSigVT7qdkEAGvUFGqQQPRzvqeHrR1McLs2cUjnyeLz7/nHffe4+O7VrTokUL3n777Rde2/79+5g59UM6NfZl8uCmaMxM83bh+cDczIQW9SrRot7/e7vSdN1R5XMhS0HIjcIYA/Xf3qKnyxBlR6vVsnr1avz8/HBySi/CunfvXnbv3s25c+eYO3durmNJSEggOTkZe3vj1koUCdQTbdu15+HDEBb8sJY+7Wrh6myfcTvvnyv3+OGvk7i4liMuIYW6lZ1o7GfO8I7d8vUNzaOsI8N6tci39kqbbq1qMvnzFfTrP6BY3OI8E34dS7UGjcoSg16BrFeglyUMMhgMMrJsIDYlidMhdzgbegdLE1P8HMtSs4wXFe3L5ukaZVnmbuxDzj2+yZ2YEJJ1OpBBoZBIv6uYnjn9/06AIWP6sizJ2GosqersThPPijj/ZzxSTmm1Wjp16cLgoUOxtbUlLCzshX9Hm/74jV++X8acsd3RmBsvcXoeMWNWKA3+e8ts6tSpTJs2Lct+W7dupX///iQlJeHr68v27dtRKBTExsYyYsQI1q1b99wSIc/zySefUKlSJRo1apSn4/OLSKD+ZfCQYVhaWHLy1AlO/rKJtvV9OfDPHfSoMegNVC9nzqRXA8QLZRFlolbh6qjh3Llz1KlTx9jhvFBcShISCmT5yW0yvSH9VpmcXs9FUoBCAkkhoZBAq0vlwqP7XHh0HwtTU/wcylLDyQsfuxf3TEUnx3Mm/ArXYh4QkxJP+mCm9PpTT6uhKxQKkMGAhEIBOr0MEpgoVHg7ulDfrSL+ji/XC7Zzxw6mffIB1WrU5NvvVufomPv37/Pl0gXMF2U9BOG5CqMHKjIyMtMtvP8uM/RUq1atOH/+PGFhYSxatIgBAwZw+PBhxo4dS79+/WjYsGGe4li6dCnr1q3j4MGDRh+uIRKo/+jVJ4BefQK4fv06u3buwHD2Hu0blKdj02rFolejNLsTGEZ8qpratWsbO5Qc6e/fmsikOP55dJcr4UGExsWl3yiTFEgSGBQSkkJCQsYgp5fclAwSkkImMVXLufDbnH90Gxszc7xtXajm6I23jWvG72maPo3Lkbe5FHmHkMQIDMjIckYnEzxdxFiWkQEDepAVT/IpCQ8bR2o4eVGnrDdmKpNsriJnoqKiGPv2G1gqkpg6pgubjuWsCGpcXByjhw9h0tB2InkShCLA3Nw8R2OgLCws8PHxwcfHh/r162NnZ8f27ds5ePAgwcHBLFy4EEgfXyzLMiqViitXruDnl/2QlW+++YapU6eyZ88eqlSpkm/XlFcigcpGxYoVmTThXca/1hyPsqJAXVEmyzK7jl5m29Eb/Pr7X8WqHo6Dxpp25WvSrnxNHifFczr4LpfDggmNi0WWDRhkQ3ov1JOeKEkChSQhKdMTLQUyiWlazkfc5eLjO1iZmOFgZoUBPdEpMaTo00CSMpaMQZaeJGjSk/pToDOk37BTIGFpao6/fTkauvrjpLHJt+t8fchABrStRGUfdw6fvYFG8/yyHCEhISxaMJdrl/5hUJe6Ys01QciBp+MXC6rtlzr+SZK0a9cuUlNTM55fsWIFJ06cYM2aNXh5ZV/R/4cffmDChAn8/fff1K1b9yWjyR8igXqG6Oho3nlzNG3reIjkqYgLCn3M0rUH6NDlFXbu+RYTk5frKTEmR40VnXxr0Mm3BpFJCey9eo6HaQk8SopGRkaSZGQpfZIB8pP/K9KLcEqSjCRBoj6ZOxEPABk3C6eMNfaQpfSinUB6ImVAIr2ny0ylxsvGlZqOPvjZe+Z7AhoREUFwYCAGgx8r1u9HNnNm8dLPn7nvpUuXWDhvFvFRYfTrUIth7XrlayyCIBS8yZMn07NnT1xdXQkPD2fu3Lk4OjrSpEkTbGwyfzBzdnZGo9FQtWrVjOemTJlCSEgIa9asAWDt2rWMHj2a7777Dl9fX8LCwgCwsbEx6oxJkUD9S3BwMAvnzebm1Qv071SbWpXKGzsk4Tn+2neOk9cjWPXzb7i5uWW736VLl7h69QqPIx4R+TgCXVoaVtY2WNvY4ObuiZ+fH+XLl0epVJKYmIgkSVhaGrcwoYPGkubuFXFxceFxYhxnw+5yLTKIR0kxT26xpSdMCkV6fSKFlH5rT5LAysQCg0GHQlKAJKOQJPSGp4PD5YxlY5zNbali701tZz/M1QU3MNvJyYmfN/zB2p9W06HXsGcuvbNv716Wfb4QazMD/TvWwd0lf4rWCkJpUkTKQBEYGEhAQAARERE4OTnRrFkz9u7dmyV5yk5oaCiBgYEZX69cuZK0tDSGDMlc5++HH35g6NChuYgsf4kECkhKSuKzGVO5fO4Er3Wpx/COWT/16vR6UtN06HQG1CplloKbQuGRZZlFP+7Cp0pDNm9Zk+3YNFmW+WDSBIJuXaC2vys2Vhr87DSolAqSkh+S+Oge/9w4zF/r4gmNiENGRmOWXuA0OVWPQmWCm7sHlatWp269BtSvXz/bAZMFydHCmg7eNengXZPIpHjOP7rDjehgwpOiAAMG+cktODk9PbJUa1A9XV/PQEYSZQCs1OZUtC1HHSd/ylgUXgE6Ly8vIh8/5sypk1jb2NKwYSP27tnD5j9+pUPHzpzY8xvjBzbC1lpU3BeE4m7dunU53nfatGlZZvGtXr0609cHDhx4+aAKQKlPoA7s38/0Tz9gQMdaDBjbE0hfwPPw2ZucvR6CTg+SUo2JiSmmpqbo9AaSYh8x573it4BtSREaEcOVO+FMnNo32+RJr9fzxsjXqeAg89rIznk6jyzLRETFcTfoBr//cJiZnzzC0tqOkWPepl279kYZa+WgsaJN+Zq0KV+T6OR4zj26zc3oQB5pI0GSUEoSjubW2JlacSsmEBkJlaSgvFVZqjn4UsneK71nqhDJsszbY0ZRq7wpZRwMbFv3JYvnTKVOJXcGtPLFw8+dSlZNCjUmQSiRikoXVClRqhOoixcvMHfGhyyc0AuFQmL3scvsPnETJxd3ur/Sh3EzOmJlZZXpmMOHD7Ptly+MFLEA4OpsxycjO7Bg2ngi4nUMHjaCXr36ZBRzi4iIYMzo4TSu5Ei7xnmfqSFJEs4ONjg72NCwZkUA4hO1bFj/FZ8vmsekDz6hZavsVigreHZmVrT2rEVrz1pEJcdx8fFtbsU+wNfGA29bD2JTE6liX4Gajn5o1MYbJ/DXn5sxl2NoVqc5AL7lyxotFkEQhPxSqhOofXv3kJKawqdfbkGnl+jZpx+//bUcC4vsbyMolUoiouMLMUrhWbw8nJkwtD1JySnsOLyFjiuW4uxcloTEeCR9KkO716diAbxRW1mYM6J3M+IStPyyegmL5s/mg4+n0qRJ03w/V27Ym1nT0r02Ld3/X8JhZBXjD8CWZZkvlixg3jjjLbcgCKWF/GTdyoJqW8isVCdQo994k9cGDcHe3j7HNZ4aN27Mb79WZN/Ja7RuUDCLlgo5pzEzpVe7OrzStjZJ2hTMzUwKpV6XtaU5b/RtQWx8Ej9/NZcFc3TMnLOAatWqFfi5i5Pz58/j6+mAaS6XehEEQSjqSnVlSHNzcxwdHXP9hjt/4RL+PHCFNJ2+gCITckuSJCw0ZoVe7NTGSsObA1rx3sBGjB0znNDQ0EI9f1G3ccNaWtb1MXYYglAqPK1EXlAPIbNSnUC9DIVCSXJK6ot3FEoFextLJg5tw6jXBxs7lCLl9MkTVPLOvsSEIAhCcSUSqDzYv38/dfxdsLIw3sBcoejxKOuInYWCBw8eGDuUIuH27du4OloUq8rwglCciR6owiUSqDyIi4tDrRTfOiGr+lU82P73VmOHUST89ut6WtSuYOwwBEEQCoTIAvKgZ8+enL8bzcLVu7h+96GxwxGKED+vsly+eN7YYRQJB/fvoVaV7Ne2EgQhf4keqMIlEqg8UCqV/Pjzeu4GR6EQdyeEfzExUZGSkmzsMIwuNDQUa40SlVJp7FAEQRAKRKkuY5BXer2egX17MWFwS7w9XYwdjlCE6PUG9HqDscMwuj9+30izWqL3SRAKU0H2FIkeqKxED1QerPjyC1rU9hTJk5DFXwcu8Nrg140dhlHpdDr+2LiehjVE+QJBEEoukUDl0r1799i6aQNdW9QwdihCEZOcksbVe5G0at3a2KEY1fIvPqdDo4qieKYgCCWaSKByISEhgTdGDOX9oe3E1GwhizV/Hefd8ZNL9e/Go0eP+Puv3+nYVFRkF4RC92Qpl4J4IJZyyUIkUDl07OhRunVqw5CutXBxtDV2OEIRE/oompBoHV26djV2KEaTkpLCiNcHMTqgSalOIgVBKB3EIPIXOHr0CAvmfIaDpcTssd2x1JgZOyShCNp2+DKTP/zU2GEYjU6nY/Cr/ejWuAK+BbCIsyAILybLgBhEXmhEAvUMMTEx7N2zhx+++woPJ3PGD2yMnY2FscMSirAbDx5Tr149Y4dhFDqdjuFDB9GsqpMYOC4IQqkhEijSyxIcOnSIv7ds4vKli2hMJGr6lmXKsFZYW4rlWoTni4pNwN7BudAXMi4KoqKiGDpoAB3qlaN5PT9jhyMIpZrogSpcpTaBMhgMHD9+nLVrVnH75jVq+JalSc0KDGrdVYzfEHJMlmVWrDvAhE/mGjuUQnf16lXeGj2Md/o3o6K4bScIQilTqhIoWZb5559/WLvmBy5d+Icq3s50aVgJz+6VjR2aUAzFxiex9Oe9tGjfk/r1Gxg7nEK1dctfLFs0m+ljuojb24JQRIgeqMJVohMog8HA9evXiY2JYcqk8YQEPaCihwNtG/oxrH1vY4cnFFOyLLPzyGV2nbzN3IVLqVOnjrFDKjQRERFMmvAuKl0Mc97rhVollmoRBKF0KnEJlCzL7NixnZVfLUObGE95VzteHTqKIR18cbAtPW90Qv4JfRSNjIyzgw1Hz95ky6ErtOvUne27v0OlKnF/Qs9kMBgY+/YbBN65zpBu9fD1En9LglDUiB6owlWiXv1v3LjBpAljqeblyMRBTTNKDpjY25CabGXk6ITiKDkljVFTV9O+XRse3D9Ml+6vsP6PBdjZ2Rk7tEIjyzLjxr6Jl10ao8f2MHY4giAIRUKJSqDGvTWC6W91w97G0tihCCWEmama3h3qU75KDb79/kdjh2MUf/65CTnhIe07tTB2KIIgPE9BVgwXlcizKFHzriUgSZti7DCEEmZA5/ocPnTA2GEYhVar5YtF8xjas4mxQxEEQShSSlQC9c0Pv7B83UFjhyEUM7Isc/lmIKcu3uZRZCzyk5v90bGJbDlwnklLNjNw0BAjR2kco4YPYVDXupioS1RntSCUSLJcsA8hsxL1qujh4YHKVEypFnImKjaB7Ycvc+ZqMPUbNaWMiycbD18mJDgIg0GPk7MLrdu0Z+fsVajVamOHaxRNm7Xgj03r8PEsg621+NsSBEF4qkQlUABm5hqu3g6mso97jva/F/yIX3edIzo+FaVKjSzLSBhISUmhZR1vurSoXiwKa4ZFxJCSFk7olZs0rOlr7HCKtJTUND75YhOPYpKZNXsOs5Z3QKks3dPxN6xby/pffiI1RYtCkkCSUCiUKFVq+gwcwdSvvmFw17rUqVLe2KEKgpANMQuvcJW4BGrlqjW8+/Yb/LL9H1rV9aZZXT9M/rNPSmoaJy/cZteJm5Rxq8C0eSvw8cm8hpfBYGD+vNlMWPgbdSt74O5sjauzPa7OdmjMTQvvgl4gOCyS7/84xpY9x/h9w1rqVRNrkb2IiVpFv451OXk5kCULZrH5j40sW/Ftqe1lArhy5TKOliBZWxEVm0iftjWoUtGDuAQtP2z+FXsHR3afC+fs1UBG9G5aKpetEQRB+DdJlot/XqnVatFoNCQlJWFunr52XUxMDBt/Xc+ff2xkxMhRRFzfT2RsIicuBiKrzGjfsQsBffvj7Oz83LaTk5M5fvw4d27f4uSJY/z401qa1avC5x8OKoxLy1Z8opYfNh8jMlEiIjKKdvUr0G/QaFIfnjZqXIXBxLVevl7n9sMXUDtV470JE/OtzfwQFhaGi4tLoZxLlmX27NlDuXLlsLKyYt7smdy5cYmeraoSl6Bl74lrYGpHy1atSAy5QK92+VcHKr9/nkWVuM6iLTkljfq9p2R6Hykunr4HOg6Zi6T6b5dB/pB1qTz+8YNi+f0pKCWuB+opW1tbRo56g5Gj3uDevXv8dvsu5Wp5MuajrtjY2OS4HTMzM1q1aoW9vT1rf/yOb2eOonYVLwDiEpI4e/kekbFJlHezp3ZlrwL/ZJ6WpmPzvnOcuPKQoa+P5sdV3zKsa23qVatQoOctyYLD4+jZrpaxwyhUDx8+5MqVKyQlJZGUlEhSYiLJyVq0Wi3+/v4sWLyUx48f88OqlejUBjx81MgGHSePH+G3TVtpUc8XB1tRW00QhNKrxCZQ/2Zubs7EyVPyfLwsy4wZPRITpcxvey+xcc8lFCo1dvaONGvRimYtfDh5/Ag/L/yDWn6udG9ZI1/WB4uMjuf63YfcCY7kbkgUyWkGTM00vNK7HzWaW/DVsoVMHNoWV2f7lz5XaSPLMrcehLHjyFViU9W0at3G2CEViqioKMaMeh2lPoGKHo6YmaowUSkwM1VjolZx8cAJtv0aR0h4DCpTC8a+Nwl3Dw9GDR+Cu6MZo3o05dPhLY19GYIgPIMYA1W4SkUC9bIkSeLYiVPP3adt27ZM+ehT9u7Zw9yFc6lXqQy92tbOdY+ULMscO3eTbYevYetYlsZNm9OrXR2qVq2KlZUVISEhTJrwLrYmKcwf31usRfYcsixz5VYQF2895FbgY5KSUwEJSaFEoTLB378y7340n6pVqxo71EJz4fw5HgbdZ9a7vV6Y5MfGJ7Fx7TKuP4jizXfexdxcw4+/rCEqIozKFcrQsm5Fyrk5FVLkgiAIRYtIoPKRQqGgXfv2tGnblu9WfsP7i37kzb7N8CmXs3Espy/dYe3fZ2nXsRs/rp+Lvf3/e5ZkWWb5F5+z7c9fGdO3GV7uzx+7Vdp9vW43K9buBMDRwZ7Xhw1l1px5pWbtuuy0at2Gr1et5d23RtOgqiut6vljbqbG3NQE9X9qPdlYaRjRuxnJKWn8tX8zRy/cJ6D/azRs1IT9+/fzxvQFfPnJICp4lDHS1QiCkEkB9kAVWLvFWOl+NykgCoWCUaPH0KNnL8a/+zZWqmt0a1ENB1tLNOamWcoi3LofyqrNJ6hWuyGbtu7G2to60/b4+HhGjxxGBUcl897rVSzKKhhb49q+dG1VG7cy9ugNBrYfvMj0qR8zc9ZcY4dmdFWqVGHXvkP8/vtGft+9E602idiYWJKT4qjt70aDal6EPY7hdtBjbgdFok3VY6pS0K6+D+E3jrDq1G5MTVRMfbMHHi4Oxr4cQRAEoxAJVAEqU6YMa9dvZOeOHezeuY3wsNvExcch63XIBj16vQ5ZlnHz9ObbH3/F1dU1SxuPHz9mQEBPhnWrSzU/DyNcRfFU3a9cxr9VSiXdWtfiqw0H6de7B3XrN8TH1x8fHx+8vLywtMy8dqJeryc2NpaYmBiio6OJiYkhNTUVSZJQq9XUqVMHW1vbQr6ivJFlmbt373Ly5AlOHD3M/Xt3AQMS6aU6DLJMpcpV6dPvVSpVqszlS5c4eGAPXt6VadegMr4P7rN359/ISAQlWhH04A5BQYFUcHOkZ+uaWXqtBEEwHjEGqnCJV79C0KFjRzp07JjleVmWkWU523FS4eHhDOzbi3GvNqO8GGvy0sb0a0FMXCL3gkO4fvQy+/9KJORRLMmpOiRJQpIkZIMBSQJLjRlWFqZYakywNDNBrVIgI5OapufDyTc5eea8sS8nW48fP2bTH7/x99Y/SU6Kx83JGv9yjnSq7Y5bJ59MPZiyLHM/OIKze37htzUxxMQloTPI3Lh2mV1bf6dhVU/e6l2b+EQtu45dQ2FIpmPTalT1KYu1pZjKLAhC6SUSKCN6+qb9LKGhobzarxfvD26JR1nHQo6s5LK1tqBWZS9qVfbKcxvnboblY0T5IywsjN82bmDn31swUehpXqs8U4Y0x9zs+TVhJEnCy8MZL4/nj6mzsdLweq+m+RmyIAj5TJYlkAtmiIdcQO0WZyKBKoKuXbvGW6OHMWloG9zKiBIFRY2kKBozHxMSEtiw/hc2/bYBC1NoXsuLaaPbiYV/BUEQCkGuXmmnTZvG9OnTMz3Xo0cPNm/eTHJyMqNGjeLUqVPcvHmTDz/8kM8++yzTvg8fPmTIkCFcvXqV4cOHM2PGDADu37+Pl5cX5cuX58aNG5iYpH9q1ul0qNVq9u/fT8uWLV/iMvNHVFQUx48fJ/RhCA9Dggh9GMKj8HBSU1OQDenjmv7foySBlH7fWFIoMDOzwKtCBSr6VcKnoh/u7u6YmZlhYmJCcnIy4eHhhISEsP7n1ajlJD4c3p4yjjkv+CkUjtQ0HWZmxltUV5ZlTpw4wcqvlxP+8AGt6vow/Y32ImkSBEGMgSpkuX7VrV+/Pn/++WfG12ZmZkD6wFtLS0smT57MF1988cxjP/30U5o0acL8+fN544036NChA02aNMnYHhYWxsqVK3nrrbdyG1aBu3XrFq8P6ke7Rn442lrgZ2dFkwru2Nn456gWU2qajoePogkKPcu+S/uJiElCpzOg0xtQq5TYWZlhZ23GmF61cLSzfmF7QuEzGAxsO3iBmrVqF/q5IyIiWL3qO3Zt34p/eUf6tayKq3PhxyEIgiCky3UCpVarn7k+l4WFBStWrADgxx9/fOaxMTExdOzYkWrVquHq6kpMTEym7WPGjGHWrFm8/vrrRWqtHYPBwNg3RzF1TNc89wqZqFWUd3MSg8GLGVmWuXQzkL0nbxESkUCbDp2Y8P7kQjv3tq1b+HHVSnTJcXRs7MfCCT3FQr6CIDybqANVqHKdQF24cAEXFxesra1p164dn332GXZ2djk6dtKkSXTp0oX+/fvTvn17OnTokGn7yJEj2bRpE8uXL2fixKKzsOuSRfNpVtNd3FIrJWRZ5urtYPaeusX90FgaNWnGxGmLqVSpUoGf22AwcOvWLVZ/v5KatWtz4dBm3gmoi6218W4bCoIgCFnlKoFq2LAha9aswcfHh/v37zNlyhR69OjBwYMHc1TcsX79+jx8+JDo6GicnbPO+lGr1UydOpX333+fN954w+i9ULIsc/bsWQ7s2sqsd3saNRahcOw/dZ2/Dl6hQaMmjPtoPlWqVMn3cxgMBoKCgrh9+zY3b1zj+rXLBN6/T1pqMga9jrKO1rRr6EtNPzcqWzXI9/MLglAyiVl4hStXCVTHf9UyqlatGpUrV8bHx4ezZ89St27dHLWhVqufmTw9NWjQIObNm8fixYv56KOPchPeS0tMTOTUqVMcPXSAs2dOok2Kp6yDFROGtBXVv0uBc9cecOTyI3buPYxSmT8z7e7cucOO7du4cf0qD+7fQ5+WPuHA2d4Kd2dr3J1t6FjTEZd2FVBlOaf4nRMEQSiqXmrqjre3N7a2tty7dy/HCdSLKJVKpk+fzsiRIxkzZkyujg0LC3tmr1VycjJhYS+u3XPo4H7srMxo36ohvbu2KnZjTRTmdpi41jN2GAUuP65TfjKl5GlibDAYMIlzYckXk4mIiHiptvV6PYGBDwgJDsJEKVGzsjdN6lTGzFSdq0Rc/DxLFnGdRZshOcXYIbw0MQuvcL1UAhUYGEhMTAzly5fPp3DSBQQEMGfOHObNm5er41xcXJ6ZQIWFhT1z4Pu/BQUF8eeGVXwwvCPEgy4+V6cuEkxc65H68HSBtZ+kTUGlUhp9yvzLXGdKahq/7jjD2RuhWFtZYzDo059PTmb0m2Nxc3PLc1zJycks/+JzdmzbTMdGfrRsUAlTEzVoAS2k5bK9gv55FhXiOkuW4nqdqSm5/QsVSrtcvRNOmjSJ7t274+7uzr1795g4cSKNGjWiTp06AFy9epXU1FQSEhIIDw/n/PnzWFpa4uPjk6ugJEli5syZBAQE5Oq4l3Ho0EFq+WVdi074v3NX7/PBonU0rV+DRtXL4e3hhJ2NBfY2VpiZqo0d3jMlJadw8Xog1+494nbQY3SykhGj32Le173z9bZsSEgIrw3oQ88WlVk8sY+45SsIQuErwDFQBdZuMZarBOrBgwcEBAQQGRmJq6srHTp04LPPPsu41dW5c2cePHgAwNmzZ/nuu+9o0aIFBw4cyHVgXbt2pVatWhw/fjzXx+bF+bOnaOpbplDOVVw1qePH1LcD2HLkJn6NenL96mXCb4YSEXGFhPh4DLoUKrg5UM2nDPWqeed4odm4BC2Po+PQ6fTo9AZ0ej16vQGdTo+lhTluZeywsjDPcVLyODqO3ceucv5mKGYWNjRv2Zr+o16nRo0amJqavsy34JmioqJ4rX9vJg8TleMFQRBKi1wlUBs2bHju9vv37+cpiPLly2eMSfm3Y8eO5am93IqOjuafM6d4rVXvQjlfcXQv+BGb910kNEpLv/4DKV/ei86du6DRaDL20ev1XLlyhf379vDp19vQmMg0rOaJq5MtGnNTwh/HEvIohoePEwh7HIcBCYXSBDt7e9zc3DExNUWlUqNSq1Gr1KjM1QRFRvH36StERUZi0KchG3S88aYnR3edwMXeAtcy9jjYWhL+OJb7Dx9z/GIgNg5leG3IcKa2al0gCdN/ffv1CgZ2rCGSJ0EQjEqMgSpcpX79h927djF7xse8PaB5kRs0rtPrSUhMRm8wYG9jmW+3hUIfRaM3GLCyMMdSY4ZCIREVm0D441jCH8cQGatFoUg/V/CjOAJDo6lQ0Z+er47h+tUr/LruRy4c20ZIRAKpeglvH1/6DxxE02bNqF69OtWrV+fdceMJDw9nx46/uRsYSHRQFOXKV6JhHT+8vb0pV65cxpI9uZE+QDsQO6ey3L17h6u3bxJ2KQgPj3L4NWjK2592wNq6cCu57929g4XjexTqOQVBEATjKrUJVHJyMpMnvkdc+F3mj+9l9DE8cQlart4O4tq9iCdjdRSYm1tgY2uDQqEk4lE4el0aZmpoWNWTxrUrYmWRtzpZS37ag4NLOdQqJbExMegNepycnPEsV55yPjXwL+uKLMsYDAba29ryxZIF3Ltzk60bvqW2nytLJgVkJHOyLBMSHsVPX89lycJ5rPxhDfb26T0xZcqUYciQYfn2PYL0WZrm5uY0bdqUpk2b5mvbeSHLMmolRS75FgShFBKVyAtVqUygzp8/z/ixY+jfoSaNOrYv9PMnp6Rx/W4I1+6Gcf1+BMlpMnYOTtRv2Jh+I9PH6jxdY/C/oqKi2LZ1C0s3/IEuOZaBneviW75spn3iErQkp6TiYGuFUpn1jX1oj0b8dvAOq3/9A5Xq+b8CDg72ODnY0rxuJbq3qEq5/yxFI0kSMfFJ3A6OpGHj5nnqVSrOkpOTMTUplX9GgiAIpVqpeuXX6/XMmzuL00f2MOPNzthYaV58UD67F/yIBT/uo1OXbrTt8wof1K2bq1tO9vb2DBo8hEGDhxAUFMTc2TP47vdjVPBwIuBVH1Z8vRWVxh5ra2vCw8LQpaViMOhQYMDJ3gonWw2W5mru373Fvn17ad++w3PPFxkZBcC5c+dY+fVy7qw/RIvaFWjTqDJKhYLbD8L45rdjbN2xD0tLy5f63hRHMTExWGkKfpyVIAjCi4hK5IWr1CRQsiwzZNAAqnmYM/2t7kaZZh4cFsmStYf448+/cXJ6+UWFPTw8+PKrlSQnJ3P37l20Wi0TPppDg4YNs+yblpZGWFgYwcHBREVFMXjcXMqVK5fjc9WqVYsV33yPVqvl9982snjd78gGGb9Klflx7cZSmTxBegJlaSESKEEQhNKmxCdQCQkJXL9+jdEjhlLJw4rOzasbLZYv1x9i7frf8yV5+jczMzMqV6783IKharUaDw8PPDw8Xupc5ubmvDZoMK8NGvxS7ZQUMTExWJqXrtuWgiAUUWIMVKEq0SNf7969S5cOrVEbkvj49Za82jVrz0xhiYlLxMrWCVdXUayzJImJicFKJFCCIAilTontgbp8+TJvjR7G1Dc642hnRarWuLPs9p28RsCA14wag5D/oqOisNSIBEoQhKKgACuRi8XNsyiRPVC/rl/HxLEj+eztbjjZ509NoJDwKNb/fYKo2IRcH6vT6zlw9i5dunTNl1iEoiMq6jFWFs+eMSkIgiCUXCWqByoqKoqPP5yEuRzHnHG9njmFPzsGg4F7wY+4HRhO6ONEQiJiSUhMxiDLyChxcXXnlT6DmLtsCTV8HGjXqDLODjY5anvznn8YNvyNQqmKLRSu6KhIfG3zVo9LEAQhPxWVSuRz585l9erVBAYGYm5uTpMmTVi4cCG+vr6Z9jtz5gyNGjWiQYMGHDly5Lltbtu2jYkTJ3L37l2qVKnCl19+ScNnTJgqTCUqgXq1b0/e7NeMSt61X7hvSmoal24EcvFWKDcDI5CUplSqUpU6dTvRsmJFvLy8sLe3zzJbr2vXrvy9bStrf9tASNB9Knk50by2Dz7lXJ45s+/G3YecvBbG1M+H5Nt1CkVHdFQU1u6FW/lcEAShKPP29mb58uV4e3sTFxfHtGnT6NKlC7du3crYR6vVMmTIEFq2bIlWq31ue9evX6dXr1588skn9OrVi6+//prOnTtz69YtHBwcCvpyslWiEqg543piqXn+7ZTrd0PYvP8SsUkGWrZux4DRQ6lZs2aOC0AqFAq6dutO127dMRgMnDhxgj82rmfFr7/Rr30tGtb0ydj38NmbbD9xj/UbN4tK1SVU3foN+O2vtYwb3M7YoQiCUNoVYB2o3LQbEBCQ6esZM2ZQvXp1wsPDKVOmDACTJ0+mY8eOWFlZsWfPnue29+2331K3bl0+/vhjAJYuXcqff/7JTz/9xLhx43J3HfmoRCVQKqUy221XbgWx9u+zeFWswsyF31ChQoWXPp9CoaBx48Y0btyY+Ph4Fs6fyzuz12OhMUehUlHB25c//tyGWm3cAexCwYiPj2ffnt0kJqdiMBhEkiwIQon3394ilUr13Pc4rVbL6tWr8fPzyyjhs3fvXnbv3s25c+eYO3fuC8956tQpWrdunfG1JEm0bt2akydP5vEq8keJSqCe5fLNQNSJrpy8m8bKNRuzrZP0sqysrJg+cxbyjM+MUqRTKFxJSUkE9OrGax1rUMO/hrHDEQRBKJQ6UP+9ZTZ16lSmTZuWZfetW7fSv39/kpKS8PX1Zfv27SgUCmJjYxkxYgTr1q3Ldsmy/3r06BHOzs6ZnnNycuLs2bN5upT8UmITKL3ewKIfd2FX1psJvRrTp++AQjmvSJ5KvrS0NF7tH8BrHatTw9/T2OEIgiAUmsjISMzN/z9xJrv1VFu1asX58+cJCwtj0aJFDBgwgMOHDzN27Fj69euXqwHgcm5GsBeiEptA/fjnMdp1G8jgocMICwszdjhCCZGYmMjoEcNoX9edGv45XwpHEAShwBXCGChzc/NMCVR2LCws8PHxwcfHh/r162NnZ8f27ds5ePAgwcHBLFy4EEifAS/LMiqViitXruDn55elrTJlyvDo0aNMz0VERGTplSpsJWrQhizLJKekcej0NaJTzRg8dJixQxJKCL1ez3crv6F7pza0ru5I0zq+Lz5IEARBAMhIknbt2sX58+czHm+88Qa1atXi/PnzeHl5PfPY+vXrs3///kzP7d+/nwYNGhRG6NkqUT1QU77YgoODI5WqVGP5V1OMHY5QAiQnJ7Nz5w6WLVlAi9rlWfR+71zVFxMEQSg0RWQtvMmTJ9OzZ09cXV0JDw9n7ty5ODo60qRJE2xsMtdPdHZ2RqPRULVq1YznpkyZQkhICGvWrAFg1KhRfPnll8yZM4eePXvyzTffEBcXx6BBg/Ll0vKqRCVQW3fszVHXoiBkR5Zlrly5wvZtWzh8aD+GNC01fMsy6+0uaMxFIVRBEIQXCQwMJCAggIiICJycnGjWrBl79+7NkjxlJzQ0lMDAwIyv/f39+f3335k4cSLTpk2jSpUq/P3330atAQUlLIEShNxKS0vj3r17nD59kp1/byU8NBgvV3saVPVg2sg2qNXiT0QQhOJBkiWkIlAHat26dTned9q0aVlm8a1evTrLfl27dqVr16K1HJp4dxBKBa1Wyz///MO1q1e4duUid+/cJi01GUnWU9bJhooe9gzvUhl7m/rGDlUQBEEoBkQCJZRYsixz5MgRfvjua0KD71PVx4VyLra0quzEa61bP7fwqiAIQrFTRMZAlRYigRJKnAcPHrDqu285eng/Vb2d6d+yKmWdX7w+oiAIgiDklEighBIhISGBjRvW89vGddiaK+jYxJ/e7/cShU0FQSg9ishaeKWFSKCEF5JlmbCwMC5cuMD5c2ewtLSibbsO+Pn5GT1BCQwM5OMpE4l8FEKrOt5MG9UOM1Ox9qAgCIJQsEQCVcrJskzrFk3RmEpISCClPySFGlNTM5KTteh1KTjYaPB2s8fH04mE6AcsnrGLSK2C3zdtMWr84955g2FdqlPeTQz+FgShdJPk9EeBEGOgshAJVCl369YtKrjaMG5QmyzbUtN0qFXKZ/YyNa3jz8crdhZGiNn668/NeDqaUN7NyahxCIIgCKWPSKBKOWdnZ8Ij4565zeQ5NZAMBgM6vb6gwsqRL79YxKy3uxg1BkEQhKJCMkgFN6zCIMZA/ZdYk6KUs7W1pWKlGly4/iBXxykUCtToiIt7dvJV0FJSUsCgw9REjHcSBEEQCp9IoIqxoKAgPps+leZN6jN75vQ8t/PJtJn8uOUUBoMhV8c1ql6OXzfkvOJsfjI1NaVew6Z89MWfbN57lsjo+Ixter2BuIQkZFnctBcEoRR5OguvoB5CJuIWXjGl1+vx9PRkUM8WVK3gRJVq1fPclr29PQEDhrBx5wH6dcr5YOz2TasyadEqWrZqg4+PT57Pn1efzVlAQkICO3fuYNUfGwkOCuTOvUACgx8CsHfNpzjZWxd6XIIgCELJJxKoYkqpVHLv3j327d1DcNB9uvfoSXh4eJ7bGznqDfq8so27QeFU8CiTo2NUSiUfjuzIiKEDWbT0K6ysrEhOTiYlJQVJkvD19cXaumASGFmW2bFjO7t3bOP27VvoUpOxtTSld4cGlHe1pbK3u0ieBEEoVcQsvMIlEqhirHz58rw+fES+tCVJEiu++Z4BfbqxcELvHC+i62hnzSejOvL1wk9RqZWolQpM1EoMBpnAsGiSUvSoTc2pWNEXZ5eymJqaolabYGpqhtrEBHNzDd7e3vj7+6PRaF54PoPBQHBwEIMHBlDdx5k29XwZ3KYdSqW4Gy0IgiAUHpFACRnKlCnDO+9N4puNP/D2wNY5Ps7ZwYaxr2W/v15vIDgskui4UHTJetIS9KTo9CTq9YSl6Di2I4H7odGk6mSUalO8KlSgarVaVKlajUqVKhEdHc2xY0c5cnAft27eYMoHk5j1dhdRMFMQBOFfJFlCEpXIC41IoEo4WZY5efIkFhYWODo64ujoiFqdfeLxSq8+nDp5gl93nKZvx3r5EoNSqaCcmxPlclCvyWAw8PBRNPeCTrP57C4+D43GSmNGZS8nejfxxKVnVUxc7El9KJInQRAEwXhEAlXC/fnnZhbN+phaVX2JiU/iUVQ8rp4VWL7i22xvmc2eu4Dx495h895z9GxTq1DjVSgUuLs44O7iQLNCPbMgCELxJupAFS4xcKSEu3DuLDUreaIxU1HW0ZpuzaugTI7g9OnT2R4jSRKLP1/GzbA0rt8NKcRoBUEQBKF4ED1QJVyr1m25/8CHChV8UKlUHD96GKdyNlStWvW5x0mSRKs27QkPPIZ/BbdCilYQBEHIKzELr3CJBKqEa96iJc3/9XXDhg1zfKyllRWRyan5H5QgCIIgFHMigRKyZWVlhTZVZ+wwBEEQhBwQs/AKlxgDJWTLwsKC5BTjLhgsCIIgCEWR6IESsmVhYUFymuiBEgRBKA4kAxTUJDxyt1RqqSB6oIRsWVpakpwiEihBEARB+C/RAyVky8LCgqTkNGOHIQiCIOSAGANVuEQCZSSJiYkEBQURGBhIaOhDKlWqTM2aNTExMTF2aBnSe6DELDxBEARB+C+RQBWStLQ05s+ZxfGjB5ENekzVClwcrXG2s8DOyowNR/5i5oMIDJIK74p+NGnWim7duuVogd2CYmFhQVRsgtHOLwiCIOSc6IEqXCKBKmDh4eH8tnEDv/+6ju4tKjFnbNfn7i/LMiHhUZw9+Sc9v/2SXzb8gaOjYyFFm5laraZOg2bsPHqZDk2eX3hTEARBEEoTkUDlksFg4M6dO9y9exdLS0tsbW0zHgaDgaCgIIKDg7l08Tx7d23H0kyiee0KLBjfExP1i7/dkiRlrAVX3deDgFe6smrNOry8vArkemRZfu7aSZ/NnkevHl2o4OZAxfJlCyQGQRAE4eWJWXiFSyRQz5GUlMSlS5f45+xp/jlziochQWBIw9XJBjcnK1LS9CQkpZKQlEp8UjIAzvZWONtZ4F7Ghs/e7Ig6B0lTdrw8nPl4ZHteH9SXJcu/pWbN/F3Y95ef17Bw/hxat23H3PmLUamyxqpUKvlhzS+MGPoaliYX6dO2Fl4ezvkahyAIgiAUNyKBeiItLY29e/dy5uQxLl44T2JCLGoleLs74uNhz8DWXjja1Sj0uJwdbPjsnR5MGvcGH3wym9Zt2mTZR6fTsfHXDaiUSn78fgUgwZNPIdKTfzxdxkhSqvny6+85eGAfu//8hR9mvc6OI5cI6N0DTw8PUlJSSE7WkpKcQkpKCgbZALKMLBu4djecbzceYPZ7AQW34rcgCIKQJ2IMVOEq9QlUWFgYX69YxuEDe2lYzYOqPq50eK0xZqZqY4eWwdrSnNnvvsLsRTM4c/ok49+fhEqlIj4+nm+/XsG2LZtoUbsCfQeNYs67PZ7bVlhEDEMG9kEhweJJASgUCjo3r0ENvygkCUzUKkzUKtSq9P8rlaJUmCAIgiD8V6lNoAIDA5kyaTxJcY/p0aIKvSb1KdK9KqYmaqa92Y2dRy7TqX0rqlSpxrXL5+neogpLJvZGoVCgULw42XFxsmXuez1JSEzOtL9bGfuCDF8QBEEoYAqDVGDvY7Kh6L4/GkupTaA+njKRgBZeeHs2MnYoOSZJEh2bVaNhjQqEPY5heMfeeWpHY2aKxsw0n6MTBEEQhNKjVCZQwcHBJMWE4+1Z39ih5ImttQW21hbGDkMQBEEoQiQ5/VEgCqrdYqxUJlBarRYLjeiBEQRBEEoQWUIqoFttshhEnkWpTKAqVqxIos6E3UcvYm9jibmZCXEJWq7eDQfSB1JrzFTUq1oetzL2ORpbJAiCIAhC6VEqEyiAFd98z+ZNvxOdkEBQTDxW1u70GzkUU1NTtFotkZGR7Ni5jRvXjlLN25FB3RqJREoQBEEosiRDRgWbAmlbyKzUJlDOzs6MGj0m4+v+Ab3YtnkjpmbmKFXq9HKuBgOmJmr2n7yGXzlnGtasaMSIBUEQBEEoKkptAvVfvn7+xFnp6dqiBs4O1kW6pIEgCIIg/JdCllCIQpqFJs/3pHr27IkkSezZsyfjub/++otatWqh0Whwd3dn3LhxpKSkZGx/+PAh7dq1w83NjU8//TTj+fv37yNJEl5eXqSmpmY8r9PpkCSJAwcO5DXMHJs+cxbNuw7i96PBTFq6lQWrdhIcFlng5xUEQRAEofjJUwL1ww8/oNVqMz13584d+vTpQ//+/bly5Qo//fQTv//+OzNnzszY59NPP6VJkyZs3bqVnTt3cvTo0UxthIWFsXLlyryE9NIkSaJXrz589e0qduw+wKTpixk//1dOXrhllHgEQRAEITckQ8E+hMxyfQvvwYMHTJ06lWPHjuHh4ZHx/D///INGo2Hy5MkAeHl50bdvX86cOZOxT0xMDB07dqRatWq4uroSExOTqe0xY8Ywa9YsXn/9dczNzfN4SXljMBiIjIzkn3/+4cDeXVw4/w+dm1enfnWfQo1DEARBEISiL1c9UAaDgSFDhjB9+nTc3d0zbatTpw5arZbff/8dWZYJCgpix44dtG/fPmOfSZMmMWbMGMzMzEhJSaFDhw6Z2hg5ciSmpqYsX778JS4pd1Z+8xXtWjaiW4fmvDtqIEe2rqJuOYk573RmaM8mYiyUIAiCUCxIBqlAH0JmueqBWrJkCZaWlgwbNizLtgoVKrBlyxb69+9P//790el0jBo1ivHjx2fsU79+fR4+fEh0dDTOzs5Z2lCr1UydOpX333+fN954o8B7oS5cuMBHH33EuKGdaFyzIg52VgV6PkEQBEEQSoYcJ1DXrl1j0aJFmW7J/dvDhw8ZM2YMEyZMoFu3bjx48ICxY8cyf/58Jk2alLGfWq1+ZvL01KBBg5g3bx6LFy/mo48+ysWlpI+helbSlZycTFhYWJbny5Qpw9lzFwgLCyMsNIRHCVoszdXYW2uws7Gg4CpqFAyFuR0mrvWMHUaBE9dZsojrLFmK63UaklNevFMRpzC8xMywFxFjoLLIcQJ18uRJwsLC8PT0zPR8hw4d6N+/P15eXpQrVy4j6alevTrx8fG88847mRKoF1EqlUyfPp2RI0cyZsyYFx/wLy4uLs9MoMLCwnBxccn2uPSxXPWQZZkrV67w9YrllDVPoHvrWrk6v7GZuNYj9eFpY4dR4MR1liziOkuW4nqdqSlpxg5BKGZynKz27NmTixcvcv78+YwHwDfffMO8efNISkpCqVRmblyhQJZzvwJhQEAAFSpUYN68ebk+9mVIkkTVqlVZuuxL9p+9T2JScqGeXxAEQRDy6uliwgX1EDLLcQ+Ura0ttra2WZ4vX7487u7udO7cmaVLl7J06dKMW3hTp06la9euuQ5KkiRmzpxJQEBAro/ND0qlkhmz5jL9k4lMHdMVC41ZxjaDwcCt+2E8jIjGysIMK405VpZmONpZY6IWdUkFQRAEoTTIt3f8tm3bsmrVKhYuXMiUKVOwt7enW7duzJ07N0/tde3alVq1anH8+PH8CjFXGjdpyvQ5nzNx/Nu4OtngaGfB/ZAoZIUJNWrWxtu3CTHRUdx/FEX09UiCg/4hKTGeMvYWVPJyplpFdzzKOohZfIIgCEKhEGvhFa6XSqD+e3tuyJAhDBkyJNftlC9f/pm3+o4dO5bn2PJD/QYNOHj0NI8fPyY4OBh/f3/MzMyy3f9p+Ybjx4+z+8hBbv9+ElmfRgV3eyp7OVOzUnksNdkfLwiCIAhC8SDuOeWAo6Mjjo6OL9xPkiQ8PT3x9PSkX79+QPpyNJcvX+b4sSN8smI9bet5oTFTo1RIeLk741H2xe0KgiAIwouIWXiFSyRQBUylUlGzZk1q1qzJyFFv8O3XX2FmrkGWDWw5fYIHtw+hUimRkdCYqhj7akusLTXGDlsQBEEQhOcQCVQhUqlUvPn2OxlfDx8xksTERNRqNSYmJpw/f5733hnNmIAmVPJ2y3SsLMtExsRjZWGOqYm6sEMXBEEQijjJICNRMNPlJIOYhvdfIoEyMgsLi4x/16xZk01bdjJl0nhWb/0HlWTAYDAgS0oUSjUuZV25fv0aAzrWolkdPyNGLQiCIAilm0igihhbW1u++nYVkF5BXaVSoVKl/5hu3rzJ6Ndfo4qP2/OaEARBEEoh0QNVuEQCVYT9d8bfwQP70OlSmbdqNwqlCqUy/cen0+kwN5F4f2JlLJ7VkCAIgiAI+UokUMXIyFFv0LffAKytrbPUl4qOjubwoYNcOnSu2C1BIwiCILw8SZaR8rD6R07bFjITCVQxY2Nj88znNRoNqampVKqQ/Zp/giAIgiDkjwIrGSEUnsuXL9GpbQvcna2oWL6sscMRBEEQjEAyyAX6EDITCVQJkJqaRkVPB+ysxQgoQRAEwbjmzp2Lv78/Go0GBwcHunfvzs2bNwF48OABrVu3xtnZGTMzM3x9ffn8889f2OacOXOoUKEC5ubm+Pn58c033xTwVbyYuIVXAtSuXZuYFDXX74Vx6/QFyrs6YWaqJjoukaiYBKLjk4lNSCY6Xkt0XBI6vYyMhL2VKa+0ro6vl6uxL0EQBEF4SZJsQJILpmR4btr19vZm+fLleHt7ExcXx7Rp0+jSpQu3bt1CpVLx6quvUrduXWxsbDhx4gQjRozA0dGR11577ZntrVmzhtmzZ/Pzzz9To0YNDhw4wMiRI/H29qZt27b5dYm5JhKoEmLDb5u5d+8eick6Ll69RFJiAmVcXCnj60oll7LY2dkxd/ZMtKnxqBQSCqWS89cesHbTHsqWceLtV9vTrklVzExFkU5BEAQh7wICAjJ9PWPGDKpXr054eDhubm4MHz48Y1v58uXZuHEjR48ezTaBOnnyJG3atKFHjx4ADB06lGXLlnHmzBmRQAn5w9zcnIEDB2Z5XpZlhg0eSKsaZWhRr0WmbbcfhLH14CU+WryWjxbDp2/3oU/HhoUVsiAIgpBfZDn9UVBtA1qtNtPTKpUKtTr7D95arZbVq1fj5+eHk5NTlu0XL17k6NGjLFq0KNs2GjVqxIQJE7hy5QpVqlThyJEj3Lp1i9atW+fxYvKHSKBKgWVLl+BikUaLev5ZtvmUc2HcYBfGDW4HpCdbgiAIgvAsDg4Omb6eOnUq06ZNy7Lf1q1b6d+/P0lJSfj6+rJ9+3YUiv8Pu27cuDH//PMPqampzJw5k1dffTXbc7722muEhIRQvXp1FAoFkiTx3XffUb9+/Xy7rrwQCVQpULd+Az76bQNKpYImtbzxKEAyS/YAABJgSURBVOuY7b7/rS8lCIIgFA+FMQYqMjISc3PzjOefrpTxX61ateL8+fOEhYWxaNEiBgwYwOHDhzN6qzZs2EBcXBwnT55k0qRJ+Pv707t372e2tW/fPpYtW8ZPP/1EtWrVOH78OGPHjsXLy4tmzZrl85XmnEigSoHGjZvw9+4DHD16lPlzZvBWQEMqeJQxdliCIAhCMWNubp4pgcqOhYUFPj4++Pj4UL9+fezs7Ni+fTvdu3cHwMPDA4AqVaoQGhrKrFmzsk2gPv30U0aNGpUxRKVatWqcOXOGzz//3KgJlChjUEqYm5vTtm1bftnwB4vW7CM1TWfskARBEIT8JBsK9vEyoclytr1VBoMh220ASUlJKJXKTM8pFAoMhoLpbcsp0QNVysiyjKlahUopcmdBEAQh/02ePJmePXvi6upKeHg4c+fOxdHRkSZNmrB582aSkpKoXbs2KpWKY8eOsWjRIqZOnZpx/JQpUwgJCWHNmjUAdO7cmaVLl1K9enWqVq3K8ePHWbNmDcuXLzfWJQIigSp1Jr0/jtF9mmQazCcIgiCUBPonj4JqO2cCAwMJCAggIiICJycnmjVrxt69e7GxscHExIRZs2Zx/fp1IL1m1OzZs3nzzTczjg8NDSUwMDDj608//RSdTsc777xDeHg4Hh4ezJgxg9dffz3/Li8PRAJVity6dYuUuHD8KtQ2diiCIAhCCbVu3bpst3Xu3JnOnTs/9/jVq1dn+trExIS5c+cyd+7c/Agv34gEqhQJDw/H3dnW2GEIgiAIBSEfxio9t20hE3EfpxSpXbs2p68GiQHkgiAIgvCSRAJVimg0Gj6dPpuPl20mSZti7HAEQRCEfGUo4IfwbyKBKmVatW7DtFlL+HDpZqJiE4wdjiAIgiAUSyKBKoUaNGzIlyvXMHXFNkIfRRs7HEEQBCFf6EEuoEeBze4rvkQCVUr5+/vz07rfmfP9LrTJqcYORxAEQRCKFZFAlWIeHh5Mn72A+at2ikWEBUEQij2Zghv/JN4j/kskUKVc8+YtaN6uO+v+PmXsUARBEASh2BAJlMA7775HWIKafccvi54oQRCEYktfwA/h30QCJSBJEl99+z1xag/em/8bv+44RWJSsrHDEgRBEIQiSyRQAgBmZmZ8MnUGO/cdoVarvsz64QALftjJ3aBwY4cmCIIg5MTTSuQF9RAyEQmUkIlKpaJXr95s+Xs3H81axq4L0Uxa/Ad7jl1GpxdduIIgCIIAYi084Tn8/Pz48quVJCQksObHH5i0ZAO+nvY0r+2NfwVXFAqRfwuCIBQdegquX0R8gP4vkUAJL2Rpacmbb73DmDff5uzZs/y56Td+2b0HZBm9Pg2DLo2BnepQw9/T2KEKgiAIQqEQCZSQY5IkUbduXerWrZvp+fDwcN4d/apIoARBEIxIxoBcQGvWFVS7xZm4ByO8NGdnZ+ITxaw9QRAEofQQPVDCSzMYDCgkydhhCIIglG5yAY6BksUYqP8SPVDCS1MqlcjiV0kQBEEoRUQPlJAvJKX4VRIEQTCup+vWFVTbwr+JbgMhV77+6ksePHiQ5XlTU3PS0nRGiEgQBEEQCp9IoIRcmTd3Lu+/NZRX+/chNDQ043k3D3fCI2ONGJkgCELpJqMv0IeQmUighFwZOHAAzet4M6C1DwMDenL79m0AypWrQNjjGOMGJwiCIAiFRCRQQq58Om0mFwJTOfTPbT59oyMjhw7kwoXzeHlXJCQ8xtjhCYIglGKGAn4I/yYSKCFXTE1N+e6HNbhXasyvO88y/JWG/LzmB1q0aME/1x8aOzxBEARBKBQigRLyZOy747Ep68fcb7cyfOQY7O3tSUNNSmqasUMTBEEolWRZX6APITMx91zIs9lzF+DrXxkPDw/S0tLo2SuArQf307td3RcfLAiCIAjFmEighDxTKBRs+XMTm9b9gAyk6iUuX71Oz9a1USpF56YgCELhEnWgCpNIoISX0rx5C9IeXaJT8xro9QZu3KuLQiGWdREEQRBKNtFNILyUd959j/uxJnz2zTYePoqiso87klgXTxAEodDJyMgYCughG/vyihzRAyW8FJVKxYqvv+PWrVvMnPYxaYmnGNqjIa7O9sYOTRAEQRAKjEighHxRsWJF1qzdwLVr15g57WOUungGd2+Ai6OtsUMTBEEoJfRAQd0BELPw/kvcwhPyzfr1v2BlZcUvG35n0rRFfLflIivW70enF394giAIQskiEighX8TFxfHV0oW8OXwAE94bi7u7Oxt++5P2rwzlg8V/EBkdb+wQBUEQSjbZULAPIZMSdQtPq9Vm+3x220oSY17nL2t/olPTyrRpVJUL1x/wv/buPqaps/0D+Le2DYUilg0cb4FGGBnOTjeKS4W2CvGRReNvY3H+8XMRfRjMoeIWNFu2iXFq+GNsGhe3oFNZtnQjGXthjJlFmWfOWV+YkL0wM9MOX1BgioQYoMD1/EE489CCLdA3cn2SJvY+5z491315l4vTu4e8Ff9B3ur/x38LCpGckoqNReuxe/P/QRWinPRrDfX2ob9v+t+wk+OcXjjOwDYdbgJMNOC1mw0QDXjpyMFLRkRBv7Te4XBAq9Xi+nX+UyKMMcYmJi4uDna7HUrl5H/R8yVf/QwM1vHxlmlRQAHD/4EGBrhCZowxNjEKhSJoiwNf/AwM5vHxhmlTQDHGGGOM+QovImeMMcYY8xAXUIwxxhhjHuICijHGGGPMQ1xAMcYYY4x5iAsoxhhjjDEPBVUBtWPHDshkMsnj6aefFre///77SExMhMFgwB9//AEA+OKLLxASEiK5weTly5chk8mwefNmyfE3bdqExYsX+yIUAMCePXvwxBNPIDw8HLGxsVi3bh06OjrG7bN48WKnMdi7d6+4fXBwEIWFhYiNjcWqVavQ09MDACgpKYHJZJIc68MPP4RMJkNNTY2kXafTYceOHVMS42SVl5cjLi4OYWFhWLlyJW7cuCFuc5XvQOHL3AKAVqt16iuTyXDmzBlvhTiuicxVAMjPz3cZR3l5uR+i+NdY41tdXe1y/+mQy5qaGuTk5GDWrFmQyWROX5G/dOkSlixZgtDQUGi1Whw+fFiy/fr161i6dCni4+Oxfft2sd1ut7uMT6VS+SQuxqZKUBVQALBw4UK0tbWJj6NHjwIAWltb8e6776K6uhrr1q0TiyOTyQSHwwGr1SoeQxAEJCQkQBAEybEFQXAqMrzp1KlTeOWVV3D+/Hl89dVX+P3337F69er79tuyZYtkDAoLC8VtFosFN27cwLFjxxAZGYl9+/YBGB6Hs2fPoq+vT9zX1TjcunULv/32m0/HYSxHjhzBrl278N577+H06dPo7u4Wx2esfAcKX+Z2REVFhaRvW1sb0tPTpzw2d3k6V0c8++yzTnFs2rTJDxH869y5c5Lz2bdvH0JDQ5Gbmztmn2DP5d27d5GdnY1XX33VaZvD4cDy5csRFRWFc+fO4c0330RRURGOHz8u7rN9+3ZkZmbim2++wbFjx/DTTz9JjvHzzz9L4vv777+9HhNjUyno/pSLUqlETEyMU3t3dzc0Gg0ee+wxKBQKHDx4EADw4IMPYu7cuRAEQby6JAgCiouLsWvXLnR1dUGj0aCrqwu//vor3nnnHZ/F8u2330qe7927F4sWLcKdO3cwa9asMfup1WqXYwAAXV1d0Gq10Ol0SE1Nxc2bNwEMF1B9fX2wWq1icSQIAkpLS1FVVSX2//HHH6FUKmEwGCYb3qTt378fJSUlyMvLAwAcPnwYycnJuHjxIhQKhct8Bwpf5nZERETEmH39wdO5OkKlUgVUHAAQHR0teV5bW4tnnnkGERERY/YJ9lyuWbMGAPDDDz84bauvr8eVK1fQ2NiImTNnYt68eTh58iT279+PnJwcAMMx5ubmQqfTIS4uDl1dXZJjREVF+T1GxiYj6K5ANTU1ISYmBqmpqSguLsbt27cBAPPmzUNaWhoiIiKQnZ2Nt956S+xjMpkkV1kEQUBOTg70ej1OnToFYLhwkMvlfi0cOjs7oVKpoFarx92vsrISUVFRWLBgASoqKjA4OChuW7NmDQRBgFKpxAcffCD+5h4dHY20tDRxHK5evYp//vkHBQUF+PPPP3Hnzh0Aw2Oj1+sRGhrqpSjd09fXh6amJmRnZ4ttc+bMgVarhdVqHTffgcibuQ1UE5mrweDKlSs4ceIE8vPzx91vOuVytLNnzyIjIwMzZ84U23JyciRX+rdt24YNGzZApVKhr68Py5Yt88epMuY9FETq6+uppqaGmpub6euvv6ZHH32UjEYjDQ0Nift0dHRQb2+vpJ/FYqGwsDDq7++nq1evklqtJofDQa+//jpt3bqViIhKS0vJYDD4NJ579fb2kl6vp6KionH3O3jwIB0/fpyam5upsrKSIiMj6Y033pDsMzQ0RG1tbTQ4OChpLyoqoqVLlxIR0ccff0zLli0jIqLMzEyqq6sjIiK9Xk+vvfbaVIU1YdeuXSMA1NzcLGnPyMignTt3is9d5TvQ+CK3SUlJFBISQmq1WvIYGBiY8njcMdG5unbtWlIoFE5xNDQ0+DiCse3evZsSEhKccnCv6ZTLhoYGAkAOh0Nse+GFFygvL0+yX11dHcnlcklbf38/3bx5U9Jms9kIAIWFhUniG3lvYixYBNVHePeuN9DpdJg7dy5SUlJw4cIF6PV6AMOXhUczm824e/cuLly4AJvNBoPBAIVCgaysLHGxtCAIWLJkiU/iGG1wcFC8XP7222+Pu29BQYH4b51OB7lcjpKSEuzcuRMymQwAIJPJXF4aN5vN+OSTTzAwMABBEGA0GgEAWVlZ4vqvX375JSCuCJCbf2HIVb4Dia9yCwBlZWVYtWqVpE0ul0/m9CdsonMVAJYvX+40VvHx8d47WQ9VVVXh+eefx4wZY1/An065dMXd+alUKjF79myX22pra5GYmCg+9/dVb8Y8FVQF1GjJycnQaDSw2Wzim7IrsbGxSElJgSAIsNls4hqgRYsW4eLFi2hvb0djYyPKysp8deqioaEh5Ofno6WlBSdPnkR4eLhH/dPT09HT04POzk6ndRqjmc1m9PT0oLGxEYIgoLKyEgBgNBqxe/ducZFnZmbmxIKZQlFRUZgxYwba29sl7R0dHWO+IQcaX+YWGP6YNiUlZaKn61XuzlUACA8PD9g4Tp8+jUuXLt3347vRplMuAeChhx5CS0uLpK2jo8Ot2EYkJiYGdIyM3U/QrYG6V2trq7gY837MZjMEQZBceYmIiEBaWhoqKipARMjKyvLyGUsREQoKCnDmzBl8//33eOCBBzw+RlNTE9RqtVtXYuLi4pCcnIzPP/8cdrsdGRkZAIYLpsbGRnz33Xd4/PHHJesa/CUkJATz589HQ0OD2Gaz2WC32/Hkk0/68czc4+vcBjpP5mogq6qqgsFgQGpqqkf9plMugeFvWJ4/f15y+4UTJ04ExdxkbKoE1RWobdu2YeXKlUhISIDNZsPWrVthMBjc+nqvyWTCSy+9hIGBAckkz8rKwoEDBzB//vxxv1HjDS+++CJqa2tRV1cHAOI9jqKjoyGXy3Ht2jXk5OTgo48+wsKFC3H58mV8+umneOqppxAZGQmr1YrS0lIUFxeLHwvcj8lkwoEDB6DX68X7rmg0Gjz88MM4dOiQ5KvW/rZx40aUlJQgPT0dc+bMwcsvvwyj0YgFCxb4+9Tuyx+57e7ultwnCxjOrT/urzOZudrb2+sUR1hYmM/n52i9vb2orq52uifVdM3lrVu30Nrair/++gvAcBEol8uRkpKC3NxcxMfHY/369SgrK4PVaoXFYkF9fb3bx+/s7HS6Kjt79uxxPxplLKD4dQWWh5577jmKiYkhpVJJSUlJVFhYSO3t7W71tdvtBMBpofhnn31GAGjLli3eOOVxAXD5sNlsRPTvYsuRBbStra1kNBpJo9GQSqWiRx55hMrLy6m/v9/t1zx69CgBcFoovmHDBgJAX3755VSFNyX27NlDMTExpFKpaMWKFdTW1ubvU3KLr3OblJTk8vUsFouXIhzfROfq2rVrXcZxvwX4vmCxWEilUtHt27cl7dM1l0eOHHF5HiNxtrS0kNlsppCQEEpMTKRDhw65ddyR8XL1CJb5zRgRkYzIzdWAjDHGGGMMQJCvgWKMMcYY8wcuoBhjjDHGPMQFFGOMMcaYh7iAYowxxhjzEBdQjDHGGGMe4gKKMcYYY8xDXEAxxhhjjHmICyjGGGOMMQ9xAcUYY4wx5iEuoBhjjDHGPMQFFGOMMcaYh/4HYYEua1S0xH8AAAAASUVORK5CYII=", + "image/png": "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13w7FotF9m6sXr26yM9d2tvGvagnT20bosevb9++SoMGDZSUlJRiP7e3tI27qSdPbRuFHV8Yb2kbhR2v1rZB6sGg+Q7l94e3f/9++VWXGDxxMzFQQAw2yL2Jc4ivysRgt6L68ssv5ddDRekVEKpXr668/vrrislkUrKysnLKIv7YX3nllTwDHkpLPb344osyvaNevXqyDNkaN24s60K8qIsXPLVcc37BoPiKsTgvxKW9bdyLevLEtiF+nwMGDJBv3OIr8zvhDW3jbuvJE9tGYccXhTe0jcKOV3PbIPVg0FxMoufijz/+kAGc+MPbt2+fvC2+khLBXVhYmDJs2DD5gp29FTTC/ea0A5EvJXI0xad44eTJk/Lrr99//13mZ4ncqoiICPlHWlTiTUR8nda2bds8+0VPjNg/cuRIxdPqqahvAuJFPPcI7uHDh8trbtKkiaK2axa/UzHaX8waIn7/Tz75pJw9JPsxbBtFq6fS2DbE1+Dh4eHyenM/RqQhCGwbRaun0tg2CjpeYNsoWj2psW2Q+jBoLiaROiD+4G7exCfPSZMm3fa+fv36FTkYjI2NzTmfEBcXp7Rr104pU6aM/FQvvg6bNm1asfJcFy1aJM9588CMoUOHyv1ieiBPq6fCiIBKHHPzwIylS5fK/aI3RG3X3LNnT6VChQpyqibxr7gdExOTcz/bRtHqqTS2jdvdLzbRJgS2jaLVU2lsGwUdL7BtFK2e1Ng2SH004n8lMUsHEREREZGn4jzNRERERESFYNBMRERERFQIBs1ERERERIVg0ExEREREVAgGzUREREREhWDQTERERERUCAbNRERERESFYNBMRERERFQIBs1ERERERIVg0ExEREREVAgGzUREREREKNj/A7RJwaROCfS4AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -155,14 +152,9 @@ "ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n", "\n", "# extract trajectory data\n", - "lons = underway_st_ds[\"lon\"][:].sel(trajectory=0).squeeze().values\n", - "lats = underway_st_ds[\"lat\"][:].sel(trajectory=0).squeeze().values\n", - "var = (\n", - " underway_st_ds[VARIABLES[PLOT_VARIABLE][\"ds_name\"]][:]\n", - " .sel(trajectory=0)\n", - " .squeeze()\n", - " .values\n", - ")\n", + "lons = underway_st_df[\"x\"]\n", + "lats = underway_st_df[\"y\"]\n", + "var = underway_st_df[VARIABLES[PLOT_VARIABLE][\"ds_name\"]]\n", "\n", "# segments for LineCollection\n", "points = np.array([lons, lats]).T.reshape(-1, 1, 2)\n", @@ -182,13 +174,13 @@ "ax.add_collection(lc)\n", "\n", "# additional map features\n", - "latlon_buffer = 7.5 # degrees (adjust this to 'zoom' in/out in the plot)\n", + "latlon_buffer = 1.0 # degrees (adjust this to 'zoom' in/out in the plot)\n", "ax.set_extent(\n", " [\n", - " underway_st_ds.lon.min() - latlon_buffer,\n", - " underway_st_ds.lon.max() + latlon_buffer,\n", - " underway_st_ds.lat.min() - latlon_buffer,\n", - " underway_st_ds.lat.max() + latlon_buffer,\n", + " underway_st_df[\"x\"].min() - latlon_buffer,\n", + " underway_st_df[\"x\"].max() + latlon_buffer,\n", + " underway_st_df[\"y\"].min() - latlon_buffer,\n", + " underway_st_df[\"y\"].max() + latlon_buffer,\n", " ],\n", " crs=ccrs.PlateCarree(),\n", ")\n", @@ -209,8 +201,8 @@ "sm = plt.cm.ScalarMappable(\n", " cmap=VARIABLES[PLOT_VARIABLE][\"cmap\"],\n", " norm=mcolors.Normalize(\n", - " vmin=float(underway_st_ds[VARIABLES[PLOT_VARIABLE][\"ds_name\"]].min()),\n", - " vmax=float(underway_st_ds[VARIABLES[PLOT_VARIABLE][\"ds_name\"]].max()),\n", + " vmin=var.min(),\n", + " vmax=var.max(),\n", " ),\n", ")\n", "sm._A = []\n", @@ -218,13 +210,10 @@ " sm, ax=ax, orientation=\"vertical\", label=VARIABLES[PLOT_VARIABLE][\"label\"]\n", ")\n", "\n", - "dates = (\n", - " underway_st_ds[\"time\"][:].sel(trajectory=0).squeeze().min(skipna=True).values,\n", - " underway_st_ds[\"time\"][:].sel(trajectory=0).squeeze().max(skipna=True).values,\n", - ")\n", + "dates = (underway_st_df[\"t\"].min(), underway_st_df[\"t\"].max())\n", "n_days = (np.datetime64(dates[1]) - np.datetime64(dates[0])) / np.timedelta64(1, \"D\")\n", "plt.title(\n", - " f\"{dates[0].astype('datetime64[D]')} to {dates[1].astype('datetime64[D]')} [{n_days:.1f} day(s)]\",\n", + " f\"{np.datetime64(dates[0], 'D')} to {np.datetime64(dates[1], 'D')} [{n_days:.1f} day(s)]\",\n", " fontsize=12,\n", ")\n", "\n", @@ -234,7 +223,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -248,7 +237,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.14.6" } }, "nbformat": 4, diff --git a/docs/user-guide/tutorials/index.md b/docs/user-guide/tutorials/index.md index 35b04234..444742de 100644 --- a/docs/user-guide/tutorials/index.md +++ b/docs/user-guide/tutorials/index.md @@ -5,8 +5,6 @@ maxdepth: 1 caption: Post-processing results --- -ADCP_data_tutorial.ipynb -CTD_data_tutorial.ipynb Drifter_data_tutorial.ipynb Argo_data_tutorial.ipynb CTD_transects.ipynb @@ -21,7 +19,6 @@ maxdepth: 1 caption: SURF Research Cloud set up --- surf_research_cloud_setup.ipynb -surf_collaborative_setup.ipynb ``` ```{nbgallery} diff --git a/docs/user-guide/tutorials/xbt_plotting.ipynb b/docs/user-guide/tutorials/xbt_plotting.ipynb index b10e0f72..4dfc17be 100644 --- a/docs/user-guide/tutorials/xbt_plotting.ipynb +++ b/docs/user-guide/tutorials/xbt_plotting.ipynb @@ -32,12 +32,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "63bef1a3", "metadata": {}, "outputs": [], "source": [ - "import xarray as xr\n", + "import parcels\n", + "import polars as pl\n", + "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import math" ] @@ -63,8 +65,6 @@ "metadata": {}, "outputs": [], "source": [ - "# set data dir path\n", - "\n", "data_dir = \"/path/to/EXPEDITION/results/\" # set this to be where your expedition output data is located on your (virtual) machine" ] }, @@ -75,19 +75,20 @@ "source": [ "#### Load data\n", "\n", - "We are now ready to read in the data using the `xarray` package. You can carry on executing the next cells without making changes to the code…" + "We are now ready to read in the data using `Parcels`, specifically the `parcels.read_particlefile()` function. \n", + "\n", + "You can carry on executing the next cells without making changes to the code…" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "id": "18ea91b0", "metadata": {}, "outputs": [], "source": [ "# load argo data\n", - "\n", - "xbt_ds = xr.open_dataset(f\"{data_dir}/xbt.zarr\")" + "xbt_df = parcels.read_particlefile(f\"{data_dir}/xbt.parquet\")" ] }, { @@ -112,13 +113,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, "id": "b9f71a4c", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABZYAAAWWCAYAAAAfbvIHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAOxAAADsQBlSsOGwABAABJREFUeJzs3Xl8VPX97/H3ZJsJIWQjYU/igtqqAYtlsWoQbRQVpKLQWhUNUtS2Itfe67UugFaliz+Xn7Xlh0ClFqu1WrX6q/yqKLgUtyu4UDeWhCUJkI1lJsnMnPtHMpMZE2AmmTNn5uT1fDx4NJk5mXzyNc1nzud8zufrMAzDEAAAAAAAAAAAEUqxOgAAAAAAAAAAQHKhsAwAAAAAAAAAiAqFZQAAAAAAAABAVCgsAwAAAAAAAACiQmEZAAAAAAAAABAVCssAAAAAAAAAgKhQWAYAAAAAAAAARIXCMgAAAAAAAAAgKhSWAQAAAAAAAABRobAMIKm99tprcjgc+sMf/mB1KAAAJARyIwAAnciLgHkoLANJbs2aNXI4HPrRj37U5TnDMFRQUCCHw6Hly5d3ef6rr76Sw+HQeeedF49QE1ZP32i88MILuv766/Xtb39bTqdTDodD//znP80JEgAQMXJj7/UkN+7fv18rV67U9OnTdcwxx8jlcmngwIG68MILtXbtWvOCBQAcFnmx93p6zviLX/xCZ599toYPHy6Xy6UhQ4Zo4sSJeuaZZ8wJFIgzCstAkhs/frwyMjK6PWH7+OOPVV9fL4fD0e3zgcfKy8tNj9MsY8eO1aZNm/S9730v7t/7vvvu0+9+9ztt2bJFgwYNivv3BwB0j9xoTW584403NGvWLL355puaMGGC5s+fr3POOUerV6/WxIkTtXLlyrjGAwBoR1607pxxyZIlOnDggM477zzNnz9fU6dO1RdffKHp06frf/2v/xX3eIBYS7M6AAC9k5mZqVNPPVVvvfWW6urqVFRUFHxu3bp1kqQpU6Yc9k3CmWeeGZ9gTdCvXz+dcMIJlnzvX/ziFxo6dKiOPvpoLVy4UIsWLbIkDgBAOHKjNblxyJAheuKJJ3TJJZcoLa3zNONf//qXysvLdcMNN2jGjBlyuVxxjw0A+jLyonXnjF988UWXvHfgwAGNGzdODzzwgG666SYNGzbMktiAWKBjGbCBwNXjr78RWLt2rUaOHKlLLrlEW7Zs0fbt27s8n5mZqW9/+9uSpFWrVmnatGkqKSmR0+lUUVGRpk+fro8//jjs6+6++245HA69+OKL3cZzwQUXKD09XbW1tZKkhQsXyuFw6Msvv9SiRYtUUlIil8ulsrIyPf74492+xr///W/NnDlThYWFcjqdOv7443XXXXeppaUl7LjubknaunWrHA6HFi5cqLffflvl5eXKysrSwIEDNWfOHO3bty947MKFC3XWWWdJkq6++mo5HA45HA6VlpZ2G1eo008/XUcfffQRjwMAxB+5Mf65cdSoUfr+978fVlSW2jvlzjrrLDU1NXVZNwBAfJAXrTln7O5ialZWlioqKmQYhrZu3XrE1wASGYVlwAYCV4+//iZh3bp1OuOMM3TGGWd0eX7nzp3avHlz8LYoSbrpppu0fft2nXPOOZo/f74mTZqkF198URMmTNDnn38e/NqrrrpKqamp3c6Xqqmp0csvv6zJkyd3GQ/x05/+VL///e81bdo0zZ07V3V1dbriiiv0yCOPhB23YcMGjRs3Ts8884wqKio0f/58ZWdn64477tCUKVPk9/sjWpd33nlHkyZNUk5Ojq677jqNHDlSjz76qGbNmhU8ZuLEicHPL7roIi1YsEALFizQjTfeGNH3AAAkJnJj96zKjYFi89eLzgCA+CAvds+KvNjS0qLXXntNGRkZOu6443r0GkDCMAAkvebmZiM1NdUYNWpU8LEvv/zSkGT84Q9/MAzDMIYNG2bMnTs3+PyqVasMScbChQuDj23evLnLa3/88cdG//79jVmzZoU9PnnyZMPpdBp79+4Ne/xXv/qVIcl45plngo8tWLDAkGQMGTLEqKmpCT5eU1NjDB482OjXr1/Y60yYMMGQZLz00kvBx3w+n3HxxRcbkoxHH300+PiaNWsMScaKFSuCj23ZssWQZEgynn766bDXmDRpkuFwOIyqqqrDvka0Aj/j//zP//T4NQAAsUNutD43BuzYscPIzMw0CgsLjba2tl6/HgAgeuRFa/Pi3Xffbdxxxx3G9ddfbxx11FGGw+EwHnjggR69FpBI6FgGbCA7O1ujR4/WRx99pMbGRkmds7ICV55PP/30sKvP3W3CcNRRR3V57RNPPFFnnXWWXnvttbDHZ8+erZaWFj3xxBNhjz/22GPBHeC/7oYbbgi7Ij1o0CDNmzdPBw8e1LPPPitJ2rJli95++21NnDhRkydPDh6bkpKixYsXy+FwHPJWqK+bOHGipk+fHvYaV155pQzD0IcffhjRawAAkhO5sXvxzo1+v1+VlZVyu92655576FgGAIuQF7sXr7x4zz336M4779Qjjzyi6upq3XfffZo3b17MXh+wCoVlwCbKy8vl9/v1xhtvSGp/ExDYWE5qf5OwadMm7d69O/h8RkaGxo0bF3yNHTt26Prrr9exxx4rl8sVnB31wgsvaNeuXWHfb+rUqSosLAy7tendd9/VJ598oh/+8IdKT0/vEuPpp5/e5bHvfOc7kqSNGzeG/W/gzU2okSNHatiwYcFjjuSUU07p8lhgY4TAmykAgH2RG7uKd26cN2+eXn75ZV1++eW65pprYv76AIDIkRe7ilde3L9/v3w+n6qqqnTvvffqlltu0eWXXx6z1wesQmEZsInAzKzAVefArKyAQIJ+4403tHfvXm3atEljx45VZmamJGnPnj0aO3as/uu//kvHHnusrr/+et1+++1asGCBRo0apdbW1rDvl56erssvv1zvvfeePvnkE0kKvmG46qqruo2xsLCwy2OBHYmbm5slKbhJwtdnbQUMGjQoeOyRDBgwoMtjgU4pn88X0WsAAJIXubGreObGW2+9VQ8//LCmTZumFStWxPS1AQDRIy92Fc+8mJKSohEjRuhnP/uZ7rzzTv3pT3/S008/HdPvAcQbhWXAJs444ww5HA6tXbtWu3bt0pdffhn2JqGsrEw5OTlau3at1q1bJ8Mwgm8sJGn58uXauXOn/vjHP+of//iH/uM//kN33nmnFi5cqCFDhnT7PWfPni2p/c1Ba2ur/vznP2v06NEaPXp0t8cHrnyHqqurk9SZ0LOzsyUpuDvw19XW1nab/AEA+Dpyo3V+8Ytf6J577tG5556rJ598khEYAJAAyIuJ45xzzpHUWeQHkhWFZcAm8vPzddJJJ+n999/XP/7xD0kKexOQkpKiCRMmaO3atd3Oytq8ebMkacqUKWGv63a79cEHH3T7PU888USNGzdOjz/+uJ555hnV19fr6quvPmSMgVuuQr355puS2t/EhP5vd8du3rxZO3fuDB4TKykp7X8K6WIGAHshN/Zcb3Ljfffdp9tvv10TJ07Us88+q4yMjJjGBgDoGfJiz8X6nHHnzp2SxIVXJD0Ky4CNnHnmmWpra9Nv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sFAvvfSSpk2bFqefBAB6pz5kxnK+i837AACwQtjGfdmceAIAYAfVIReOKSxHJik6lo/knXfe0fDhw3XccccFHzv77LP10Ucfye12B4+ZNGlS8PmsrCyNGzdO69evj3u8ANBTgY7lVIeh7HQ2CgIAwApVIYVlRmEAAGAP2w90FpaHMwojIknRsXwkdXV1KioqCnussLBQfr9fe/bs0YgRIw55TF1d3SFft62tTV5vZ0dgoEgNAFYJzFjOc/qU4rA4GPRJ5EYAkLbtaz/xzErzqYDNdPs08iIA2EegY9mV6tdA9jSKiKWF5WuvvVZLliw55PPl5eV67bXXjvg6hmHEMKpOd999txYtWtTl8aKiImVmZkb0Gk6nU4MGDYp1aOjA+pqL9TVftGvc1NbeIVWU5eC/TQT4He6qtye85MbEx/qai/U1VzKsr2FI1QddkqRj86TBgxM73q9LhjWOt97kRvJicmCNzcX6mov1NVfo+u50t+f30hxDQ5Isv8dapLnR0sLy4sWLddtttx3yeafTGdHrDBo0qEvn8e7du5WSkqKBAwdKak/s3R1zzDHHHPJ1b731Vt18883Bz91utwoKClRXVyeXyxVxbLW1tREdi+ixvuZifc0XzRobhrTHfbQkKTvVw3+bCPA73JXH4+nV15MbEx/ray7W11zJsL4NLalqaukvSRriOqDa2t0WRxSdZFjjeOtNbiQvJgfW2Fysr7lYX3MF1tftdaj2YPv59mCnu8+veaS50dLCcm5urnJzc3v9OmPHjtX27dv1xRdfaOTIkZKkV199VSeffHLwKvHYsWO1Zs0azZ49W5J08OBBrV+/XvPmzTvk66anpys9Pf2QzwNAPB3wpqjN3z7/Ip/bbmERciOAvq4qZGOfYjb26fPIiwBgD6HzlUewf0LEkmLG8v79+/Xll19q586dkqRNmzZp//79Ki4uVn5+vsrKynTmmWdqzpw5evDBB7V161bdf//9euCBB4Kv8eMf/1jnnXeezjrrLI0fP1533XWXhg4dqvPPP9+inwoAohPYuE9qn7EMAADib+u+zo37SjjxBADAFqpDNuYdkcWF40ilWB1AJN577z2dcsopuuCCCyRJU6dO1SmnnKLnn38+eMyTTz6pnJwcTZgwQXPnztXNN9+sysrK4PNnn322lixZorvuuktjxozRrl279OKLLyojI6PL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bbfJP942bNigqqoq9e/fv9vnA1ffDcOIZ1gAgBDkxsQRKBQcPHjQ4kgAoO8iL8bXyJEjJXUWmEPl5uZKktxudzxDAmKOwjJgE/n5+TrppJP0/vvv6x//+Ickhb0JSElJ0YQJE4JvEqTwWVmbN2+WJE2ZMiXsdd1u9yGvop544okaN26cHn/8cY0ZM0b19fVasGDBIWN84403utza9Oabb0pqfxMT+r+B27NCbd68WTt37gz7uWIhJaX95o1orkh///vfD87MCvXiiy+qpqZGlZWVwXUGAFiD3NhzPcmNh/P+++9LkkpKSmLyegCA6JEXe64neXH8+PFyOp3697//3eW5TZs2SZKKi4tjEyBgEUZhADZy5plnqq2tTb/5zW+Ul5enk046Kez5008/XRs2bNBLL72ktLQ0nXbaacHnRowYISk8ORuGoZ///OfBK8TdqaysVE1NjW688UZlZGTosssuO+SxDz30UNhr1dbW6sEHH1S/fv30ve99T1L7ZhATJkzQmjVrtHr16i6x+P1+XX755RGuSGTy8/MlSdu3b4/4axYvXqxHH320y7/A1fUlS5bo0UcfjWmcAIDokRt7pie5sbq6Wjt27Ojy+Msvv6zHH39cw4cP1/jx42MWIwAgeuTFnulJXhwwYIBmzpypTZs2hW1g6PV6gyMVL7744pjGCcQbHcuAjZx55pn67W9/q08//VQXXnhhl47Z008/XT6fT5999pnGjh0bNsbh8ssv1+LFizV9+nTNnDlTOTk5WrdunTZv3qzy8nK9/vrr3X7P73//+5o/f75qa2t18cUXd5kdFWr06NEaNWqUZsyYIUl66qmnVFNTo9/+9rfBRC1JjzzyiMrLy3XhhRdq5syZGj58uF555RW9++67Ouecc3T11Vf3Zpm6OOGEEzRo0CA98MADamho0MCBA5Wbm6uf/OQnMf0+AID4Izf2TE9y4/vvv69LL71UkyZN0rHHHqvMzEx99NFHWr16tVwul1asWKGMjIyYxgkAiA55sWd6es64ePFirVmzRpdffrn++te/qri4WGvWrNGHH36oM888U9dcc01M4wTijY5lwEZCb/fpbofccePGBU/ovn5rUElJiV555RWNHTtWf/3rX/XYY49p2LBhevvtt1VaWnrI7zlgwIDgrVBHSt4PPfSQ5s6dq7/97W/6/e9/r4KCAq1cuVLX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0Om6n//854Yk4/zzzw/5/oBYRMcy0A8MGjRI48eP14YNG/wdQr5ZWb5Xno8//vigV5+72oThoIMO6nTfRxxxhE466SS9+eabQZfPmjVLLS0teu6554Iuf/LJJ5Wbm6vvfve7ne7r2muvDXpFuqCgQNddd52ampr0t7/9TZK0detWvf3225oyZYqmT5/uP9Zut+vuu++WzWbr9q1QXzdlyhSde+65Qfdx6aWXyjAMffTRRyHdRziefPJJSWIMBgDEAHJj18zOjZdffrlefPFF7d27V4888oh+85vfaM2aNZo+fbrOOOOMPt8/AKB3yItdMzMvTps2TZL00EMPBY3W2Llzp5YuXSpJamho6NP3AKxGYRnoJyZPniyPx6P//Oc/krxPAoYMGaKRI0dK8j5J2LRpk6qqqvzXJyUladKkSf772LFjh6655hodcsghcjqd/tlRL7/8snbt2hX0/c4880zl5eUFvbXpvffe08cff6wf/OAHSkxM7BTj8ccf3+my4447TpK0fv36oH99T24CjRo1SkOHDvUf05Mjjzyy02VDhw6VpE5v0e2rtrY2Pffccxo0aJDOOeeciN43AKB3yI2dmZ0bH374YZ1//vm6/vrrtX37djU0NOgf//iH3nnnHR1zzDHauXNnn78HAKB3yIudmZkXTz75ZJ177rnatGmTxowZox//+MeaM2eOSktLNWTIEEneQjYQz/gNBvoJ38ws36vOvllZPr4E/Z///Ec1NTXatGmTJk6cqJSUFEnezXQmTpyoP/7xjzrkkEN0zTXX6NZbb9Vtt92mcePGqbW1Nej7JSYm6uKLL9b777+vjz/+WJL8Txi62+09Ly+v02W+HYn37NkjSf5Xcr8+a8unoKDAf2xPBg8e3Oky3467brc7pPsI1SuvvKKamhqdf/75Sk1Njeh9AwB6h9zYmZm58ZNPPtH111+vc845R7/61a80dOhQDR48WGeccYb++Mc/qqKiQg888ECfvgcAoPfIi52Zfc745z//WXfddZdSU1O1ePFi/eMf/9Bll12m3//+95K6/nmBeJJgdQAAIuOEE06QzWbT6tWrtWvXLn355ZdBmwmUlpYqIyNDq1evls1mk2EY/icWkvTYY49p586devbZZ/X9738/6L7Xrl2rdevWdfqes2bN0sKFC/XEE09owYIF+vOf/6zx48dr/PjxXcZY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T58+io+P19lnn60tW7YEfX92drauueYazZ07V8cdd5zcbrcGDhyoJUuWNIhn2bJlGj58uNq1a6e4uDiNHDlS3377bdAxZ511lk4//XS98847GjBggFwul/76179Kkp5++mmdeuqpSk5OVmJiok455ZSgK7S1V50l6dxzzw3c2rV06VJJ/tvA6l+Zl/y3QNlsNv39738PPHf99derc+fOWrlypU477TTFxMQEku3+/ft1yy23qFOnTnK5XOrTp4+effbZRv3/mDdvns4///wGV4R79OihuXPnqqSkRHPnzlWvXr0Cr61evVofffSR7rnnnqAPB7VsNpvGjh0beOxwOHTZZZdp3rx5jYoJANoaciO5EQAQjNxIbgTMQGEZCGO7du3S0KFD9fXXX+uxxx7T22+/rYEDB+qSSy7R22+/3eD4yy67TGPGjNG//vUvDRo0SBMmTNA999yjZ555RrNnz9aCBQv0/fff66qrrmrwvcuWLdP//d//acaMGfrHP/4hl8ulUaNG6fvvvw8c8+6772r48OGKj4/XSy+9pFdeeUWlpaU644wztGvXrqD327Rpk26//Xb9+te/1n//+18NHz5ckj+Z33jjjXr99de1cOFCnXzyybrgggv0n//8R5I0cOBA/eUvf5EkPfnkk1q5cqVWrlypgQMHNnn9iouLdcUVV+jKK6/Uf/7zH1111VUqKSnRz3/+c7377rt64IEH9O677+rCCy/ULbfcoqeeeuqI71dZWamlS5fqjDPOaPDa008/rZkzZyohIUF//OMf9cwzzwRe+/DDDyX5ryg31plnnqnNmzeH7bwwADALuZHcSG4EgGDkRnIjuRGmMQCEja5duxpXX3114PGECROMDh06GPv37w86bsSIEUa/fv0Cj++//35DkvH8888HnisoKDAcDoeRnJxsFBcXB55/4oknDEnG9u3bg36u0+k0duzYEXiupKTESEpKMq655prAcz169DDOOeecoFiKi4uNlJQU44477gg8N2zYMMNmsxlffvnlEX9fr9drVFdXG+eee65x0UUXBZ5fsmSJIcn44IMPGnyPJOP+++8Pem7btm2GJGPBggWB58aPH29IMv71r38FHfvggw8aLpfL2LRpU9DzN954o5GSkmJUV1cfNt7PPvvMkGQsXrz4kK9XVFQYGzduNDweT9DzN998syGpwfNH8sMP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", + "image/png": "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5FScpEo4qWy+7777Nvk7P/axj8U555yTJomPPvroGDZs2FuOL2mRkfRrPv7449P9X//612lSOhlzW3BuOyBNfmfyb0jGMmbMmLj77rvTxQGT04Terip6S+ywww5p7+arrroqli5dmv4bBg8eHF/84hff9v/73e9+l14SbasEf/vb304ruBPJAkWbWrAQgJ4lPvZcfLznnnvS25NqruSspuTL7g0lazGMHz9+C0cFQFcRH3suPiZnAR977LHpcW6yKH1y/9mzZ8cf//jHdA2hJDYmraMgJ2WAvDBv3rxM8pJOLt/85jc3ur2+vj5TVlaW3v7v//7vG93+yCOPZPbbb7/MwIEDM0OGDMkceeSRmRdffDFz4oknpv/PWznhhBPS2//whz9s8vaLLroovf2f//xnuj1u3Lh0HDvttFPmpptu2uT/8/zzz2eOO+64TFVVVXrfbbfdNnPJJZek/4aOpk2blj72jTfe2H7djBkz0uuS37WhTd0/cf/992f22muvTN++fdPbt9pqq7f8927473qry4a/A4DsEB97Lj4m///bxcbkkvwuALJPfOy5+Pj6669nzj777MzkyZPTY+0+ffpkhg0bljnooIMyv/rVr7r07wo9rSj5T7aT20Du2nHHHdP+ysmpQJvqC5UsAHjJJZfEjBkzVCgBUDDERwAQHyHf6bEMbLG//OUv8cILL6S9li02AADiIwA4foTCoccy0Gk///nP017ON9xwQwwYMCDOOussswhAwRMfAcDxIxQSiWWg066//vr429/+Fttvv31873vfi+rqarMIQMETHwHA8SMUEj2WAQAAAADoFD2WAQAAAADoFK0wOqGlpSWWLVsWFRUVUVRU1LmZBoAsymQy0dDQEIMHD47i4q79Xll8BCBXiY8AsOXxUWK5E5KkclVVVWf+FwDoVRYvXhxDhw7t0scUHwHIdeIjAHQ+Pkosd0JSqZx4/PHH27cL0YgRI2LBggVRyMyBOfA88FrItfeD5NvmKVOmdEv8Eh9z67nQncyBOfA88FrItfcD8bH75cpzoTuZA3PgeeC1kK/xUWK5E9raXySTWsiJ5crKyoL+9yfMgTnwPPBayNX3g+5o5SQ+5uZzoTuYA3PgeeC1kKvvB+Jj98m150J3MAfmwPPAayFf46PF+wAAAAAA6BSJZQAAAAAAOkViGQAAAACATpFYBgAAAACgUySWAQAAAADoFIllAAAAAAA6RWIZAAAAAIBOkVgGAAAAAKBTJJYBAAAAAOiUgkwsX3nllTFq1Kjo27dvHHnkkVFbW5vtIQEAAAAA5IyCSyzfeOON8fWvfz2uvvrqeOihh2LFihVxwgknZHtYAAAAAAA5o08UmB/+8Idx9tlnx9FHH53u33DDDbH11lvHU089FZMnT8728AAAAAAAer2CSiyvWbMmpk+fHt/+9rfbr5s4cWKMHz8+HnnkEYllALpNQ0ND3HXXXTFr1qwYN25cHHTQQVFRUWHGAUD8BKCANOTRsWFBJZYXL14cLS0tMWLEiPWuHz58eCxYsGCj+zc2NkZTU1P7fn19fY+ME4D88vTTT8fJp54Wy5YtjYqqraJh8esx+PJvxPXXXhOTJk2KXCM+AtATci1+io8AvJMnnngiPnrMcTkT295JUSaTyUSBeOONN2LMmDHpB5Rddtml/fqpU6fGEUccERdeeOF697/44ovjkksu2ehxkiR0ZWVlFKry8vK0+ruQmQNz4HngtbC57wfJl5Lv2WnnqK/aNYZ8/GdRMqgmmpfPi6W3nBiVi6fHC8892yMxJRlH8sVqXV3du/594uOmiQ3mwPPAa8H7Qde9J/ZU/BQfu5/4aA48D7wWvB90jG27RH3VpKweG3ZlfCyoiuVhw4ZFcXHxRtXJCxcu3KiKOXH++efHueeeu96kVlVVpf9/rpaod4WRI0fG/Pnzo5CZA3PgeeC1sLnvB7///e9jyZIlMeqLrR8cEsnP5IPE3EvGxi9+8Ys48sgje+R0q64iPm6a2GAOPA+8FrwfdN17Yk/FT/Gx+4mP5sDzwGvB+8GbsW3pksVRk+Vjw66Mj30K7ZvSXXfdNaZNmxYHHnhget2MGTNi5syZsccee2x0/9LS0vQCAFsq6ZuVnOLU9sGhTbJfMWx8zJ49O+cmV3wEoLvlYvwUHwF4p9hWPmx8TsW2d1IcBeaLX/xifP/734/bb789Xcjv5JNPjr333tvCfQB0i2QxhqRvVnKKU0fJfsOimTF27FgzDwDiJwAFcGy4ZtHMvDo2LLjE8kknnRRf/epX48wzz4w999wz+vXrF7/+9a+zPSwA8lSywu/gwUNi6c2faf8AkfbRuvnTMXjI0Dj44IOzPUQA6L3x8xbxE4D8iW1Dhg7Nq9hWUK0w2px33nnpBQC6W9KTP1nh96RTTos3LhkXfYaOj6YlM2LIkKHp9UmbJgBg0/Hz5FPFTwDyJ7b99n9+HR895ri8OTYsyMQyAPSkSZMmxQP3TYuDvvOPqFs4M7beakzc9IXdC3ohWADY3Pj50aueiAVzZ8Wo0WPjf86eIn4CkLN22223NLbt/82nYu3iGbHjxFFx7el75Gxsk1gGgB5QWVkR2+9zXLy2sjxK+zZGRcUs8w4A7yA50B6+x8dizeqyGDlgTVRUzDFnAOR8bOs/5RPRnCmK8SNXRUXF/MhVBddjGQCyZWTfpvTn/Po+0dzi7wAAAEDuklgGgB5SU9mY/mzJFMXCBicNAQAAkLsklgGgh1Svq1hO1NZJLAMAAJC7JJYBoIdU922tWE7Mqy817wAAAOQsiWUA6CE1KpYBAADIExLLANBDRlZ2bIWhYhkAAIDcJbEMAD2kf2lLDChtTrdr6/VYBgAAIHdJLANAFhbwm6diGQAAgBwmsQwAPaimsnUBv8UNJbG2tXgZAAAAco7EMgD0oJHrKpYzURQL6vVZBgAAIDdJLANAD6rp21qxnJinzzIAAAA5SmIZAHpQdWVrxXJifp0F/AAAAMhNEssA0IOqO1YsW8APAACAHCWxDAA9qHpdj+VErVYYAAAA5CiJZQDoQRUlmRhS3ppcrlWxDAAAQI6SWAaALPVZrtVjGQAAgBwlsQwAWeqzvHRtn6hvKjL/AAAA5ByJZQDoYTUd+izP12cZAACAHCSxDAA9rLqytWI5oc8yAAAAuUhiGQB6WHWHiuV5+iwDAACQgySWAaCH1azrsZyorS81/wAAAOQciWUA6GHDK5qiKDLpdq2KZQAAAHKQxDIA9LCykohhFc3p9rw6FcsAAADkHollAMiC6nXtMObX9zH/AAAA5ByJZQDIgurK1gX8VjaWxKpG4RgAAIDc4kgWALK9gJ8+ywAAAOQYiWUAyIKRfVsrlhO12mEAAACQYySWASALairfrFi2gB8AAAC5RmIZALKgukPF8nytMAAAAMgxEssAkAXDK5qiuCiTbs+rL/U3AAAAIKdILANAFpQUR4ysbK1atngfAAAAuUZiGQCypHpdn+XautLItBYvAwAAQE6QWAaALPdZrm8ujhWNQjIAAAC5w1EsAGRJdd/WiuXEvDp9lgEAAMgdEssAkCU163osJ/RZBgAAIJdILANAllthtPVZBgAAgFwhsQwAvaEVRn0ffwcAAAByhsQyAGTJ0PLmKC1uSbfnq1gGAAAgh0gsA0CWFBdFjFzXZ3lenYplAAAAcofEMgBkUc26Psu19X2iJeNPAQAAQG6QWAaALGrrs9zYUhxL15T4WwAAAJATJJYBIIuq17XCSGiHAQAAQK6QWAaALKpZV7GcqLWAHwAAADlCYhkAsqh6XY/ltj7LAAAAkAsklgEgi6orVSwDAACQeySWASCLBpW1REVJS7qtxzIAAAC5QmIZALKoqOjNPsu19aX+FgAAAOQEiWUAyLKRla19lhfU94nmTLZHAwAAAO9MYhkAsqytYrk5UxQLLeAHAABADpBYBoAsq+7bWrGcmC+xDAAAQA6QWAaALKte1wojMa9On2UAAAB6P4llAOglrTAStXV9sjoWAAAA2BwSywDQi1ph1NarWAYAAKD3k1gGgCzrX9oS/Uub0+15KpYBAADIARLLANCL+izX6rEMAABADsibxPJPf/rTKCoqWu8yefLk9e5TW1sbRx11VPTt2zdqamriiiuuyNp4AWBTfZYXNZREY4u5AQAAoHfLqxWCkmTxk08+2b5fWrp+n8oTTjghMplMPPTQQzFjxoz4zGc+E9XV1XHSSSdlYbQAsHGf5UwUxYL6PjG635t9lwEAAKC3yavEcnFxcZoo3pSnn3467r///njppZdiu+22S6uZzznnnPjBD34gsQxA1lVXtlYst7XDkFgGAACgN8ubVhiJhQsXxpgxY2LChAnxqU99Kt5444322x599NH0tiSp3ObAAw+MZ555Jurr6zf5eI2NjeltHS8A0B1q1lUs58ICfuIjAIiPANC7j1w7YYcddogbb7wxdt5551iwYEFccsklsd9++6WJ44qKivS6ESNGrPf/DB8+PFpaWmLRokUxduzYjR7z8ssvTx9nQ8njVFZWRqEqLy+PkSNHRiEzB+bA88BroavfD3YqK454rHV7ZfHgGDmyb3SlrvxyVHzcNLHBHHgeeC14P+ie98Q+ffq0/+zq4xDxsfuJj+bA88BrwfvBxu+JRev2k5xlb8yxbW587PWJ5dNPPz2uueaat7x93333jXvvvTf23HPP9NJmypQpMW7cuPjjH/8Yxx57bNpbubPOP//8OPfcc9eb1KqqqjRJnfzhC1XyhJ8/f34UMnNgDjwPvBa6+v2gT1Py0WJiuv3qwjUxf/6C6EoNDQ1d9lji46aJDebA88BrwftB97wnNjUlRUBl0dTU1OXHIeJj9xMfzYHngdeC94ON3xMz6479kjjUG3Nsmxsfe31i+corr4wLLrjgbTP9mzJ48ODYeuut00X62v5wSUJ4w9YZSV/mYcOGbfIxksX/NlwAEAC6Q2WfTAwua45la0vSHsu9mfgIAOIjAPT6xHKSIE4unbVy5co0qTx+/Ph0f+rUqTFnzpz45z//Gdtuu2163T333BO77LJLQbe1AKD3qO7bmCaW59X3+vAMAABAgcubxfsuu+yyuPvuu9Nk8iOPPBLHHHNMDB06NA477LD09kmTJsU+++wTp556akyfPj3uuOOO+N73vhdnnXVWtocOAKmavo3pz6Vr+sSa5rauWwAAAND75E1J1JIlS+Kzn/1s2u4iaW2x9957pxXJ/fr1a7/PrbfeGqeddlrstddeMXDgwLR/8kknnZTVcQNAm5GVTe3btXV9YqsBrYlmAAAA6G3yJrGcVB8nl7dTXV2dVioDQG9U0/fNxPK8ulKJZQAAAHqtvGmFAQD50GO5zXx9lgEAAOjFJJYBoJeorly/YhkAAAB6K4llAOglRlY2RlFk2nssAwAAQG8lsQwAvURZSURVRXO6XasVBgAAAL2YxDIA9CLVla19lmu1wgAAAKAXk1gGgF6kum9rn+UVjSWxurEo28MBAACATZJYBoBepKZva8VyorbeAn4AAAD0ThLLANCLVFe2ViwnLOAHAABAbyWxDAC9SHWHiuV5+iwDAADQS0ksA0AvUrOux3Kitr5PVscCAAAAb0ViGQB6keEVTVFclEm3a1UsAwAA0EtJLANAL1JSHDGiorVqWY9lAAAAeiuJZQDoZarXtcOorS+NTGvxMgAAAPQqEssA0EsX8KtrKo4VjUI1AAAAvY+jVQDoZWoqOyzgp88yAAAAvZDl5gGglxlasiJWP/HnaFr0avxucVWcfcK+UVFRke1hAUCPa2hoiIWP/CqWv/F6zB8zLhr2mCImApDzsW3V4zfH2kWvxcytR0fDLnvkbGyTWAaAXuTpp5+OC04+LVYuXxp9ho6P6+6aGb/50ZC4/tprYtKkSdkeHgD0aEw8+dTTYunS1pj4wl9mxt63iYkA5K4nnngiPnrMce2x7eEktt2Su7FNKwwA6EXfXCcH0M0jd43RF82KURf8M0Z9bVasGb5ren1yOwAUUkxMYmBbTEx+iokA5HJsO+a44/MqtkksA0Avcdddd8WyZUtjyMdvipJBNel1yc9kf9nSJentAFAIxEQA8jG2LV2yJK+O9ySWAaCXmDVrVlRUbdX+IaNNsl8xbHzMnj07a2MDgJ4kJgKQj7GtfNj4vDrek1gGgF5i3Lhx0bD49WhePm+965P9hkUzY+zYsVkbGwD0JDERgHyMbWsWzcyr4z2JZQDoJQ466KAYPHhILL3lM+0fNpKfS2/+dAweMjQOPvjgbA8RAHqEmAhAPsa2IUOH5tXxXp9sDwAAaFVRUZGuBpws3PDGJePSVYKblsyIIUOGpteXl5ebKgAKgpgIQD7Gtt/+z6/jyKOPy5vjPYllAOhFJk2aFPfdOy32/9b0aFr8Wkzapib++/N7ph9CAKDQYuID902Lj171RCyYOytGjR4b/3P2FDERgJy12267xbW/eyjOvPbR9HjvkEnD48JPfTBnY5vEMgD0MqXlFdFvt0+k29uMWhkVFQuyPSQAyIrkQHv4Hh+LNavLYuSANVFRMcdfAoCc1tynb/vx3vsnLYiKipWRq/RYBoBepiVT1L5dIlIDAADkjbqmNw/y+vVpiVzmcBUAepnmzJvbJUUddgAAAMhp9R0Sy5V9cvt4T2IZAHpxxXLxm5sAAADkuNUdEst9VSwDAF1JxTIAAED+Vyz3lVgGALpSc0uHHstaYQAAAOSNuqY3j/cqS/RYBgC6qWJZKwwAAID8UdesYhkA6CbNHXosl+ixDAAAkKetMDKRyyzeBwC9jB7LAAAA+aluXWI5aXtYWiyxDAB0oZYOFctaYQAAAORfYrlvn5YoyvEzVFUsA0Avo2IZAAAgP9WvW7wvSSznOollAOjNPZZz/NQoAAAA3rS6Q8VyrpNYBoBepqVDLtnifQAAAPm3eF9lji/cl5BYBoBepmPFsh7LAAAA+dljOddJLANAL6PHMgAAQH6enVrfvC6xXCKxDAB0+YeNDj2Wc3yVYAAAAFrVN67bSFthSCwDAF2sucPni5Ki3O+7BQAAQMTqxjcrh7TCAAC6nB7LAAAA+Wd1h4rlvhbvAwC6o+9WGxXLAAAA+VexXKkVBgDQnRXLeiwDAADkh1UdEsv9JJYBgK7W3KFiuViPZQAAgLxQZ/E+AKA7qVgGAADIP6st3gcAdCc9lgEAAPLPaov3AQA9VbFc/OYmAAAA+bJ4X0lL5LribA8AAHjrHsslxR12AAAAyFmrtcIAALqTHssAAAD53gqjJXKdimUA6GWaO3y+KC5SsQwAAJAP6jq2wuiT+8d6EssA0Mu0xJsfNkr0WAYAAMi7iuVKFcsAQHdWLJeoWAYAAMgLq9a2Vg5VlLTkRRGRimUA6GVaMiqWAQAA8nXxvr55UK2ckFgGgF6muUOrLRXLAAAA+aFuXSsMiWUAoFs0r1exnPsLOgAAABDtFcv5sHBfzlQs33///XHYYYfF8OHDo6ioKF555ZWN7lNbWxtHHXVU9O3bN2pqauKKK67Y6D433nhjTJw4MSorK2PfffeNl19+uYf+BQCw+Vo6fMYozoO+WwAAAMSbrTBKtMLoMatXr44pU6ZsMlnc5oQTToglS5bEQw89FD/60Y/iG9/4Rtxwww3tt99zzz3x+c9/Ps4777x47LHHorq6Og4//PBYu3ZtD/0rAGBLKpbNGgAAQD5Yva4VRmWe9FjuEzng0EMPTS8zZ87c5O1PP/10WtX80ksvxXbbbReTJ0+Oc845J37wgx/ESSedlN7n6quvjuOPPz5OPfXUdD9JOicV0HfeeWda6QwAvbLHcnF+nCIFAABQyBpbkovF+3qdRx99NMaMGZMmldsceOCB8cwzz0R9fX37fQ444ID22/v16xd77LFHPPLII1kZMwC8lZYOFcs50bMKAACAt1XX9ObRXb4s3pcTFcvvZMGCBTFixIj1rkuqkVtaWmLRokUxduzYt7xPcv1baWxsjKampvb9tiQ1ABRyxbL4CADiIwBbnljOl8X7sppYPv300+Oaa655y9uTBfbuvffed3ycTKZ7/hiXX355XHLJJRtdnySokwUAC1V5eXmMHDkyCpk5MAeeB14L3fl+UD6zrH17xPBhMbL/u49zXfnlqPi4aWKDOfA88FrwftA974klJa2HrX1K+3R5zBUfu5/4aA48D7wWvB+0WrbkzcTyiMGVvTq3trnxMauJ5SuvvDIuuOCCtw1AmyP5Q2xYebxw4cIoLi6OYcOGtSeDN3Wfrbfe+i0f9/zzz49zzz13vUmtqqpKH6eioiIKVTLf8+fPj0JmDsyB54HXQne+H6xcXRURrcnlpYsXRsnq5nf9mA0NDdFVxMdNExvMgeeB14L3g+55T2xuHpvGxabGpi6PueJj9xMfzYHngdeC94NWc5YkucS+6XZLw8qYP3959FabGx+zmlgePHhwenm3pk6dGnPmzIl//vOfse2226bX3XPPPbHLLru0VxYn95k2bVqcfPLJ6X5dXV3aX/nss89+y8ctLS1NLwDQk5rXLeiQKHlzs9cQHwFAfASgc+qa3jy402O5B61atSpeeeWVmDt3brr/wgsvpNeNGzcuhg4dGpMmTYp99tknTj311Pj+978fM2fOjO9973tx1VVXtT/GF77whTjkkENi//33jz333DMuu+yyGDVqVBx22GE9+U8BgHfU0qHzRXFRfvTeAgAAKGR1ebh4X04sNv/444/He9/73jj88MPT/SOPPDLd//3vf99+n1tvvTUGDRoUe+21V5x22mlpC4uTTjqp/fYDDzww7eecJJR32223mDdvXvzpT3+KsrI3+1gCQG/QnOndFcsAAAB0Tn3HxftK8qOAKKutMDbXfvvt944L9FVXV8cdd9zxtvdJEs0dk80A0Bs1dwh5JSqWAQAAcl6dimUAoLupWAYAAMgvdc3512M5J1phAECh9lhWsQwAAJBnrTD6SCwDAN1csVysxzIAAEDOW71eK4z86LGsYhkAemmP5eLIRJHEMgAAQF5VLPdTsQwAdIeWdRXLJb7+BQAAyKvF+0qKMlFarGIZAOjGimX9lQEAAPIrsdy3T0venJmqFgoAemmPZf2VAQAA8kN9U1FeLdyXkFgGgF6mRcUyAABAnlYsZyJfSCwDQC/T3LKux3KenB4FAABQ6OraEsslKpYBgG7usVxclD/fZAMAABSy+ubWxLJWGABAt2lZ12NZxTIAAEB+tDus67B4X77QCgMAemnFcomKZQAAgJzX0Pxmn0OJZQCg2zSvq1gu1mMZAAAg59Wtq1ZOSCwDAN16mlRCxTIAAEC+JZYzkS/6dPZ/+Pvf/x5//vOf059z586N+vr6GDZsWGy//fax7777xlFHHRVDhgzpntECQAFVLJdoWAUAAJDz6jsklgty8b6f/exnscsuu8T73//+uOqqq6Kuri623Xbb2GOPPdJE8iOPPBKnnHJKjB49Oj772c/GjBkzunfkAJDnPZaLI3++yQYAAChUdU352WN5syqWd91111iwYEF85jOfiZtuuikmT54cRUUbN35cvnx5/PGPf4xf/vKXsdNOO8WNN94YJ5xwQneMGwDyloplAACA/FGXpz2W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", "text/plain": [ "
" ] @@ -129,7 +130,7 @@ ], "source": [ "# make as 'square' a grid of subplots as possible\n", - "n_profiles = len(xbt_ds[\"temperature\"])\n", + "n_profiles = np.unique(xbt_df[\"particle_id\"]).size\n", "ncols = math.ceil(math.sqrt(n_profiles))\n", "nrows = math.ceil(n_profiles / ncols)\n", "\n", @@ -145,7 +146,7 @@ "\n", "for i, ax in enumerate(axs.flat):\n", " if i < n_profiles:\n", - " profile = xbt_ds.isel(trajectory=i)\n", + " profile = xbt_df.filter(pl.col(\"particle_id\") == i)\n", "\n", " # plot\n", " ax.scatter(\n", @@ -161,7 +162,7 @@ " )\n", "\n", " # extras\n", - " ax.set_title(f\"Waypoint {int(profile['trajectory'].values) + 1}\", fontsize=14)\n", + " ax.set_title(f\"Waypoint {int(profile['particle_id'][0]) + 1}\", fontsize=14)\n", " ax.set_facecolor(\"gainsboro\")\n", " ax.grid(visible=True, which=\"both\", color=\"white\", linewidth=0.5)\n", "\n", @@ -186,7 +187,7 @@ ], "metadata": { "kernelspec": { - "display_name": "ship", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -200,7 +201,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.14.6" } }, "nbformat": 4, From f6bca0faca6a3ff67fb12884759a91781d5255b8 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:17:08 +0200 Subject: [PATCH 092/191] ingest and validate mfp exports with/without (or mixture of) ports --- src/virtualship/utils.py | 116 +++++++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 30 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 9126c72d..77e5679e 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -208,8 +208,18 @@ def _load_mfpexport(file_path): ) from e +def _create_port_row(columns, port_type): + """Generate a single placeholder row for missing departure/arrival ports.""" + row = {col: None for col in columns} + row["Station"] = port_type + row["Type"] = port_type + return pd.DataFrame([row]) + + def _validate_mfpdata(file_path): """Load and validate MFP CruiseData export.""" + errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." + mfp_data = _load_mfpexport(file_path) # clean up column names @@ -237,33 +247,57 @@ def _validate_mfpdata(file_path): if missing_columns: raise ValueError( f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?" + "Are you sure that you're using the correct export from MFP?\n\n" + + errmsg_supplement ) extra_columns = actual_columns - expected_columns if extra_columns: + # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? warnings.warn( f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " - "If the MFP export format changed, please submit an issue: " - "https://github.com/OceanParcels/virtualship/issues.", + "Manually added columns have no effect. " + errmsg_supplement, stacklevel=2, ) - # Drop unexpected columns - mfp_data = mfp_data[list(expected_columns)] + # Convert latitude and longitude to floats, handling commas and missing values safely + for coord in ["Latitude", "Longitude"]: + if mfp_data[coord].dtype in ["object", "string"]: + mfp_data[coord] = pd.to_numeric( + mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" + ) - # Convert latitude and longitude to floats, replacing commas with dots - # Handles case when the latitude and longitude have decimals with commas - if mfp_data["Latitude"].dtype in ["object", "string"]: - mfp_data["Latitude"] = mfp_data["Latitude"].apply( - lambda x: float(x.replace(",", ".")) + # check for missing departure/arrival ports and add placeholders if necessary + # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting + has_departure = ( + "Departure Port" in mfp_data["Station"].values + or "Departure Port" in mfp_data["Type"].values + ) + has_arrival = ( + "Arrival Port" in mfp_data["Station"].values + or "Arrival Port" in mfp_data["Type"].values + ) + if not has_departure or not has_arrival: + # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + warnings.warn( + "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " + "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " + "The prescribed date will be used for Waypoint #1 instead. " + "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " + + errmsg_supplement.replace("If ", ""), + stacklevel=2, ) - if mfp_data["Longitude"].dtype in ["object", "string"]: - mfp_data["Longitude"] = mfp_data["Longitude"].apply( - lambda x: float(x.replace(",", ".")) - ) + if not has_departure: + dept_row = _create_port_row(expected_columns, "Departure Port") + mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row + + if not has_arrival: + arr_row = _create_port_row(expected_columns, "Arrival Port") + mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row + + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] # convert 'Travel Time to Next' and 'Time at Station' to timedelta mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( @@ -274,9 +308,10 @@ def _validate_mfpdata(file_path): ) # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column - mfp_data["Total Time"] = ( - mfp_data["Travel Time to Next"] + mfp_data["Time at Station"] - ) + # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port + mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ + "Time at Station" + ].fillna(pd.Timedelta(0)) return mfp_data @@ -288,6 +323,7 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): Expedition, InstrumentsConfig, Location, + Port, Schedule, Waypoint, ) @@ -295,22 +331,42 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): # Read data from file mfp_data = _validate_mfpdata(file_path) - # Generate waypoints + # Generate ports/waypoints waypoints = [] current_time, previous_timedelta = start_date, None for i, row in mfp_data.iterrows(): if i > 0: current_time += previous_timedelta - waypoints.append( - Waypoint( - instrument=None, - location=Location(latitude=row["Latitude"], longitude=row["Longitude"]), - time=current_time, + is_port = "Port" in row["Station"] or "Port" in row["Type"] + + if is_port: + has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( + row["Longitude"] + ) # indicates that the port has been set in MFP / is not a placeholder + + waypoints.append( + Port( + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time if has_latlon else None, + ) ) + else: + waypoints.append( + Waypoint( + instrument=None, + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time, + ) + ) + + # store total timedelta for next iteration + previous_timedelta = ( + row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) ) - previous_timedelta = row[ - "Total Time" - ] # store total timedelta for next iteration # Create Schedule object schedule = Schedule( @@ -338,8 +394,8 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): def _mfp_string_to_timedelta(value: str) -> timedelta: """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint has no travel time to next, so will be NaN - return timedelta(0) + if pd.isna(value): # last waypoint/missing ports have NaN/None travel time + return value # return None value = value.replace("d", ":").replace("h", ":").replace("m", "") days, hours, minutes = map(int, value.split(":")) @@ -653,7 +709,7 @@ def _calc_sail_time( def _calc_wp_stationkeeping_time( - wp_instrument_types: list, + wp_instrument_types: list | None, instruments_config: InstrumentsConfig, instrument_config_map: dict = INSTRUMENT_CONFIG_MAP, ) -> timedelta: From e91686b2afa501bbd00e6ce167ed0f7153df2c64 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:17:30 +0200 Subject: [PATCH 093/191] update static expedition.yaml with ports API --- src/virtualship/static/expedition.yaml | 41 ++++++++++++++++---------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index 0f2c0c0b..ad04aa67 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -53,39 +53,50 @@ instruments_config: - SALINITY schedule: waypoints: + # Port of Departure + - location: + latitude: 0 + longitude: 0 + time: 1998-01-01 00:00:00 # Waypoint 1 - instrument: - CTD location: - latitude: 0 - longitude: 0 - time: 1998-01-01 00:00:00 + latitude: 0.01 + longitude: 0.01 + time: 1998-01-02 00:00:00 # Waypoint 2 - instrument: - DRIFTER - CTD location: - latitude: 0.01 - longitude: 0.01 - time: 1998-01-02 01:00:00 + latitude: 0.02 + longitude: 0.02 + time: 1998-01-03 01:00:00 # Waypoint 3 - instrument: - ARGO_FLOAT location: - latitude: 0.02 - longitude: 0.02 - time: 1998-01-03 02:00:00 + latitude: 0.03 + longitude: 0.03 + time: 1998-01-04 02:00:00 # Waypoint 4 - instrument: - XBT location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-04 03:00:00 + latitude: 0.04 + longitude: 0.04 + time: 1998-01-05 03:00:00 # Waypoint 5 - - location: - latitude: 0.03 - longitude: 0.03 + - instrument: [] + location: + latitude: 0.05 + longitude: 0.05 time: 1998-01-05 03:00:00 + # Port of Arrival + - location: + latitude: 0.06 + longitude: 0.06 + time: 1998-01-06 03:00:00 ship_config: ship_speed_knots: 10.0 From 03da307f52d03766a7878f052025a9f616165c3f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:19:49 +0200 Subject: [PATCH 094/191] fix timings in static expedition.yaml --- src/virtualship/static/expedition.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index ad04aa67..1e201543 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -92,11 +92,11 @@ schedule: location: latitude: 0.05 longitude: 0.05 - time: 1998-01-05 03:00:00 + time: 1998-01-06 04:00:00 # Port of Arrival - location: latitude: 0.06 longitude: 0.06 - time: 1998-01-06 03:00:00 + time: 1998-01-07 05:00:00 ship_config: ship_speed_knots: 10.0 From 8cf91de1587e1bdae7c0abeb0e4d73441bb3d0f0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:47:46 +0200 Subject: [PATCH 095/191] move `virtualship init` logic to new initialise.py module --- src/virtualship/cli/_initialise.py | 287 +++++++++++++++++++++++++++++ src/virtualship/cli/commands.py | 41 +---- src/virtualship/utils.py | 238 ------------------------ 3 files changed, 290 insertions(+), 276 deletions(-) create mode 100644 src/virtualship/cli/_initialise.py diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py new file mode 100644 index 00000000..8a8db8ae --- /dev/null +++ b/src/virtualship/cli/_initialise.py @@ -0,0 +1,287 @@ +import os +import warnings +from datetime import timedelta +from functools import lru_cache +from importlib.resources import files +from pathlib import Path + +import click +import pandas as pd +import yaml + +from virtualship.utils import ( + EXPEDITION, +) + + +def _initialise( + path: str | Path, from_mfp: str | None = None, start_date: str | None = None +): + path = Path(path) + path.mkdir(exist_ok=True) + + expedition = path / EXPEDITION + + if expedition.exists(): + raise FileExistsError( + f"File '{expedition}' already exist. Please remove it or choose another directory." + ) + + if from_mfp: + mfp_file = Path(from_mfp) + # Generate expedition.yaml from the MPF file + click.echo(f"Generating schedule from {mfp_file}...") + _mfp_to_yaml(mfp_file, start_date, expedition) + # TODO: need to check this interacts as expected with the 'problems' module + # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) + # TODO: but add and remove waypoint buttons should ignore ports + # TODO: update relevant docs + #! TODO: `virtualship init` methods are becoming long and complex. Consider refactoring into a separate module for clarity and maintainability (in `virtualship/cli/_init.py`). + # though, consider confusion of having both `_init.py` and `init.py` in the same directory. Maybe `_init.py` should be renamed to `_init_command.py` or similar. + # TODO: add a check to see if any instruments are added to a port waypoint (shouldn't be possible via MFP export but in case someone manually edits the expedition.yaml to add instruments to a port waypoint). If so, raise an error and ask user to remove them. + #! TODO: see utils.py: propagate the warnings to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + + click.echo( + "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" + "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " + "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." + "\n\nIf editing 'expedition.yaml' manually:" + "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." + f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" + ) + else: + # Create a default example expedition YAML + expedition.write_text(_get_example_expedition()) + + click.echo(f"Created '{expedition.name}' at {path}.") + + +def _mfp_to_yaml(file_path: str, start_date: str, output_path: str): + """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" + # avoid circular imports + from virtualship.models import ( + Expedition, + InstrumentsConfig, + Location, + Port, + Schedule, + Waypoint, + ) + + # Read data from file + mfp_data = _validate_mfp_data(file_path) + + # Generate ports/waypoints + waypoints = [] + current_time, previous_timedelta = start_date, None + for i, row in mfp_data.iterrows(): + if i > 0: + current_time += previous_timedelta + is_port = "Port" in row["Station"] or "Port" in row["Type"] + + if is_port: + has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( + row["Longitude"] + ) # indicates that the port has been set in MFP / is not a placeholder + + waypoints.append( + Port( + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time if has_latlon else None, + ) + ) + else: + waypoints.append( + Waypoint( + instrument=None, + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time, + ) + ) + + # store total timedelta for next iteration + previous_timedelta = ( + row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) + ) + + # Create Schedule object + schedule = Schedule( + waypoints=waypoints, + ) + + # extract instruments config from static + instruments_config = InstrumentsConfig.model_validate( + yaml.safe_load(_get_example_expedition()).get("instruments_config") + ) + + # extract ship config from static + ship_config = yaml.safe_load(_get_example_expedition()).get("ship_config") + # combine to Expedition object + expedition = Expedition( + schedule=schedule, + instruments_config=instruments_config, + ship_config=ship_config, + ) + + # Save to YAML file + expedition.to_yaml(output_path) + + +def _validate_mfp_data(file_path): + """Load and validate MFP CruiseData export.""" + errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." + + mfp_data = _load_mfp_export(file_path) + + # clean up column names + mfp_data.columns = mfp_data.columns.astype(str).str.strip() + mfp_data = mfp_data.loc[ + :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") + ] + + expected_columns = { + "Station", + "Type", + "Latitude", + "Longitude", + "Sea Depth", + "Time at Station", + "Travel Time to Next", + "Distance to Next (NM)", + "Ship Speed (kn)", + "EEZ", + } + + actual_columns = set(mfp_data.columns) + + missing_columns = expected_columns - actual_columns + if missing_columns: + raise ValueError( + f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " + "Are you sure that you're using the correct export from MFP?\n\n" + + errmsg_supplement + ) + + extra_columns = actual_columns - expected_columns + if extra_columns: + # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? + warnings.warn( + f"Found additional unexpected columns {list(extra_columns)}. " + "Manually added columns have no effect. " + errmsg_supplement, + stacklevel=2, + ) + + # Convert latitude and longitude to floats, handling commas and missing values safely + for coord in ["Latitude", "Longitude"]: + if mfp_data[coord].dtype in ["object", "string"]: + mfp_data[coord] = pd.to_numeric( + mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" + ) + + # check for missing departure/arrival ports and add placeholders if necessary + # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting + has_departure = ( + "Departure Port" in mfp_data["Station"].values + or "Departure Port" in mfp_data["Type"].values + ) + has_arrival = ( + "Arrival Port" in mfp_data["Station"].values + or "Arrival Port" in mfp_data["Type"].values + ) + if not has_departure or not has_arrival: + # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + warnings.warn( + "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " + "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " + "The prescribed date will be used for Waypoint #1 instead. " + "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " + + errmsg_supplement.replace("If ", ""), + stacklevel=2, + ) + + if not has_departure: + dept_row = _create_port_row(expected_columns, "Departure Port") + mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row + + if not has_arrival: + arr_row = _create_port_row(expected_columns, "Arrival Port") + mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row + + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] + + # convert 'Travel Time to Next' and 'Time at Station' to timedelta + mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + + # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column + # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port + mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ + "Time at Station" + ].fillna(pd.Timedelta(0)) + + return mfp_data + + +def _load_mfp_export(file_path): + if not os.path.isfile(file_path): + raise FileNotFoundError(f"File not found: {file_path}") + + try: + df = pd.read_excel(file_path) + return df.dropna(how="all", axis=1) # drop empty columns + + except Exception as e: + raise RuntimeError( + "Could not read coordinates data from the provided file. " + "Ensure it is an exported .xlsx file from MFP." + ) from e + + +def _create_port_row(columns, port_type): + """Generate a single placeholder row for missing departure/arrival ports.""" + row = {col: None for col in columns} + row["Station"] = port_type + row["Type"] = port_type + return pd.DataFrame([row]) + + +def _mfp_string_to_timedelta(value: str) -> timedelta: + """Handle MFP export string format (e.g., "0d 13h 13m").""" + if pd.isna(value): # last waypoint/missing ports have NaN/None travel time + return value # return None + + value = value.replace("d", ":").replace("h", ":").replace("m", "") + days, hours, minutes = map(int, value.split(":")) + return timedelta(days=days, hours=hours, minutes=minutes) + + +def _load_static_file(name: str) -> str: + """Load static file from the ``virtualship.static`` module by file name.""" + return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") + + +@lru_cache(None) +@lru_cache(None) +def _get_example_expedition() -> str: + """Get the example unified expedition configuration file.""" + return _load_static_file(EXPEDITION) + + +def _validate_start_date(ctx, param, value): + """Callback to enforce and validate --start-date when --from-mfp is used.""" + if ctx.params.get("from_mfp"): + if not value: + raise click.BadParameter( + "The '--start-date' option is required when using '--from-mfp'." + "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." + ) + return value diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index 2ecf7125..d958df16 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -2,15 +2,12 @@ import click +from virtualship.cli._initialise import _initialise, _validate_start_date from virtualship.cli._plan import _plan from virtualship.cli._run import _run from virtualship.utils import ( COPERNICUSMARINE_BGC_VARIABLES, COPERNICUSMARINE_PHYS_VARIABLES, - EXPEDITION, - get_example_expedition, - mfp_to_yaml, - validate_start_date, ) @@ -31,7 +28,7 @@ "--start-date", type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S", "%Y-%m-%d"]), default=None, - callback=validate_start_date, + callback=_validate_start_date, help="The departure/start date of the expedition (required when using --from-mfp). " "Expected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00.", ) @@ -41,39 +38,7 @@ def init(path, from_mfp, start_date): If --mfp-file is provided, it will generate the expedition.yaml from the MPF file instead. """ - path = Path(path) - path.mkdir(exist_ok=True) - - expedition = path / EXPEDITION - - if expedition.exists(): - raise FileExistsError( - f"File '{expedition}' already exist. Please remove it or choose another directory." - ) - - if from_mfp: - mfp_file = Path(from_mfp) - # Generate expedition.yaml from the MPF file - click.echo(f"Generating schedule from {mfp_file}...") - mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. - # TODO: the schedule object should be able to take a special 'port' waypoint type, which is the same as a regular waypoint (to ensure compatibility) but without 'instruments' - # TODO: need to check this interacts as expected with the 'problems' module - # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) - # TODO: but add and remove waypoint buttons should ignore ports - click.echo( - "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" - "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " - "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." - "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." - f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" - ) - else: - # Create a default example expedition YAML - expedition.write_text(get_example_expedition()) - - click.echo(f"Created '{expedition.name}' at {path}.") + _initialise(Path(path), from_mfp, start_date) @click.command() diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 77e5679e..9441defd 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -2,16 +2,11 @@ import glob import hashlib -import os import re -import warnings from datetime import datetime, timedelta -from functools import lru_cache -from importlib.resources import files from pathlib import Path from typing import TYPE_CHECKING, Literal, TextIO -import click import copernicusmarine import numpy as np import parcels @@ -29,7 +24,6 @@ from virtualship.models.checkpoint import Checkpoint from virtualship.models.expedition import SensorConfig -import pandas as pd import yaml from pydantic import BaseModel from yaspin import Spinner @@ -158,18 +152,6 @@ def decorator(cls): # ===================================================== -def load_static_file(name: str) -> str: - """Load static file from the ``virtualship.static`` module by file name.""" - return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") - - -@lru_cache(None) -@lru_cache(None) -def get_example_expedition() -> str: - """Get the example unified expedition configuration file.""" - return load_static_file(EXPEDITION) - - def _dump_yaml(model: BaseModel, stream: TextIO) -> str | None: """Dump a pydantic model to a yaml string.""" return yaml.safe_dump( @@ -182,226 +164,6 @@ def _generic_load_yaml(data: str, model: BaseModel) -> BaseModel: return model.model_validate(yaml.safe_load(data)) -def validate_start_date(ctx, param, value): - """Callback to enforce and validate --start-date when --from-mfp is used.""" - if ctx.params.get("from_mfp"): - if not value: - raise click.BadParameter( - "The '--start-date' option is required when using '--from-mfp'." - "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." - ) - return value - - -def _load_mfpexport(file_path): - if not os.path.isfile(file_path): - raise FileNotFoundError(f"File not found: {file_path}") - - try: - df = pd.read_excel(file_path) - return df.dropna(how="all", axis=1) # drop empty columns - - except Exception as e: - raise RuntimeError( - "Could not read coordinates data from the provided file. " - "Ensure it is an exported .xlsx file from MFP." - ) from e - - -def _create_port_row(columns, port_type): - """Generate a single placeholder row for missing departure/arrival ports.""" - row = {col: None for col in columns} - row["Station"] = port_type - row["Type"] = port_type - return pd.DataFrame([row]) - - -def _validate_mfpdata(file_path): - """Load and validate MFP CruiseData export.""" - errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." - - mfp_data = _load_mfpexport(file_path) - - # clean up column names - mfp_data.columns = mfp_data.columns.astype(str).str.strip() - mfp_data = mfp_data.loc[ - :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") - ] - - expected_columns = { - "Station", - "Type", - "Latitude", - "Longitude", - "Sea Depth", - "Time at Station", - "Travel Time to Next", - "Distance to Next (NM)", - "Ship Speed (kn)", - "EEZ", - } - - actual_columns = set(mfp_data.columns) - - missing_columns = expected_columns - actual_columns - if missing_columns: - raise ValueError( - f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?\n\n" - + errmsg_supplement - ) - - extra_columns = actual_columns - expected_columns - if extra_columns: - # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? - warnings.warn( - f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " + errmsg_supplement, - stacklevel=2, - ) - - # Convert latitude and longitude to floats, handling commas and missing values safely - for coord in ["Latitude", "Longitude"]: - if mfp_data[coord].dtype in ["object", "string"]: - mfp_data[coord] = pd.to_numeric( - mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" - ) - - # check for missing departure/arrival ports and add placeholders if necessary - # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting - has_departure = ( - "Departure Port" in mfp_data["Station"].values - or "Departure Port" in mfp_data["Type"].values - ) - has_arrival = ( - "Arrival Port" in mfp_data["Station"].values - or "Arrival Port" in mfp_data["Type"].values - ) - if not has_departure or not has_arrival: - # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. - warnings.warn( - "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " - "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " - "The prescribed date will be used for Waypoint #1 instead. " - "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " - + errmsg_supplement.replace("If ", ""), - stacklevel=2, - ) - - if not has_departure: - dept_row = _create_port_row(expected_columns, "Departure Port") - mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row - - if not has_arrival: - arr_row = _create_port_row(expected_columns, "Arrival Port") - mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row - - # Drop unexpected columns - mfp_data = mfp_data[list(expected_columns)] - - # convert 'Travel Time to Next' and 'Time at Station' to timedelta - mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( - lambda x: _mfp_string_to_timedelta(x) - ) - mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( - lambda x: _mfp_string_to_timedelta(x) - ) - - # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column - # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port - mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ - "Time at Station" - ].fillna(pd.Timedelta(0)) - - return mfp_data - - -def mfp_to_yaml(file_path: str, start_date: str, output_path: str): - """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" - # avoid circular imports - from virtualship.models import ( - Expedition, - InstrumentsConfig, - Location, - Port, - Schedule, - Waypoint, - ) - - # Read data from file - mfp_data = _validate_mfpdata(file_path) - - # Generate ports/waypoints - waypoints = [] - current_time, previous_timedelta = start_date, None - for i, row in mfp_data.iterrows(): - if i > 0: - current_time += previous_timedelta - is_port = "Port" in row["Station"] or "Port" in row["Type"] - - if is_port: - has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( - row["Longitude"] - ) # indicates that the port has been set in MFP / is not a placeholder - - waypoints.append( - Port( - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time if has_latlon else None, - ) - ) - else: - waypoints.append( - Waypoint( - instrument=None, - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time, - ) - ) - - # store total timedelta for next iteration - previous_timedelta = ( - row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) - ) - - # Create Schedule object - schedule = Schedule( - waypoints=waypoints, - ) - - # extract instruments config from static - instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(get_example_expedition()).get("instruments_config") - ) - - # extract ship config from static - ship_config = yaml.safe_load(get_example_expedition()).get("ship_config") - - # combine to Expedition object - expedition = Expedition( - schedule=schedule, - instruments_config=instruments_config, - ship_config=ship_config, - ) - - # Save to YAML file - expedition.to_yaml(output_path) - - -def _mfp_string_to_timedelta(value: str) -> timedelta: - """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint/missing ports have NaN/None travel time - return value # return None - - value = value.replace("d", ":").replace("h", ":").replace("m", "") - days, hours, minutes = map(int, value.split(":")) - return timedelta(days=days, hours=hours, minutes=minutes) - - def _validate_numeric_to_timedelta( value: int | float | timedelta, unit: Literal["minutes", "days"] ) -> timedelta: From 46e78283cfcf3fd615d482b1e09238acd80a8f62 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:48:39 +0200 Subject: [PATCH 096/191] update init docstring --- src/virtualship/cli/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index d958df16..3442fb1b 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -36,7 +36,7 @@ def init(path, from_mfp, start_date): """ Initialize a directory for a new expedition, with an expedition.yaml file. - If --mfp-file is provided, it will generate the expedition.yaml from the MPF file instead. + If --mfp-file is provided (and --start-date is also provided), it will generate the expedition.yaml from the MPF file instead. """ _initialise(Path(path), from_mfp, start_date) From 02a1dd7edd2e875f875917edeabdc0118352b900 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:17:41 +0200 Subject: [PATCH 097/191] refactor _initialise.py --- src/virtualship/cli/_initialise.py | 201 +++++++++++++---------------- 1 file changed, 90 insertions(+), 111 deletions(-) diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py index 8a8db8ae..41145c8f 100644 --- a/src/virtualship/cli/_initialise.py +++ b/src/virtualship/cli/_initialise.py @@ -1,4 +1,5 @@ import os +import re import warnings from datetime import timedelta from functools import lru_cache @@ -9,9 +10,17 @@ import pandas as pd import yaml -from virtualship.utils import ( - EXPEDITION, +from virtualship.models import ( + Expedition, + InstrumentsConfig, + Location, + Port, + Schedule, + Waypoint, ) +from virtualship.utils import EXPEDITION + +ERR_SUPPLEMENT = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." def _initialise( @@ -24,126 +33,98 @@ def _initialise( if expedition.exists(): raise FileExistsError( - f"File '{expedition}' already exist. Please remove it or choose another directory." + f"File '{expedition}' already exists. Please remove it or choose another directory." ) if from_mfp: mfp_file = Path(from_mfp) - # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") - _mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: need to check this interacts as expected with the 'problems' module - # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) - # TODO: but add and remove waypoint buttons should ignore ports - # TODO: update relevant docs - #! TODO: `virtualship init` methods are becoming long and complex. Consider refactoring into a separate module for clarity and maintainability (in `virtualship/cli/_init.py`). - # though, consider confusion of having both `_init.py` and `init.py` in the same directory. Maybe `_init.py` should be renamed to `_init_command.py` or similar. - # TODO: add a check to see if any instruments are added to a port waypoint (shouldn't be possible via MFP export but in case someone manually edits the expedition.yaml to add instruments to a port waypoint). If so, raise an error and ask user to remove them. - #! TODO: see utils.py: propagate the warnings to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + # catch warnings raised to propagate them via click.echo + with warnings.catch_warnings(record=True) as captured_warnings: + warnings.simplefilter("always") + _mfp_to_yaml(mfp_file, start_date, expedition) + + indent = " " * 4 click.echo( "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." - f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" + "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." + f"\n\n{indent * 4}waypoints:\n{indent * 4}- instrument:\n{indent * 5}- CTD\n{indent * 5}- ARGO_FLOAT\n" ) + + # output captured warnings to the terminal + if captured_warnings: + click.echo("\n❗️ WARNINGS:") + for w in captured_warnings: + click.echo(f"{indent}• {w.message}") + click.echo( + f"\n{indent}If you believe any of these warnings are incorrect (e.g. you have selected departure/arrival ports), and {ERR_SUPPLEMENT.replace('If ', '')}\n" + ) else: - # Create a default example expedition YAML expedition.write_text(_get_example_expedition()) click.echo(f"Created '{expedition.name}' at {path}.") -def _mfp_to_yaml(file_path: str, start_date: str, output_path: str): - """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" - # avoid circular imports - from virtualship.models import ( - Expedition, - InstrumentsConfig, - Location, - Port, - Schedule, - Waypoint, - ) - - # Read data from file +def _mfp_to_yaml(file_path: Path, start_date: str, output_path: Path): + """Generates an expedition.yaml file from MFP Excel export.""" mfp_data = _validate_mfp_data(file_path) - # Generate ports/waypoints + # convert start_date string to datetime object if needed + if isinstance(start_date, str): + current_time = pd.to_datetime(start_date) + else: + current_time = start_date + waypoints = [] - current_time, previous_timedelta = start_date, None + previous_timedelta = None + for i, row in mfp_data.iterrows(): if i > 0: current_time += previous_timedelta - is_port = "Port" in row["Station"] or "Port" in row["Type"] - if is_port: - has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( - row["Longitude"] - ) # indicates that the port has been set in MFP / is not a placeholder + is_port = "Port" in str(row["Station"]) or "Port" in str(row["Type"]) + lat = None if pd.isna(row["Latitude"]) else float(row["Latitude"]) + lon = None if pd.isna(row["Longitude"]) else float(row["Longitude"]) + loc = Location(latitude=lat, longitude=lon) + if is_port: + has_latlon = lat is not None and lon is not None waypoints.append( - Port( - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time if has_latlon else None, - ) + Port(location=loc, time=current_time if has_latlon else None) ) else: - waypoints.append( - Waypoint( - instrument=None, - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time, - ) - ) + waypoints.append(Waypoint(instrument=None, location=loc, time=current_time)) - # store total timedelta for next iteration previous_timedelta = ( - row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) + row["Total Time"] if pd.notna(row["Total Time"]) else timedelta(0) ) - # Create Schedule object - schedule = Schedule( - waypoints=waypoints, - ) - - # extract instruments config from static - instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(_get_example_expedition()).get("instruments_config") - ) - - # extract ship config from static - ship_config = yaml.safe_load(_get_example_expedition()).get("ship_config") - # combine to Expedition object + # build and dump expedition YAML + static_yaml = yaml.safe_load(_get_example_expedition()) expedition = Expedition( - schedule=schedule, - instruments_config=instruments_config, - ship_config=ship_config, + schedule=Schedule(waypoints=waypoints), + instruments_config=InstrumentsConfig.model_validate( + static_yaml.get("instruments_config") + ), + ship_config=static_yaml.get("ship_config"), ) - - # Save to YAML file expedition.to_yaml(output_path) -def _validate_mfp_data(file_path): +def _validate_mfp_data(file_path: Path) -> pd.DataFrame: """Load and validate MFP CruiseData export.""" - errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." - mfp_data = _load_mfp_export(file_path) # clean up column names mfp_data.columns = mfp_data.columns.astype(str).str.strip() - mfp_data = mfp_data.loc[ - :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") - ] + junk_col_pattern = r"^(Unnamed:.*||\.\d+)$" + mfp_data = mfp_data.loc[:, ~mfp_data.columns.str.match(junk_col_pattern)] - expected_columns = { + expected_columns = [ "Station", "Type", "Latitude", @@ -154,28 +135,25 @@ def _validate_mfp_data(file_path): "Distance to Next (NM)", "Ship Speed (kn)", "EEZ", - } - - actual_columns = set(mfp_data.columns) + ] + expected_set = set(expected_columns) + actual_set = set(mfp_data.columns) - missing_columns = expected_columns - actual_columns + missing_columns = expected_set - actual_set if missing_columns: raise ValueError( - f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?\n\n" - + errmsg_supplement + f"Error: Found columns {list(actual_set)}, but expected columns {list(expected_columns)}. " + f"Are you sure that you're using the correct export from MFP?\n\n{ERR_SUPPLEMENT}" ) - extra_columns = actual_columns - expected_columns + extra_columns = actual_set - expected_set if extra_columns: - # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? warnings.warn( - f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " + errmsg_supplement, + f"Found additional unexpected columns {list(extra_columns)}. Manually added columns have no effect.", stacklevel=2, ) - # Convert latitude and longitude to floats, handling commas and missing values safely + # safe float conversion for lat/lon for coord in ["Latitude", "Longitude"]: if mfp_data[coord].dtype in ["object", "string"]: mfp_data[coord] = pd.to_numeric( @@ -192,14 +170,12 @@ def _validate_mfp_data(file_path): "Arrival Port" in mfp_data["Station"].values or "Arrival Port" in mfp_data["Type"].values ) + if not has_departure or not has_arrival: - # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. warnings.warn( "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " - "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " - "The prescribed date will be used for Waypoint #1 instead. " - "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " - + errmsg_supplement.replace("If ", ""), + "Any missing port will be replaced with an empty placeholder in `expedition.yaml` but will be ignored in the simulation. " + "If missing the 'Departure Port', the prescribed start date will be used for Waypoint #1 instead. ", stacklevel=2, ) @@ -216,10 +192,10 @@ def _validate_mfp_data(file_path): # convert 'Travel Time to Next' and 'Time at Station' to timedelta mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( - lambda x: _mfp_string_to_timedelta(x) + _mfp_string_to_timedelta ) mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( - lambda x: _mfp_string_to_timedelta(x) + _mfp_string_to_timedelta ) # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column @@ -231,14 +207,12 @@ def _validate_mfp_data(file_path): return mfp_data -def _load_mfp_export(file_path): +def _load_mfp_export(file_path: Path) -> pd.DataFrame: if not os.path.isfile(file_path): raise FileNotFoundError(f"File not found: {file_path}") try: - df = pd.read_excel(file_path) - return df.dropna(how="all", axis=1) # drop empty columns - + return pd.read_excel(file_path).dropna(how="all", axis=1) # drop empty columns except Exception as e: raise RuntimeError( "Could not read coordinates data from the provided file. " @@ -246,7 +220,7 @@ def _load_mfp_export(file_path): ) from e -def _create_port_row(columns, port_type): +def _create_port_row(columns, port_type: str) -> pd.DataFrame: """Generate a single placeholder row for missing departure/arrival ports.""" row = {col: None for col in columns} row["Station"] = port_type @@ -254,14 +228,20 @@ def _create_port_row(columns, port_type): return pd.DataFrame([row]) -def _mfp_string_to_timedelta(value: str) -> timedelta: - """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint/missing ports have NaN/None travel time - return value # return None +def _mfp_string_to_timedelta(value: str | None) -> timedelta | None: + """Parse MFP duration string (e.g., '0d 13h 13m') to timedelta.""" + if pd.isna(value): + return None + + match = re.search(r"(\d+)d\s*(\d+)h\s*(\d+)m", str(value)) + if match: + days, hours, minutes = map(int, match.groups()) + return timedelta(days=days, hours=hours, minutes=minutes) - value = value.replace("d", ":").replace("h", ":").replace("m", "") - days, hours, minutes = map(int, value.split(":")) - return timedelta(days=days, hours=hours, minutes=minutes) + else: + raise ValueError( + f"Invalid MFP duration format: '{value}'. Expected format: 'Xd Yh Zm' (e.g., '0d 13h 13m'). {ERR_SUPPLEMENT}" + ) def _load_static_file(name: str) -> str: @@ -269,8 +249,7 @@ def _load_static_file(name: str) -> str: return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") -@lru_cache(None) -@lru_cache(None) +@lru_cache(maxsize=1) def _get_example_expedition() -> str: """Get the example unified expedition configuration file.""" return _load_static_file(EXPEDITION) From 2f5b5e160aa710317c68a8ff5bfa7cd07cd2d4c4 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 14 Aug 2026 12:39:33 +0200 Subject: [PATCH 098/191] rename method and small update --- src/virtualship/expedition/simulate_schedule.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 93dd7441..6f1fed05 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -134,7 +134,7 @@ def simulate(self) -> ScheduleOk | ScheduleProblem: ) # wait at the waypoint until ship is scheduled to be there # note measurements made at waypoint - time_passed = self._make_measurements(waypoint) + time_passed = self._get_instrument_timescosts(waypoint) # wait while measurements are being done self._progress_time_stationary(time_passed) @@ -248,13 +248,13 @@ def _get_underway_stationary_times( for i in range(1, int(npts) + 1) ] - def _make_measurements(self, waypoint: Waypoint | Port) -> timedelta: - # port stops have no instruments + def _get_instrument_timescosts(self, waypoint: Waypoint | Port) -> timedelta: + # port stops have no instruments; if there are no instruments, there is no time cost if isinstance(waypoint, Port): return timedelta() - # if there are no instruments, there is no time cost - if waypoint.instrument is None: + # if proper waypoint but there are no instruments, there is no time cost + if isinstance(waypoint, Waypoint) and waypoint.instrument is None: return timedelta() # make instruments a list even if it's only a single one From ed07b42e0bff7ab3d20e08f5e4f80648c00d8788 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:30:50 +0200 Subject: [PATCH 099/191] add Port logic to problems simulator --- .../make_realistic/problems/simulator.py | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index dcffbbff..e08e0827 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -23,6 +23,7 @@ InstrumentProblem, ) from virtualship.models.checkpoint import Checkpoint +from virtualship.models.expedition import Port from virtualship.utils import ( CACHE, EXPEDITION, @@ -74,6 +75,8 @@ def select_problems( Map each selected problem to a random waypoint (or None if pre-departure). Finally, cache the suite of problems to a directory (expedition-specific) for reference. """ + waypoints = self.expedition.schedule.waypoints + valid_instrument_problems = [ problem for problem in INSTRUMENT_PROBLEMS @@ -86,12 +89,9 @@ def select_problems( if isinstance(p, GeneralProblem) and p.pre_departure ] - num_waypoints = len(self.expedition.schedule.waypoints) + num_waypoints = len(waypoints) num_instruments = len(instruments_in_expedition) - expedition_duration_days = ( - self.expedition.schedule.waypoints[-1].time - - self.expedition.schedule.waypoints[0].time - ).days + expedition_duration_days = (waypoints[-1].time - waypoints[0].time).days # if only one waypoint, return just a pre-departure problem if num_waypoints < 2: @@ -166,13 +166,12 @@ def select_problems( random.shuffle(available_replacements) selected_problems.extend(available_replacements[:num_to_replace]) - # map each problem to a [random] waypoint (or None if pre-departure) + # map each problem to a [random, non-port waypoint] (or None if pre-departure) # limited to one per waypoint, else complicates scheduling and contingency checking waypoint_idxs = [] unassigned_problems = [] - available_idxs = list( - range(len(self.expedition.schedule.waypoints) - 1) - ) # exclude last waypoint (problem there would have no impact on scheduling) + is_port = [isinstance(wp, Port) for wp in waypoints] + available_idxs = [i for i, port in enumerate(is_port) if not port] # TODO: if incorporate departure and arrival port/waypoints in future, bear in mind index selection here may need to change for problem in selected_problems: @@ -181,13 +180,21 @@ def select_problems( else: if available_idxs: wp_select = random.choice(available_idxs) + wp_instruments = waypoints[wp_select].instrument + wp_instruments = wp_instruments if wp_instruments else [] # noqa; handle when waypoint instruments set to "null" in expedition.yaml - # fmt: off # check waypoint actually deploys the instrument associated with the problem...if not, replace it with a general (non-instrument related) problem # rather than a different waypoint, because it's possible no applicable waypoint is still available - wp_instruments = self.expedition.schedule.waypoints[wp_select].instrument - if isinstance(problem, InstrumentProblem) and problem.instrument_type not in wp_instruments: - available_general = [p for p in GENERAL_PROBLEMS if not p.pre_departure and p not in selected_problems] + needs_replacement = ( + isinstance(problem, InstrumentProblem) + and problem.instrument_type not in wp_instruments + ) + if needs_replacement: + available_general = [ + p + for p in GENERAL_PROBLEMS + if not p.pre_departure and p not in selected_problems + ] if not available_general: unassigned_problems.append(problem) @@ -196,15 +203,12 @@ def select_problems( replacement = random.choice(available_general) problem_idx = selected_problems.index(problem) selected_problems[problem_idx] = replacement - # fmt: on waypoint_idxs.append(wp_select) available_idxs.remove(wp_select) # each waypoint only used once else: - unassigned_problems.append( - problem - ) # if run out of available waypoints, remove problem from selection + unassigned_problems.append(problem) # noqa; if run out of available waypoints, remove problem from selection # remove any problems that couldn't be assigned a waypoint (i.e. if more problems than available waypoints) if unassigned_problems: From d756cbe2b63eabafcbc7bc33e93dd4bb59b931c6 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:33:41 +0100 Subject: [PATCH 100/191] `add_field` removed from Parcels API --- src/virtualship/instruments/base.py | 45 +++++++++++++++++------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index e06ae344..894979dd 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -124,8 +124,8 @@ def load_input_data(self) -> parcels.FieldSet: # bathymetry data if self.add_bathymetry: - bathymetry_field = _get_bathy_data(from_data=self.from_data).bathymetry - fieldset.add_field(bathymetry_field) + bathymetry_fs = _get_bathy_data(from_data=self.from_data) + fieldset = fieldset + bathymetry_fs return fieldset @@ -142,15 +142,22 @@ def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" instrument_name = self.__class__.__name__.split("Instrument")[0] - if not self.verbose_progress: - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: - self.simulate(measurements, out_path) - spinner.ok("✅\n") + TMP = True + + if TMP: + if not self.verbose_progress: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: + self.simulate(measurements, out_path) + spinner.ok("✅\n") + else: + print(f"Simulating {instrument_name} measurements... ") + self.simulate(measurements, out_path) + print("\n") else: print(f"Simulating {instrument_name} measurements... ") self.simulate(measurements, out_path) @@ -213,22 +220,24 @@ def _generate_fieldset(self) -> parcels.FieldSet: fieldsets_list.append(fs) - base_fieldset = fieldsets_list[0] - for fs, key in zip(fieldsets_list[1:], keys[1:], strict=False): - base_fieldset.add_field(getattr(fs, key)) + combined_fieldset = fieldsets_list[0] + for fs in fieldsets_list[1:]: + combined_fieldset = combined_fieldset + fs # some instruments use AdvectionRKn kernels which require a combined UV vector field - # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time, therefore build combined VectorField here in FieldSet + # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time if "U" in keys and "V" in keys: uv = parcels.VectorField( "UV", - base_fieldset.U, - base_fieldset.V, + combined_fieldset.U, + combined_fieldset.V, interp_method=parcels.interpolators.XLinear_Velocity(), ) - base_fieldset.add_field(uv) + # add vector field to internal fieldset dictionary and attach as attribute + combined_fieldset.fields["UV"] = uv + combined_fieldset.UV = uv - return base_fieldset + return combined_fieldset def _get_copernicus_ds( self, From 81f7459b2e086f36b387ffd0d69209fa5f8161c3 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:37:20 +0100 Subject: [PATCH 101/191] update tests for new parcels API --- tests/instruments/test_argo_float.py | 4 +--- tests/instruments/test_base.py | 2 +- tests/instruments/test_ctd.py | 4 +--- tests/instruments/test_xbt.py | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index b7da7a60..502731d0 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -102,9 +102,7 @@ def create_fieldset( ) bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) - fieldset.add_field(bathymetry_fset.bathymetry) - - return fieldset + return fieldset + bathymetry_fset def create_argo_float(waypoint): diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index bcc741a5..db6b6e7f 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -221,7 +221,7 @@ def test_generate_fieldset_combines_fields(): ): dummy._generate_fieldset() - fs_A.add_field.assert_called_once_with(fs_B.B) + fs_A.__add__.assert_called_once_with(fs_B) def test_load_input_data_error(monkeypatch): diff --git a/tests/instruments/test_ctd.py b/tests/instruments/test_ctd.py index 845ac06d..9e0a803e 100644 --- a/tests/instruments/test_ctd.py +++ b/tests/instruments/test_ctd.py @@ -106,9 +106,7 @@ def create_fieldset( ) bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) - fieldset.add_field(bathymetry_fset.bathymetry) - - return fieldset + return fieldset + bathymetry_fset def test_simulate_ctds(tmpdir) -> None: diff --git a/tests/instruments/test_xbt.py b/tests/instruments/test_xbt.py index e2d8525f..d55ce4fb 100644 --- a/tests/instruments/test_xbt.py +++ b/tests/instruments/test_xbt.py @@ -113,9 +113,7 @@ def create_fieldset( ) bathymetry_fset = parcels.FieldSet.from_sgrid_conventions(ds_bathymetry_fset) - fieldset.add_field(bathymetry_fset.bathymetry) - - return fieldset + return fieldset + bathymetry_fset def test_simulate_xbts(tmpdir, xbt_expedition) -> None: From a77c59e139f08a575078d9bc68be5abc0abea131 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:42:37 +0200 Subject: [PATCH 102/191] add state_date argument to init command --- src/virtualship/cli/commands.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index 41f4d519..b5110fac 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -10,6 +10,7 @@ EXPEDITION, get_example_expedition, mfp_to_yaml, + validate_start_date, ) @@ -26,7 +27,15 @@ 'Marine Facilities Planning tool (specifically the "Export Coordinates > DD" option). ' "User edits are required after initialisation.", ) -def init(path, from_mfp): +@click.option( + "--start-date", + type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S", "%Y-%m-%d"]), + default=None, + callback=validate_start_date, + help="The departure/start date of the expedition (required when using --from-mfp). " + "Expected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00.", +) +def init(path, from_mfp, start_date): """ Initialize a directory for a new expedition, with an expedition.yaml file. @@ -46,7 +55,9 @@ def init(path, from_mfp): mfp_file = Path(from_mfp) # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") - mfp_to_yaml(mfp_file, expedition) + mfp_to_yaml(mfp_file, start_date, expedition) + # TODO: this print needs to be updated + # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. click.echo( "\n⚠️ The generated schedule does not contain TIME values or INSTRUMENT selections. ⚠️" "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the schedule configuration, " From d8b5611379b0f18d31030592e5415eb1ada5240b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:43:23 +0200 Subject: [PATCH 103/191] handle timedeltas from mfp export, .xlsx only now that MFP export is .xslx only --- src/virtualship/utils.py | 126 +++++++++++++++++++++++++-------------- 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 30f3dffc..9126c72d 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -11,6 +11,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Literal, TextIO +import click import copernicusmarine import numpy as np import parcels @@ -181,35 +182,56 @@ def _generic_load_yaml(data: str, model: BaseModel) -> BaseModel: return model.model_validate(yaml.safe_load(data)) -def load_coordinates(file_path): - """Loads coordinates from a file based on its extension.""" +def validate_start_date(ctx, param, value): + """Callback to enforce and validate --start-date when --from-mfp is used.""" + if ctx.params.get("from_mfp"): + if not value: + raise click.BadParameter( + "The '--start-date' option is required when using '--from-mfp'." + "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." + ) + return value + + +def _load_mfpexport(file_path): if not os.path.isfile(file_path): raise FileNotFoundError(f"File not found: {file_path}") - ext = os.path.splitext(file_path)[-1].lower() - try: - if ext in [".xls", ".xlsx"]: - return pd.read_excel(file_path) - - if ext == ".csv": - return pd.read_csv(file_path) - - raise ValueError(f"Unsupported file extension {ext}.") + df = pd.read_excel(file_path) + return df.dropna(how="all", axis=1) # drop empty columns except Exception as e: raise RuntimeError( "Could not read coordinates data from the provided file. " - "Ensure it is either a csv or excel file." + "Ensure it is an exported .xlsx file from MFP." ) from e -def validate_coordinates(coordinates_data): - # Expected column headers - expected_columns = {"Station Type", "Name", "Latitude", "Longitude"} +def _validate_mfpdata(file_path): + """Load and validate MFP CruiseData export.""" + mfp_data = _load_mfpexport(file_path) + + # clean up column names + mfp_data.columns = mfp_data.columns.astype(str).str.strip() + mfp_data = mfp_data.loc[ + :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") + ] - # Check if the headers match the expected ones - actual_columns = set(coordinates_data.columns) + expected_columns = { + "Station", + "Type", + "Latitude", + "Longitude", + "Sea Depth", + "Time at Station", + "Travel Time to Next", + "Distance to Next (NM)", + "Ship Speed (kn)", + "EEZ", + } + + actual_columns = set(mfp_data.columns) missing_columns = expected_columns - actual_columns if missing_columns: @@ -228,42 +250,39 @@ def validate_coordinates(coordinates_data): stacklevel=2, ) - # Drop unexpected columns (optional, only if you want to ensure strict conformity) - coordinates_data = coordinates_data[list(expected_columns)] - - # Continue with the rest of the function after validation... - coordinates_data = coordinates_data.dropna() + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] # Convert latitude and longitude to floats, replacing commas with dots # Handles case when the latitude and longitude have decimals with commas - if coordinates_data["Latitude"].dtype in ["object", "string"]: - coordinates_data["Latitude"] = coordinates_data["Latitude"].apply( + if mfp_data["Latitude"].dtype in ["object", "string"]: + mfp_data["Latitude"] = mfp_data["Latitude"].apply( lambda x: float(x.replace(",", ".")) ) - if coordinates_data["Longitude"].dtype in ["object", "string"]: - coordinates_data["Longitude"] = coordinates_data["Longitude"].apply( + if mfp_data["Longitude"].dtype in ["object", "string"]: + mfp_data["Longitude"] = mfp_data["Longitude"].apply( lambda x: float(x.replace(",", ".")) ) - return coordinates_data - + # convert 'Travel Time to Next' and 'Time at Station' to timedelta + mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) -def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D417 - """ - Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version. + # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column + mfp_data["Total Time"] = ( + mfp_data["Travel Time to Next"] + mfp_data["Time at Station"] + ) - Parameters - ---------- - - excel_file_path (str): Path to the Excel file containing coordinate and instrument data. + return mfp_data - The function: - 1. Reads instrument and location data from the Excel file. - 2. Determines the maximum depth and buffer based on the instruments present. - 3. Ensures longitude and latitude values remain valid after applying buffer adjustments. - 4. returns the yaml information. - """ +def mfp_to_yaml(file_path: str, start_date: str, output_path: str): + """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" # avoid circular imports from virtualship.models import ( Expedition, @@ -274,19 +293,24 @@ def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D41 ) # Read data from file - coordinates_data = load_coordinates(coordinates_file_path) - - coordinates_data = validate_coordinates(coordinates_data) + mfp_data = _validate_mfpdata(file_path) # Generate waypoints waypoints = [] - for _, row in coordinates_data.iterrows(): + current_time, previous_timedelta = start_date, None + for i, row in mfp_data.iterrows(): + if i > 0: + current_time += previous_timedelta waypoints.append( Waypoint( - instrument=None, # instruments blank, to be built by user using `virtualship plan` UI or by interacting directly with YAML files + instrument=None, location=Location(latitude=row["Latitude"], longitude=row["Longitude"]), + time=current_time, ) ) + previous_timedelta = row[ + "Total Time" + ] # store total timedelta for next iteration # Create Schedule object schedule = Schedule( @@ -309,7 +333,17 @@ def mfp_to_yaml(coordinates_file_path: str, yaml_output_path: str): # noqa: D41 ) # Save to YAML file - expedition.to_yaml(yaml_output_path) + expedition.to_yaml(output_path) + + +def _mfp_string_to_timedelta(value: str) -> timedelta: + """Handle MFP export string format (e.g., "0d 13h 13m").""" + if pd.isna(value): # last waypoint has no travel time to next, so will be NaN + return timedelta(0) + + value = value.replace("d", ":").replace("h", ":").replace("m", "") + days, hours, minutes = map(int, value.split(":")) + return timedelta(days=days, hours=hours, minutes=minutes) def _validate_numeric_to_timedelta( From b8637601187d06b32f35c4a864fe13bd1260c9a2 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:54:07 +0200 Subject: [PATCH 104/191] update click.echo(); no time instructions required --- src/virtualship/cli/commands.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index b5110fac..2ecf7125 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -56,14 +56,16 @@ def init(path, from_mfp, start_date): # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: this print needs to be updated # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. + # TODO: the schedule object should be able to take a special 'port' waypoint type, which is the same as a regular waypoint (to ensure compatibility) but without 'instruments' + # TODO: need to check this interacts as expected with the 'problems' module + # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) + # TODO: but add and remove waypoint buttons should ignore ports click.echo( - "\n⚠️ The generated schedule does not contain TIME values or INSTRUMENT selections. ⚠️" - "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the schedule configuration, " - "\nOR edit 'expedition.yaml' and manually add the necessary time values and instrument selections under the 'schedule' heading." + "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" + "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " + "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🕒 Expected time format: 'YYYY-MM-DD HH:MM:SS' (e.g., '2023-10-20 01:00:00')." "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" ) From 4faa24a4000b47a612e00022bfe776a226dc7d37 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:05:15 +0200 Subject: [PATCH 105/191] add waypoint numbers (comments) to expedition.yaml --- src/virtualship/models/expedition.py | 19 +++++++- src/virtualship/static/expedition.yaml | 67 ++++++++++++++------------ 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index b7269373..07e4d184 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -37,9 +37,24 @@ class Expedition(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") def to_yaml(self, file_path: str) -> None: - """Write exepedition object to yaml file.""" + """Write expedition object to yaml file, with waypoint number comments.""" + raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) + + breakpoint() + lines = raw.splitlines(keepends=True) + annotated = [] + waypoint_number = 0 + for line in lines: + if line.lstrip().startswith( + "- instrument:" + ): # TODO: unit test that this is how each waypoint is identified in the yaml dump + waypoint_number += 1 + indent = " " * (len(line) - len(line.lstrip())) + annotated.append(f"{indent}# Waypoint {waypoint_number}\n") + annotated.append(line) + with open(file_path, "w") as file: - yaml.dump(self.model_dump(by_alias=True), file) + file.writelines(annotated) @classmethod def from_yaml(cls, file_path: str) -> Expedition: diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index acb16dcf..0f2c0c0b 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -1,36 +1,5 @@ # see https://virtualship.readthedocs.io/en/latest/user-guide/tutorials/working_with_expedition_yaml.html for more details on how to edit this file # -schedule: - waypoints: - - instrument: - - CTD - location: - latitude: 0 - longitude: 0 - time: 1998-01-01 00:00:00 - - instrument: - - DRIFTER - - CTD - location: - latitude: 0.01 - longitude: 0.01 - time: 1998-01-02 01:00:00 - - instrument: - - ARGO_FLOAT - location: - latitude: 0.02 - longitude: 0.02 - time: 1998-01-03 02:00:00 - - instrument: - - XBT - location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-04 03:00:00 - - location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-05 03:00:00 instruments_config: adcp_config: num_bins: 40 @@ -82,5 +51,41 @@ instruments_config: sensors: - TEMPERATURE - SALINITY +schedule: + waypoints: + # Waypoint 1 + - instrument: + - CTD + location: + latitude: 0 + longitude: 0 + time: 1998-01-01 00:00:00 + # Waypoint 2 + - instrument: + - DRIFTER + - CTD + location: + latitude: 0.01 + longitude: 0.01 + time: 1998-01-02 01:00:00 + # Waypoint 3 + - instrument: + - ARGO_FLOAT + location: + latitude: 0.02 + longitude: 0.02 + time: 1998-01-03 02:00:00 + # Waypoint 4 + - instrument: + - XBT + location: + latitude: 0.03 + longitude: 0.03 + time: 1998-01-04 03:00:00 + # Waypoint 5 + - location: + latitude: 0.03 + longitude: 0.03 + time: 1998-01-05 03:00:00 ship_config: ship_speed_knots: 10.0 From 1119153a95c87d9ff3e62d11bbdd198775a648db Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:13:08 +0200 Subject: [PATCH 106/191] add unit test: waypoint field in yaml always starts with "- instrument" --- src/virtualship/models/expedition.py | 4 +-- tests/expedition/test_expedition.py | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 07e4d184..176220a5 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -45,9 +45,7 @@ def to_yaml(self, file_path: str) -> None: annotated = [] waypoint_number = 0 for line in lines: - if line.lstrip().startswith( - "- instrument:" - ): # TODO: unit test that this is how each waypoint is identified in the yaml dump + if line.lstrip().startswith("- instrument:"): waypoint_number += 1 indent = " " * (len(line) - len(line.lstrip())) annotated.append(f"{indent}# Waypoint {waypoint_number}\n") diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index 4bde12bd..406ffbe4 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -7,6 +7,7 @@ import pyproj import pytest import xarray as xr +import yaml from virtualship.errors import InstrumentsConfigError, ScheduleError from virtualship.models import ( @@ -371,3 +372,40 @@ def test_all_instrument_configs_use_mixin(expedition): assert iconfig.__class__._instrument_type == iconfig._instrument_type, ( f"{iconfig.__class__.__name__}._instrument_type does not match its registered InstrumentType" ) + + +def test_waypoint_yaml_line() -> None: + """Each waypoint entry in the raw YAML dump should start with '- instrument:'.""" + base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") + schedule = Schedule( + waypoints=[ + Waypoint(location=Location(0, 0), time=base_time, instrument=None), + Waypoint( + location=Location(1, 1), + time=base_time + timedelta(hours=1), + instrument=None, + ), + Waypoint( + location=Location(2, 2), + time=base_time + timedelta(hours=2), + instrument=["CTD"], + ), + ] + ) + raw = yaml.dump( + { + "schedule": { + "waypoints": [wp.model_dump(by_alias=True) for wp in schedule.waypoints] + } + }, + default_flow_style=False, + ) + + lines = [ + line for line in raw.splitlines() if line.lstrip().startswith("- instrument:") + ] + assert len(lines) == len(schedule.waypoints), ( + f"Expected {len(schedule.waypoints)} lines starting with '- instrument:' in the YAML dump, " + f"got {len(lines)}. The Waypoint field order or teminology may have changed. " + "Note this can have implications for the placement of waypoint number comments in Expedition.to_yaml()." + ) From 6a460a404d9fc757c6091337f1ea08369a68c49e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:45:02 +0200 Subject: [PATCH 107/191] new Port class --- .../expedition/simulate_schedule.py | 7 ++- src/virtualship/models/__init__.py | 2 + src/virtualship/models/expedition.py | 63 ++++++++++++++----- src/virtualship/models/location.py | 29 +++++---- 4 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 6af9d80c..93dd7441 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -16,6 +16,7 @@ from virtualship.models import ( Expedition, Location, + Port, Spacetime, Waypoint, ) @@ -247,7 +248,11 @@ def _get_underway_stationary_times( for i in range(1, int(npts) + 1) ] - def _make_measurements(self, waypoint: Waypoint) -> timedelta: + def _make_measurements(self, waypoint: Waypoint | Port) -> timedelta: + # port stops have no instruments + if isinstance(waypoint, Port): + return timedelta() + # if there are no instruments, there is no time cost if waypoint.instrument is None: return timedelta() diff --git a/src/virtualship/models/__init__.py b/src/virtualship/models/__init__.py index dd4b2bf1..b95544c8 100644 --- a/src/virtualship/models/__init__.py +++ b/src/virtualship/models/__init__.py @@ -8,6 +8,7 @@ DrifterConfig, Expedition, InstrumentsConfig, + Port, Schedule, SensorConfig, ShipConfig, @@ -23,6 +24,7 @@ __all__ = [ # noqa: RUF022 "Location", + "Port", "Schedule", "SensorConfig", "ShipConfig", diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 176220a5..5b519316 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -37,19 +37,8 @@ class Expedition(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") def to_yaml(self, file_path: str) -> None: - """Write expedition object to yaml file, with waypoint number comments.""" - raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) - - breakpoint() - lines = raw.splitlines(keepends=True) - annotated = [] - waypoint_number = 0 - for line in lines: - if line.lstrip().startswith("- instrument:"): - waypoint_number += 1 - indent = " " * (len(line) - len(line.lstrip())) - annotated.append(f"{indent}# Waypoint {waypoint_number}\n") - annotated.append(line) + """Write expedition object to yaml file, with port/waypoint number comments.""" + annotated = self._annotate() with open(file_path, "w") as file: file.writelines(annotated) @@ -66,6 +55,8 @@ def get_instruments(self) -> set[InstrumentType]: instruments_in_expedition = [] # from waypoints for waypoint in self.schedule.waypoints: + if isinstance(waypoint, Port): + continue if waypoint.instrument: for instrument in waypoint.instrument: if instrument: @@ -83,6 +74,36 @@ def get_instruments(self) -> set[InstrumentType]: "Underway instrument config attribute(s) are missing from YAML. Must be Config object or None." ) from e + def _annotate(self): + """Add port/waypoint comments/annotations to the expedition.yaml file.""" + assert isinstance(self.schedule.waypoints[0], Port) & isinstance( + self.schedule.waypoints[-1], Port + ), ( + "First and last waypoints must be Ports." + ) # commenting logic below assumes first and last waypoints are ports + + raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) + + lines = raw.splitlines(keepends=True) + annotated = [] + waypoint_number = 0 + for line in lines: + stripped = line.lstrip() + indent = " " * (len(line) - len(stripped)) + + # waypoints start with "- instrument:" and Ports start with "- location:" (no instrument field). + if stripped.startswith("- instrument:"): + waypoint_number += 1 + annotated.append(f"{indent}# Waypoint {waypoint_number}\n") + + if stripped.startswith("- location:"): + arrival_departure = "Departure" if waypoint_number == 0 else "Arrival" + annotated.append(f"{indent}# Port of {arrival_departure}\n") + + annotated.append(line) + + return annotated + class ShipConfig(pydantic.BaseModel): """Configuration of the ship.""" @@ -97,7 +118,7 @@ class ShipConfig(pydantic.BaseModel): class Schedule(pydantic.BaseModel): """Schedule of the virtual ship.""" - waypoints: list[Waypoint] + waypoints: list[Port | Waypoint] model_config = pydantic.ConfigDict(extra="forbid") @@ -150,6 +171,8 @@ def verify( ) from e for wp_i, wp in enumerate(self.waypoints): + if isinstance(wp, Port): + continue # ports are in harbour; skip bathymetry land check try: value = bathymetry_field.eval( np.float64(0.0), # time @@ -175,7 +198,8 @@ def verify( zip(self.waypoints, self.waypoints[1:], strict=False) ): stationkeeping_time = _calc_wp_stationkeeping_time( - wp.instrument, instruments_config + wp.instrument if isinstance(wp, Waypoint) else None, + instruments_config, ) time_to_reach = _calc_sail_time( @@ -201,6 +225,15 @@ def verify( print("... All good to go!") +class Port(pydantic.BaseModel): + """A port stop: a location the ship visits with no instrument deployments made.""" + + location: Location | None = None + time: datetime | None = None + + model_config = pydantic.ConfigDict(extra="forbid") + + class Waypoint(pydantic.BaseModel): """A Waypoint to sail to with an optional time and an optional instrument.""" diff --git a/src/virtualship/models/location.py b/src/virtualship/models/location.py index 793e5312..1c40bb8b 100644 --- a/src/virtualship/models/location.py +++ b/src/virtualship/models/location.py @@ -7,26 +7,29 @@ class Location: """A location on a sphere.""" - latitude: float - longitude: float + latitude: float | None = None + longitude: float | None = None def __post_init__(self) -> None: """ - Verify this location has valid latitude and longitude. + Verify this location has valid latitude and longitude if provided. :raises ValueError: If latitude and/or longitude are not valid. """ - if self.lat < -90: - raise ValueError("Latitude cannot be smaller than -90.") - if self.lat > 90: - raise ValueError("Latitude cannot be larger than 90.") - if self.lon < -180: - raise ValueError("Longitude cannot be smaller than -180.") - if self.lon > 360: - raise ValueError("Longitude cannot be larger than 360.") + if self.lat is not None: + if self.lat < -90: + raise ValueError("Latitude cannot be smaller than -90.") + if self.lat > 90: + raise ValueError("Latitude cannot be larger than 90.") + + if self.lon is not None: + if self.lon < -180: + raise ValueError("Longitude cannot be smaller than -180.") + if self.lon > 360: + raise ValueError("Longitude cannot be larger than 360.") @property - def lat(self) -> float: + def lat(self) -> float | None: """ Shorthand for latitude variable. @@ -35,7 +38,7 @@ def lat(self) -> float: return self.latitude @property - def lon(self) -> float: + def lon(self) -> float | None: """ Shorthand for longitude variable. From 585d54c9b6c31cca9989e2b9174c42a88dcbd68b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:17:08 +0200 Subject: [PATCH 108/191] ingest and validate mfp exports with/without (or mixture of) ports --- src/virtualship/utils.py | 116 +++++++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 30 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 9126c72d..77e5679e 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -208,8 +208,18 @@ def _load_mfpexport(file_path): ) from e +def _create_port_row(columns, port_type): + """Generate a single placeholder row for missing departure/arrival ports.""" + row = {col: None for col in columns} + row["Station"] = port_type + row["Type"] = port_type + return pd.DataFrame([row]) + + def _validate_mfpdata(file_path): """Load and validate MFP CruiseData export.""" + errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." + mfp_data = _load_mfpexport(file_path) # clean up column names @@ -237,33 +247,57 @@ def _validate_mfpdata(file_path): if missing_columns: raise ValueError( f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?" + "Are you sure that you're using the correct export from MFP?\n\n" + + errmsg_supplement ) extra_columns = actual_columns - expected_columns if extra_columns: + # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? warnings.warn( f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " - "If the MFP export format changed, please submit an issue: " - "https://github.com/OceanParcels/virtualship/issues.", + "Manually added columns have no effect. " + errmsg_supplement, stacklevel=2, ) - # Drop unexpected columns - mfp_data = mfp_data[list(expected_columns)] + # Convert latitude and longitude to floats, handling commas and missing values safely + for coord in ["Latitude", "Longitude"]: + if mfp_data[coord].dtype in ["object", "string"]: + mfp_data[coord] = pd.to_numeric( + mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" + ) - # Convert latitude and longitude to floats, replacing commas with dots - # Handles case when the latitude and longitude have decimals with commas - if mfp_data["Latitude"].dtype in ["object", "string"]: - mfp_data["Latitude"] = mfp_data["Latitude"].apply( - lambda x: float(x.replace(",", ".")) + # check for missing departure/arrival ports and add placeholders if necessary + # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting + has_departure = ( + "Departure Port" in mfp_data["Station"].values + or "Departure Port" in mfp_data["Type"].values + ) + has_arrival = ( + "Arrival Port" in mfp_data["Station"].values + or "Arrival Port" in mfp_data["Type"].values + ) + if not has_departure or not has_arrival: + # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + warnings.warn( + "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " + "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " + "The prescribed date will be used for Waypoint #1 instead. " + "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " + + errmsg_supplement.replace("If ", ""), + stacklevel=2, ) - if mfp_data["Longitude"].dtype in ["object", "string"]: - mfp_data["Longitude"] = mfp_data["Longitude"].apply( - lambda x: float(x.replace(",", ".")) - ) + if not has_departure: + dept_row = _create_port_row(expected_columns, "Departure Port") + mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row + + if not has_arrival: + arr_row = _create_port_row(expected_columns, "Arrival Port") + mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row + + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] # convert 'Travel Time to Next' and 'Time at Station' to timedelta mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( @@ -274,9 +308,10 @@ def _validate_mfpdata(file_path): ) # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column - mfp_data["Total Time"] = ( - mfp_data["Travel Time to Next"] + mfp_data["Time at Station"] - ) + # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port + mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ + "Time at Station" + ].fillna(pd.Timedelta(0)) return mfp_data @@ -288,6 +323,7 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): Expedition, InstrumentsConfig, Location, + Port, Schedule, Waypoint, ) @@ -295,22 +331,42 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): # Read data from file mfp_data = _validate_mfpdata(file_path) - # Generate waypoints + # Generate ports/waypoints waypoints = [] current_time, previous_timedelta = start_date, None for i, row in mfp_data.iterrows(): if i > 0: current_time += previous_timedelta - waypoints.append( - Waypoint( - instrument=None, - location=Location(latitude=row["Latitude"], longitude=row["Longitude"]), - time=current_time, + is_port = "Port" in row["Station"] or "Port" in row["Type"] + + if is_port: + has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( + row["Longitude"] + ) # indicates that the port has been set in MFP / is not a placeholder + + waypoints.append( + Port( + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time if has_latlon else None, + ) ) + else: + waypoints.append( + Waypoint( + instrument=None, + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time, + ) + ) + + # store total timedelta for next iteration + previous_timedelta = ( + row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) ) - previous_timedelta = row[ - "Total Time" - ] # store total timedelta for next iteration # Create Schedule object schedule = Schedule( @@ -338,8 +394,8 @@ def mfp_to_yaml(file_path: str, start_date: str, output_path: str): def _mfp_string_to_timedelta(value: str) -> timedelta: """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint has no travel time to next, so will be NaN - return timedelta(0) + if pd.isna(value): # last waypoint/missing ports have NaN/None travel time + return value # return None value = value.replace("d", ":").replace("h", ":").replace("m", "") days, hours, minutes = map(int, value.split(":")) @@ -653,7 +709,7 @@ def _calc_sail_time( def _calc_wp_stationkeeping_time( - wp_instrument_types: list, + wp_instrument_types: list | None, instruments_config: InstrumentsConfig, instrument_config_map: dict = INSTRUMENT_CONFIG_MAP, ) -> timedelta: From 03989fb83041d6809b6ccb968cceee5e42d46eee Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:17:30 +0200 Subject: [PATCH 109/191] update static expedition.yaml with ports API --- src/virtualship/static/expedition.yaml | 41 ++++++++++++++++---------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index 0f2c0c0b..ad04aa67 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -53,39 +53,50 @@ instruments_config: - SALINITY schedule: waypoints: + # Port of Departure + - location: + latitude: 0 + longitude: 0 + time: 1998-01-01 00:00:00 # Waypoint 1 - instrument: - CTD location: - latitude: 0 - longitude: 0 - time: 1998-01-01 00:00:00 + latitude: 0.01 + longitude: 0.01 + time: 1998-01-02 00:00:00 # Waypoint 2 - instrument: - DRIFTER - CTD location: - latitude: 0.01 - longitude: 0.01 - time: 1998-01-02 01:00:00 + latitude: 0.02 + longitude: 0.02 + time: 1998-01-03 01:00:00 # Waypoint 3 - instrument: - ARGO_FLOAT location: - latitude: 0.02 - longitude: 0.02 - time: 1998-01-03 02:00:00 + latitude: 0.03 + longitude: 0.03 + time: 1998-01-04 02:00:00 # Waypoint 4 - instrument: - XBT location: - latitude: 0.03 - longitude: 0.03 - time: 1998-01-04 03:00:00 + latitude: 0.04 + longitude: 0.04 + time: 1998-01-05 03:00:00 # Waypoint 5 - - location: - latitude: 0.03 - longitude: 0.03 + - instrument: [] + location: + latitude: 0.05 + longitude: 0.05 time: 1998-01-05 03:00:00 + # Port of Arrival + - location: + latitude: 0.06 + longitude: 0.06 + time: 1998-01-06 03:00:00 ship_config: ship_speed_knots: 10.0 From 804f909c009d5c6498a1499dba8744d44bf851e9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:19:49 +0200 Subject: [PATCH 110/191] fix timings in static expedition.yaml --- src/virtualship/static/expedition.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/virtualship/static/expedition.yaml b/src/virtualship/static/expedition.yaml index ad04aa67..1e201543 100644 --- a/src/virtualship/static/expedition.yaml +++ b/src/virtualship/static/expedition.yaml @@ -92,11 +92,11 @@ schedule: location: latitude: 0.05 longitude: 0.05 - time: 1998-01-05 03:00:00 + time: 1998-01-06 04:00:00 # Port of Arrival - location: latitude: 0.06 longitude: 0.06 - time: 1998-01-06 03:00:00 + time: 1998-01-07 05:00:00 ship_config: ship_speed_knots: 10.0 From b2c43dc99d71a9baeaed30f21757277b69f80041 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:47:46 +0200 Subject: [PATCH 111/191] move `virtualship init` logic to new initialise.py module --- src/virtualship/cli/_initialise.py | 287 +++++++++++++++++++++++++++++ src/virtualship/cli/commands.py | 41 +---- src/virtualship/utils.py | 238 ------------------------ 3 files changed, 290 insertions(+), 276 deletions(-) create mode 100644 src/virtualship/cli/_initialise.py diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py new file mode 100644 index 00000000..8a8db8ae --- /dev/null +++ b/src/virtualship/cli/_initialise.py @@ -0,0 +1,287 @@ +import os +import warnings +from datetime import timedelta +from functools import lru_cache +from importlib.resources import files +from pathlib import Path + +import click +import pandas as pd +import yaml + +from virtualship.utils import ( + EXPEDITION, +) + + +def _initialise( + path: str | Path, from_mfp: str | None = None, start_date: str | None = None +): + path = Path(path) + path.mkdir(exist_ok=True) + + expedition = path / EXPEDITION + + if expedition.exists(): + raise FileExistsError( + f"File '{expedition}' already exist. Please remove it or choose another directory." + ) + + if from_mfp: + mfp_file = Path(from_mfp) + # Generate expedition.yaml from the MPF file + click.echo(f"Generating schedule from {mfp_file}...") + _mfp_to_yaml(mfp_file, start_date, expedition) + # TODO: need to check this interacts as expected with the 'problems' module + # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) + # TODO: but add and remove waypoint buttons should ignore ports + # TODO: update relevant docs + #! TODO: `virtualship init` methods are becoming long and complex. Consider refactoring into a separate module for clarity and maintainability (in `virtualship/cli/_init.py`). + # though, consider confusion of having both `_init.py` and `init.py` in the same directory. Maybe `_init.py` should be renamed to `_init_command.py` or similar. + # TODO: add a check to see if any instruments are added to a port waypoint (shouldn't be possible via MFP export but in case someone manually edits the expedition.yaml to add instruments to a port waypoint). If so, raise an error and ask user to remove them. + #! TODO: see utils.py: propagate the warnings to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + + click.echo( + "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" + "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " + "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." + "\n\nIf editing 'expedition.yaml' manually:" + "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." + f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" + ) + else: + # Create a default example expedition YAML + expedition.write_text(_get_example_expedition()) + + click.echo(f"Created '{expedition.name}' at {path}.") + + +def _mfp_to_yaml(file_path: str, start_date: str, output_path: str): + """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" + # avoid circular imports + from virtualship.models import ( + Expedition, + InstrumentsConfig, + Location, + Port, + Schedule, + Waypoint, + ) + + # Read data from file + mfp_data = _validate_mfp_data(file_path) + + # Generate ports/waypoints + waypoints = [] + current_time, previous_timedelta = start_date, None + for i, row in mfp_data.iterrows(): + if i > 0: + current_time += previous_timedelta + is_port = "Port" in row["Station"] or "Port" in row["Type"] + + if is_port: + has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( + row["Longitude"] + ) # indicates that the port has been set in MFP / is not a placeholder + + waypoints.append( + Port( + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time if has_latlon else None, + ) + ) + else: + waypoints.append( + Waypoint( + instrument=None, + location=Location( + latitude=row["Latitude"], longitude=row["Longitude"] + ), + time=current_time, + ) + ) + + # store total timedelta for next iteration + previous_timedelta = ( + row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) + ) + + # Create Schedule object + schedule = Schedule( + waypoints=waypoints, + ) + + # extract instruments config from static + instruments_config = InstrumentsConfig.model_validate( + yaml.safe_load(_get_example_expedition()).get("instruments_config") + ) + + # extract ship config from static + ship_config = yaml.safe_load(_get_example_expedition()).get("ship_config") + # combine to Expedition object + expedition = Expedition( + schedule=schedule, + instruments_config=instruments_config, + ship_config=ship_config, + ) + + # Save to YAML file + expedition.to_yaml(output_path) + + +def _validate_mfp_data(file_path): + """Load and validate MFP CruiseData export.""" + errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." + + mfp_data = _load_mfp_export(file_path) + + # clean up column names + mfp_data.columns = mfp_data.columns.astype(str).str.strip() + mfp_data = mfp_data.loc[ + :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") + ] + + expected_columns = { + "Station", + "Type", + "Latitude", + "Longitude", + "Sea Depth", + "Time at Station", + "Travel Time to Next", + "Distance to Next (NM)", + "Ship Speed (kn)", + "EEZ", + } + + actual_columns = set(mfp_data.columns) + + missing_columns = expected_columns - actual_columns + if missing_columns: + raise ValueError( + f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " + "Are you sure that you're using the correct export from MFP?\n\n" + + errmsg_supplement + ) + + extra_columns = actual_columns - expected_columns + if extra_columns: + # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? + warnings.warn( + f"Found additional unexpected columns {list(extra_columns)}. " + "Manually added columns have no effect. " + errmsg_supplement, + stacklevel=2, + ) + + # Convert latitude and longitude to floats, handling commas and missing values safely + for coord in ["Latitude", "Longitude"]: + if mfp_data[coord].dtype in ["object", "string"]: + mfp_data[coord] = pd.to_numeric( + mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" + ) + + # check for missing departure/arrival ports and add placeholders if necessary + # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting + has_departure = ( + "Departure Port" in mfp_data["Station"].values + or "Departure Port" in mfp_data["Type"].values + ) + has_arrival = ( + "Arrival Port" in mfp_data["Station"].values + or "Arrival Port" in mfp_data["Type"].values + ) + if not has_departure or not has_arrival: + # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + warnings.warn( + "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " + "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " + "The prescribed date will be used for Waypoint #1 instead. " + "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " + + errmsg_supplement.replace("If ", ""), + stacklevel=2, + ) + + if not has_departure: + dept_row = _create_port_row(expected_columns, "Departure Port") + mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row + + if not has_arrival: + arr_row = _create_port_row(expected_columns, "Arrival Port") + mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row + + # Drop unexpected columns + mfp_data = mfp_data[list(expected_columns)] + + # convert 'Travel Time to Next' and 'Time at Station' to timedelta + mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( + lambda x: _mfp_string_to_timedelta(x) + ) + + # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column + # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port + mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ + "Time at Station" + ].fillna(pd.Timedelta(0)) + + return mfp_data + + +def _load_mfp_export(file_path): + if not os.path.isfile(file_path): + raise FileNotFoundError(f"File not found: {file_path}") + + try: + df = pd.read_excel(file_path) + return df.dropna(how="all", axis=1) # drop empty columns + + except Exception as e: + raise RuntimeError( + "Could not read coordinates data from the provided file. " + "Ensure it is an exported .xlsx file from MFP." + ) from e + + +def _create_port_row(columns, port_type): + """Generate a single placeholder row for missing departure/arrival ports.""" + row = {col: None for col in columns} + row["Station"] = port_type + row["Type"] = port_type + return pd.DataFrame([row]) + + +def _mfp_string_to_timedelta(value: str) -> timedelta: + """Handle MFP export string format (e.g., "0d 13h 13m").""" + if pd.isna(value): # last waypoint/missing ports have NaN/None travel time + return value # return None + + value = value.replace("d", ":").replace("h", ":").replace("m", "") + days, hours, minutes = map(int, value.split(":")) + return timedelta(days=days, hours=hours, minutes=minutes) + + +def _load_static_file(name: str) -> str: + """Load static file from the ``virtualship.static`` module by file name.""" + return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") + + +@lru_cache(None) +@lru_cache(None) +def _get_example_expedition() -> str: + """Get the example unified expedition configuration file.""" + return _load_static_file(EXPEDITION) + + +def _validate_start_date(ctx, param, value): + """Callback to enforce and validate --start-date when --from-mfp is used.""" + if ctx.params.get("from_mfp"): + if not value: + raise click.BadParameter( + "The '--start-date' option is required when using '--from-mfp'." + "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." + ) + return value diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index 2ecf7125..d958df16 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -2,15 +2,12 @@ import click +from virtualship.cli._initialise import _initialise, _validate_start_date from virtualship.cli._plan import _plan from virtualship.cli._run import _run from virtualship.utils import ( COPERNICUSMARINE_BGC_VARIABLES, COPERNICUSMARINE_PHYS_VARIABLES, - EXPEDITION, - get_example_expedition, - mfp_to_yaml, - validate_start_date, ) @@ -31,7 +28,7 @@ "--start-date", type=click.DateTime(formats=["%Y-%m-%d %H:%M:%S", "%Y-%m-%d"]), default=None, - callback=validate_start_date, + callback=_validate_start_date, help="The departure/start date of the expedition (required when using --from-mfp). " "Expected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00.", ) @@ -41,39 +38,7 @@ def init(path, from_mfp, start_date): If --mfp-file is provided, it will generate the expedition.yaml from the MPF file instead. """ - path = Path(path) - path.mkdir(exist_ok=True) - - expedition = path / EXPEDITION - - if expedition.exists(): - raise FileExistsError( - f"File '{expedition}' already exist. Please remove it or choose another directory." - ) - - if from_mfp: - mfp_file = Path(from_mfp) - # Generate expedition.yaml from the MPF file - click.echo(f"Generating schedule from {mfp_file}...") - mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: how to handle the ports?! Should be conditional on this kind of 'waypoint' being present in the MFP file. - # TODO: the schedule object should be able to take a special 'port' waypoint type, which is the same as a regular waypoint (to ensure compatibility) but without 'instruments' - # TODO: need to check this interacts as expected with the 'problems' module - # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) - # TODO: but add and remove waypoint buttons should ignore ports - click.echo( - "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" - "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " - "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." - "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." - f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" - ) - else: - # Create a default example expedition YAML - expedition.write_text(get_example_expedition()) - - click.echo(f"Created '{expedition.name}' at {path}.") + _initialise(Path(path), from_mfp, start_date) @click.command() diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 77e5679e..9441defd 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -2,16 +2,11 @@ import glob import hashlib -import os import re -import warnings from datetime import datetime, timedelta -from functools import lru_cache -from importlib.resources import files from pathlib import Path from typing import TYPE_CHECKING, Literal, TextIO -import click import copernicusmarine import numpy as np import parcels @@ -29,7 +24,6 @@ from virtualship.models.checkpoint import Checkpoint from virtualship.models.expedition import SensorConfig -import pandas as pd import yaml from pydantic import BaseModel from yaspin import Spinner @@ -158,18 +152,6 @@ def decorator(cls): # ===================================================== -def load_static_file(name: str) -> str: - """Load static file from the ``virtualship.static`` module by file name.""" - return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") - - -@lru_cache(None) -@lru_cache(None) -def get_example_expedition() -> str: - """Get the example unified expedition configuration file.""" - return load_static_file(EXPEDITION) - - def _dump_yaml(model: BaseModel, stream: TextIO) -> str | None: """Dump a pydantic model to a yaml string.""" return yaml.safe_dump( @@ -182,226 +164,6 @@ def _generic_load_yaml(data: str, model: BaseModel) -> BaseModel: return model.model_validate(yaml.safe_load(data)) -def validate_start_date(ctx, param, value): - """Callback to enforce and validate --start-date when --from-mfp is used.""" - if ctx.params.get("from_mfp"): - if not value: - raise click.BadParameter( - "The '--start-date' option is required when using '--from-mfp'." - "\n\nExpected format: 'YYYY-MM-DD HH:MM:SS' (with quotes, e.g., '2023-10-20 01:00:00'). If only the date is provided, the time will default to 00:00:00." - ) - return value - - -def _load_mfpexport(file_path): - if not os.path.isfile(file_path): - raise FileNotFoundError(f"File not found: {file_path}") - - try: - df = pd.read_excel(file_path) - return df.dropna(how="all", axis=1) # drop empty columns - - except Exception as e: - raise RuntimeError( - "Could not read coordinates data from the provided file. " - "Ensure it is an exported .xlsx file from MFP." - ) from e - - -def _create_port_row(columns, port_type): - """Generate a single placeholder row for missing departure/arrival ports.""" - row = {col: None for col in columns} - row["Station"] = port_type - row["Type"] = port_type - return pd.DataFrame([row]) - - -def _validate_mfpdata(file_path): - """Load and validate MFP CruiseData export.""" - errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." - - mfp_data = _load_mfpexport(file_path) - - # clean up column names - mfp_data.columns = mfp_data.columns.astype(str).str.strip() - mfp_data = mfp_data.loc[ - :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") - ] - - expected_columns = { - "Station", - "Type", - "Latitude", - "Longitude", - "Sea Depth", - "Time at Station", - "Travel Time to Next", - "Distance to Next (NM)", - "Ship Speed (kn)", - "EEZ", - } - - actual_columns = set(mfp_data.columns) - - missing_columns = expected_columns - actual_columns - if missing_columns: - raise ValueError( - f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?\n\n" - + errmsg_supplement - ) - - extra_columns = actual_columns - expected_columns - if extra_columns: - # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? - warnings.warn( - f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " + errmsg_supplement, - stacklevel=2, - ) - - # Convert latitude and longitude to floats, handling commas and missing values safely - for coord in ["Latitude", "Longitude"]: - if mfp_data[coord].dtype in ["object", "string"]: - mfp_data[coord] = pd.to_numeric( - mfp_data[coord].astype(str).str.replace(",", "."), errors="coerce" - ) - - # check for missing departure/arrival ports and add placeholders if necessary - # check against both 'Station' and 'Type' columns; variations can occur when importing to MFP before re-exporting - has_departure = ( - "Departure Port" in mfp_data["Station"].values - or "Departure Port" in mfp_data["Type"].values - ) - has_arrival = ( - "Arrival Port" in mfp_data["Station"].values - or "Arrival Port" in mfp_data["Type"].values - ) - if not has_departure or not has_arrival: - # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. - warnings.warn( - "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " - "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " - "The prescribed date will be used for Waypoint #1 instead. " - "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " - + errmsg_supplement.replace("If ", ""), - stacklevel=2, - ) - - if not has_departure: - dept_row = _create_port_row(expected_columns, "Departure Port") - mfp_data = pd.concat([dept_row, mfp_data], ignore_index=True) # first row - - if not has_arrival: - arr_row = _create_port_row(expected_columns, "Arrival Port") - mfp_data = pd.concat([mfp_data, arr_row], ignore_index=True) # last row - - # Drop unexpected columns - mfp_data = mfp_data[list(expected_columns)] - - # convert 'Travel Time to Next' and 'Time at Station' to timedelta - mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( - lambda x: _mfp_string_to_timedelta(x) - ) - mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( - lambda x: _mfp_string_to_timedelta(x) - ) - - # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column - # add 0 when Time at Station is NaN, to avoid NaT in Total Time, but not to Travel Time to keep NaT at the arrival port - mfp_data["Total Time"] = mfp_data["Travel Time to Next"] + mfp_data[ - "Time at Station" - ].fillna(pd.Timedelta(0)) - - return mfp_data - - -def mfp_to_yaml(file_path: str, start_date: str, output_path: str): - """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" - # avoid circular imports - from virtualship.models import ( - Expedition, - InstrumentsConfig, - Location, - Port, - Schedule, - Waypoint, - ) - - # Read data from file - mfp_data = _validate_mfpdata(file_path) - - # Generate ports/waypoints - waypoints = [] - current_time, previous_timedelta = start_date, None - for i, row in mfp_data.iterrows(): - if i > 0: - current_time += previous_timedelta - is_port = "Port" in row["Station"] or "Port" in row["Type"] - - if is_port: - has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( - row["Longitude"] - ) # indicates that the port has been set in MFP / is not a placeholder - - waypoints.append( - Port( - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time if has_latlon else None, - ) - ) - else: - waypoints.append( - Waypoint( - instrument=None, - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time, - ) - ) - - # store total timedelta for next iteration - previous_timedelta = ( - row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) - ) - - # Create Schedule object - schedule = Schedule( - waypoints=waypoints, - ) - - # extract instruments config from static - instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(get_example_expedition()).get("instruments_config") - ) - - # extract ship config from static - ship_config = yaml.safe_load(get_example_expedition()).get("ship_config") - - # combine to Expedition object - expedition = Expedition( - schedule=schedule, - instruments_config=instruments_config, - ship_config=ship_config, - ) - - # Save to YAML file - expedition.to_yaml(output_path) - - -def _mfp_string_to_timedelta(value: str) -> timedelta: - """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint/missing ports have NaN/None travel time - return value # return None - - value = value.replace("d", ":").replace("h", ":").replace("m", "") - days, hours, minutes = map(int, value.split(":")) - return timedelta(days=days, hours=hours, minutes=minutes) - - def _validate_numeric_to_timedelta( value: int | float | timedelta, unit: Literal["minutes", "days"] ) -> timedelta: From a8d647d5a88206ca89481924db0330b0d9def8d3 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:48:39 +0200 Subject: [PATCH 112/191] update init docstring --- src/virtualship/cli/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/cli/commands.py b/src/virtualship/cli/commands.py index d958df16..3442fb1b 100644 --- a/src/virtualship/cli/commands.py +++ b/src/virtualship/cli/commands.py @@ -36,7 +36,7 @@ def init(path, from_mfp, start_date): """ Initialize a directory for a new expedition, with an expedition.yaml file. - If --mfp-file is provided, it will generate the expedition.yaml from the MPF file instead. + If --mfp-file is provided (and --start-date is also provided), it will generate the expedition.yaml from the MPF file instead. """ _initialise(Path(path), from_mfp, start_date) From 33d11a9034ac428daddab6f2a60df627fae16b01 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:17:41 +0200 Subject: [PATCH 113/191] refactor _initialise.py --- src/virtualship/cli/_initialise.py | 201 +++++++++++++---------------- 1 file changed, 90 insertions(+), 111 deletions(-) diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py index 8a8db8ae..41145c8f 100644 --- a/src/virtualship/cli/_initialise.py +++ b/src/virtualship/cli/_initialise.py @@ -1,4 +1,5 @@ import os +import re import warnings from datetime import timedelta from functools import lru_cache @@ -9,9 +10,17 @@ import pandas as pd import yaml -from virtualship.utils import ( - EXPEDITION, +from virtualship.models import ( + Expedition, + InstrumentsConfig, + Location, + Port, + Schedule, + Waypoint, ) +from virtualship.utils import EXPEDITION + +ERR_SUPPLEMENT = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." def _initialise( @@ -24,126 +33,98 @@ def _initialise( if expedition.exists(): raise FileExistsError( - f"File '{expedition}' already exist. Please remove it or choose another directory." + f"File '{expedition}' already exists. Please remove it or choose another directory." ) if from_mfp: mfp_file = Path(from_mfp) - # Generate expedition.yaml from the MPF file click.echo(f"Generating schedule from {mfp_file}...") - _mfp_to_yaml(mfp_file, start_date, expedition) - # TODO: need to check this interacts as expected with the 'problems' module - # TODO: and new components need to be added to the 'plan' module to allow users to add ports and instruments to the schedule (keep in waypoints section but without instruments) - # TODO: but add and remove waypoint buttons should ignore ports - # TODO: update relevant docs - #! TODO: `virtualship init` methods are becoming long and complex. Consider refactoring into a separate module for clarity and maintainability (in `virtualship/cli/_init.py`). - # though, consider confusion of having both `_init.py` and `init.py` in the same directory. Maybe `_init.py` should be renamed to `_init_command.py` or similar. - # TODO: add a check to see if any instruments are added to a port waypoint (shouldn't be possible via MFP export but in case someone manually edits the expedition.yaml to add instruments to a port waypoint). If so, raise an error and ask user to remove them. - #! TODO: see utils.py: propagate the warnings to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. + # catch warnings raised to propagate them via click.echo + with warnings.catch_warnings(record=True) as captured_warnings: + warnings.simplefilter("always") + _mfp_to_yaml(mfp_file, start_date, expedition) + + indent = " " * 4 click.echo( "\n⚠️ The generated schedule does not contain INSTRUMENT selections. ⚠️" "\n\nNow please either use the `\033[4mvirtualship plan\033[0m` app to complete the configuration, " "\nOR edit 'expedition.yaml' and manually add the instrument selections under the 'schedule' heading." "\n\nIf editing 'expedition.yaml' manually:" - "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." - f"\n\n{' ' * 15}waypoints:\n{' ' * 15}- instrument:\n{' ' * 19}- CTD\n{' ' * 19}- ARGO_FLOAT\n" + "\n\n🌡️ Expected instrument(s) format: one line per instrument e.g." + f"\n\n{indent * 4}waypoints:\n{indent * 4}- instrument:\n{indent * 5}- CTD\n{indent * 5}- ARGO_FLOAT\n" ) + + # output captured warnings to the terminal + if captured_warnings: + click.echo("\n❗️ WARNINGS:") + for w in captured_warnings: + click.echo(f"{indent}• {w.message}") + click.echo( + f"\n{indent}If you believe any of these warnings are incorrect (e.g. you have selected departure/arrival ports), and {ERR_SUPPLEMENT.replace('If ', '')}\n" + ) else: - # Create a default example expedition YAML expedition.write_text(_get_example_expedition()) click.echo(f"Created '{expedition.name}' at {path}.") -def _mfp_to_yaml(file_path: str, start_date: str, output_path: str): - """Generates an expedition.yaml file with schedule information based on data from MFP excel file. The ship and instrument configurations entries in the YAML file are sourced from the static version.""" - # avoid circular imports - from virtualship.models import ( - Expedition, - InstrumentsConfig, - Location, - Port, - Schedule, - Waypoint, - ) - - # Read data from file +def _mfp_to_yaml(file_path: Path, start_date: str, output_path: Path): + """Generates an expedition.yaml file from MFP Excel export.""" mfp_data = _validate_mfp_data(file_path) - # Generate ports/waypoints + # convert start_date string to datetime object if needed + if isinstance(start_date, str): + current_time = pd.to_datetime(start_date) + else: + current_time = start_date + waypoints = [] - current_time, previous_timedelta = start_date, None + previous_timedelta = None + for i, row in mfp_data.iterrows(): if i > 0: current_time += previous_timedelta - is_port = "Port" in row["Station"] or "Port" in row["Type"] - if is_port: - has_latlon = not pd.isna(row["Latitude"]) and not pd.isna( - row["Longitude"] - ) # indicates that the port has been set in MFP / is not a placeholder + is_port = "Port" in str(row["Station"]) or "Port" in str(row["Type"]) + lat = None if pd.isna(row["Latitude"]) else float(row["Latitude"]) + lon = None if pd.isna(row["Longitude"]) else float(row["Longitude"]) + loc = Location(latitude=lat, longitude=lon) + if is_port: + has_latlon = lat is not None and lon is not None waypoints.append( - Port( - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time if has_latlon else None, - ) + Port(location=loc, time=current_time if has_latlon else None) ) else: - waypoints.append( - Waypoint( - instrument=None, - location=Location( - latitude=row["Latitude"], longitude=row["Longitude"] - ), - time=current_time, - ) - ) + waypoints.append(Waypoint(instrument=None, location=loc, time=current_time)) - # store total timedelta for next iteration previous_timedelta = ( - row["Total Time"] if row["Total Time"] is not pd.NaT else timedelta(0) + row["Total Time"] if pd.notna(row["Total Time"]) else timedelta(0) ) - # Create Schedule object - schedule = Schedule( - waypoints=waypoints, - ) - - # extract instruments config from static - instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(_get_example_expedition()).get("instruments_config") - ) - - # extract ship config from static - ship_config = yaml.safe_load(_get_example_expedition()).get("ship_config") - # combine to Expedition object + # build and dump expedition YAML + static_yaml = yaml.safe_load(_get_example_expedition()) expedition = Expedition( - schedule=schedule, - instruments_config=instruments_config, - ship_config=ship_config, + schedule=Schedule(waypoints=waypoints), + instruments_config=InstrumentsConfig.model_validate( + static_yaml.get("instruments_config") + ), + ship_config=static_yaml.get("ship_config"), ) - - # Save to YAML file expedition.to_yaml(output_path) -def _validate_mfp_data(file_path): +def _validate_mfp_data(file_path: Path) -> pd.DataFrame: """Load and validate MFP CruiseData export.""" - errmsg_supplement = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." - mfp_data = _load_mfp_export(file_path) # clean up column names mfp_data.columns = mfp_data.columns.astype(str).str.strip() - mfp_data = mfp_data.loc[ - :, ~mfp_data.columns.str.startswith("Unnamed") & (mfp_data.columns != "") - ] + junk_col_pattern = r"^(Unnamed:.*||\.\d+)$" + mfp_data = mfp_data.loc[:, ~mfp_data.columns.str.match(junk_col_pattern)] - expected_columns = { + expected_columns = [ "Station", "Type", "Latitude", @@ -154,28 +135,25 @@ def _validate_mfp_data(file_path): "Distance to Next (NM)", "Ship Speed (kn)", "EEZ", - } - - actual_columns = set(mfp_data.columns) + ] + expected_set = set(expected_columns) + actual_set = set(mfp_data.columns) - missing_columns = expected_columns - actual_columns + missing_columns = expected_set - actual_set if missing_columns: raise ValueError( - f"Error: Found columns {list(actual_columns)}, but expected columns {list(expected_columns)}. " - "Are you sure that you're using the correct export from MFP?\n\n" - + errmsg_supplement + f"Error: Found columns {list(actual_set)}, but expected columns {list(expected_columns)}. " + f"Are you sure that you're using the correct export from MFP?\n\n{ERR_SUPPLEMENT}" ) - extra_columns = actual_columns - expected_columns + extra_columns = actual_set - expected_set if extra_columns: - # TODO: as mentioned below, propagate this warning to the user via the click.echo() output in the `virtualship init` command? warnings.warn( - f"Found additional unexpected columns {list(extra_columns)}. " - "Manually added columns have no effect. " + errmsg_supplement, + f"Found additional unexpected columns {list(extra_columns)}. Manually added columns have no effect.", stacklevel=2, ) - # Convert latitude and longitude to floats, handling commas and missing values safely + # safe float conversion for lat/lon for coord in ["Latitude", "Longitude"]: if mfp_data[coord].dtype in ["object", "string"]: mfp_data[coord] = pd.to_numeric( @@ -192,14 +170,12 @@ def _validate_mfp_data(file_path): "Arrival Port" in mfp_data["Station"].values or "Arrival Port" in mfp_data["Type"].values ) + if not has_departure or not has_arrival: - # TODO: propagate the warning to to the user via the click.echo() output in the `virtualship init` command, so that the user sees clearly it in the terminal. Perhaps a warnings section at the bottom. warnings.warn( "The MFP export is missing either a 'Departure Port' or 'Arrival Port', or both. " - "Any missing port will be replaced with a placeholder in `expedition.yaml` but will be ignored in the simulation. " - "The prescribed date will be used for Waypoint #1 instead. " - "If you believe this warning is wrong (i.e. you have selected departure/arrival ports), and " - + errmsg_supplement.replace("If ", ""), + "Any missing port will be replaced with an empty placeholder in `expedition.yaml` but will be ignored in the simulation. " + "If missing the 'Departure Port', the prescribed start date will be used for Waypoint #1 instead. ", stacklevel=2, ) @@ -216,10 +192,10 @@ def _validate_mfp_data(file_path): # convert 'Travel Time to Next' and 'Time at Station' to timedelta mfp_data["Travel Time to Next"] = mfp_data["Travel Time to Next"].apply( - lambda x: _mfp_string_to_timedelta(x) + _mfp_string_to_timedelta ) mfp_data["Time at Station"] = mfp_data["Time at Station"].apply( - lambda x: _mfp_string_to_timedelta(x) + _mfp_string_to_timedelta ) # combine 'Travel Time to Next' and 'Time at Station' into a single 'Total Time' column @@ -231,14 +207,12 @@ def _validate_mfp_data(file_path): return mfp_data -def _load_mfp_export(file_path): +def _load_mfp_export(file_path: Path) -> pd.DataFrame: if not os.path.isfile(file_path): raise FileNotFoundError(f"File not found: {file_path}") try: - df = pd.read_excel(file_path) - return df.dropna(how="all", axis=1) # drop empty columns - + return pd.read_excel(file_path).dropna(how="all", axis=1) # drop empty columns except Exception as e: raise RuntimeError( "Could not read coordinates data from the provided file. " @@ -246,7 +220,7 @@ def _load_mfp_export(file_path): ) from e -def _create_port_row(columns, port_type): +def _create_port_row(columns, port_type: str) -> pd.DataFrame: """Generate a single placeholder row for missing departure/arrival ports.""" row = {col: None for col in columns} row["Station"] = port_type @@ -254,14 +228,20 @@ def _create_port_row(columns, port_type): return pd.DataFrame([row]) -def _mfp_string_to_timedelta(value: str) -> timedelta: - """Handle MFP export string format (e.g., "0d 13h 13m").""" - if pd.isna(value): # last waypoint/missing ports have NaN/None travel time - return value # return None +def _mfp_string_to_timedelta(value: str | None) -> timedelta | None: + """Parse MFP duration string (e.g., '0d 13h 13m') to timedelta.""" + if pd.isna(value): + return None + + match = re.search(r"(\d+)d\s*(\d+)h\s*(\d+)m", str(value)) + if match: + days, hours, minutes = map(int, match.groups()) + return timedelta(days=days, hours=hours, minutes=minutes) - value = value.replace("d", ":").replace("h", ":").replace("m", "") - days, hours, minutes = map(int, value.split(":")) - return timedelta(days=days, hours=hours, minutes=minutes) + else: + raise ValueError( + f"Invalid MFP duration format: '{value}'. Expected format: 'Xd Yh Zm' (e.g., '0d 13h 13m'). {ERR_SUPPLEMENT}" + ) def _load_static_file(name: str) -> str: @@ -269,8 +249,7 @@ def _load_static_file(name: str) -> str: return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") -@lru_cache(None) -@lru_cache(None) +@lru_cache(maxsize=1) def _get_example_expedition() -> str: """Get the example unified expedition configuration file.""" return _load_static_file(EXPEDITION) From 373f4c581f38710d3168435550dec124cde0a676 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 14 Aug 2026 12:39:33 +0200 Subject: [PATCH 114/191] rename method and small update --- src/virtualship/expedition/simulate_schedule.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 93dd7441..6f1fed05 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -134,7 +134,7 @@ def simulate(self) -> ScheduleOk | ScheduleProblem: ) # wait at the waypoint until ship is scheduled to be there # note measurements made at waypoint - time_passed = self._make_measurements(waypoint) + time_passed = self._get_instrument_timescosts(waypoint) # wait while measurements are being done self._progress_time_stationary(time_passed) @@ -248,13 +248,13 @@ def _get_underway_stationary_times( for i in range(1, int(npts) + 1) ] - def _make_measurements(self, waypoint: Waypoint | Port) -> timedelta: - # port stops have no instruments + def _get_instrument_timescosts(self, waypoint: Waypoint | Port) -> timedelta: + # port stops have no instruments; if there are no instruments, there is no time cost if isinstance(waypoint, Port): return timedelta() - # if there are no instruments, there is no time cost - if waypoint.instrument is None: + # if proper waypoint but there are no instruments, there is no time cost + if isinstance(waypoint, Waypoint) and waypoint.instrument is None: return timedelta() # make instruments a list even if it's only a single one From 2042b4d080eb828e4ee2ba43e60cc3963692f2de Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:30:50 +0200 Subject: [PATCH 115/191] add Port logic to problems simulator --- .../make_realistic/problems/simulator.py | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index dcffbbff..e08e0827 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -23,6 +23,7 @@ InstrumentProblem, ) from virtualship.models.checkpoint import Checkpoint +from virtualship.models.expedition import Port from virtualship.utils import ( CACHE, EXPEDITION, @@ -74,6 +75,8 @@ def select_problems( Map each selected problem to a random waypoint (or None if pre-departure). Finally, cache the suite of problems to a directory (expedition-specific) for reference. """ + waypoints = self.expedition.schedule.waypoints + valid_instrument_problems = [ problem for problem in INSTRUMENT_PROBLEMS @@ -86,12 +89,9 @@ def select_problems( if isinstance(p, GeneralProblem) and p.pre_departure ] - num_waypoints = len(self.expedition.schedule.waypoints) + num_waypoints = len(waypoints) num_instruments = len(instruments_in_expedition) - expedition_duration_days = ( - self.expedition.schedule.waypoints[-1].time - - self.expedition.schedule.waypoints[0].time - ).days + expedition_duration_days = (waypoints[-1].time - waypoints[0].time).days # if only one waypoint, return just a pre-departure problem if num_waypoints < 2: @@ -166,13 +166,12 @@ def select_problems( random.shuffle(available_replacements) selected_problems.extend(available_replacements[:num_to_replace]) - # map each problem to a [random] waypoint (or None if pre-departure) + # map each problem to a [random, non-port waypoint] (or None if pre-departure) # limited to one per waypoint, else complicates scheduling and contingency checking waypoint_idxs = [] unassigned_problems = [] - available_idxs = list( - range(len(self.expedition.schedule.waypoints) - 1) - ) # exclude last waypoint (problem there would have no impact on scheduling) + is_port = [isinstance(wp, Port) for wp in waypoints] + available_idxs = [i for i, port in enumerate(is_port) if not port] # TODO: if incorporate departure and arrival port/waypoints in future, bear in mind index selection here may need to change for problem in selected_problems: @@ -181,13 +180,21 @@ def select_problems( else: if available_idxs: wp_select = random.choice(available_idxs) + wp_instruments = waypoints[wp_select].instrument + wp_instruments = wp_instruments if wp_instruments else [] # noqa; handle when waypoint instruments set to "null" in expedition.yaml - # fmt: off # check waypoint actually deploys the instrument associated with the problem...if not, replace it with a general (non-instrument related) problem # rather than a different waypoint, because it's possible no applicable waypoint is still available - wp_instruments = self.expedition.schedule.waypoints[wp_select].instrument - if isinstance(problem, InstrumentProblem) and problem.instrument_type not in wp_instruments: - available_general = [p for p in GENERAL_PROBLEMS if not p.pre_departure and p not in selected_problems] + needs_replacement = ( + isinstance(problem, InstrumentProblem) + and problem.instrument_type not in wp_instruments + ) + if needs_replacement: + available_general = [ + p + for p in GENERAL_PROBLEMS + if not p.pre_departure and p not in selected_problems + ] if not available_general: unassigned_problems.append(problem) @@ -196,15 +203,12 @@ def select_problems( replacement = random.choice(available_general) problem_idx = selected_problems.index(problem) selected_problems[problem_idx] = replacement - # fmt: on waypoint_idxs.append(wp_select) available_idxs.remove(wp_select) # each waypoint only used once else: - unassigned_problems.append( - problem - ) # if run out of available waypoints, remove problem from selection + unassigned_problems.append(problem) # noqa; if run out of available waypoints, remove problem from selection # remove any problems that couldn't be assigned a waypoint (i.e. if more problems than available waypoints) if unassigned_problems: From f7ac2aa8af4df1b51da6e8602e39acaa04a373b9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:15:00 +0100 Subject: [PATCH 116/191] remove tmp dev step --- src/virtualship/instruments/base.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 894979dd..5a0c4e84 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -142,22 +142,15 @@ def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" instrument_name = self.__class__.__name__.split("Instrument")[0] - TMP = True - - if TMP: - if not self.verbose_progress: - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: - self.simulate(measurements, out_path) - spinner.ok("✅\n") - - else: - print(f"Simulating {instrument_name} measurements... ") + if not self.verbose_progress: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: self.simulate(measurements, out_path) - print("\n") + spinner.ok("✅\n") + else: print(f"Simulating {instrument_name} measurements... ") self.simulate(measurements, out_path) From 60a58b440925fcc07f8305532f9e1ff34bfb51db Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 31 Aug 2026 17:20:03 +0100 Subject: [PATCH 117/191] move _get_example_expedition back to utils --- src/virtualship/cli/_initialise.py | 15 +-------------- src/virtualship/utils.py | 13 +++++++++++++ tests/cli/test_initialise.py | 14 ++++++++++++++ tests/cli/test_plan.py | 8 ++++---- tests/cli/test_run.py | 4 ++-- tests/expedition/test_expedition.py | 4 ++-- tests/test_checkpoint.py | 4 ++-- tests/test_utils.py | 16 ++-------------- 8 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 tests/cli/test_initialise.py diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py index 41145c8f..29eec331 100644 --- a/src/virtualship/cli/_initialise.py +++ b/src/virtualship/cli/_initialise.py @@ -2,8 +2,6 @@ import re import warnings from datetime import timedelta -from functools import lru_cache -from importlib.resources import files from pathlib import Path import click @@ -18,7 +16,7 @@ Schedule, Waypoint, ) -from virtualship.utils import EXPEDITION +from virtualship.utils import EXPEDITION, _get_example_expedition ERR_SUPPLEMENT = "If the MFP export format has changed, please submit an issue at: https://github.com/Parcels-code/virtualship/issues." @@ -244,17 +242,6 @@ def _mfp_string_to_timedelta(value: str | None) -> timedelta | None: ) -def _load_static_file(name: str) -> str: - """Load static file from the ``virtualship.static`` module by file name.""" - return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") - - -@lru_cache(maxsize=1) -def _get_example_expedition() -> str: - """Get the example unified expedition configuration file.""" - return _load_static_file(EXPEDITION) - - def _validate_start_date(ctx, param, value): """Callback to enforce and validate --start-date when --from-mfp is used.""" if ctx.params.get("from_mfp"): diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 9441defd..d1b13715 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -4,6 +4,8 @@ import hashlib import re from datetime import datetime, timedelta +from functools import lru_cache +from importlib.resources import files from pathlib import Path from typing import TYPE_CHECKING, Literal, TextIO @@ -152,6 +154,17 @@ def decorator(cls): # ===================================================== +def _load_static_file(name: str) -> str: + """Load static file from the ``virtualship.static`` module by file name.""" + return files("virtualship.static").joinpath(name).read_text(encoding="utf-8") + + +@lru_cache(None) +def _get_example_expedition() -> str: + """Get the example unified expedition configuration file.""" + return _load_static_file(EXPEDITION) + + def _dump_yaml(model: BaseModel, stream: TextIO) -> str | None: """Dump a pydantic model to a yaml string.""" return yaml.safe_dump( diff --git a/tests/cli/test_initialise.py b/tests/cli/test_initialise.py new file mode 100644 index 00000000..a01c2886 --- /dev/null +++ b/tests/cli/test_initialise.py @@ -0,0 +1,14 @@ +from virtualship.models.expedition import Expedition +from virtualship.utils import _get_example_expedition + + +def test_get_example_expedition(): + assert len(_get_example_expedition()) > 0 + + +def test_valid_example_expedition(tmp_path): + path = tmp_path / "test.yaml" + with open(path, "w") as file: + file.write(_get_example_expedition()) + + Expedition.from_yaml(path) diff --git a/tests/cli/test_plan.py b/tests/cli/test_plan.py index 29459223..ec994ae6 100644 --- a/tests/cli/test_plan.py +++ b/tests/cli/test_plan.py @@ -17,7 +17,7 @@ SensorConfig, Waypoint, ) -from virtualship.utils import EXPEDITION, get_example_expedition +from virtualship.utils import EXPEDITION, _get_example_expedition NEW_SPEED = "8.0" NEW_LAT = "0.015" @@ -32,9 +32,9 @@ def _make_expedition( """Write a minimal expedition YAML.""" if instruments_config is None: instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(get_example_expedition()).get("instruments_config") + yaml.safe_load(_get_example_expedition()).get("instruments_config") ) - ship_config = yaml.safe_load(get_example_expedition()).get("ship_config") + ship_config = yaml.safe_load(_get_example_expedition()).get("ship_config") Expedition( schedule=Schedule(waypoints=waypoints), instruments_config=instruments_config, @@ -346,7 +346,7 @@ async def test_sensor_initial_state_reflects_config(tmp_path): sensors=[SensorConfig(sensor_type=SensorType.TEMPERATURE)], ) instruments_config = InstrumentsConfig.model_validate( - yaml.safe_load(get_example_expedition()).get("instruments_config") + yaml.safe_load(_get_example_expedition()).get("instruments_config") ) instruments_config.ctd_config = ctd_config _make_expedition( diff --git a/tests/cli/test_run.py b/tests/cli/test_run.py index b537e405..e0daeb82 100644 --- a/tests/cli/test_run.py +++ b/tests/cli/test_run.py @@ -8,7 +8,7 @@ ScheduleOk, ) from virtualship.instruments.types import InstrumentType -from virtualship.utils import EXPEDITION, EXPEDITION_IDENTIFIER, get_example_expedition +from virtualship.utils import EXPEDITION, EXPEDITION_IDENTIFIER, _get_example_expedition def _simulate_schedule(projection, expedition): @@ -39,7 +39,7 @@ def test_run(tmp_path, monkeypatch): expedition_dir = tmp_path / "expedition_dir" expedition_dir.mkdir() - (expedition_dir / EXPEDITION).write_text(get_example_expedition()) + (expedition_dir / EXPEDITION).write_text(_get_example_expedition()) monkeypatch.setattr("virtualship.cli._run.simulate_schedule", _simulate_schedule) diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index 406ffbe4..456ab054 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -19,8 +19,8 @@ ) from virtualship.utils import ( EXPEDITION, + _get_example_expedition, _get_expedition, - get_example_expedition, ) projection = pyproj.Geod(ellps="WGS84") @@ -238,7 +238,7 @@ def test_verify_schedule_errors(schedule: Schedule, error, match) -> None: @pytest.fixture def expedition(tmp_file): with open(tmp_file, "w") as file: - file.write(get_example_expedition()) + file.write(_get_example_expedition()) return Expedition.from_yaml(tmp_file) diff --git a/tests/test_checkpoint.py b/tests/test_checkpoint.py index f84693c9..d501b72d 100644 --- a/tests/test_checkpoint.py +++ b/tests/test_checkpoint.py @@ -7,13 +7,13 @@ from virtualship.models.checkpoint import Checkpoint from virtualship.models.expedition import Expedition, Schedule, Waypoint from virtualship.models.location import Location -from virtualship.utils import get_example_expedition +from virtualship.utils import _get_example_expedition @pytest.fixture def expedition(tmp_file): with open(tmp_file, "w") as file: - file.write(get_example_expedition()) + file.write(_get_example_expedition()) return Expedition.from_yaml(tmp_file) diff --git a/tests/test_utils.py b/tests/test_utils.py index 63b5c4e9..4fd45671 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -18,17 +18,17 @@ _calc_wp_stationkeeping_time, _find_nc_file_with_variable, _get_bathy_data, + _get_example_expedition, _select_product_id, _start_end_in_product_timerange, build_particle_class_from_sensors, - get_example_expedition, ) @pytest.fixture def expedition(tmp_file): with open(tmp_file, "w") as file: - file.write(get_example_expedition()) + file.write(_get_example_expedition()) return Expedition.from_yaml(tmp_file) @@ -68,18 +68,6 @@ def fake_open_dataset(*args, **kwargs): yield -def test_get_example_expedition(): - assert len(get_example_expedition()) > 0 - - -def test_valid_example_expedition(tmp_path): - path = tmp_path / "test.yaml" - with open(path, "w") as file: - file.write(get_example_expedition()) - - Expedition.from_yaml(path) - - def test_instrument_registry_updates(dummy_instrument): from virtualship import utils From 7946f7b34332b43d3eed32f35c6c450d9fbf8df9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:49:05 +0100 Subject: [PATCH 118/191] fix datetime handling --- src/virtualship/cli/_initialise.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py index 29eec331..6fea2180 100644 --- a/src/virtualship/cli/_initialise.py +++ b/src/virtualship/cli/_initialise.py @@ -71,9 +71,11 @@ def _mfp_to_yaml(file_path: Path, start_date: str, output_path: Path): """Generates an expedition.yaml file from MFP Excel export.""" mfp_data = _validate_mfp_data(file_path) - # convert start_date string to datetime object if needed + # convert start_date string to datetime object if needed, ensuring it's standard Python datetime if isinstance(start_date, str): - current_time = pd.to_datetime(start_date) + current_time = pd.to_datetime(start_date).to_pydatetime() + elif isinstance(start_date, pd.Timestamp): + current_time = start_date.to_pydatetime() else: current_time = start_date @@ -89,13 +91,18 @@ def _mfp_to_yaml(file_path: Path, start_date: str, output_path: Path): lon = None if pd.isna(row["Longitude"]) else float(row["Longitude"]) loc = Location(latitude=lat, longitude=lon) + # Ensure timestamp passed is a native python datetime (or string) to prevent PyYAML pandas pickle tags + time_val = ( + current_time.to_pydatetime() + if isinstance(current_time, pd.Timestamp) + else current_time + ) + if is_port: has_latlon = lat is not None and lon is not None - waypoints.append( - Port(location=loc, time=current_time if has_latlon else None) - ) + waypoints.append(Port(location=loc, time=time_val if has_latlon else None)) else: - waypoints.append(Waypoint(instrument=None, location=loc, time=current_time)) + waypoints.append(Waypoint(instrument=None, location=loc, time=time_val)) previous_timedelta = ( row["Total Time"] if pd.notna(row["Total Time"]) else timedelta(0) From 92c5335823f0d81c5c4a81ebe1e0af8e230f770a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:50:28 +0100 Subject: [PATCH 119/191] move mfp_to_yaml test to test_initialise --- tests/cli/test_initialise.py | 190 ++++++++++++++++++++++++++++++++++- tests/test_mfp_to_yaml.py | 152 ---------------------------- 2 files changed, 189 insertions(+), 153 deletions(-) delete mode 100644 tests/test_mfp_to_yaml.py diff --git a/tests/cli/test_initialise.py b/tests/cli/test_initialise.py index a01c2886..0037c7b6 100644 --- a/tests/cli/test_initialise.py +++ b/tests/cli/test_initialise.py @@ -1,4 +1,8 @@ -from virtualship.models.expedition import Expedition +import pandas as pd +import pytest + +from virtualship.cli._initialise import _mfp_to_yaml +from virtualship.models import Expedition, Port, Waypoint from virtualship.utils import _get_example_expedition @@ -12,3 +16,187 @@ def test_valid_example_expedition(tmp_path): file.write(_get_example_expedition()) Expedition.from_yaml(path) + + +def valid_mfp_data(): + return pd.DataFrame( + { + "Station": [ + "Departure Port", + "Station1", + "Station2", + "Station3", + "Arrival Port", + ], + "Type": ["Departure Port", "CTD", "CTD", "CTD", "Arrival Port"], + "Latitude": [30.8, 31.2, 32.5, 33.1, 34.0], + "Longitude": [-44.3, -45.1, -46.7, -47.2, -48.0], + "Sea Depth": [100, 200, 300, 400, 500], + "Time at Station": [ + "0d 00h 00m", + "0d 01h 00m", + "0d 01h 00m", + "0d 01h 00m", + "0d 00h 00m", + ], + "Travel Time to Next": [ + "0d 05h 00m", + "0d 06h 00m", + "0d 04h 00m", + "0d 03h 00m", + None, + ], + "Distance to Next (NM)": [50, 60, 40, 30, None], + "Ship Speed (kn)": [10, 10, 10, 10, None], + "EEZ": ["EEZ1", "EEZ1", "EEZ2", "EEZ2", "EEZ2"], + } + ) + + +@pytest.fixture +def valid_excel_mfp_file(tmp_path): + path = tmp_path / "file.xlsx" + valid_mfp_data().to_excel(path, index=False) + return path + + +@pytest.fixture +def valid_excel_mfp_file_with_commas(tmp_path): + path = tmp_path / "file.xlsx" + df = valid_mfp_data() + df["Latitude"] = df["Latitude"].astype(str).str.replace(".", ",") + df["Longitude"] = df["Longitude"].astype(str).str.replace(".", ",") + df.to_excel(path, index=False) + return path + + +@pytest.fixture +def invalid_mfp_file(tmp_path): + """File missing required MFP columns.""" + path = tmp_path / "file.xlsx" + df = pd.DataFrame({"WrongColumn": [1, 2, 3]}) + df.to_excel(path, index=False) + return path + + +@pytest.fixture +def unsupported_extension_mfp_file(tmp_path): + path = tmp_path / "file.unsupported" + valid_mfp_data().to_csv(path, index=False) + return path + + +@pytest.fixture +def nonexistent_mfp_file(tmp_path): + return tmp_path / "non_file.xlsx" + + +@pytest.fixture +def missing_columns_mfp_file(tmp_path): + path = tmp_path / "file.xlsx" + valid_mfp_data().drop(columns=["Longitude"]).to_excel(path, index=False) + return path + + +@pytest.fixture +def missing_ports_mfp_file(tmp_path): + path = tmp_path / "file.xlsx" + # remove rows marked as departure or arrival ports + df = valid_mfp_data() + df = df[~df["Station"].str.contains("Port")] + df.to_excel(path, index=False) + return path + + +@pytest.fixture +def unexpected_header_mfp_file(tmp_path): + path = tmp_path / "file.xlsx" + df = valid_mfp_data() + df["Unexpected Column"] = ["Extra1", "Extra2", "Extra3", "Extra4", "Extra5"] + df.to_excel(path, index=False) + return path + + +@pytest.mark.parametrize( + "fixture_name", + ["valid_excel_mfp_file", "valid_excel_mfp_file_with_commas"], +) +def test_mfp_to_yaml_success(request, fixture_name, tmp_path): + """Test that _mfp_to_yaml correctly processes a valid MFP Excel export.""" + valid_mfp_file = request.getfixturevalue(fixture_name) + yaml_output_path = tmp_path / "expedition.yaml" + start_date = "2023-10-20 01:00:00" + + _mfp_to_yaml(valid_mfp_file, start_date, yaml_output_path) + + # Ensure the YAML file was written + assert yaml_output_path.exists() + + # Load YAML and validate contents + data = Expedition.from_yaml(yaml_output_path) + + # 3 waypoints + 2 ports (departure & arrival) + assert len(data.schedule.waypoints) == 5 + assert isinstance(data.schedule.waypoints[0], Port) + assert isinstance(data.schedule.waypoints[-1], Port) + assert isinstance(data.schedule.waypoints[1], Waypoint) + + +@pytest.mark.parametrize( + "fixture_name,error,match", + [ + pytest.param( + "nonexistent_mfp_file", + FileNotFoundError, + r"File not found:", + id="FileNotFound", + ), + pytest.param( + "unsupported_extension_mfp_file", + RuntimeError, + "Could not read coordinates data from the provided file. Ensure it is an exported .xlsx file from MFP.", + id="UnsupportedExtension", + ), + pytest.param( + "invalid_mfp_file", + ValueError, + r"Error: Found columns .* but expected columns .*", + id="InvalidFile", + ), + pytest.param( + "missing_columns_mfp_file", + ValueError, + r"Error: Found columns .* but expected columns .*", + id="MissingColumns", + ), + ], +) +def test_mfp_to_yaml_exceptions(request, fixture_name, error, match, tmp_path): + """Test that _mfp_to_yaml raises an error when input file is not valid.""" + fixture = request.getfixturevalue(fixture_name) + yaml_output_path = tmp_path / "expedition.yaml" + start_date = "1998-05-01 01:00:00" + + with pytest.raises(error, match=match): + _mfp_to_yaml(fixture, start_date, yaml_output_path) + + +def test_mfp_to_yaml_extra_headers(unexpected_header_mfp_file, tmp_path): + """Test that _mfp_to_yaml prints a warning when extra columns are found.""" + yaml_output_path = tmp_path / "expedition.yaml" + start_date = "1998-05-01 01:00:00" + + with pytest.warns(UserWarning, match="Found additional unexpected columns.*"): + _mfp_to_yaml(unexpected_header_mfp_file, start_date, yaml_output_path) + + +def test_mfp_to_yaml_missing_ports_warning(missing_ports_mfp_file, tmp_path): + """Test that _mfp_to_yaml warns when departure or arrival ports are missing.""" + yaml_output_path = tmp_path / "expedition.yaml" + start_date = "1998-05-01 01:00:00" + + with pytest.warns( + UserWarning, + match="The MFP export is missing either a 'Departure Port' or 'Arrival Port'", + ): + _mfp_to_yaml(missing_ports_mfp_file, start_date, yaml_output_path) diff --git a/tests/test_mfp_to_yaml.py b/tests/test_mfp_to_yaml.py deleted file mode 100644 index 4eab16c2..00000000 --- a/tests/test_mfp_to_yaml.py +++ /dev/null @@ -1,152 +0,0 @@ -import os - -import pandas as pd -import pytest - -from virtualship.models import Expedition -from virtualship.utils import mfp_to_yaml - - -def valid_mfp_data(): - return pd.DataFrame( - { - "Station Type": ["A", "B", "C"], - "Name": ["Station1", "Station2", "Station3"], - "Latitude": [30.8, 31.2, 32.5], - "Longitude": [-44.3, -45.1, -46.7], - } - ) - - -# Fixture for Excel file -@pytest.fixture -def valid_excel_mfp_file(tmp_path): - path = tmp_path / "file.xlsx" - valid_mfp_data().to_excel(path, index=False) - return path - - -# Fixture for CSV file -@pytest.fixture -def valid_csv_mfp_file(tmp_path): - path = tmp_path / "file.csv" - valid_mfp_data().to_csv(path, index=False) - return path - - -@pytest.fixture -def valid_csv_mfp_file_with_commas(tmp_path): - path = tmp_path / "file.csv" - valid_mfp_data().to_csv(path, decimal=",", index=False) - return path - - -@pytest.fixture -def invalid_mfp_file(tmp_path): - path = tmp_path / "file.csv" - valid_mfp_data().to_csv(path, decimal=",", sep="|", index=False) - - return path - - -@pytest.fixture -def unsupported_extension_mfp_file(tmp_path): - path = tmp_path / "file.unsupported" - valid_mfp_data().to_csv(path, index=False) - - return path - - -@pytest.fixture -def nonexistent_mfp_file(tmp_path): - path = tmp_path / "non_file.csv" - - return path - - -@pytest.fixture -def missing_columns_mfp_file(tmp_path): - path = tmp_path / "file.xlsx" - valid_mfp_data().drop(columns=["Longitude"]).to_excel(path, index=False) - return path - - -@pytest.fixture -def unexpected_header_mfp_file(tmp_path): - path = tmp_path / "file.xlsx" - df = valid_mfp_data() - df["Unexpected Column"] = ["Extra1", "Extra2", "Extra3"] - df.to_excel(path, index=False) - yield path - - -@pytest.mark.parametrize( - "fixture_name", - ["valid_excel_mfp_file", "valid_csv_mfp_file", "valid_csv_mfp_file_with_commas"], -) -def test_mfp_to_yaml_success(request, fixture_name, tmp_path): - """Test that mfp_to_yaml correctly processes a valid MFP file.""" - valid_mfp_file = request.getfixturevalue(fixture_name) - - yaml_output_path = tmp_path / "expedition.yaml" - - # Run function (No need to mock open() for YAML, real file is created) - mfp_to_yaml(valid_mfp_file, yaml_output_path) - - # Ensure the YAML file was written - assert yaml_output_path.exists() - - # Load YAML and validate contents - data = Expedition.from_yaml(yaml_output_path) - - assert len(data.schedule.waypoints) == 3 - - -@pytest.mark.parametrize( - "fixture_name,error,match", - [ - pytest.param( - "nonexistent_mfp_file", - FileNotFoundError, - os.path.basename("/non_file.csv"), - id="FileNotFound", - ), - pytest.param( - "unsupported_extension_mfp_file", - RuntimeError, - "Could not read coordinates data from the provided file. Ensure it is either a csv or excel file.", - id="UnsupportedExtension", - ), - pytest.param( - "invalid_mfp_file", - ValueError, - r"Error: Found columns \['Station Type\|Name\|Latitude\|Longitude'\], but expected columns \[.*('Station Type'|'Longitude'|'Latitude'|'Name').*\]. Are you sure that you're using the correct export from MFP\?", - id="InvalidFile", - ), - pytest.param( - "missing_columns_mfp_file", - ValueError, - ( - r"Error: Found columns \[.*?('Station Type'| 'Name'| 'Latitude').*?\], " - r"but expected columns \[.*?('Station Type'| 'Name'| 'Latitude'| 'Longitude').*?\]." - ), - id="MissingColumns", - ), - ], -) -def test_mfp_to_yaml_exceptions(request, fixture_name, error, match, tmp_path): - """Test that mfp_to_yaml raises an error when input file is not valid.""" - fixture = request.getfixturevalue(fixture_name) - - yaml_output_path = tmp_path / "expedition.yaml" - - with pytest.raises(error, match=match): - mfp_to_yaml(fixture, yaml_output_path) - - -def test_mfp_to_yaml_extra_headers(unexpected_header_mfp_file, tmp_path): - """Test that mfp_to_yaml prints a warning when extra columns are found.""" - yaml_output_path = tmp_path / "expedition.yaml" - - with pytest.warns(UserWarning, match="Found additional unexpected columns.*"): - mfp_to_yaml(unexpected_header_mfp_file, yaml_output_path) From a7b55e2796222169a655f25915d443a1245b16ac Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:03:21 +0100 Subject: [PATCH 120/191] fix bug: UV vector field remains even after adding bathymetry --- src/virtualship/instruments/base.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 5a0c4e84..8cdf8c04 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -127,6 +127,19 @@ def load_input_data(self) -> parcels.FieldSet: bathymetry_fs = _get_bathy_data(from_data=self.from_data) fieldset = fieldset + bathymetry_fs + # some instruments use AdvectionRKn kernels which require a combined UV vector field + # fieldsets are created per variable (in _generate_fieldset) and thus are not seen by from_sgrid_conventions at that time + if hasattr(fieldset, "U") and hasattr(fieldset, "V"): + uv = parcels.VectorField( + "UV", + fieldset.U, + fieldset.V, + interp_method=parcels.interpolators.XLinear_Velocity(), + ) + # add vector field to internal fieldset dictionary and attach as attribute + fieldset.fields["UV"] = uv + fieldset.UV = uv + return fieldset @abc.abstractmethod @@ -217,19 +230,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: for fs in fieldsets_list[1:]: combined_fieldset = combined_fieldset + fs - # some instruments use AdvectionRKn kernels which require a combined UV vector field - # fieldsets are created per variable and thus are not seen by from_sgrid_conventions at the same time - if "U" in keys and "V" in keys: - uv = parcels.VectorField( - "UV", - combined_fieldset.U, - combined_fieldset.V, - interp_method=parcels.interpolators.XLinear_Velocity(), - ) - # add vector field to internal fieldset dictionary and attach as attribute - combined_fieldset.fields["UV"] = uv - combined_fieldset.UV = uv - return combined_fieldset def _get_copernicus_ds( From 8bfe86beea3e5121fc2262fa520b4aad6ccbc783 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 09:37:18 +0100 Subject: [PATCH 121/191] fix: high RAM spikes with argo fieldsets --- src/virtualship/instruments/base.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 8cdf8c04..da8f01a9 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -90,6 +90,7 @@ def __init__( self.allow_time_extrapolation = allow_time_extrapolation self.verbose_progress = verbose_progress self.fetch_spec = fetch_spec or FetchSpec() + self._tmp_dir = tempfile.TemporaryDirectory() wp_lats, wp_lons = _get_waypoint_latlons(expedition.schedule.waypoints) wp_times = [ @@ -177,6 +178,9 @@ def _generate_fieldset(self) -> parcels.FieldSet: Includes an intermediate step of writing to tmp files, as per https://github.com/Parcels-code/parcels-benchmarks/pull/49 TODO: the need for this step may be removed as Parcels x copernicusmarine integration improves, tracked in https://github.com/Parcels-code/Parcels/issues/2756 and xref'd in VirtualShip #357 (https://github.com/Parcels-code/virtualship/issues/357) + + # TODO: N.B. adding (+) fields to fieldsets might not be intended behaviour for using Parcels (?) + #! However, at present it's still needed to build the fieldset one-by-one to avoid large file dumps/memory when using tmp files and streaming data """ fieldsets_list = [] keys = list(self.variables.keys()) @@ -318,18 +322,15 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: return ds - @staticmethod - def _via_tmp_ds(ds: xr.Dataset) -> xr.Dataset: - """Create and re-load a temporary local dataset.""" + def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: + """Create and re-load a temporary local dataset without loading everything into RAM.""" encoding = get_clean_encoding(ds) + tmp_fpath = Path(self._tmp_dir.name) / f"tmp_{id(ds)}.nc" - with tempfile.TemporaryDirectory() as tmpdir: - tmp_fpath = Path(tmpdir) / "tmp.nc" - ds.to_netcdf(tmp_fpath, encoding=encoding) + ds.to_netcdf(tmp_fpath, encoding=encoding, engine="netcdf4") + loaded_ds = xr.open_dataset(tmp_fpath) - # context manage to ensure file closure - with xr.open_dataset(tmp_fpath) as loaded_ds: - return loaded_ds.load() + return loaded_ds @staticmethod def _sample_initial( From 0df9d996dd3b9006fb7c3032999b8007a11ce528 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:36:16 +0100 Subject: [PATCH 122/191] move to using context manager protocol for instrument simulations, enable tmp ds writing without heavy RAM spikes --- src/virtualship/cli/_run.py | 20 +++--- src/virtualship/instruments/base.py | 37 +++++++++- tests/instruments/test_base.py | 107 ++++++++++++++++++++-------- 3 files changed, 122 insertions(+), 42 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 6969d32f..61e629ce 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -191,19 +191,17 @@ def _run( attr = MeasurementsToSimulate.get_attr_for_instrumenttype(itype) measurements = getattr(schedule_results.measurements_to_simulate, attr) - # initialise instrument - instrument = instrument_class( + # initialise instrument, execute simulation within context manager + with instrument_class( expedition=expedition, from_data=Path(from_data) if from_data is not None else None, - ) - - # execute simulation - instrument.execute( - measurements=measurements, - out_path=expedition_dir.joinpath( - RESULTS, f"{itype.name.lower()}.parquet" - ), - ) + ) as instrument: + instrument.execute( + measurements=measurements, + out_path=expedition_dir.joinpath( + RESULTS, f"{itype.name.lower()}.parquet" + ), + ) except Exception as e: # clean up if unexpected error occurs if os.path.exists(problems_dir): diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index da8f01a9..55ff7252 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -90,7 +90,7 @@ def __init__( self.allow_time_extrapolation = allow_time_extrapolation self.verbose_progress = verbose_progress self.fetch_spec = fetch_spec or FetchSpec() - self._tmp_dir = tempfile.TemporaryDirectory() + self._tmp_dirs: list[tempfile.TemporaryDirectory] = [] wp_lats, wp_lons = _get_waypoint_latlons(expedition.schedule.waypoints) wp_times = [ @@ -108,6 +108,33 @@ def __init__( self.min_lat, self.max_lat = min(wp_lats), max(wp_lats) self.min_lon, self.max_lon = min(wp_lons), max(wp_lons) + def close(self): + """Explicitly cleanup all tmp dirs/resources.""" + tmp_dirs = getattr(self, "_tmp_dirs", None) + if not tmp_dirs: + return + for tmp_dir in tmp_dirs: + try: + tmp_dir.cleanup() + except Exception: + pass # i.e. best effort clean up + self._tmp_dirs = [] + + def __del__(self): + """Safety net: ensure temporary directories are cleaned up even if close()/context manager usage was skipped.""" + try: + self.close() + except Exception: + pass + + def __enter__(self): + """Enter the context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exit context manager, ensuring resource cleanup.""" + self.close() + def load_input_data(self) -> parcels.FieldSet: """Load and return the input data as a FieldSet for the instrument.""" try: @@ -323,9 +350,13 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: return ds def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: - """Create and re-load a temporary local dataset without loading everything into RAM.""" + """Create and re-load a temporary local dataset (without heavy RAM spikes).""" encoding = get_clean_encoding(ds) - tmp_fpath = Path(self._tmp_dir.name) / f"tmp_{id(ds)}.nc" + + tmp_dir = tempfile.TemporaryDirectory() + self._tmp_dirs.append(tmp_dir) + + tmp_fpath = Path(tmp_dir.name) / f"tmp_{id(ds)}.nc" ds.to_netcdf(tmp_fpath, encoding=encoding, engine="netcdf4") loaded_ds = xr.open_dataset(tmp_fpath) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index db6b6e7f..b1b83772 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -117,6 +117,10 @@ def test_load_input_data(): mock_fieldset = MagicMock() mock_fieldset.to_windowed_arrays.return_value = mock_fieldset + shared_interval = MagicMock() + mock_fieldset.U = MagicMock(time_interval=shared_interval) + mock_fieldset.V = MagicMock(time_interval=shared_interval) + with ( patch( "virtualship.instruments.base._select_product_id", @@ -180,17 +184,59 @@ def test_fetch_spec_applied_to_instrument(): def test_via_tmp_ds_roundtrip(): """_via_tmp_ds writes to a tmp file and re-opens it.""" - ds = xr.Dataset( - {"temperature": (["x", "y"], [[1.0, 2.0], [3.0, 4.0]])}, - coords={"x": [0, 1], "y": [10, 20]}, - ) - result = Instrument._via_tmp_ds(ds) + mock_waypoint = MagicMock() + mock_waypoint.location.latitude = 1.0 + mock_waypoint.location.longitude = 2.0 - assert isinstance(result, xr.Dataset) - assert "temperature" in result - assert ( - result is not ds - ) # result is new object loaded from tmp file, not the original + with DummyInstrument( + expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + variables={"A": "a"}, + add_bathymetry=False, + allow_time_extrapolation=False, + verbose_progress=False, + from_data=None, + ) as dummy: + ds = xr.Dataset( + {"temperature": (["x", "y"], [[1.0, 2.0], [3.0, 4.0]])}, + coords={"x": [0, 1], "y": [10, 20]}, + ) + result = dummy._via_tmp_ds(ds) + + assert isinstance(result, xr.Dataset) + assert "temperature" in result + assert ( + result is not ds + ) # result is new object loaded from tmp file, not the original + + result.close() + ds.close() + + +def test_instrument_context_manager(): + """Test that context manager cleans up temporary directories upon exit.""" + mock_waypoint = MagicMock() + mock_waypoint.location.latitude = 1.0 + mock_waypoint.location.longitude = 2.0 + + with DummyInstrument( + expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + variables={"A": "a"}, + add_bathymetry=False, + allow_time_extrapolation=False, + verbose_progress=False, + from_data=None, + ) as dummy: + ds = xr.Dataset( + {"temperature": (["x", "y"], [[1.0, 2.0], [3.0, 4.0]])}, + coords={"x": [0, 1], "y": [10, 20]}, + ) + result = dummy._via_tmp_ds(ds) + assert len(dummy._tmp_dirs) == 1 + result.close() + ds.close() + + # outside 'with' block, tmp dirs should be cleared + assert len(dummy._tmp_dirs) == 0 def test_generate_fieldset_combines_fields(): @@ -393,25 +439,27 @@ def test_to_parquet_writes_valid_file( assert out_path.exists() # verify parquet table, metadata, and columns - table = pq.read_table(out_path) - schema = table.schema - - assert table.column_names == [ - "t", - "z", - "y", - "x", - "particle_id", - "temp", - "sal", - ] - assert schema.metadata[b"feature_type"] == b"trajectory" - assert b"units" in schema.field("t").metadata + with pq.ParquetFile(out_path) as pf: + table = pf.read() + schema = table.schema + + assert table.column_names == [ + "t", + "z", + "y", + "x", + "particle_id", + "temp", + "sal", + ] + assert schema.metadata[b"feature_type"] == b"trajectory" + assert b"units" in schema.field("t").metadata - np.testing.assert_array_equal( - table["x"].to_numpy(), np.array(sample_underway_coords.lons, dtype=np.float32) - ) - np.testing.assert_array_equal(table["temp"].to_numpy(), dat_arrays[0]) + np.testing.assert_array_equal( + table["x"].to_numpy(), + np.array(sample_underway_coords.lons, dtype=np.float32), + ) + np.testing.assert_array_equal(table["temp"].to_numpy(), dat_arrays[0]) def _create_underway_parquet( @@ -478,6 +526,9 @@ def test_underway_schema_matches_parcels(tmp_path, pset): dt=np.timedelta64(60, "m"), output_file=parcels_output, ) + if hasattr(parcels_output, "close"): + parcels_output.close() + parcels_df = parcels.read_particlefile(parcels_path) # UnderwayInstrument output From 7f31c9c3d392712922336a04ad4707b3a4048ce6 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 11:54:42 +0100 Subject: [PATCH 123/191] additional optimisation: ignore waypoints irrelevant to instrument type --- src/virtualship/instruments/base.py | 14 +++++++++----- src/virtualship/utils.py | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 55ff7252..fc684322 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -26,6 +26,7 @@ _find_files_in_timerange, _find_nc_file_with_variable, _get_bathy_data, + _get_instrument_relevant_waypoints, _get_waypoint_latlons, _select_product_id, get_clean_encoding, @@ -92,10 +93,13 @@ def __init__( self.fetch_spec = fetch_spec or FetchSpec() self._tmp_dirs: list[tempfile.TemporaryDirectory] = [] - wp_lats, wp_lons = _get_waypoint_latlons(expedition.schedule.waypoints) - wp_times = [ - wp.time for wp in expedition.schedule.waypoints if wp.time is not None - ] + # only waypoints relevant to this instrument; avoid needlessly ballooning fieldset to full expedition schedule + relevant_waypoints = _get_instrument_relevant_waypoints( + expedition.schedule.waypoints, self.instrument_type + ) + + wp_lats, wp_lons = _get_waypoint_latlons(relevant_waypoints) + wp_times = [wp.time for wp in relevant_waypoints if wp.time is not None] assert all(earlier <= later for earlier, later in pairwise(wp_times)), ( "Waypoint times are not in ascending order" ) @@ -350,7 +354,7 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: return ds def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: - """Create and re-load a temporary local dataset (without heavy RAM spikes).""" + """Create and re-load a temporary local dataset (without loading everything into RAM).""" encoding = get_clean_encoding(ds) tmp_dir = tempfile.TemporaryDirectory() diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 30f3dffc..4a847732 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -591,6 +591,24 @@ def _get_waypoint_latlons(waypoints): return wp_lats, wp_lons +def _get_instrument_relevant_waypoints(waypoints, instrument_type) -> list: + """Subset of waypoints that are relevant to this `instrument_type`.""" + if instrument_type.is_underway: + return list(waypoints) + + relevant = [] + for wp in waypoints: + wp_instruments = ( + wp.instrument + if isinstance(wp.instrument, list) + else ([wp.instrument] if wp.instrument else []) + ) + if instrument_type in wp_instruments: + relevant.append(wp) + + return relevant or list(waypoints) + + def _save_checkpoint(checkpoint: Checkpoint, expedition_dir: Path) -> None: file_path = expedition_dir.joinpath(CHECKPOINT) checkpoint.to_yaml(file_path) From 02669077b8fcf09aa7502822cf8fa9c4d5b456ec Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 12:18:09 +0100 Subject: [PATCH 124/191] further improve performance by writing to tmp zarr store --- src/virtualship/instruments/base.py | 25 ++++++++++++++++++------- src/virtualship/utils.py | 14 -------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index fc684322..295e2bc9 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -29,7 +29,6 @@ _get_instrument_relevant_waypoints, _get_waypoint_latlons, _select_product_id, - get_clean_encoding, ship_spinner, ) @@ -354,16 +353,28 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: return ds def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: - """Create and re-load a temporary local dataset (without loading everything into RAM).""" - encoding = get_clean_encoding(ds) - + """Create and re-load a temporary local dataset without loading everything into RAM, using local Zarr store for improved performance and concurrent chunk writing.""" tmp_dir = tempfile.TemporaryDirectory() self._tmp_dirs.append(tmp_dir) - tmp_fpath = Path(tmp_dir.name) / f"tmp_{id(ds)}.nc" + tmp_store = Path(tmp_dir.name) / f"tmp_{id(ds)}.zarr" + + # strip pre-existing per-variable encoding, which may interfere with zarr defaults + ds_to_write = ds.copy() + for variable in ds_to_write.variables.values(): + variable.encoding = {} + + ds_to_write.to_zarr( + tmp_store, + mode="w", + consolidated=False, + safe_chunks=False, + write_empty_chunks=False, + ) - ds.to_netcdf(tmp_fpath, encoding=encoding, engine="netcdf4") - loaded_ds = xr.open_dataset(tmp_fpath) + loaded_ds = xr.open_zarr( + tmp_store, chunks=None, consolidated=False + ) # chunks=None to avoid Dask backed return loaded_ds diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 4a847732..d3703117 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -691,20 +691,6 @@ def build_particle_class_from_sensors( return Particle.add_variable(nonsensor_variables + sensor_variables) -def get_clean_encoding(ds): - """ - Clean existing encodings and supply explicit native endianness to prevent netCDF4 UserWarnings. - - Helps avoid annoying user warnings when writing tmp files to disk. - """ - encoding = {} - for var_name, var in ds.variables.items(): - var.encoding.pop("endian", None) - encoding[var_name] = {"endian": "native"} - - return encoding - - # ===================================================== # SECTION: misc. # ===================================================== From 4fe2a8ddd92ea53444a683fbe6b6b82d33bf79b7 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 19:57:50 +0100 Subject: [PATCH 125/191] further optimisation --- src/virtualship/instruments/argo_float.py | 11 ++++++++--- src/virtualship/instruments/base.py | 7 ++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 66e7ca3d..47ece7fa 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -255,7 +255,7 @@ def __init__(self, expedition, from_data): **sensor_variables, } # advection variables (U and V) are always required for argo float simulation; sensor variables come from config fetch_spec = FetchSpec( - latlon_buffer=3.0, # [degrees] + latlon_buffer=12.5, # [degrees] time_buffer=expedition.instruments_config.argo_float_config.lifetime.total_seconds() / (24 * 3600), # [days] ) @@ -272,7 +272,7 @@ def __init__(self, expedition, from_data): def simulate(self, measurements, out_path) -> None: """Simulate Argo float measurements.""" - DT = 10.0 # dt of Argo float simulation integrator + DT = 60.0 * 5 # dt of Argo float simulation integrator [seconds] OUTPUT_DT = timedelta(minutes=5) if len(measurements) == 0: @@ -307,7 +307,12 @@ def simulate(self, measurements, out_path) -> None: ) # in case fieldset depth is smaller than the config min_depth, possible when min_depth config is 0 and fieldset surface is ~ -0.4... - grid_shallowest = fieldset.U.grid.depth[-1] + grid_depths = fieldset.U.grid.depth + if len(grid_depths) > 1: + _grid_edge_margin = 1e-3 * abs(grid_depths[-1] - grid_depths[-2]) + else: + _grid_edge_margin = 0.0 + grid_shallowest = grid_depths[-1] - _grid_edge_margin # define parcel particles argo_float_particleset = ParticleSet( diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 295e2bc9..6c5b8718 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -356,7 +356,6 @@ def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: """Create and re-load a temporary local dataset without loading everything into RAM, using local Zarr store for improved performance and concurrent chunk writing.""" tmp_dir = tempfile.TemporaryDirectory() self._tmp_dirs.append(tmp_dir) - tmp_store = Path(tmp_dir.name) / f"tmp_{id(ds)}.zarr" # strip pre-existing per-variable encoding, which may interfere with zarr defaults @@ -364,12 +363,14 @@ def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: for variable in ds_to_write.variables.values(): variable.encoding = {} + ds_to_write = ds_to_write.chunk( + {dim: size for dim, size in ds_to_write.sizes.items()} + ) + ds_to_write.to_zarr( tmp_store, mode="w", consolidated=False, - safe_chunks=False, - write_empty_chunks=False, ) loaded_ds = xr.open_zarr( From 11e930bb5190ce94e1e4d6bc994d80631728df0e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 20:41:02 +0100 Subject: [PATCH 126/191] improved spinner handling: use spinner before progress bar appears --- src/virtualship/instruments/base.py | 47 ++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 6c5b8718..a6e52f2a 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -3,6 +3,7 @@ import abc import collections import inspect +import sys import tempfile from dataclasses import dataclass from datetime import timedelta @@ -179,6 +180,7 @@ def simulate( data_dir: Path, measurements: list, out_path: str | Path, + spinner: yaspin.core.Yaspin | None = None, ) -> None: """Simulate instrument measurements.""" @@ -186,20 +188,25 @@ def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" instrument_name = self.__class__.__name__.split("Instrument")[0] - if not self.verbose_progress: - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: + if self.verbose_progress: + stdout_wrapper = _SpinnerStop(sys.stdout, spinner) + original_stdout = sys.stdout + sys.stdout = stdout_wrapper + try: + self.simulate(measurements, out_path) + finally: + sys.stdout = original_stdout + spinner.stop() + print("\n") + else: self.simulate(measurements, out_path) spinner.ok("✅\n") - else: - print(f"Simulating {instrument_name} measurements... ") - self.simulate(measurements, out_path) - print("\n") - def _generate_fieldset(self) -> parcels.FieldSet: """ Create and combine FieldSets for each variable, supporting both local and Copernicus Marine data sources. @@ -423,6 +430,24 @@ def spatial_bounds( ) +class _SpinnerStop: + """Stops yaspin spinner when there's a print (e.g. Parcels progress bar).""" + + def __init__(self, original_stream, spinner): + self._stream = original_stream + self._spinner = spinner + self._stopped = False + + def write(self, s: str): + if s and not self._stopped: + self._stopped = True + self._spinner.stop() + return self._stream.write(s) + + def flush(self): + return self._stream.flush() + + @dataclass(frozen=True) class UnderwayCoordinates: """1D sampling location arrays for underway instruments.""" From a36bd8402bf62985c69bc0910d95062b44d38ad4 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:27:27 +0100 Subject: [PATCH 127/191] refactor spinner handling: move to utils, restore progress bar formatting and "simulating" print --- src/virtualship/instruments/base.py | 28 ++--------------- src/virtualship/utils.py | 48 +++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index a6e52f2a..0d27e385 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -3,7 +3,6 @@ import abc import collections import inspect -import sys import tempfile from dataclasses import dataclass from datetime import timedelta @@ -30,6 +29,7 @@ _get_instrument_relevant_waypoints, _get_waypoint_latlons, _select_product_id, + _SpinnerAutoStop, ship_spinner, ) @@ -194,14 +194,8 @@ def execute(self, measurements: list, out_path: str | Path) -> None: spinner=ship_spinner, ) as spinner: if self.verbose_progress: - stdout_wrapper = _SpinnerStop(sys.stdout, spinner) - original_stdout = sys.stdout - sys.stdout = stdout_wrapper - try: + with _SpinnerAutoStop(spinner): self.simulate(measurements, out_path) - finally: - sys.stdout = original_stdout - spinner.stop() print("\n") else: self.simulate(measurements, out_path) @@ -430,24 +424,6 @@ def spatial_bounds( ) -class _SpinnerStop: - """Stops yaspin spinner when there's a print (e.g. Parcels progress bar).""" - - def __init__(self, original_stream, spinner): - self._stream = original_stream - self._spinner = spinner - self._stopped = False - - def write(self, s: str): - if s and not self._stopped: - self._stopped = True - self._spinner.stop() - return self._stream.write(s) - - def flush(self): - return self._stream.flush() - - @dataclass(frozen=True) class UnderwayCoordinates: """1D sampling location arrays for underway instruments.""" diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index d3703117..cd497657 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -4,6 +4,7 @@ import hashlib import os import re +import sys import warnings from datetime import datetime, timedelta from functools import lru_cache @@ -712,3 +713,50 @@ def build_particle_class_from_sensors( "🚢 ", ], ) + + +class _SpinnerAutoStop: + """Wrapper and context manager that stops a yaspin spinner on first print (e.g., Parcels progress bar).""" + + def __init__(self, spinner): + self._spinner = spinner + self._original_stdout = None + self._stopped = False + + def __enter__(self): + self._original_stdout = sys.stdout + sys.stdout = self + return self + + def __exit__(self, _exc_type, _exc_val, _exc_tb): + sys.stdout = self._original_stdout + self._stop_spinner() + + def _stop_spinner(self): + if not self._stopped: + self._stopped = True + if self._spinner and self._original_stdout: + self._spinner.stop() + # persist the spinner text to the original stdout (before starting progress bar output) + self._original_stdout.write(f"{self._spinner.text}\n") + self._original_stdout.flush() + + def write(self, s: str): + if s and not self._stopped: + self._stop_spinner() + return self._original_stdout.write(s) + + def flush(self): + return self._original_stdout.flush() + + def isatty(self) -> bool: + """Restore unicode block rendering (█████ instead of ###) in parcels progress bar.""" + return getattr(self._original_stdout, "isatty", lambda: False)() + + def fileno(self) -> int: + """Restore full terminal width detection for parcels progress bar sizing.""" + return self._original_stdout.fileno() + + @property + def encoding(self) -> str: + return getattr(self._original_stdout, "encoding", "utf-8") From c43e86a4c669ea996ca633d6a0a3df7d0118c611 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:32:26 +0100 Subject: [PATCH 128/191] add context management to dummyinstrument --- tests/cli/test_run.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/cli/test_run.py b/tests/cli/test_run.py index b537e405..0b697861 100644 --- a/tests/cli/test_run.py +++ b/tests/cli/test_run.py @@ -26,6 +26,14 @@ def __init__(self, expedition, from_data=None): self.expedition = expedition self.from_data = from_data + def __enter__(self): + """Dummy context manager enter method.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Dummy context manager exit method.""" + pass + def execute(self, measurements, out_path): """Mock execute method.""" out_path = Path(out_path) From 397a28646fafe50b371120552237f818cf39faaa Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:16:50 +0100 Subject: [PATCH 129/191] reduce argo spatial halo further --- src/virtualship/instruments/argo_float.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 47ece7fa..b295bacc 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -255,7 +255,7 @@ def __init__(self, expedition, from_data): **sensor_variables, } # advection variables (U and V) are always required for argo float simulation; sensor variables come from config fetch_spec = FetchSpec( - latlon_buffer=12.5, # [degrees] + latlon_buffer=9.0, # [degrees] time_buffer=expedition.instruments_config.argo_float_config.lifetime.total_seconds() / (24 * 3600), # [days] ) From a0d4e9d7fc71a94680a4ce8c35abf6d67a4e91c3 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 3 Sep 2026 14:45:45 +0100 Subject: [PATCH 130/191] refactor and add test for auto-build UV vector field --- tests/instruments/test_base.py | 64 ++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index b1b83772..c27810f7 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -99,6 +99,19 @@ def instrument_type(self) -> InstrumentType: return InstrumentType.CTD +class _FakeFieldSet: + """Minimal fieldset.""" + + def __init__(self, **fields): + for name, value in fields.items(): + setattr(self, name, value) + self.fields = {} + + def to_windowed_arrays(self): + """Mimic FieldSet.to_windowed_arrays.""" + return self + + def test_load_input_data(): """Test Instrument.load_input_data with mocks.""" mock_waypoint = MagicMock() @@ -114,12 +127,12 @@ def test_load_input_data(): from_data=None, ) - mock_fieldset = MagicMock() - mock_fieldset.to_windowed_arrays.return_value = mock_fieldset - shared_interval = MagicMock() - mock_fieldset.U = MagicMock(time_interval=shared_interval) - mock_fieldset.V = MagicMock(time_interval=shared_interval) + fake_fieldset = _FakeFieldSet( + A=MagicMock(), + U=MagicMock(time_interval=shared_interval), + V=MagicMock(time_interval=shared_interval), + ) with ( patch( @@ -130,13 +143,50 @@ def test_load_input_data(): patch.object(dummy, "_via_tmp_ds", side_effect=lambda ds: ds), patch("parcels.convert.copernicusmarine_to_sgrid"), patch( - "parcels.FieldSet.from_sgrid_conventions", return_value=mock_fieldset + "parcels.FieldSet.from_sgrid_conventions", return_value=fake_fieldset ) as mock_from_sgrid, ): fieldset = dummy.load_input_data() mock_from_sgrid.assert_called_once() - assert fieldset == mock_fieldset + assert fieldset == fake_fieldset + + +def test_gets_uv_vectorfield_when_u_and_v_present(): + """load_input_data creates a 'UV' VectorField when U and V fields are present.""" + mock_waypoint = MagicMock() + mock_waypoint.location.latitude = 1.0 + mock_waypoint.location.longitude = 2.0 + + dummy = DummyInstrument( + expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + variables={"U": "uo", "V": "vo"}, + add_bathymetry=False, + allow_time_extrapolation=False, + verbose_progress=False, + from_data=None, + ) + + fake_u = MagicMock() + fake_v = MagicMock() + fake_fieldset = _FakeFieldSet(U=fake_u, V=fake_v) + mock_uv = MagicMock() + + with ( + patch.object(dummy, "_generate_fieldset", return_value=fake_fieldset), + patch( + "virtualship.instruments.base.parcels.VectorField", return_value=mock_uv + ) as mock_vectorfield, + ): + result = dummy.load_input_data() + + args, _ = mock_vectorfield.call_args + assert args[0] == "UV" + assert args[1] is fake_u + assert args[2] is fake_v + + assert result.UV is mock_uv + assert result.fields["UV"] is mock_uv def test_execute_calls_simulate(monkeypatch): From 834dd4eb1ffa5692e48e4775f5e9ac900624319c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 3 Sep 2026 14:58:42 +0100 Subject: [PATCH 131/191] add test that no initial sampling for argo float --- tests/instruments/test_argo_float.py | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index 502731d0..2917a875 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -6,6 +6,7 @@ import numpy as np import parcels +import polars as pl import pydantic import pytest import xarray as xr @@ -352,3 +353,33 @@ def __init__(self): "Shallow bathymetry warning: Argo float grounded at bathymetry during descent" in output ) + + +def test_argo_no_initial_sampling(tmpdir): + """Test that ArgoFloat does not sample at initial deployment (on purpose for realism).""" + fieldset = create_fieldset() + + sensors = [ + SensorConfig(sensor_type=SensorType.TEMPERATURE), + SensorConfig(sensor_type=SensorType.SALINITY), + ] + expedition = create_dummy_expedition(sensors) + + argo_instrument = ArgoFloatInstrument(expedition, None) + argo_floats = [create_argo_float(wp) for wp in expedition.schedule.waypoints] + out_path = tmpdir.join("out_no_initial.parquet") + argo_instrument.load_input_data = lambda: fieldset + argo_instrument.simulate(argo_floats, out_path) + + results = parcels.read_particlefile(out_path) + + # check no sampling occured at initial deployment + deploy_time = fieldset.time_interval.left + initial = results.filter(pl.col("t") == deploy_time) + assert len(initial) == 1, "Should only be one entry for initial deployment time" + assert initial["temperature"].is_nan().all(), ( + "ArgoFloat should not sample temperature at initial deployment" + ) + assert initial["salinity"].is_nan().all(), ( + "ArgoFloat should not sample salinity at initial deployment" + ) From a7dbc9793825e3664ad09e984ab90c82f794553b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 3 Sep 2026 15:32:10 +0100 Subject: [PATCH 132/191] add todo to track potential speed vs. memory trade-off --- src/virtualship/instruments/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 0d27e385..be697868 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -364,6 +364,7 @@ def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: for variable in ds_to_write.variables.values(): variable.encoding = {} + # TODO: potential trade off between speed and memory usage here... could remove to reduce memory footprint, but may slow down writing (?) ds_to_write = ds_to_write.chunk( {dim: size for dim, size in ds_to_write.sizes.items()} ) From 538e20186fcb331e6b660f66fdca2b289f560a90 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 4 Sep 2026 08:59:19 +0100 Subject: [PATCH 133/191] remove duplicate cycle age update --- src/virtualship/instruments/argo_float.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index b295bacc..f680d882 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -113,7 +113,6 @@ def _argo_float_vertical_movement(particles, fieldset): # Phase 3: Rising with vertical_speed until at surface ptcls3.dz -= particles.vertical_speed * ptcls3.dt - ptcls3.cycle_age += ptcls3.dt # solve issue of not updating cycle_age during ascent next_phase = ptcls3.z + ptcls3.dz >= particles.min_depth ptcls3.cycle_phase[next_phase] = 4 ptcls3.dz[next_phase] = particles.min_depth - ptcls3.z[next_phase] # noqa:avoid overshoot From ea14cd600f667434f56f925800c4241226b3d64a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 4 Sep 2026 10:00:21 +0100 Subject: [PATCH 134/191] clean up: unnecessary or old/stale code --- src/virtualship/instruments/adcp.py | 1 - src/virtualship/instruments/argo_float.py | 1 - src/virtualship/instruments/base.py | 24 +------------------ src/virtualship/instruments/ctd.py | 1 - src/virtualship/instruments/drifter.py | 1 - .../instruments/ship_underwater_st.py | 1 - src/virtualship/instruments/xbt.py | 1 - tests/instruments/test_base.py | 8 ------- 8 files changed, 1 insertion(+), 37 deletions(-) diff --git a/src/virtualship/instruments/adcp.py b/src/virtualship/instruments/adcp.py index bd253230..0b9630d3 100644 --- a/src/virtualship/instruments/adcp.py +++ b/src/virtualship/instruments/adcp.py @@ -56,7 +56,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=False, - allow_time_extrapolation=True, verbose_progress=False, fetch_spec=FetchSpec(), from_data=from_data, diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index f680d882..1376886e 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -263,7 +263,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=True, - allow_time_extrapolation=False, verbose_progress=True, fetch_spec=fetch_spec, from_data=from_data, diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index be697868..4698ee47 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -71,7 +71,6 @@ def __init__( expedition: Expedition, variables: dict, add_bathymetry: bool, - allow_time_extrapolation: bool, verbose_progress: bool, from_data: Path | None, fetch_spec: FetchSpec | None = None, @@ -81,14 +80,7 @@ def __init__( self.from_data = from_data self.variables = collections.OrderedDict(variables) - self.dimensions = { - "lon": "longitude", - "lat": "latitude", - "time": "time", - "depth": "depth", - } # same dimensions for all instruments self.add_bathymetry = add_bathymetry - self.allow_time_extrapolation = allow_time_extrapolation self.verbose_progress = verbose_progress self.fetch_spec = fetch_spec or FetchSpec() self._tmp_dirs: list[tempfile.TemporaryDirectory] = [] @@ -113,7 +105,7 @@ def __init__( self.min_lon, self.max_lon = min(wp_lons), max(wp_lons) def close(self): - """Explicitly cleanup all tmp dirs/resources.""" + """Explicitly cleanup all tmp dirs.""" tmp_dirs = getattr(self, "_tmp_dirs", None) if not tmp_dirs: return @@ -124,13 +116,6 @@ def close(self): pass # i.e. best effort clean up self._tmp_dirs = [] - def __del__(self): - """Safety net: ensure temporary directories are cleaned up even if close()/context manager usage was skipped.""" - try: - self.close() - except Exception: - pass - def __enter__(self): """Enter the context manager.""" return self @@ -177,10 +162,8 @@ def load_input_data(self) -> parcels.FieldSet: @abc.abstractmethod def simulate( self, - data_dir: Path, measurements: list, out_path: str | Path, - spinner: yaspin.core.Yaspin | None = None, ) -> None: """Simulate instrument measurements.""" @@ -209,9 +192,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: Includes an intermediate step of writing to tmp files, as per https://github.com/Parcels-code/parcels-benchmarks/pull/49 TODO: the need for this step may be removed as Parcels x copernicusmarine integration improves, tracked in https://github.com/Parcels-code/Parcels/issues/2756 and xref'd in VirtualShip #357 (https://github.com/Parcels-code/virtualship/issues/357) - - # TODO: N.B. adding (+) fields to fieldsets might not be intended behaviour for using Parcels (?) - #! However, at present it's still needed to build the fieldset one-by-one to avoid large file dumps/memory when using tmp files and streaming data """ fieldsets_list = [] keys = list(self.variables.keys()) @@ -321,8 +301,6 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: ds["depth"] = -ds["depth"] ds = ds.reindex(depth=ds["depth"][::-1]) ds["depth"].attrs["positive"] = "up" - elif ds["depth"].attrs.get("positive") != "up": - pass except Exception as e: raise ValueError( diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 1291890d..1257c0f3 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -147,7 +147,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=True, - allow_time_extrapolation=True, verbose_progress=False, fetch_spec=FetchSpec(), from_data=from_data, diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index b72b8ab0..9fd9493f 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -100,7 +100,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=True, fetch_spec=fetch_spec, from_data=from_data, diff --git a/src/virtualship/instruments/ship_underwater_st.py b/src/virtualship/instruments/ship_underwater_st.py index 4aff0af5..86f92ed3 100644 --- a/src/virtualship/instruments/ship_underwater_st.py +++ b/src/virtualship/instruments/ship_underwater_st.py @@ -61,7 +61,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=False, - allow_time_extrapolation=True, verbose_progress=False, fetch_spec=FetchSpec(), from_data=from_data, diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index c07c385c..b6878bf5 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -100,7 +100,6 @@ def __init__(self, expedition, from_data): expedition, variables, add_bathymetry=True, - allow_time_extrapolation=True, verbose_progress=False, fetch_spec=FetchSpec(), from_data=from_data, diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index c27810f7..b6955491 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -122,7 +122,6 @@ def test_load_input_data(): expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) @@ -162,7 +161,6 @@ def test_gets_uv_vectorfield_when_u_and_v_present(): expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"U": "uo", "V": "vo"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) @@ -199,7 +197,6 @@ def test_execute_calls_simulate(monkeypatch): expedition=MagicMock(schedule=mock_schedule), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=True, from_data=None, ) @@ -220,7 +217,6 @@ def test_fetch_spec_applied_to_instrument(): expedition=MagicMock(schedule=mock_schedule), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, fetch_spec=fetch_spec, from_data=None, @@ -242,7 +238,6 @@ def test_via_tmp_ds_roundtrip(): expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) as dummy: @@ -272,7 +267,6 @@ def test_instrument_context_manager(): expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) as dummy: @@ -298,7 +292,6 @@ def test_generate_fieldset_combines_fields(): expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), variables={"A": "a", "B": "b"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) @@ -330,7 +323,6 @@ def test_load_input_data_error(monkeypatch): expedition=MagicMock(schedule=mock_schedule), variables={"A": "a"}, add_bathymetry=False, - allow_time_extrapolation=False, verbose_progress=False, from_data=None, ) From 7947ecd864e14c4d32a8527e23ea9afbe0a51359 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:54:24 +0100 Subject: [PATCH 135/191] using waypoint index for in-port problems; use public facing wp numbers throughout codebase --- src/virtualship/cli/_initialise.py | 2 +- src/virtualship/cli/_run.py | 9 +- .../expedition/simulate_schedule.py | 9 +- .../make_realistic/problems/simulator.py | 721 ++++++++---------- src/virtualship/models/checkpoint.py | 113 ++- src/virtualship/models/expedition.py | 51 +- src/virtualship/utils.py | 36 +- 7 files changed, 447 insertions(+), 494 deletions(-) diff --git a/src/virtualship/cli/_initialise.py b/src/virtualship/cli/_initialise.py index 6fea2180..d5cfbc4b 100644 --- a/src/virtualship/cli/_initialise.py +++ b/src/virtualship/cli/_initialise.py @@ -250,7 +250,7 @@ def _mfp_string_to_timedelta(value: str | None) -> timedelta | None: def _validate_start_date(ctx, param, value): - """Callback to enforce and validate --start-date when --from-mfp is used.""" + """Enforce --start-date when --from-mfp is used.""" if ctx.params.get("from_mfp"): if not value: raise click.BadParameter( diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 61e629ce..1adba075 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -14,7 +14,7 @@ simulate_schedule, ) from virtualship.make_realistic.problems.simulator import ProblemSimulator -from virtualship.models import Checkpoint, Schedule +from virtualship.models import Checkpoint from virtualship.models.expedition import Expedition from virtualship.utils import ( CACHE, @@ -93,11 +93,10 @@ def _run( # load last checkpoint checkpoint = _load_checkpoint(expedition_dir) - if checkpoint is None: - checkpoint = Checkpoint(past_schedule=Schedule(waypoints=[])) - # verify that schedule and checkpoint match, and that problems have been resolved - checkpoint.verify(expedition, problems_dir) + # verify that schedule and checkpoint match, and that problems have been resolved (if checkpoint exists) + if checkpoint is not None: + checkpoint.verify(expedition, problems_dir) print("\n---- WAYPOINT VERIFICATION ----") diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 6f1fed05..75ab9a10 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -20,7 +20,7 @@ Spacetime, Waypoint, ) -from virtualship.utils import _calc_sail_time +from virtualship.utils import _calc_sail_time, _get_public_wp @dataclass @@ -36,7 +36,7 @@ class ScheduleProblem: """Result of schedule that could not be fully completed.""" time: datetime - failed_waypoint_i: int + failed_wp: int @dataclass @@ -103,7 +103,7 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: self._expedition = expedition assert self._expedition.schedule.waypoints[0].time is not None, ( - "First waypoint must have a time. This should have been verified before calling this function." + "Departure port must have a time." ) self._time = expedition.schedule.waypoints[0].time self._location = expedition.schedule.waypoints[0].location @@ -123,8 +123,9 @@ def simulate(self) -> ScheduleOk | ScheduleProblem: # check if waypoint was reached in time # TODO: already tested in schedule.verify(), re-check here for robustness but could be removed if deemed redundant if waypoint.time is not None and self._time > waypoint.time: + public_wp = _get_public_wp(wp_i, self._expedition.schedule.waypoints) print( - f"\nWaypoint {wp_i + 1} could not be reached in time. Current time: {self._time}. Waypoint time: {waypoint.time}." + f"\nWaypoint {public_wp} could not be reached in time. Current time: {self._time}. Waypoint time: {waypoint.time}." "\n\nHave you ensured that your schedule includes sufficient time for taking measurements, e.g. CTD casts (in addition to the time it takes to sail between waypoints)?\n" ) return ScheduleProblem(self._time, wp_i) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index e08e0827..92b98605 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -1,12 +1,12 @@ from __future__ import annotations import json -import os import random import sys import time +from datetime import timedelta from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from rich import box from rich.console import Console @@ -32,6 +32,7 @@ PROJECTION, _calc_sail_time, _calc_wp_stationkeeping_time, + _get_public_wp, _make_hash, _save_checkpoint, ) @@ -42,385 +43,305 @@ LOG_MESSAGING = { "pre_departure": "Hang on! There could be a pre-departure problem in-port...", "during_expedition": "Oh no, a problem has occurred during the expedition, at waypoint {waypoint}...!", - "schedule_problems": "This problem will cause a delay of {delay_duration} hours {problem_wp}. The next waypoint therefore cannot be reached in time. Please account for this in your schedule (`virtualship plan` or directly in {expedition_yaml}), then continue the expedition by executing the `virtualship run` command again.\n", + "schedule_problems": ( + "This problem will cause a delay of {delay_duration} hours {problem_wp}. " + "The next waypoint therefore cannot be reached in time. Please account for this " + "in your schedule (`virtualship plan` or directly in {expedition_yaml}), then continue " + "the expedition by executing the `virtualship run` command again.\n" + ), "problem_avoided": "Phew! You had enough contingency time scheduled to avoid delays from this problem.\n", } - -# default problem weights for problems simulator (i.e. add +1 problem for every n days/waypoints/instruments in expedition) +# default problem weights for problems simulator (e.g., +1 problem every N days/waypoints/instruments) PROBLEM_WEIGHTS = { "every_ndays": 7, "every_nwaypoints": 6, "every_ninstruments": 3, } +ProblemType = GeneralProblem | InstrumentProblem +SelectedProblemsDict = dict[str, list[ProblemType | None]] + class ProblemSimulator: - """Handle problem simulation during expedition.""" + """Handle problem simulation during an expedition.""" def __init__(self, expedition: Expedition, expedition_dir: str | Path): """Initialise ProblemSimulator with a schedule and probability level.""" self.expedition = expedition self.expedition_dir = Path(expedition_dir) + self.waypoints = expedition.schedule.waypoints + + def __post_init__(self): + """Ensure first and last waypoints are Ports. Allows the problem selection to work properly.""" + assert isinstance(self.waypoints[0], Port) & isinstance( + self.waypoints[-1], Port + ), "First and last waypoints must be Port types." + def select_problems( self, instruments_in_expedition: set[InstrumentType], difficulty_level: str, - ) -> dict[str, list[GeneralProblem | InstrumentProblem] | None] | None: + ) -> SelectedProblemsDict | None: """ Select problems (general and instrument-specific). When difficulty_level = 'hard', number of problems is determined by expedition length, instrument count etc. If only one waypoint, return just a pre-departure problem. - Map each selected problem to a random waypoint (or None if pre-departure). Finally, cache the suite of problems to a directory (expedition-specific) for reference. + Map each selected problem to a random waypoint (or 0th [i.e. departure port] if pre-departure). Finally, cache the suite of problems to a directory (expedition-specific) for reference. """ - waypoints = self.expedition.schedule.waypoints - - valid_instrument_problems = [ - problem - for problem in INSTRUMENT_PROBLEMS - if problem.instrument_type in instruments_in_expedition - ] + # handle early-exit single waypoint case (pre-departure only) + if len(self.waypoints) < 2: + pre_departure = [p for p in GENERAL_PROBLEMS if p.pre_departure] + return { + "problem_class": [random.choice(pre_departure)], + "waypoint_i": [0], # noqa; pre-departure problem is always associated with the departure port (index 0) + } - pre_departure_problems = [ + valid_instruments = [ p - for p in GENERAL_PROBLEMS - if isinstance(p, GeneralProblem) and p.pre_departure + for p in INSTRUMENT_PROBLEMS + if p.instrument_type in instruments_in_expedition ] + num_problems = self._calculate_problem_count( + difficulty_level=difficulty_level, + expedition_days=(self.waypoints[-1].time - self.waypoints[0].time).days, + num_waypoints=len(self.waypoints), + num_instruments=len(instruments_in_expedition), + max_available=len(GENERAL_PROBLEMS) + len(valid_instruments), + ) - num_waypoints = len(waypoints) - num_instruments = len(instruments_in_expedition) - expedition_duration_days = (waypoints[-1].time - waypoints[0].time).days + if num_problems <= 0: + return None - # if only one waypoint, return just a pre-departure problem - if num_waypoints < 2: - return { - "problem_class": [random.choice(pre_departure_problems)], - "waypoint_i": [None], - } + selected = self._sample_problems( + num_problems, valid_instruments, len(instruments_in_expedition) + ) + selected = self._limit_pre_departure(selected, valid_instruments) + + return self._assign_problems_to_waypoints(selected) + def _calculate_problem_count( + self, + difficulty_level: str, + expedition_days: int, + num_waypoints: int, + num_instruments: int, + max_available: int, + ) -> int: + """Determine problem count based on difficulty setting.""" if difficulty_level == "easy": - num_problems = 0 - elif difficulty_level == "medium": - num_problems = random.randint(1, 2) - - elif difficulty_level == "hard": - base = 1 - extra = ( # i.e. +1 problem for every n days/waypoints/instruments (tunable above) - (expedition_duration_days // PROBLEM_WEIGHTS["every_ndays"]) + return 0 + if difficulty_level == "medium": + return random.randint(1, 2) + if difficulty_level == "hard": + extra = ( + (expedition_days // PROBLEM_WEIGHTS["every_ndays"]) + (num_waypoints // PROBLEM_WEIGHTS["every_nwaypoints"]) + (num_instruments // PROBLEM_WEIGHTS["every_ninstruments"]) ) - num_problems = base + extra - num_problems = min( - num_problems, len(GENERAL_PROBLEMS) + len(valid_instrument_problems) - ) + return min(1 + extra, max_available) + return 0 - selected_problems = [] - problems_sorted = None - if num_problems > 0: - random.shuffle(GENERAL_PROBLEMS) - random.shuffle(valid_instrument_problems) - - # bias towards more instrument problems when there are more instruments - instrument_bias = min(0.7, num_instruments / (num_instruments + 2)) - n_instrument = round(num_problems * instrument_bias) - n_general = min(len(GENERAL_PROBLEMS), num_problems - n_instrument) - n_instrument = ( - num_problems - n_general - ) # recalc in case n_general was capped to len(GENERAL_PROBLEMS) - - selected_problems.extend(GENERAL_PROBLEMS[:n_general]) - selected_problems.extend(valid_instrument_problems[:n_instrument]) - - # allow only one pre-departure problem to occur; replace any extras with non-pre-departure problems - selected_pre_departure = [ - p - for p in selected_problems - if isinstance(p, GeneralProblem) and p.pre_departure - ] - if len(selected_pre_departure) > 1: - to_keep = random.choice(selected_pre_departure) - num_to_replace = len(selected_pre_departure) - 1 - # remove all but one pre_departure problem - selected_problems = [ - problem - for problem in selected_problems - if not ( - isinstance(problem, GeneralProblem) - and problem.pre_departure - and problem is not to_keep - ) - ] - # available non-pre_departure problems not already selected - available_general = [ + def _sample_problems( + self, + num_problems: int, + valid_instruments: list[InstrumentProblem], + num_instruments: int, + ) -> list[ProblemType]: + """Sample a balanced ratio of general and instrument problems.""" + general_pool = list(GENERAL_PROBLEMS) + instrument_pool = list(valid_instruments) + random.shuffle(general_pool) + random.shuffle(instrument_pool) + + bias = min(0.7, num_instruments / (num_instruments + 2)) + n_inst = round(num_problems * bias) + n_gen = min(len(general_pool), num_problems - n_inst) + n_inst = num_problems - n_gen # noqa; recalc in case n_gen was capped to len(GENERAL_PROBLEMS) + + return general_pool[:n_gen] + instrument_pool[:n_inst] + + def _limit_pre_departure( + self, + selected: list[ProblemType], + valid_instruments: list[InstrumentProblem], + ) -> list[ProblemType]: + """Ensure maximum of one pre-departure problem is selected.""" + pre_deps = [ + p for p in selected if isinstance(p, GeneralProblem) and p.pre_departure + ] + if len(pre_deps) <= 1: + return selected + + keep = random.choice(pre_deps) + replacements_needed = len(pre_deps) - 1 + filtered = [ + p for p in selected if p is keep or not getattr(p, "pre_departure", False) + ] + + avail_gen = [ + p for p in GENERAL_PROBLEMS if not p.pre_departure and p not in filtered + ] + avail_inst = [p for p in valid_instruments if p not in filtered] + replacements = avail_gen + avail_inst + random.shuffle(replacements) + + return filtered + replacements[:replacements_needed] + + def _assign_problems_to_waypoints( + self, selected: list[ProblemType] + ) -> SelectedProblemsDict | None: + """Assign sampled problems to valid, non-port waypoint indices.""" + waypoints = self.waypoints + avail_indices = [ + i for i, wp in enumerate(waypoints) if not isinstance(wp, Port) + ] + random.shuffle(avail_indices) + + assert 0 not in avail_indices, ( + "Index 0 (departure port) should not be in available waypoint indices for non-pre-departure problems." + ) + + assigned_problems: list[ProblemType] = [] + assigned_indices: list[int | None] = [] + + for problem in selected: + if getattr(problem, "pre_departure", False): + assigned_problems.append(problem) + assigned_indices.append(0) # noqa; pre-departure problem is always associated with the departure port (index 0) + continue + + if not avail_indices: + break + + # find matching waypoint or substitute with general problem + target_idx = None + for idx in avail_indices: + wp_instruments = waypoints[idx].instrument or [] + if ( + isinstance(problem, InstrumentProblem) + and problem.instrument_type not in wp_instruments + ): + continue + target_idx = idx + break + + if target_idx is not None: + avail_indices.remove(target_idx) + assigned_problems.append(problem) + assigned_indices.append(target_idx) + else: + # fall back to a general problem if instrument match fails + avail_general = [ p for p in GENERAL_PROBLEMS - if not p.pre_departure and p not in selected_problems - ] - available_instrument = [ - p for p in valid_instrument_problems if p not in selected_problems - ] - available_replacements = available_general + available_instrument - random.shuffle(available_replacements) - selected_problems.extend(available_replacements[:num_to_replace]) - - # map each problem to a [random, non-port waypoint] (or None if pre-departure) - # limited to one per waypoint, else complicates scheduling and contingency checking - waypoint_idxs = [] - unassigned_problems = [] - is_port = [isinstance(wp, Port) for wp in waypoints] - available_idxs = [i for i, port in enumerate(is_port) if not port] - - # TODO: if incorporate departure and arrival port/waypoints in future, bear in mind index selection here may need to change - for problem in selected_problems: - if getattr(problem, "pre_departure", False): - waypoint_idxs.append(None) - else: - if available_idxs: - wp_select = random.choice(available_idxs) - wp_instruments = waypoints[wp_select].instrument - wp_instruments = wp_instruments if wp_instruments else [] # noqa; handle when waypoint instruments set to "null" in expedition.yaml - - # check waypoint actually deploys the instrument associated with the problem...if not, replace it with a general (non-instrument related) problem - # rather than a different waypoint, because it's possible no applicable waypoint is still available - needs_replacement = ( - isinstance(problem, InstrumentProblem) - and problem.instrument_type not in wp_instruments - ) - if needs_replacement: - available_general = [ - p - for p in GENERAL_PROBLEMS - if not p.pre_departure and p not in selected_problems - ] - - if not available_general: - unassigned_problems.append(problem) - continue - - replacement = random.choice(available_general) - problem_idx = selected_problems.index(problem) - selected_problems[problem_idx] = replacement - - waypoint_idxs.append(wp_select) - available_idxs.remove(wp_select) # each waypoint only used once - - else: - unassigned_problems.append(problem) # noqa; if run out of available waypoints, remove problem from selection - - # remove any problems that couldn't be assigned a waypoint (i.e. if more problems than available waypoints) - if unassigned_problems: - selected_problems = [ - p for p in selected_problems if p not in unassigned_problems + if not p.pre_departure and p not in assigned_problems ] - - # pair problems with their waypoint indices and sort by waypoint index (pre-departure first) - paired = sorted( - zip(selected_problems, waypoint_idxs, strict=True), - key=lambda x: (x[1] is not None, x[1] if x[1] is not None else -1), - ) - problems_sorted = { - "problem_class": [p for p, _ in paired], - "waypoint_i": [w for _, w in paired], - } - - return problems_sorted if selected_problems else None + if avail_general and avail_indices: + substitute = random.choice(avail_general) + assigned_problems.append(substitute) + assigned_indices.append(avail_indices.pop()) + + if not assigned_problems: + return None + + # sort chronologically (waypoint 0 first, then remaining waypoint index order) + paired = sorted( + zip(assigned_problems, assigned_indices, strict=True), + key=lambda x: 0 if x[1] == 0 else x[1], + ) + return { + "problem_class": [p for p, _ in paired], + "waypoint_i": [w for _, w in paired], + } def execute( self, - problems: dict[str, list[GeneralProblem | InstrumentProblem] | None], + problems: SelectedProblemsDict, instrument_type_validation: InstrumentType | None, log_dir: Path, log_delay: float = 4.0, - ): - """ - Execute the selected problems, returning messaging and delay times. - - N.B. a problem_waypoint_i is different to a failed_waypoint_i defined in the Checkpoint class; failed_waypoint_i is the waypoint index after the problem_waypoint_i where the problem occurred, as this is when scheduling issues would be encountered. - """ - # TODO: when difficulty_level = 'hard' and have general problems which occur at later waypoints: could artificially delay their propagation until later in the simulation? Otherwise they are front-loaded at the start of the simulation... Instrument problems are fine because they only propagate when instrument is simulated... - - for problem, problem_waypoint_i in zip( + ) -> None: + """Execute simulation problems and apply delay/schedule impacts.""" + for problem, wp_i in zip( problems["problem_class"], problems["waypoint_i"], strict=True ): - # skip if instrument problem but `p.instrument_type` does not match `instrument_type_validation` (i.e. the current instrument being simulated in the expedition, e.g. from _run.py) if ( isinstance(problem, InstrumentProblem) and problem.instrument_type is not instrument_type_validation ): continue - problem_hash = _make_hash(problem.message + str(problem_waypoint_i), 8) - hash_fpath = log_dir.joinpath(f"problem_{problem_hash}.json") + problem_hash = _make_hash(problem.message + str(wp_i), 8) + hash_fpath = log_dir / f"problem_{problem_hash}.json" if hash_fpath.exists(): - continue # problem * waypoint combination has already occurred; don't repeat - - if isinstance(problem, GeneralProblem) and problem.pre_departure: - alert_msg = LOG_MESSAGING["pre_departure"] - - else: - alert_msg = LOG_MESSAGING["during_expedition"].format( - waypoint=int(problem_waypoint_i) + 1 - ) - - # log problem occurrence, save to checkpoint, and pause simulation - self._log_problem( - problem, - problem_waypoint_i, - alert_msg, - problem_hash, - hash_fpath, - log_delay, - ) + continue - # cache original expedition for reference and/or restoring later if needed (checkpoint.yaml [written in _log_problem] can be overwritten if multiple problems occur so is not a persistent record of original schedule) + self._log_problem(problem, wp_i, problem_hash, hash_fpath, log_delay) self._cache_original_expedition(self.expedition) - @staticmethod - def cache_selected_problems( - problems: dict[str, list[GeneralProblem | InstrumentProblem] | None], - selected_problems_fpath: str, - ) -> None: - """Cache suite of problems to json, for reference.""" - # make dir to contain problem jsons (unique to expedition) - os.makedirs(Path(selected_problems_fpath).parent, exist_ok=True) - - # cache dict of selected_problems to json - with open( - selected_problems_fpath, - "w", - encoding="utf-8", - ) as f: - json.dump( - { - "problem_class": [p.short_name for p in problems["problem_class"]], - "waypoint_i": problems["waypoint_i"], - "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), - }, - f, - indent=4, - ) - - @staticmethod - def post_expedition_report( - problems: dict[str, list[GeneralProblem | InstrumentProblem] | None], - report_fpath: str | Path, - ) -> None: - """Produce human-readable post-expedition report (.txt), including problems that occured (their full messages), the waypoint and what delay they caused.""" - for problem, problem_waypoint_i in zip( - problems["problem_class"], problems["waypoint_i"], strict=True - ): - affected_wp = ( - "in-port" if problem_waypoint_i is None else f"{problem_waypoint_i + 1}" - ) - delay_hours = problem.delay_duration.total_seconds() / 3600.0 - with open(report_fpath, "a", encoding="utf-8") as f: - f.write("---\n") - f.write(f"Waypoint: {affected_wp}\n") - f.write(f"Problem: {problem.message}\n") - f.write(f"Delay caused: {delay_hours} hours\n\n") - - @staticmethod - def load_selected_problems( - selected_problems_fpath: str, - ) -> dict[str, list[GeneralProblem | InstrumentProblem] | None]: - """Load previously selected problem classes from json.""" - with open( - selected_problems_fpath, - encoding="utf-8", - ) as f: - problems_json = json.load(f) - - # extract selected problem classes from their names (using the lookups preserves order they were saved in) - selected_problems = {"problem_class": [], "waypoint_i": []} - general_problems_lookup = {cls.short_name: cls for cls in GENERAL_PROBLEMS} - instrument_problems_lookup = { - cls.short_name: cls for cls in INSTRUMENT_PROBLEMS - } - - for cls_name, wp_idx in zip( - problems_json["problem_class"], problems_json["waypoint_i"], strict=True - ): - if cls_name in general_problems_lookup: - selected_problems["problem_class"].append( - general_problems_lookup[cls_name] - ) - elif cls_name in instrument_problems_lookup: - selected_problems["problem_class"].append( - instrument_problems_lookup[cls_name] - ) - else: - raise ValueError( - f"Problem class '{cls_name}' not found in known problem registries." - ) - selected_problems["waypoint_i"].append(wp_idx) - - return selected_problems - def _log_problem( self, - problem: GeneralProblem | InstrumentProblem, - problem_waypoint_i: int | None, - alert_msg: str, + problem: ProblemType, + problem_wp_i: int | None, problem_hash: str, hash_fpath: Path, log_delay: float, - ): - """Log problem occurrence with spinner and delay, save to checkpoint, write hash.""" - time.sleep(3.0) # brief pause before spinner + ) -> None: + """ + Handle execution sequence, logging, checkpoint saving, and user presentation. + + Note, problem_wp_i is the index of the waypoint in the expedition schedule, but the user-facing message should be based on the index of the waypoint in the list of non-port waypoints. + Use problem_wp_i for internal logic, but user-facing messages (below) should use public_wp (non indexed version). + problem_wp_i will often == public_wp (given 0-indexing), but this makes the logic explicit and clear. + """ + waypoints = self.waypoints + public_wp = _get_public_wp(problem_wp_i, waypoints) + + alert_msg = ( + LOG_MESSAGING["pre_departure"] + if isinstance(problem, GeneralProblem) and problem.pre_departure + else LOG_MESSAGING["during_expedition"].format(waypoint=public_wp) + ) + + time.sleep(3.0) with yaspin(text=alert_msg) as spinner: time.sleep(log_delay) spinner.ok("💥 ") - self._hash_to_json( - problem, - problem_hash, - problem_waypoint_i, - hash_fpath, - ) - - has_contingency = self._has_contingency(problem, problem_waypoint_i) + self._hash_to_json(problem, problem_hash, problem_wp_i, hash_fpath) + has_contingency = self._has_contingency(problem, problem_wp_i) + delay_hrs = problem.delay_duration.total_seconds() / 3600.0 if has_contingency: impact_str = LOG_MESSAGING["problem_avoided"] result_str = "The expedition will carry on shortly as planned." - - # update problem json to resolved = True - with open(hash_fpath, encoding="utf-8") as f: - problem_json = json.load(f) - problem_json["resolved"] = True - with open(hash_fpath, "w", encoding="utf-8") as f_out: - json.dump(problem_json, f_out, indent=4) - + # update problem JSON state to resolved + data = self._read_json(hash_fpath) + data["resolved"] = True + self._write_json(hash_fpath, data) else: - affected = ( - "in-port" - if problem_waypoint_i is None - else f"at waypoint {problem_waypoint_i + 1}" + affected = "in-port" if public_wp is None else f"at waypoint {public_wp}" + impact_str = ( + f"Not enough contingency time scheduled to mitigate delay of {delay_hrs} " + f"hours occurring {affected} (future waypoint(s) would be reached too late).\n" ) - - impact_str = f"Not enough contingency time scheduled to mitigate delay of {problem.delay_duration.total_seconds() / 3600.0} hours occuring {affected} (future waypoint(s) would be reached too late).\n" result_str = LOG_MESSAGING["schedule_problems"].format( - delay_duration=problem.delay_duration.total_seconds() / 3600.0, + delay_duration=delay_hrs, problem_wp=affected, expedition_yaml=EXPEDITION, ) - # save checkpoint + # update and save checkpoints checkpoint = Checkpoint( past_schedule=self.expedition.schedule, - failed_waypoint_i=problem_waypoint_i + 1 - if problem_waypoint_i is not None - else 0, - ) # failed waypoint index then becomes the one after the one where the problem occurred; as this is when scheduling issues would be run into; for pre-departure problems this is the first waypoint + problem_wp_i=problem_wp_i, + ) _save_checkpoint(checkpoint, self.expedition_dir) + self.expedition.to_yaml(self.expedition_dir / CACHE / EXPEDITION_LATEST) - # save latest version of expedition (overwrites previous) - self.expedition.to_yaml(self.expedition_dir.joinpath(CACHE, EXPEDITION_LATEST)) - - # display tabular output in self._tabular_outputter( problem_str=problem.message, impact_str=impact_str, @@ -428,124 +349,160 @@ def _log_problem( has_contingency=has_contingency, ) - if has_contingency: - return # continue expedition as normal - else: - sys.exit(0) # pause simulation + if not has_contingency: + sys.exit(0) - def _has_contingency( - self, - problem: InstrumentProblem | GeneralProblem, - problem_waypoint_i: int | None, - ) -> bool: - """Determine if enough contingency time has been scheduled to avoid delay affecting the waypoint immediately after the problem.""" - if problem_waypoint_i is None: - return False # pre-departure problems always cause delay to first waypoint + def _has_contingency(self, problem: ProblemType, problem_wp_i: int | None) -> bool: + """Check whether scheduled contingency covers expected delay duration.""" + curr_wp, next_wp = ( + self.waypoints[problem_wp_i], + self.waypoints[problem_wp_i + 1], + ) - else: - curr_wp = self.expedition.schedule.waypoints[problem_waypoint_i] - next_wp = self.expedition.schedule.waypoints[problem_waypoint_i + 1] + stationkeeping = ( + _calc_wp_stationkeeping_time(curr_wp.instrument, self.expedition) + if not isinstance(curr_wp, Port) + else timedelta(0) + ) + sail_time = _calc_sail_time( + curr_wp.location, + next_wp.location, + ship_speed_knots=self.expedition.ship_config.ship_speed_knots, + projection=PROJECTION, + )[0] - wp_stationkeeping_time = _calc_wp_stationkeeping_time( - curr_wp.instrument, self.expedition - ) + scheduled_time = next_wp.time - curr_wp.time + required_time = sail_time + stationkeeping + problem.delay_duration - scheduled_time_diff = next_wp.time - curr_wp.time + return scheduled_time > required_time - sail_time = _calc_sail_time( - curr_wp.location, - next_wp.location, - ship_speed_knots=self.expedition.ship_config.ship_speed_knots, - projection=PROJECTION, - )[0] + def _cache_original_expedition(self, expedition: Expedition) -> None: + """Cache original schedule configuration to file for recovery.""" + path = self.expedition_dir / CACHE / EXPEDITION_ORIGINAL + if not path.exists(): + expedition.to_yaml(path) + print(f"\nOriginal expedition.yaml cached to {path}.\n") - return ( - scheduled_time_diff - > sail_time + wp_stationkeeping_time + problem.delay_duration - ) + @staticmethod + def cache_selected_problems( + problems: SelectedProblemsDict, selected_problems_fpath: str | Path + ) -> None: + """Cache suite of selected problems to JSON.""" + fpath = Path(selected_problems_fpath) + fpath.parent.mkdir(parents=True, exist_ok=True) - def _make_checkpoint(self, failed_waypoint_i: int | None = None) -> Checkpoint: - """Make checkpoint, also handling pre-departure.""" - return Checkpoint( - past_schedule=self.expedition.schedule, failed_waypoint_i=failed_waypoint_i - ) + payload = { + "problem_class": [p.short_name for p in problems["problem_class"]], + "waypoint_i": problems["waypoint_i"], + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + } + ProblemSimulator._write_json(fpath, payload) - def _cache_original_expedition(self, expedition: Expedition): - """Cache original schedule to file for user's reference.""" - path = self.expedition_dir.joinpath(CACHE, EXPEDITION_ORIGINAL) - if path.exists(): - return # don't overwrite if already cached - expedition.to_yaml(path) - print(f"\nOriginal expedition.yaml cached to {path}.\n") + @staticmethod + def load_selected_problems( + selected_problems_fpath: str | Path, + ) -> SelectedProblemsDict: + """Load selected problems suite from a cached JSON file.""" + data = ProblemSimulator._read_json(Path(selected_problems_fpath)) + + general_lookup = {cls.short_name: cls for cls in GENERAL_PROBLEMS} + instrument_lookup = {cls.short_name: cls for cls in INSTRUMENT_PROBLEMS} + + selected_classes, waypoint_indices = [], [] + for cls_name, wp_idx in zip( + data["problem_class"], data["waypoint_i"], strict=True + ): + if cls_name in general_lookup: + selected_classes.append(general_lookup[cls_name]) + elif cls_name in instrument_lookup: + selected_classes.append(instrument_lookup[cls_name]) + else: + raise ValueError( + f"Problem class '{cls_name}' not found in known registries." + ) + waypoint_indices.append(wp_idx) + + return {"problem_class": selected_classes, "waypoint_i": waypoint_indices} + + @staticmethod + def post_expedition_report( + problems: SelectedProblemsDict, report_fpath: str | Path + ) -> None: + """Append human-readable report summary of all occurring problems.""" + with open(report_fpath, "a", encoding="utf-8") as f: + for problem, wp_i in zip( + problems["problem_class"], problems["waypoint_i"], strict=True + ): + affected = "in-port" if wp_i is None else f"{wp_i + 1}" + delay_hrs = problem.delay_duration.total_seconds() / 3600.0 + f.write( + f"---\nWaypoint: {affected}\n" + f"Problem: {problem.message}\n" + f"Delay caused: {delay_hrs} hours\n\n" + ) @staticmethod def _hash_to_json( - problem: InstrumentProblem | GeneralProblem, + problem: ProblemType, problem_hash: str, - problem_waypoint_i: int | None, + problem_wp_i: int | None, hash_path: Path, - ) -> dict: - """Convert problem details + hash to json.""" + ) -> None: + """Serialize runtime problem detail to JSON.""" hash_data = { "problem_hash": problem_hash, "message": problem.message, - "problem_waypoint_i": problem_waypoint_i, + "problem_wp_i": problem_wp_i, "delay_duration_hours": problem.delay_duration.total_seconds() / 3600.0, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "resolved": False, } - with open(hash_path, "w", encoding="utf-8") as f: - json.dump(hash_data, f, indent=4) + ProblemSimulator._write_json(hash_path, hash_data) + + @staticmethod + def _read_json(path: Path) -> dict[str, Any]: + with open(path, encoding="utf-8") as f: + return json.load(f) + + @staticmethod + def _write_json(path: Path, data: dict[str, Any]) -> None: + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) @staticmethod - def _tabular_outputter(problem_str, impact_str, result_str, has_contingency: bool): + def _tabular_outputter( + problem_str: str, impact_str: str, result_str: str, has_contingency: bool + ) -> None: """Display the problem, impact, and result in a live-updating table. Sleep times are included to increase readability and engagement for user.""" console = Console() console.print() # line break before table - col_kwargs = dict(ratio=1, no_wrap=False, max_width=None, justify="left") + col_kwargs = dict(ratio=1, no_wrap=False, justify="left") - def make_table(problem, impact, result, col_kwargs, colour_results=False): + def make_table(problem, impact, result, colour_results=False) -> Table: table = Table(box=box.SIMPLE, expand=True) table.add_column("Problem Encountered", **col_kwargs) table.add_column("Impact on schedule", **col_kwargs) - if colour_results: - style = "green1" if has_contingency else "red1" - table.add_column("Result", style=style, **col_kwargs) - else: - table.add_column("Result", **col_kwargs) - + style = ( + ("green1" if has_contingency else "red1") if colour_results else None + ) + table.add_column("Result", style=style, **col_kwargs) table.add_row(problem, impact, result) return table - empty_spinner = Spinner("dots", text="") + empty = Spinner("dots", text="") impact_spinner = Spinner("dots", text="Assessing impact on schedule...") + stages = [ + (empty, empty, empty, False, 3.0), + (problem_str, empty, empty, False, 3.0), + (problem_str, impact_spinner, empty, False, 7.0), + (problem_str, impact_str, empty, False, 4.0), + (problem_str, impact_str, result_str, True, 3.0), + ] + with Live(console=console, refresh_per_second=10) as live: - # stage 0: empty table - table = make_table(empty_spinner, empty_spinner, empty_spinner, col_kwargs) - live.update(table) - time.sleep(3.0) - - # stage 1: show problem - table = make_table(problem_str, empty_spinner, empty_spinner, col_kwargs) - live.update(table) - time.sleep(3.0) - - # stage 2: spinner in "Impact on schedule" column - table = make_table(problem_str, impact_spinner, empty_spinner, col_kwargs) - live.update(table) - time.sleep(7.0) - - # stage 3: table with problem and impact-investigation complete - table = make_table(problem_str, impact_str, empty_spinner, col_kwargs) - live.update(table) - time.sleep(4.0) - - # stage 4: complete table with problem, impact, and result (give final outcome colour based on fail/success) - table = make_table( - problem_str, impact_str, result_str, col_kwargs, colour_results=True - ) - live.update(table) - time.sleep(3.0) + for prob, imp, res, colour, sleep_time in stages: + live.update(make_table(prob, imp, res, colour_results=colour)) + time.sleep(sleep_time) diff --git a/src/virtualship/models/checkpoint.py b/src/virtualship/models/checkpoint.py index ce620af1..a486ca4e 100644 --- a/src/virtualship/models/checkpoint.py +++ b/src/virtualship/models/checkpoint.py @@ -11,12 +11,13 @@ from virtualship.errors import CheckpointError from virtualship.instruments.types import InstrumentType -from virtualship.models.expedition import Expedition, Schedule +from virtualship.models.expedition import Expedition, Port, Schedule from virtualship.utils import ( EXPEDITION, PROJECTION, _calc_sail_time, _calc_wp_stationkeeping_time, + _get_public_wp, ) @@ -37,7 +38,7 @@ class Checkpoint(pydantic.BaseModel): """ past_schedule: Schedule - failed_waypoint_i: int | None = None + problem_wp_i: int | None = None def to_yaml(self, file_path: str | Path) -> None: """ @@ -68,15 +69,22 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: """ new_schedule = expedition.schedule - # 1) check that past waypoints have not been changed, unless is a pre-departure problem - if self.failed_waypoint_i is None: - pass - elif ( - not new_schedule.waypoints[: int(self.failed_waypoint_i)] - == self.past_schedule.waypoints[: int(self.failed_waypoint_i)] + # failed waypoint is the waypoint immediately *after* the problem waypoint (i.e. the one that will not be reached in time) + failed_wp_i = self.problem_wp_i + 1 + + # public waypoint number of problem and failed waypoints, for use in error messages + public_problem_wp = _get_public_wp( + self.problem_wp_i, self.past_schedule.waypoints + ) + public_failed_wp = _get_public_wp(failed_wp_i, self.past_schedule.waypoints) + + # 1) check that past waypoints have not been changed (up to but not including failed_wp) + if ( + not new_schedule.waypoints[: int(failed_wp_i)] + == self.past_schedule.waypoints[: int(failed_wp_i)] ): raise CheckpointError( - f"Past waypoints in schedule have been changed! Restore past schedule and only change future waypoints (waypoint {int(self.failed_waypoint_i) + 1} onwards)." + f"Past waypoints in schedule have been changed! Restore past schedule and only change future waypoints (waypoint {int(public_failed_wp)} onwards)." ) # 2) check that problems have been resolved in the new schedule @@ -88,52 +96,38 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: for file in hash_fpaths: with open(file, encoding="utf-8") as f: problem = json.load(f) + + # continue if problem is already resolved, else perform checks to see if delay is accounted for if problem["resolved"]: continue - elif not problem["resolved"]: - # check if delay has been accounted for in the new schedule (at waypoint immediately after problem waypoint; or first waypoint if pre-departure problem) + else: delay_duration = timedelta( hours=float(problem["delay_duration_hours"]) ) - problem_waypoint = ( - new_schedule.waypoints[0] - if problem["problem_waypoint_i"] is None - else new_schedule.waypoints[problem["problem_waypoint_i"]] - ) - - # pre-departure problem: check that whole delay duration has been added to first waypoint time (by testing against past schedule) - if problem["problem_waypoint_i"] is None: - time_diff = ( - problem_waypoint.time - self.past_schedule.waypoints[0].time - ) - resolved = time_diff >= delay_duration - - # problem at a later waypoint: check new scheduled time exceeds sail time + delay duration + instrument deployment time (rather whole delay duration add-on, as there may be _some_ contingency time already scheduled) - else: - failed_waypoint = new_schedule.waypoints[self.failed_waypoint_i] - - scheduled_time = failed_waypoint.time - problem_waypoint.time + problem_waypoint = new_schedule.waypoints[self.problem_wp_i] + failed_waypoint = new_schedule.waypoints[failed_wp_i] + scheduled_time_diff = failed_waypoint.time - problem_waypoint.time - stationkeeping_time = _calc_wp_stationkeeping_time( + stationkeeping_time = ( + _calc_wp_stationkeeping_time( problem_waypoint.instrument, expedition, - ) # total time required to deploy instruments at problem waypoint - - sail_time = _calc_sail_time( - problem_waypoint.location, - failed_waypoint.location, - ship_speed_knots=expedition.ship_config.ship_speed_knots, - projection=PROJECTION, - )[0] - - min_time_required = ( - sail_time + delay_duration + stationkeeping_time ) + if not isinstance(problem_waypoint, Port) + else timedelta(0) + ) + + sail_time = _calc_sail_time( + problem_waypoint.location, + failed_waypoint.location, + ship_speed_knots=expedition.ship_config.ship_speed_knots, + projection=PROJECTION, + )[0] - resolved = scheduled_time >= min_time_required + min_time_required = sail_time + delay_duration + stationkeeping_time - if resolved: + if scheduled_time_diff >= min_time_required: print( "\n\n🎉 Previous problem has been resolved in the schedule.\n" ) @@ -149,37 +143,18 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: else: problem_wp_str = ( "in-port" - if problem["problem_waypoint_i"] is None - else f"at waypoint {problem['problem_waypoint_i'] + 1}" - ) - affected_wp_str = ( - "1" - if problem["problem_waypoint_i"] is None - else f"{problem['problem_waypoint_i'] + 2}" - ) - time_elapsed = ( - (sail_time + delay_duration + stationkeeping_time) - if problem["problem_waypoint_i"] is not None - else delay_duration - ) - failed_waypoint_time = ( - failed_waypoint.time - if problem["problem_waypoint_i"] is not None - else new_schedule.waypoints[0].time - ) - current_time = ( - problem_waypoint.time + time_elapsed - if problem["problem_waypoint_i"] is not None - else self.past_schedule.waypoints[0].time + time_elapsed + if problem["problem_wp_i"] == 0 # i.e. pre-departure + else f"at waypoint {public_problem_wp}" ) + time_elapsed = sail_time + delay_duration + stationkeeping_time raise CheckpointError( f"The problem encountered in previous simulation has not been resolved in the schedule! Please adjust the schedule to account for delays caused by the problem (by using `virtualship plan` or directly editing the {EXPEDITION} file).\n\n" - f"The problem was associated with a delay duration of {problem['delay_duration_hours']} hours {problem_wp_str} (meaning waypoint {affected_wp_str} could not be reached in time). " - f"Currently, the ship would reach waypoint {affected_wp_str} at {current_time}, but the scheduled time is {failed_waypoint_time}." + f"The problem was associated with a delay duration of {problem['delay_duration_hours']} hours {problem_wp_str} (meaning waypoint {public_failed_wp} could not be reached in time). " + f"Currently, the ship would reach waypoint {public_failed_wp} at {problem_waypoint.time + time_elapsed}, but the scheduled time is {failed_waypoint.time}." + ( - f"\n\nHint: don't forget to factor in the time required to deploy the instruments {problem_wp_str} when rescheduling waypoint {affected_wp_str}." - if problem["problem_waypoint_i"] is not None + f"\n\nHint: don't forget to factor in the time required to deploy the instruments {problem_wp_str} when rescheduling waypoint {public_failed_wp}." + if problem["problem_wp_i"] != 0 else "" ) ) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 5b519316..64b74588 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -17,6 +17,7 @@ _calc_sail_time, _calc_wp_stationkeeping_time, _get_bathy_data, + _get_public_wp, _validate_numeric_to_timedelta, get_supported_sensors, register_instrument_config, @@ -76,12 +77,6 @@ def get_instruments(self) -> set[InstrumentType]: def _annotate(self): """Add port/waypoint comments/annotations to the expedition.yaml file.""" - assert isinstance(self.schedule.waypoints[0], Port) & isinstance( - self.schedule.waypoints[-1], Port - ), ( - "First and last waypoints must be Ports." - ) # commenting logic below assumes first and last waypoints are ports - raw = yaml.dump(self.model_dump(by_alias=True), default_flow_style=False) lines = raw.splitlines(keepends=True) @@ -130,24 +125,21 @@ def verify( *, from_data: Path | None = None, ) -> None: - """ - Verify the feasibility and correctness of the schedule's waypoints. - - This method checks various conditions to ensure the schedule is valid: - 1. At least one waypoint is provided. - 2. The first waypoint has a specified time. - 3. Waypoint times are in ascending order. - 4. All waypoints are in water (not on land). - 5. The ship can arrive on time at each waypoint given its speed. - """ + """Verify the feasibility and correctness of the schedule's waypoints.""" print("\nVerifying route... ") - if len(self.waypoints) == 0: - raise ScheduleError("At least one waypoint must be provided.") + # first and last waypoints are Ports + assert isinstance(self.waypoints[0], Port) & isinstance( + self.waypoints[-1], Port + ), "First and last waypoints must be Ports." - # check first waypoint has a time + # has at least one non-port waypoint + if not any(isinstance(wp, Waypoint) for wp in self.waypoints): + raise ScheduleError("At least one non-port waypoint must be provided.") + + # check departure port has a time if self.waypoints[0].time is None: - raise ScheduleError("First waypoint must have a specified time.") + raise ScheduleError("Departure port must have a specified time.") # check waypoint times are in ascending order timed_waypoints = [wp for wp in self.waypoints if wp.time is not None] @@ -156,11 +148,12 @@ def verify( ] if not all(checks): invalid_i = [i for i, c in enumerate(checks) if c] + public_wps = [_get_public_wp(i, self.waypoints) for i in invalid_i] raise ScheduleError( - f"Waypoint(s) {', '.join(f'#{i + 1}' for i in invalid_i)}: each waypoint should be timed after all previous waypoints", + f"Waypoint(s) {', '.join(f'#{i}' for i in public_wps)}: each waypoint should be timed after all previous waypoints", ) - # check if all waypoints are in water using bathymetry data + # check if all non-port waypoints are in water using bathymetry data land_waypoints = [] if not ignore_land_test: try: @@ -173,6 +166,7 @@ def verify( for wp_i, wp in enumerate(self.waypoints): if isinstance(wp, Port): continue # ports are in harbour; skip bathymetry land check + public_wp = _get_public_wp(wp_i, self.waypoints) try: value = bathymetry_field.eval( np.float64(0.0), # time @@ -181,15 +175,15 @@ def verify( wp.location.lon, ) if value == 0.0 or (isinstance(value, float) and np.isnan(value)): - land_waypoints.append((wp_i, wp)) + land_waypoints.append((public_wp, wp)) except Exception as e: raise ScheduleError( - f"Waypoint #{wp_i + 1} at location {wp.location} could not be evaluated against bathymetry data. \n\n Original error: {e}" + f"Waypoint #{public_wp} at location {wp.location} could not be evaluated against bathymetry data. \n\n Original error: {e}" ) from e if len(land_waypoints) > 0: raise ScheduleError( - f"The following waypoint(s) throw(s) error(s): {['#' + str(wp_i + 1) + ' ' + str(wp) for (wp_i, wp) in land_waypoints]}\n\nINFO: They are likely on land (bathymetry data cannot be interpolated to their location(s)).\n" + f"The following waypoint(s) throw(s) error(s): {['#' + str(public_wp) + ' ' + str(wp) for (public_wp, wp) in land_waypoints]}\n\nINFO: They are likely on land (bathymetry data cannot be interpolated to their location(s)).\n" ) # check that ship will arrive on time at each waypoint (in case no unexpected event happen) @@ -214,8 +208,13 @@ def verify( if wp_next.time is None: time = arrival_time elif arrival_time > wp_next.time: + affected = ( + f"waypoint {_get_public_wp(wp_i + 1, self.waypoints)}" # +1 to get next + if not isinstance(wp_next, Port) + else "the final port of arrival" + ) raise ScheduleError( - f"Waypoint planning is not valid: would arrive too late at waypoint {wp_i + 2}. " + f"Waypoint planning is not valid: would arrive too late at {affected}. " f"Location: {wp_next.location} Time: {wp_next.time}. " f"Currently projected to arrive at: {arrival_time}." ) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 10f5993a..f4f17999 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -459,18 +459,21 @@ def _get_waypoint_latlons(waypoints): def _get_instrument_relevant_waypoints(waypoints, instrument_type) -> list: """Subset of waypoints that are relevant to this `instrument_type`.""" + from virtualship.models import Port # avoid circular import problems + if instrument_type.is_underway: return list(waypoints) relevant = [] for wp in waypoints: - wp_instruments = ( - wp.instrument - if isinstance(wp.instrument, list) - else ([wp.instrument] if wp.instrument else []) - ) - if instrument_type in wp_instruments: - relevant.append(wp) + if not isinstance(wp, Port): + wp_instruments = ( + wp.instrument + if isinstance(wp.instrument, list) + else ([wp.instrument] if wp.instrument else []) + ) + if instrument_type in wp_instruments: + relevant.append(wp) return relevant or list(waypoints) @@ -557,6 +560,25 @@ def build_particle_class_from_sensors( return Particle.add_variable(nonsensor_variables + sensor_variables) +def _get_public_wp(raw_wp_i: int | None, waypoints: list) -> int | None: + """ + Get the public waypoint number for a given raw waypoint index (accounting for Port waypoints). + + Note, the returned number is not an index, rather it corresponds to Waypoint numbers ignoring Ports (which are not waypoints from the user's perspective). + """ + from virtualship.models.expedition import Port # avoid circular import + + port_wps = [i for i, wp in enumerate(waypoints) if isinstance(wp, Port)] + non_port_wps = [i for i in range(len(waypoints)) if i not in port_wps] + + if raw_wp_i in port_wps: + public_wp = None # Port waypoints do not have public waypoint numbers + else: + public_wp = non_port_wps.index(raw_wp_i) + 1 + + return public_wp + + # ===================================================== # SECTION: misc. # ===================================================== From 9f63dc3ad07ea5752a3008134a55c19e2fca83e3 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 7 Sep 2026 17:06:03 +0100 Subject: [PATCH 136/191] first steps update plan tool to take port waypoints --- src/virtualship/cli/_plan.py | 363 ++++++++++++++++++----------------- tests/cli/test_plan.py | 2 + 2 files changed, 184 insertions(+), 181 deletions(-) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index 9446fb6f..a54c21fc 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -43,6 +43,7 @@ Waypoint, XBTConfig, ) +from virtualship.models.expedition import Port from virtualship.utils import EXPEDITION, _get_waypoint_latlons UNEXPECTED_MSG_ONSAVE = ( @@ -613,10 +614,13 @@ def show_invalid_reasons(self, event: Input.Changed) -> None: @on(Button.Pressed, "#add_waypoint") def add_waypoint(self) -> None: - """Add a new waypoint to the schedule. Copies time from last waypoint if possible (Lat/lon and instruments blank).""" + """Add a new waypoint to the schedule (N.B. ports always remain). Copies time from last waypoint if possible (Lat/lon and instruments blank).""" try: - if self.expedition.schedule.waypoints: - last_wp = self.expedition.schedule.waypoints[-1] + #! TODO: add check that any schedule ingested by Plan has ports! + wps = self.expedition.schedule.waypoints + if wps: + non_port_wps = [wp for wp in wps if not isinstance(wp, Port)] + last_wp = non_port_wps[-1] new_time = last_wp.time if last_wp.time else None new_wp = Waypoint( location=Location( @@ -632,7 +636,12 @@ def add_waypoint(self) -> None: time=None, instrument=[], ) - self.expedition.schedule.waypoints.append(new_wp) + + # add waypoint before the last port (arrival port) if it exists, otherwise at the end + insert_index = next( + (i for i, wp in reversed(list(enumerate(wps))) if isinstance(wp, Port)) + ) # just before arrival port + self.expedition.schedule.waypoints.insert(insert_index, new_wp) self.refresh_waypoint_widgets() except Exception as e: @@ -640,10 +649,18 @@ def add_waypoint(self) -> None: @on(Button.Pressed, "#remove_waypoint") def remove_waypoint(self) -> None: - """Remove the last waypoint from the schedule.""" + """Remove the last waypoint (non-port) from the schedule.""" try: - if self.expedition.schedule.waypoints: - self.expedition.schedule.waypoints.pop() + wps = self.expedition.schedule.waypoints + if wps: + last_wp_index = next( + ( + i + for i, wp in reversed(list(enumerate(wps))) + if isinstance(wp, Waypoint) + ) + ) + self.expedition.schedule.waypoints.pop(last_wp_index) self.refresh_waypoint_widgets() else: self.notify("No waypoints to remove.", severity="error", timeout=5) @@ -748,150 +765,146 @@ def __init__(self, waypoint: Waypoint, index: int): self.waypoint = waypoint self.index = index + def _get_coord_value(self, coord: float | None) -> str: + """Return coordinate as string or empty string if None.""" + return str(coord) if coord is not None else "" + + def _get_minute_options(self) -> list[tuple[str, int]]: + """Generate minute options, inserting current minute if non-multiple of 5.""" + options = {(f"{m:02d}", m) for m in range(0, 60, 5)} + if self.waypoint.time and self.waypoint.time.minute % 5 != 0: + m = self.waypoint.time.minute + options.add((f"{m:02d}", m)) + return sorted(list(options), key=lambda x: x[1]) + + def _yield_coordinate_input( + self, label: str, field: str, validator_fn, placeholder: str, wp_id: int + ) -> ComposeResult: + """Yields a labeled coordinate input with its validation error label.""" + val = getattr(self.waypoint.location, field, None) + + yield Label(f" {label}:") + yield Input( + id=f"wp{wp_id}_{field}", + value=self._get_coord_value(val), + validators=[ + Function( + validator_fn, + f"INVALID: value must be {validator_fn.__doc__.lower()}", + ) + ], + type="number", + placeholder=placeholder, + classes=f"{field}itude-input", + ) + yield Label( + "", + id=f"validation-failure-label-wp{wp_id}_{field}", + classes="-hidden validation-failure", + ) + + def _yield_time_selectors(self, wp_id: int) -> ComposeResult: + """Yields year, month, day, hour, and minute Select controls.""" + time = self.waypoint.time + + yield Label("Year:") + yield Select( + [(str(y), y) for y in range(1993, datetime.datetime.now().year + 1)], + id=f"wp{wp_id}_year", + value=time.year if time else Select.NULL, + prompt="YYYY", + classes="year-select", + ) + yield Label("Month:") + yield Select( + [(f"{m:02d}", m) for m in range(1, 13)], + id=f"wp{wp_id}_month", + value=time.month if time else Select.NULL, + prompt="MM", + classes="month-select", + ) + yield Label("Day:") + yield Select( + [(f"{d:02d}", d) for d in range(1, 32)], + id=f"wp{wp_id}_day", + value=time.day if time else Select.NULL, + prompt="DD", + classes="day-select", + ) + yield Label("Hour:") + yield Select( + [(f"{h:02d}", h) for h in range(24)], + id=f"wp{wp_id}_hour", + value=time.hour if time else Select.NULL, + prompt="hh", + classes="hour-select", + ) + yield Label("Min:") + yield Select( + self._get_minute_options(), + id=f"wp{wp_id}_minute", + value=time.minute if time else Select.NULL, + prompt="mm", + classes="minute-select", + ) + + def _yield_instrument_controls(self, wp_id: int) -> ComposeResult: + """Yields instrument controls if waypoint is not a Port.""" + yield Label("Instruments:") + + for instrument in [i for i in InstrumentType if not i.is_underway]: + is_selected = instrument in (self.waypoint.instrument or []) + with Horizontal(): + yield Label(instrument.value) + # Matches expected #inst_ prefix or wp-indexed switch ID + yield Switch( + value=is_selected, + id=f"wp{wp_id}_{instrument.value}", + ) + + if instrument.value == "DRIFTER": + yield Label("Count") + yield Input( + id=f"wp{wp_id}_drifter_count", + value=str(self.get_drifter_count() if is_selected else ""), + type="integer", + placeholder="# of drifters", + validators=Integer( + minimum=1, + failure_description="INVALID: value must be > 0", + ), + classes="drifter-count-input", + ) + yield Label( + "", + id=f"validation-failure-label-wp{wp_id}_drifter_count", + classes="-hidden validation-failure", + ) + def compose(self) -> ComposeResult: try: with Collapsible( - title=f"[b]Waypoint {self.index + 1}[/b]", - collapsed=True, - id=f"wp{self.index + 1}", + title=self.get_title(), collapsed=True, id=f"wp{self.index}" ): if self.index > 0: yield Button( - "Copy Time & Instruments from Previous", + self.get_copy_button_text(), id=f"wp{self.index}_copy", variant="warning", ) - yield Label("Location:") - yield Label(" Latitude:") - yield Input( - id=f"wp{self.index}_lat", - value=str(self.waypoint.location.lat) - if self.waypoint.location.lat - is not None # is not None to handle if lat is 0.0 - else "", - validators=[ - Function( - is_valid_lat, - f"INVALID: value must be {is_valid_lat.__doc__.lower()}", - ) - ], - type="number", - placeholder="°N", - classes="latitude-input", - ) - yield Label( - "", - id=f"validation-failure-label-wp{self.index}_lat", - classes="-hidden validation-failure", - ) - yield Label(" Longitude:") - yield Input( - id=f"wp{self.index}_lon", - value=str(self.waypoint.location.lon) - if self.waypoint.location.lon - is not None # is not None to handle if lon is 0.0 - else "", - validators=[ - Function( - is_valid_lon, - f"INVALID: value must be {is_valid_lon.__doc__.lower()}", - ) - ], - type="number", - placeholder="°E", - classes="longitude-input", + yield Label("Location:") + yield from self._yield_coordinate_input( + "Latitude", "lat", is_valid_lat, "°N", self.index ) - yield Label( - "", - id=f"validation-failure-label-wp{self.index}_lon", - classes="-hidden validation-failure", + yield from self._yield_coordinate_input( + "Longitude", "lon", is_valid_lon, "°E", self.index ) yield Label("Time:") with Horizontal(): - yield Label("Year:") - yield Select( - [ - (str(year), year) - for year in range( - 1993, - datetime.datetime.now().year + 1, - ) - ], - id=f"wp{self.index}_year", - value=int(self.waypoint.time.year) - if self.waypoint.time - else Select.NULL, - prompt="YYYY", - classes="year-select", - ) - yield Label("Month:") - yield Select( - [(f"{m:02d}", m) for m in range(1, 13)], - id=f"wp{self.index}_month", - value=int(self.waypoint.time.month) - if self.waypoint.time - else Select.NULL, - prompt="MM", - classes="month-select", - ) - yield Label("Day:") - yield Select( - [(f"{d:02d}", d) for d in range(1, 32)], - id=f"wp{self.index}_day", - value=int(self.waypoint.time.day) - if self.waypoint.time - else Select.NULL, - prompt="DD", - classes="day-select", - ) - yield Label("Hour:") - yield Select( - [(f"{h:02d}", h) for h in range(24)], - id=f"wp{self.index}_hour", - value=int(self.waypoint.time.hour) - if self.waypoint.time - else Select.NULL, - prompt="hh", - classes="hour-select", - ) - yield Label("Min:") - minute_options = [(f"{m:02d}", m) for m in range(0, 60, 5)] - minute_value = ( - int(self.waypoint.time.minute) - if self.waypoint.time - else Select.NULL - ) + yield from self._yield_time_selectors(self.index) - # if the current minute is not a multiple of 5, add it to the options - if ( - self.waypoint.time - and self.waypoint.time.minute % 5 != 0 - and ( - f"{self.waypoint.time.minute:02d}", - self.waypoint.time.minute, - ) - not in minute_options - ): - minute_options = [ - ( - f"{self.waypoint.time.minute:02d}", - self.waypoint.time.minute, - ) - ] + minute_options - - minute_options = sorted(minute_options, key=lambda x: x[1]) - - yield Select( - minute_options, - id=f"wp{self.index}_minute", - value=minute_value, - prompt="mm", - classes="minute-select", - ) - - # fmt: off yield Horizontal( Button("+1 day", id="plus_one_day", variant="primary"), Button("+1 hour", id="plus_one_hour", variant="primary"), @@ -901,47 +914,32 @@ def compose(self) -> ComposeResult: Button("-30 minutes", id="minus_thirty_minutes", variant="default"), classes="time-adjust-buttons", ) - # fmt: on - - yield Label("Instruments:") - for instrument in [i for i in InstrumentType if not i.is_underway]: - is_selected = instrument in (self.waypoint.instrument or []) - with Horizontal(): - yield Label(instrument.value) - yield Switch( - value=is_selected, id=f"wp{self.index}_{instrument.value}" - ) - if instrument.value == "DRIFTER": - yield Label("Count") - yield Input( - id=f"wp{self.index}_drifter_count", - value=str( - self.get_drifter_count() if is_selected else "" - ), - type="integer", - placeholder="# of drifters", - validators=Integer( - minimum=1, - failure_description="INVALID: value must be > 0", - ), - classes="drifter-count-input", - ) - yield Label( - "", - id=f"validation-failure-label-wp{self.index}_drifter_count", - classes="-hidden validation-failure", - ) - - yield Horizontal( - Button( - "Remove Waypoint", id=f"wp{self.index}_remove", variant="error" + if not isinstance(self.waypoint, Port): + yield from self._yield_instrument_controls() + yield Horizontal( + Button( + "Remove Waypoint", + id=f"wp{self.index}_remove", + variant="error", + ) ) - ) except Exception as e: raise UnexpectedError(unexpected_msg_compose(e)) from None + def get_title(self) -> str: + if isinstance(self.waypoint, Port): + return "Port of Departure" if self.index == 0 else "Port of Arrival" + else: + return f"Waypoint {self.index}" + + def get_copy_button_text(self) -> str: + if isinstance(self.waypoint, Port): + return "Copy Time from Previous" + else: + return "Copy Time & Instruments from Previous" + def get_drifter_count(self) -> int: return sum( 1 for inst in self.waypoint.instrument if inst == InstrumentType.DRIFTER @@ -968,17 +966,20 @@ def copy_from_previous(self) -> None: else: curr.value = prev.value - for instrument in [ - inst for inst in InstrumentType if not inst.is_underway - ]: - prev_switch = schedule_editor.query_one( - f"#wp{self.index - 1}_{instrument.value}" - ) - curr_switch = self.query_one( - f"#wp{self.index}_{instrument.value}" - ) - if prev_switch and curr_switch: - curr_switch.value = prev_switch.value + if not isinstance( + self.waypoint, Port + ): # only copy instruments for non-port waypoints + for instrument in [ + inst for inst in InstrumentType if not inst.is_underway + ]: + prev_switch = schedule_editor.query_one( + f"#wp{self.index - 1}_{instrument.value}" + ) + curr_switch = self.query_one( + f"#wp{self.index}_{instrument.value}" + ) + if prev_switch and curr_switch: + curr_switch.value = prev_switch.value # hard update self.waypoint.time to match new values as shown in UI year = int(self.query_one(f"#wp{self.index}_year").value) diff --git a/tests/cli/test_plan.py b/tests/cli/test_plan.py index ec994ae6..a38d61e9 100644 --- a/tests/cli/test_plan.py +++ b/tests/cli/test_plan.py @@ -23,6 +23,8 @@ NEW_LAT = "0.015" NEW_LON = "0.015" +# TODO: new test that the check that there's Ports works + def _make_expedition( tmpdir: Path, From 4c1b9e689a8074296d206851c5a7ef216818c008 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 08:58:12 +0200 Subject: [PATCH 137/191] add/move some structural schedule verfication checks to pydantic field validators --- src/virtualship/models/expedition.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 64b74588..654f3564 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -54,6 +54,7 @@ def from_yaml(cls, file_path: str) -> Expedition: def get_instruments(self) -> set[InstrumentType]: """Return a set of unique InstrumentType enums used in the expedition.""" instruments_in_expedition = [] + # from waypoints for waypoint in self.schedule.waypoints: if isinstance(waypoint, Port): @@ -117,6 +118,18 @@ class Schedule(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") + @pydantic.field_validator("waypoints", mode="after") + @classmethod + def _wp_ports(cls, value: list[Port | Waypoint]) -> None: + """First and last waypoints are Ports, plus has at least one non-port waypoint.""" + if not isinstance(value[0], Port) & isinstance(value[-1], Port): + raise ScheduleError( + "First and last waypoints must be Ports (of arrival/departure)." + ) + if not any(isinstance(wp, Waypoint) for wp in value): + raise ScheduleError("At least one non-port waypoint must be provided.") + return value + def verify( self, ship_speed: float, @@ -128,15 +141,6 @@ def verify( """Verify the feasibility and correctness of the schedule's waypoints.""" print("\nVerifying route... ") - # first and last waypoints are Ports - assert isinstance(self.waypoints[0], Port) & isinstance( - self.waypoints[-1], Port - ), "First and last waypoints must be Ports." - - # has at least one non-port waypoint - if not any(isinstance(wp, Waypoint) for wp in self.waypoints): - raise ScheduleError("At least one non-port waypoint must be provided.") - # check departure port has a time if self.waypoints[0].time is None: raise ScheduleError("Departure port must have a specified time.") From 3aa120642b0b7e281de4f523867b57616a1c49bd Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 09:16:33 +0200 Subject: [PATCH 138/191] add fieldsets rather than building list --- src/virtualship/instruments/base.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 4698ee47..3fe99f89 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -193,7 +193,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: Includes an intermediate step of writing to tmp files, as per https://github.com/Parcels-code/parcels-benchmarks/pull/49 TODO: the need for this step may be removed as Parcels x copernicusmarine integration improves, tracked in https://github.com/Parcels-code/Parcels/issues/2756 and xref'd in VirtualShip #357 (https://github.com/Parcels-code/virtualship/issues/357) """ - fieldsets_list = [] + combined_fieldset = None keys = list(self.variables.keys()) time_buffer = self.fetch_spec.time_buffer @@ -239,11 +239,7 @@ def _generate_fieldset(self) -> parcels.FieldSet: if not self.instrument_type.is_underway: fs = fs.to_windowed_arrays() - fieldsets_list.append(fs) - - combined_fieldset = fieldsets_list[0] - for fs in fieldsets_list[1:]: - combined_fieldset = combined_fieldset + fs + combined_fieldset = combined_fieldset + fs if combined_fieldset else fs return combined_fieldset From 3ee8d0402d3c4c48521ce6495c6d1f236bd59e3c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 09:23:02 +0200 Subject: [PATCH 139/191] fieldset[particles.x, particles.y, ...] notation -> fieldset[particles] --- src/virtualship/instruments/argo_float.py | 14 ++------------ src/virtualship/instruments/ctd.py | 20 +++++++++----------- src/virtualship/instruments/drifter.py | 4 +--- src/virtualship/instruments/xbt.py | 4 +--- 4 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 1376886e..2321f4a2 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -166,12 +166,7 @@ def _argo_sample_temperature(particles, fieldset): phase_mask = particles.cycle_phase == 3 depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] - sampling_particles.temperature = fieldset.T[ - sampling_particles.t, - sampling_particles.z, - sampling_particles.y, - sampling_particles.x, - ] + sampling_particles.temperature = fieldset.T[sampling_particles] def _argo_sample_salinity(particles, fieldset): @@ -179,12 +174,7 @@ def _argo_sample_salinity(particles, fieldset): phase_mask = particles.cycle_phase == 3 depth_mask = particles.z < particles.min_depth # still ascending sampling_particles = particles[np.logical_and(phase_mask, depth_mask)] - sampling_particles.salinity = fieldset.S[ - sampling_particles.t, - sampling_particles.z, - sampling_particles.y, - sampling_particles.x, - ] + sampling_particles.salinity = fieldset.S[sampling_particles] # ===================================================== diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 1257c0f3..f05a846f 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -54,44 +54,42 @@ class CTD: def _sample_temperature(particles, fieldset): - particles.temperature = fieldset.T[ - particles.t, particles.z, particles.y, particles.x - ] + particles.temperature = fieldset.T[particles] def _sample_salinity(particles, fieldset): - particles.salinity = fieldset.S[particles.t, particles.z, particles.y, particles.x] + particles.salinity = fieldset.S[particles] ## bgc variables def _sample_o2(particles, fieldset): - particles.o2 = fieldset.o2[particles.t, particles.z, particles.y, particles.x] + particles.o2 = fieldset.o2[particles] def _sample_chlorophyll(particles, fieldset): - particles.chl = fieldset.chl[particles.t, particles.z, particles.y, particles.x] + particles.chl = fieldset.chl[particles] def _sample_nitrate(particles, fieldset): - particles.no3 = fieldset.no3[particles.t, particles.z, particles.y, particles.x] + particles.no3 = fieldset.no3[particles] def _sample_phosphate(particles, fieldset): - particles.po4 = fieldset.po4[particles.t, particles.z, particles.y, particles.x] + particles.po4 = fieldset.po4[particles] def _sample_ph(particles, fieldset): - particles.ph = fieldset.ph[particles.t, particles.z, particles.y, particles.x] + particles.ph = fieldset.ph[particles] def _sample_phytoplankton(particles, fieldset): - particles.phyc = fieldset.phyc[particles.t, particles.z, particles.y, particles.x] + particles.phyc = fieldset.phyc[particles] def _sample_primary_production(particles, fieldset): - particles.nppv = fieldset.nppv[particles.t, particles.z, particles.y, particles.x] + particles.nppv = fieldset.nppv[particles] ## cast diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 9fd9493f..c08dcedc 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -49,9 +49,7 @@ class Drifter: def _sample_temperature(particles, fieldset): - particles.temperature = fieldset.T[ - particles.t, particles.z, particles.y, particles.x - ] + particles.temperature = fieldset.T[particles] def _check_lifetime(particles, fieldset): diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index b6878bf5..db279390 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -52,9 +52,7 @@ class XBT: def _sample_temperature(particles, fieldset): - particles.temperature = fieldset.T[ - particles.t, particles.z, particles.y, particles.x - ] + particles.temperature = fieldset.T[particles] def _xbt_cast(particles, fieldset): From 0e8cd8873740a882f8074c0f10e0983691f67ee0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 10:00:00 +0200 Subject: [PATCH 140/191] np.where() -> boolean indexing for all kernels --- src/virtualship/instruments/ctd.py | 22 ++++++++-------------- src/virtualship/instruments/drifter.py | 7 ++----- src/virtualship/instruments/xbt.py | 12 ++++-------- 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index f05a846f..596f6625 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -96,24 +96,18 @@ def _sample_primary_production(particles, fieldset): def _ctd_cast(particles, fieldset): - particles_lowering = particles[particles.raising == 0] - particles_raising = particles[particles.raising == 1] + ptcls_lowering = particles[particles.raising == 0] + ptcls_raising = particles[particles.raising == 1] # lowering - particles_lowering.dz += -particles_lowering.winch_speed * particles_lowering.dt - particles_lowering.raising = np.where( - particles_lowering.z + particles_lowering.dz < particles_lowering.max_depth, - 1, - particles_lowering.raising, - ) + ptcls_lowering.dz += -ptcls_lowering.winch_speed * ptcls_lowering.dt + next_phase = ptcls_lowering.z + ptcls_lowering.dz < ptcls_lowering.max_depth + ptcls_lowering.raising[next_phase] = 1 # raising - particles_raising.dz += particles_raising.winch_speed * particles_raising.dt - particles_raising.state = np.where( - particles_raising.z + particles_raising.dz > particles_raising.min_depth, - StatusCode.Delete, - particles_raising.state, - ) + ptcls_raising.dz += ptcls_raising.winch_speed * ptcls_raising.dt + finished = ptcls_raising.z + ptcls_raising.dz > ptcls_raising.min_depth + ptcls_raising.state[finished] = StatusCode.Delete # ===================================================== diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index c08dcedc..0f1b178b 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -56,11 +56,8 @@ def _check_lifetime(particles, fieldset): particles_wlifetime = particles[particles.has_lifetime == 1] particles_wlifetime.age += particles_wlifetime.dt - particles_wlifetime.state = np.where( - particles_wlifetime.age >= particles_wlifetime.lifetime, - StatusCode.Delete, - particles_wlifetime.state, - ) + finished = particles_wlifetime.age >= particles_wlifetime.lifetime + particles_wlifetime.state[finished] = StatusCode.Delete # ===================================================== diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index db279390..6237a7cc 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -65,16 +65,12 @@ def _xbt_cast(particles, fieldset): ) # delete particle if depth is exactly max_depth - particles.state = np.where( - particles.z == particles.max_depth, StatusCode.Delete, particles.state - ) + finished = particles.z == particles.max_depth + particles.state[finished] = StatusCode.Delete # set particle depth to max depth if it's too deep - particles.dz = np.where( - particles.z + particles.dz < particles.max_depth, - particles.max_depth - particles.z, - particles.dz, - ) + too_deep = particles.z + particles.dz < particles.max_depth + particles.dz[too_deep] = particles.max_depth - particles.z[too_deep] # ===================================================== From dc8874f70703219f2feec7f205e6199168adebf8 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:14:38 +0200 Subject: [PATCH 141/191] remove unnecessary np.float --- src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/models/expedition.py | 2 +- src/virtualship/utils.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 2321f4a2..72562424 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -275,7 +275,7 @@ def simulate(self, measurements, out_path) -> None: shallow_waypoints = {} for i, m in enumerate(measurements): loc_bathy = fieldset.bathymetry.eval( - t=np.float64(0), + t=0, z=0, y=m.spacetime.location.lat, x=m.spacetime.location.lon, diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index b7269373..79d45abb 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -139,7 +139,7 @@ def verify( for wp_i, wp in enumerate(self.waypoints): try: value = bathymetry_field.eval( - np.float64(0.0), # time + 0, # time 0, # depth (surface) wp.location.lat, wp.location.lon, diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index cd497657..a3c7ba6e 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -570,7 +570,7 @@ def _compute_max_depths(measurements, fieldset) -> list[float]: z=0, y=m.spacetime.location.lat, x=m.spacetime.location.lon, - t=np.float64(0), + t=0, )[0], ) for m in measurements From c9301233f9dc2eebe37c5ec0a75bd2a844ae9126 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:58:58 +0200 Subject: [PATCH 142/191] bump pixi up from old pinnings --- .github/workflows/ci.yml | 2 -- .readthedocs.yaml | 4 ++-- pixi.toml | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85a1f227..184e1206 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,6 @@ jobs: persist-credentials: false - uses: Parcels-code/pixi-lock/create-and-cache@38495788b79a5ff26009aecc15daa9a8310b8832 # v0.1.0 id: pixi-lock - with: - pixi-version: v0.70.2 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: pixi-lock diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 533a8783..a8b751be 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -6,8 +6,8 @@ build: jobs: create_environment: - asdf plugin add pixi - - asdf install pixi 0.70.2 - - asdf global pixi 0.70.2 + - asdf install pixi latest + - asdf global pixi latest install: - pixi install -e docs build: diff --git a/pixi.toml b/pixi.toml index a429025d..4514de47 100644 --- a/pixi.toml +++ b/pixi.toml @@ -4,14 +4,14 @@ preview = ["pixi-build"] channels = ["conda-forge"] platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] exclude-newer = "5d" # security pre-caution against compromised packages -requires-pixi = ">=0.67.0,<0.71.0" +requires-pixi = ">=0.72.0" [package] name = "virtualship" version = "dynamic" # dynamic versioning needs better support in pixi https://github.com/prefix-dev/pixi/issues/2923#issuecomment-2598460666 . Putting `version = "dynamic"` here for now until pixi recommends something else. [package.build] -backend = { name = "pixi-build-python", version = "0.4.*" } +backend = { name = "pixi-build-python", version = "0.*" } [package.host-dependencies] setuptools = "*" From 0160d44ed37bdd9fb35c3e86b487d5dcd40888f1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 14:53:12 +0200 Subject: [PATCH 143/191] prevent ctd from going out of bounds by exceeding max/min depths; update tests with more tolerance for interpolation discrepancies --- src/virtualship/instruments/ctd.py | 4 ++-- tests/instruments/test_ctd.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 596f6625..f2bf7d8c 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -101,12 +101,12 @@ def _ctd_cast(particles, fieldset): # lowering ptcls_lowering.dz += -ptcls_lowering.winch_speed * ptcls_lowering.dt - next_phase = ptcls_lowering.z + ptcls_lowering.dz < ptcls_lowering.max_depth + next_phase = ptcls_lowering.z + ptcls_lowering.dz <= ptcls_lowering.max_depth ptcls_lowering.raising[next_phase] = 1 # raising ptcls_raising.dz += ptcls_raising.winch_speed * ptcls_raising.dt - finished = ptcls_raising.z + ptcls_raising.dz > ptcls_raising.min_depth + finished = ptcls_raising.z + ptcls_raising.dz >= ptcls_raising.min_depth ptcls_raising.state[finished] = StatusCode.Delete diff --git a/tests/instruments/test_ctd.py b/tests/instruments/test_ctd.py index 9e0a803e..3e63a8bd 100644 --- a/tests/instruments/test_ctd.py +++ b/tests/instruments/test_ctd.py @@ -257,9 +257,9 @@ def test_simulate_ctds(tmpdir) -> None: obs_value = obs[var].item() exp_value = exp[var] - assert np.isclose(obs_value, exp_value), ( - f"Observation incorrect {ctd_i=} {loc=} {var=} {obs_value=} {exp_value=}." - ) + assert np.isclose(obs_value, exp_value, rtol=0.02), ( + f"Observation incorrect {ctd_i=} {loc=} {var=} {obs_value=} {exp_value=}.", + ) # rtol to handle interpolation differences at the extreme ends of the depth range def test_ctd_sensor_config_active_variables() -> None: From a7ce809068e0725f7bcb728a7cd61aaa8faab712 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Tue, 8 Sep 2026 15:03:58 +0200 Subject: [PATCH 144/191] use raw datetime objects in psets --- src/virtualship/instruments/argo_float.py | 2 +- src/virtualship/instruments/ctd.py | 2 +- src/virtualship/instruments/drifter.py | 2 +- src/virtualship/instruments/xbt.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 72562424..dd686e81 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -309,7 +309,7 @@ def simulate(self, measurements, out_path) -> None: y=[argo.spacetime.location.lat for argo in measurements], x=[argo.spacetime.location.lon for argo in measurements], z=[min(argo.min_depth, grid_shallowest) for argo in measurements], - t=[np.datetime64(argo.spacetime.time) for argo in measurements], + t=[argo.spacetime.time for argo in measurements], min_depth=[min(argo.min_depth, grid_shallowest) for argo in measurements], max_depth=[argo.max_depth for argo in measurements], drift_depth=[argo.drift_depth for argo in measurements], diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index f2bf7d8c..50d641fd 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -194,7 +194,7 @@ def simulate(self, measurements, out_path) -> None: x=[ctd.spacetime.location.lon for ctd in measurements], y=[ctd.spacetime.location.lat for ctd in measurements], z=[ctd.min_depth for ctd in measurements], - t=[np.datetime64(ctd.spacetime.time) for ctd in measurements], + t=[ctd.spacetime.time for ctd in measurements], max_depth=max_depths, min_depth=[ctd.min_depth for ctd in measurements], winch_speed=[WINCH_SPEED for _ in measurements], diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 0f1b178b..440fc5ee 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -134,7 +134,7 @@ def simulate(self, measurements, out_path) -> None: y=lat_release, x=lon_release, z=[drifter.depth for drifter in measurements], - t=[np.datetime64(drifter.spacetime.time) for drifter in measurements], + t=[drifter.spacetime.time for drifter in measurements], has_lifetime=[ 1 if drifter.lifetime is not None else 0 for drifter in measurements ], diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 6237a7cc..fb810a65 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -151,7 +151,7 @@ def simulate(self, measurements, out_path) -> None: x=[xbt.spacetime.location.lon for xbt in measurements], y=[xbt.spacetime.location.lat for xbt in measurements], z=[xbt.min_depth for xbt in measurements], - t=[np.datetime64(xbt.spacetime.time) for xbt in measurements], + t=[xbt.spacetime.time for xbt in measurements], max_depth=max_depths, min_depth=[xbt.min_depth for xbt in measurements], fall_speed=[xbt.fall_speed for xbt in measurements], From adabe910b0159ea919734b4ff1345847d2a3450d Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 9 Sep 2026 09:17:09 +0200 Subject: [PATCH 145/191] fix bug when using local data: handle both depth_min and depth_max being None --- src/virtualship/instruments/base.py | 36 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 3fe99f89..14459512 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -171,18 +171,24 @@ def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" instrument_name = self.__class__.__name__.split("Instrument")[0] - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: - if self.verbose_progress: - with _SpinnerAutoStop(spinner): + TMP = True + + if TMP: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: + if self.verbose_progress: + with _SpinnerAutoStop(spinner): + self.simulate(measurements, out_path) + print("\n") + else: self.simulate(measurements, out_path) - print("\n") - else: - self.simulate(measurements, out_path) - spinner.ok("✅\n") + spinner.ok("✅\n") + + else: + self.simulate(measurements, out_path) def _generate_fieldset(self) -> parcels.FieldSet: """ @@ -309,7 +315,9 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: depth_min = self.fetch_spec.depth_min depth_max = self.fetch_spec.depth_max - if depth_min == depth_max: + both_none = depth_min is None and depth_max is None + + if depth_min == depth_max and not both_none: depth_sel = { "depth": [depth_min], "method": "nearest", @@ -322,7 +330,9 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: longitude=slice(min_lon_wbuf, max_lon_wbuf), latitude=slice(min_lat_wbuf, max_lat_wbuf), ) - # separate sel for depth to allow nearest selection if not using slices + + # separate sel (from lat, lon above) for depth to allow `nearest` selection if not using slices + # will leave as is if both_none, as intended ds = ds.sel(**depth_sel) return ds From 501410da508b23c2909f8263aea50a973613ac2e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 9 Sep 2026 09:21:29 +0200 Subject: [PATCH 146/191] remove broken/unnecessary warning filter --- src/virtualship/cli/main.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/virtualship/cli/main.py b/src/virtualship/cli/main.py index a055429f..a02a5ffb 100644 --- a/src/virtualship/cli/main.py +++ b/src/virtualship/cli/main.py @@ -1,15 +1,6 @@ -import warnings +import click -# TODO: remove this when Parcels v4 is no longer alpha and the warning is no longer issued -warnings.filterwarnings( - "ignore", - message="This is an alpha version of Parcels v4.*", - category=UserWarning, -) - -import click # noqa: E402 - -from . import commands # noqa: E402 +from . import commands @click.group() From 3776a6e61b157a8257d86479f8de5a80d22ee66c Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 9 Sep 2026 09:23:23 +0200 Subject: [PATCH 147/191] remove tmp dev spinner skipping --- src/virtualship/instruments/base.py | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index 14459512..f13a8338 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -171,24 +171,18 @@ def execute(self, measurements: list, out_path: str | Path) -> None: """Run instrument simulation.""" instrument_name = self.__class__.__name__.split("Instrument")[0] - TMP = True - - if TMP: - with yaspin( - text=f"Simulating {instrument_name} measurements... ", - side="right", - spinner=ship_spinner, - ) as spinner: - if self.verbose_progress: - with _SpinnerAutoStop(spinner): - self.simulate(measurements, out_path) - print("\n") - else: + with yaspin( + text=f"Simulating {instrument_name} measurements... ", + side="right", + spinner=ship_spinner, + ) as spinner: + if self.verbose_progress: + with _SpinnerAutoStop(spinner): self.simulate(measurements, out_path) - spinner.ok("✅\n") - - else: - self.simulate(measurements, out_path) + print("\n") + else: + self.simulate(measurements, out_path) + spinner.ok("✅\n") def _generate_fieldset(self) -> parcels.FieldSet: """ From 278e1250e63af7941e65defa36e6987bb4d5456f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:56:48 +0200 Subject: [PATCH 148/191] plan tool fixes: ignore wp instruments when Port --- src/virtualship/cli/_plan.py | 70 +++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index a54c21fc..a02e138a 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -44,7 +44,7 @@ XBTConfig, ) from virtualship.models.expedition import Port -from virtualship.utils import EXPEDITION, _get_waypoint_latlons +from virtualship.utils import EXPEDITION UNEXPECTED_MSG_ONSAVE = ( "Please ensure that:\n" @@ -566,16 +566,20 @@ def _update_schedule(self): int(self.query_one(f"#wp{i}_minute").value), 0, ) - wp.instrument = [] - for instrument in [inst for inst in InstrumentType if not inst.is_underway]: - switch_on = self.query_one(f"#wp{i}_{instrument.value}").value - if instrument.value == "DRIFTER" and switch_on: - count_str = self.query_one(f"#wp{i}_drifter_count").value - count = int(count_str) - assert count > 0 - wp.instrument.extend([InstrumentType.DRIFTER] * count) - elif switch_on: - wp.instrument.append(instrument) + + if not isinstance(wp, Port): + wp.instrument = [] + for instrument in [ + inst for inst in InstrumentType if not inst.is_underway + ]: + switch_on = self.query_one(f"#wp{i}_{instrument.value}").value + if instrument.value == "DRIFTER" and switch_on: + count_str = self.query_one(f"#wp{i}_drifter_count").value + count = int(count_str) + assert count > 0 + wp.instrument.extend([InstrumentType.DRIFTER] * count) + elif switch_on: + wp.instrument.append(instrument) @on(Input.Changed) def show_invalid_reasons(self, event: Input.Changed) -> None: @@ -616,7 +620,6 @@ def show_invalid_reasons(self, event: Input.Changed) -> None: def add_waypoint(self) -> None: """Add a new waypoint to the schedule (N.B. ports always remain). Copies time from last waypoint if possible (Lat/lon and instruments blank).""" try: - #! TODO: add check that any schedule ingested by Plan has ports! wps = self.expedition.schedule.waypoints if wps: non_port_wps = [wp for wp in wps if not isinstance(wp, Port)] @@ -916,7 +919,7 @@ def compose(self) -> ComposeResult: ) if not isinstance(self.waypoint, Port): - yield from self._yield_instrument_controls() + yield from self._yield_instrument_controls(self.index) yield Horizontal( Button( "Remove Waypoint", @@ -1084,6 +1087,7 @@ def sync_ui_waypoints(self): """Update the waypoints models with current UI values from the live UI inputs.""" expedition_editor = self.query_one(ExpeditionEditor) errors = [] + for i, wp in enumerate(expedition_editor.expedition.schedule.waypoints): try: wp.location = Location( @@ -1098,24 +1102,29 @@ def sync_ui_waypoints(self): int(expedition_editor.query_one(f"#wp{i}_minute").value), 0, ) - wp.instrument = [] - for instrument in [ - inst for inst in InstrumentType if not inst.is_underway - ]: - switch_on = expedition_editor.query_one( - f"#wp{i}_{instrument.value}", Switch - ).value - if instrument.value == "DRIFTER" and switch_on: - count_str = expedition_editor.query_one( - f"#wp{i}_drifter_count", Input + + if not isinstance(wp, Port): + wp.instrument = [] + + for instrument in [ + inst for inst in InstrumentType if not inst.is_underway + ]: + switch_on = expedition_editor.query_one( + f"#wp{i}_{instrument.value}", Switch ).value - count = int(count_str) - assert count > 0 - wp.instrument.extend([InstrumentType.DRIFTER] * count) - elif switch_on: - wp.instrument.append(instrument) + if instrument.value == "DRIFTER" and switch_on: + count_str = expedition_editor.query_one( + f"#wp{i}_drifter_count", Input + ).value + count = int(count_str) + assert count > 0 + wp.instrument.extend([InstrumentType.DRIFTER] * count) + elif switch_on: + wp.instrument.append(instrument) + except Exception as e: errors.append(f"Waypoint {i + 1}: {e}") + if errors: log_exception_to_file( Exception("\n".join(errors)), @@ -1142,11 +1151,6 @@ def save_pressed(self) -> None: self.sync_ui_waypoints() # call to ensure waypoint inputs are synced # verify schedule - _wp_lats, _wp_lons = ( - _get_waypoint_latlons( # TODO: Remove these since they aren't used? - expedition_editor.expedition.schedule.waypoints - ) - ) instruments_config = expedition_editor.expedition.instruments_config expedition_editor.expedition.schedule.verify( From 8dcf8f90cf41602eb519e8fa19dbaebbde839c34 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Mon, 14 Sep 2026 12:05:27 +0200 Subject: [PATCH 149/191] re-implement ADCP help button --- src/virtualship/cli/_plan.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index a02e138a..ad01ca64 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -761,6 +761,15 @@ def shallow_changed(self, event: Switch.Changed) -> None: deep = self.query_one("#adcp_deep", Switch) deep.value = False + @on(Button.Pressed, "#info_button") + def info_pressed(self) -> None: + self.notify( + "[b]SeaSeven[/b]:\nShallow ADCP profiler capable of providing information to a depth of 150 m every 4 meters (300kHz)" + "\n\n[b]OceanObserver[/b]:\nLong-range ADCP profiler capable of providing ~ 1000m of depth range every 24 meters (38kHz)", + severity="warning", + timeout=20, + ) + class WaypointWidget(Static): def __init__(self, waypoint: Waypoint, index: int): From 3536107412548cdd8e758818293fec500a15c698 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 10:43:48 +0200 Subject: [PATCH 150/191] adapt expedition/schedule model to use ports properly --- src/virtualship/models/expedition.py | 35 +++++++++++--- tests/expedition/test_expedition.py | 70 +++++++++++++++++++++------- 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 4dbb3131..75d0b4e4 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -141,9 +141,12 @@ def verify( """Verify the feasibility and correctness of the schedule's waypoints.""" print("\nVerifying route... ") - # check departure port has a time - if self.waypoints[0].time is None: - raise ScheduleError("Departure port must have a specified time.") + # is the departure port in use or a placeholder (i.e. all None)? + check_idx = 0 if self.departure_port_in_use else 1 + wp_str = "Departure port" if self.departure_port_in_use else "Waypoint 1" + + if self.waypoints[check_idx].time is None: + raise ScheduleError(f"{wp_str} must have a specified time.") # check waypoint times are in ascending order timed_waypoints = [wp for wp in self.waypoints if wp.time is not None] @@ -191,10 +194,16 @@ def verify( ) # check that ship will arrive on time at each waypoint (in case no unexpected event happen) - time = self.waypoints[0].time - for wp_i, (wp, wp_next) in enumerate( - zip(self.waypoints, self.waypoints[1:], strict=False) - ): + + dp_in_use = self.departure_port_in_use + ap_in_use = self.arrival_port_in_use + time = self.waypoints[0].time if dp_in_use else self.waypoints[1].time + + start_slice = 0 if dp_in_use else 1 + end_slice = len(self.waypoints) if ap_in_use else len(self.waypoints) - 1 + wps_in_use = self.waypoints[start_slice:end_slice] + + for wp_i, (wp, wp_next) in enumerate(itertools.pairwise(wps_in_use)): stationkeeping_time = _calc_wp_stationkeeping_time( wp.instrument if isinstance(wp, Waypoint) else None, instruments_config, @@ -227,6 +236,18 @@ def verify( print("... All good to go!") + @property + def departure_port_in_use(self) -> bool: + """Check if the departure port is in use (i.e., has a specified time and location), or is placeholder.""" + p = self.waypoints[0] + return all(v is not None for v in (p.time, p.location.lat, p.location.lon)) + + @property + def arrival_port_in_use(self) -> bool: + """Check if the arrival port is in use (i.e., has a specified time and location), or is placeholder.""" + p = self.waypoints[-1] + return all(v is not None for v in (p.time, p.location.lat, p.location.lon)) + class Port(pydantic.BaseModel): """A port stop: a location the ship visits with no instrument deployments made.""" diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index 456ab054..f3f4032e 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -17,6 +17,7 @@ Waypoint, _InstrumentConfigMixin, ) +from virtualship.models.expedition import Port from virtualship.utils import ( EXPEDITION, _get_example_expedition, @@ -165,23 +166,56 @@ def test_verify_on_land(): ) +def add_ports( + waypoints: list[Waypoint], + departure_port: Port | None = None, + arrival_port: Port | None = None, + start_time: datetime | None = None, +) -> list[Waypoint]: + """Add ports to the first and last in list of waypoints.""" + if departure_port is None: + departure_port = Port(location=Location(0, 0), time=start_time) + if arrival_port is None: + arrival_port = Port( + location=Location(1, 0), + time=start_time + timedelta(days=1) if start_time is not None else None, + ) + + return [departure_port] + waypoints + [arrival_port] + + @pytest.mark.parametrize( "schedule,error,match", [ pytest.param( - Schedule(waypoints=[]), + Schedule(waypoints=[Waypoint(location=Location(0, 0))]), + ScheduleError, + "First and last waypoints must be Ports (of arrival/departure).", + id="NoPorts", + ), + pytest.param( + Schedule( + add_ports( + waypoints=[ + Port(location=Location(0, 0)), + Port(location=Location(1, 0)), + ] + ) + ), ScheduleError, - "At least one waypoint must be provided.", + "At least one non-port waypoint must be provided.", id="NoWaypoints", ), pytest.param( Schedule( - waypoints=[ - Waypoint(location=Location(0, 0)), - Waypoint( - location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) - ), - ] + add_ports( + waypoints=[ + Waypoint(location=Location(0, 0)), + Waypoint( + location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) + ), + ] + ) ), ScheduleError, "First waypoint must have a specified time.", @@ -189,15 +223,17 @@ def test_verify_on_land(): ), pytest.param( Schedule( - waypoints=[ - Waypoint( - location=Location(0, 0), time=datetime(2022, 1, 2, 1, 0, 0) - ), - Waypoint(location=Location(0, 0)), - Waypoint( - location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) - ), - ] + add_ports( + waypoints=[ + Waypoint( + location=Location(0, 0), time=datetime(2022, 1, 2, 1, 0, 0) + ), + Waypoint(location=Location(0, 0)), + Waypoint( + location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) + ), + ] + ) ), ScheduleError, "Waypoint\\(s\\) : each waypoint should be timed after all previous waypoints", From 30999d76e414a02623aa514dad110fec6f7eac82 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 10:48:24 +0200 Subject: [PATCH 151/191] more informative error messaging --- src/virtualship/models/expedition.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 75d0b4e4..217e3e2b 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -226,10 +226,14 @@ def verify( if not isinstance(wp_next, Port) else "the final port of arrival" ) + + # TODO: add messaging of stationkeeping time to the error message, e.g. how much each instrument is taking... raise ScheduleError( f"Waypoint planning is not valid: would arrive too late at {affected}. " f"Location: {wp_next.location} Time: {wp_next.time}. " f"Currently projected to arrive at: {arrival_time}." + "\n\nHint: adding instruments may increase the amount of time spent stationary at a waypoints. " + "Have you ensured that your schedule includes sufficient time for taking measurements, e.g. CTD casts (in addition to the time it takes to sail between waypoints)?\n" ) else: time = wp_next.time From 059086a79e9e33cee99d9006a5033aa7ceb9e574 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 10:48:49 +0200 Subject: [PATCH 152/191] remove duplicate/redundant schedule verification checks --- .../expedition/simulate_schedule.py | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 75ab9a10..ac54ad4c 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -20,7 +20,7 @@ Spacetime, Waypoint, ) -from virtualship.utils import _calc_sail_time, _get_public_wp +from virtualship.utils import _calc_sail_time @dataclass @@ -102,9 +102,6 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: self._projection = projection self._expedition = expedition - assert self._expedition.schedule.waypoints[0].time is not None, ( - "Departure port must have a time." - ) self._time = expedition.schedule.waypoints[0].time self._location = expedition.schedule.waypoints[0].location @@ -116,23 +113,12 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: def simulate(self) -> ScheduleOk | ScheduleProblem: # TODO: instrument config mapping (as introduced in #269) should be helpful for refactoring here (i.e. #236)... - for wp_i, waypoint in enumerate(self._expedition.schedule.waypoints): + for waypoint in self._expedition.schedule.waypoints: # sail towards waypoint self._progress_time_traveling_towards(waypoint.location) - # check if waypoint was reached in time - # TODO: already tested in schedule.verify(), re-check here for robustness but could be removed if deemed redundant - if waypoint.time is not None and self._time > waypoint.time: - public_wp = _get_public_wp(wp_i, self._expedition.schedule.waypoints) - print( - f"\nWaypoint {public_wp} could not be reached in time. Current time: {self._time}. Waypoint time: {waypoint.time}." - "\n\nHave you ensured that your schedule includes sufficient time for taking measurements, e.g. CTD casts (in addition to the time it takes to sail between waypoints)?\n" - ) - return ScheduleProblem(self._time, wp_i) - else: - self._time = ( - waypoint.time - ) # wait at the waypoint until ship is scheduled to be there + # wait at the waypoint until ship is scheduled to be there + self._time = waypoint.time # note measurements made at waypoint time_passed = self._get_instrument_timescosts(waypoint) From 13a315df26535ac45f78f1a6995511cf98934215 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:19:59 +0200 Subject: [PATCH 153/191] filter out placeholder Port wps if necessary; add _verified internal flag to schedule object as safe guard --- src/virtualship/cli/_run.py | 8 +++--- .../expedition/simulate_schedule.py | 11 +++++--- src/virtualship/models/expedition.py | 26 +++++++++++++------ tests/expedition/test_expedition.py | 26 +++++++++++++++++++ tests/expedition/test_simulate_schedule.py | 23 ++++++++++++++++ 5 files changed, 79 insertions(+), 15 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 1adba075..7767309c 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -307,10 +307,10 @@ def _load_checkpoint(expedition_dir: Path) -> Checkpoint | None: def _write_expedition_cost(expedition, schedule_results, expedition_dir): """Calculate the expedition cost, write it to a file, and print summary.""" - assert expedition.schedule.waypoints[0].time is not None, ( - "First waypoint has no time. This should not be possible as it should have been verified before." - ) - time_past = schedule_results.time - expedition.schedule.waypoints[0].time + wps_in_use = expedition.schedule._get_wps_in_use() + + assert wps_in_use[0].time is not None, "First waypoint has no time." + time_past = schedule_results.time - wps_in_use[0].time cost = expedition_cost(schedule_results, time_past) with open(expedition_dir.joinpath(RESULTS, "cost.txt"), "w") as file: file.writelines(f"cost: {cost} US$") diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index ac54ad4c..25b75fae 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -102,8 +102,13 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: self._projection = projection self._expedition = expedition - self._time = expedition.schedule.waypoints[0].time - self._location = expedition.schedule.waypoints[0].location + assert self._expedition.schedule._verified, ( + "Schedule must be verified before simulation." + ) + + self._wps_in_use = self._expedition.schedule._get_wps_in_use() # remove any placeholder departure/arrival ports which are ignored in simulation + self._time = self._wps_in_use[0].time + self._location = self._wps_in_use[0].location self._measurements_to_simulate = MeasurementsToSimulate() @@ -113,7 +118,7 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: def simulate(self) -> ScheduleOk | ScheduleProblem: # TODO: instrument config mapping (as introduced in #269) should be helpful for refactoring here (i.e. #236)... - for waypoint in self._expedition.schedule.waypoints: + for waypoint in self._wps_in_use: # sail towards waypoint self._progress_time_traveling_towards(waypoint.location) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 217e3e2b..edb05ae1 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -115,8 +115,8 @@ class Schedule(pydantic.BaseModel): """Schedule of the virtual ship.""" waypoints: list[Port | Waypoint] - model_config = pydantic.ConfigDict(extra="forbid") + _verified: bool = False # internal flag to indicate if the schedule has been verified, so that a schedule can be simulated safely elsewhere in codebase @pydantic.field_validator("waypoints", mode="after") @classmethod @@ -194,14 +194,13 @@ def verify( ) # check that ship will arrive on time at each waypoint (in case no unexpected event happen) + time = ( + self.waypoints[0].time + if self.departure_port_in_use + else self.waypoints[1].time + ) - dp_in_use = self.departure_port_in_use - ap_in_use = self.arrival_port_in_use - time = self.waypoints[0].time if dp_in_use else self.waypoints[1].time - - start_slice = 0 if dp_in_use else 1 - end_slice = len(self.waypoints) if ap_in_use else len(self.waypoints) - 1 - wps_in_use = self.waypoints[start_slice:end_slice] + wps_in_use = self._get_wps_in_use() for wp_i, (wp, wp_next) in enumerate(itertools.pairwise(wps_in_use)): stationkeeping_time = _calc_wp_stationkeeping_time( @@ -238,8 +237,19 @@ def verify( else: time = wp_next.time + # finally, mark this schedule as verified (so that subsequent stages of the workflow can proceed without re-verifying) + self._verified = True + print("... All good to go!") + def _get_wps_in_use(self) -> list[Port | Waypoint]: + """Return waypoints that are in use (i.e., have a specified time and location), i.e. excluding placeholder departure/arrival ports.""" + start_slice = 0 if self.departure_port_in_use else 1 + end_slice = ( + len(self.waypoints) if self.arrival_port_in_use else len(self.waypoints) - 1 + ) + return self.waypoints[start_slice:end_slice] + @property def departure_port_in_use(self) -> bool: """Check if the departure port is in use (i.e., has a specified time and location), or is placeholder.""" diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index f3f4032e..0543dc40 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -77,6 +77,10 @@ def test_verify_schedule() -> None: schedule.verify(ship_speed_knots, instruments_config, ignore_land_test=True) + assert schedule._verified, ( + "Schedule should be marked as verified after successful verification." + ) + def test_get_instruments() -> None: get_expedition = _get_expedition(expedition_dir) @@ -445,3 +449,25 @@ def test_waypoint_yaml_line() -> None: f"got {len(lines)}. The Waypoint field order or teminology may have changed. " "Note this can have implications for the placement of waypoint number comments in Expedition.to_yaml()." ) + + +def test_wps_in_use(): + """Test that _get_wps_in_use() correctly returns waypoints excluding placeholder ports.""" + base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") + schedule = Schedule( + waypoints=[ + Port(location=Location(None, None), time=None), + Waypoint(location=Location(1, 1), time=base_time + timedelta(hours=1)), + Waypoint(location=Location(2, 2), time=base_time + timedelta(hours=2)), + Port(location=Location(None, None), time=None), + ] + ) + expedition = Expedition( + schedule=schedule, + instruments_config=_get_expedition(expedition_dir).instruments_config, + ship_config=_get_expedition(expedition_dir).ship_config, + ) + + wps_in_use = expedition.schedule._get_wps_in_use() + assert len(wps_in_use) == 2 # placeholder waypoints should be removed + assert all(isinstance(wp, Waypoint) for wp in wps_in_use) diff --git a/tests/expedition/test_simulate_schedule.py b/tests/expedition/test_simulate_schedule.py index 35dfbdea..c92acdb6 100644 --- a/tests/expedition/test_simulate_schedule.py +++ b/tests/expedition/test_simulate_schedule.py @@ -2,6 +2,7 @@ import numpy as np import pyproj +import pytest from virtualship.expedition.simulate_schedule import ( ScheduleOk, @@ -122,3 +123,25 @@ def test_ship_path_inside_domain() -> None: assert np.isclose(adcp_min_lat, wp1.lat, atol=0.1) assert np.isclose(adcp_max_lon, wp4.lon, atol=0.1) assert np.isclose(adcp_min_lon, wp3.lon, atol=0.1) + + +def test_does_not_simulate_unverified(): + """Test that simulating an unverified schedule raises an error.""" + base_time = datetime.strptime("2022-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S") + + projection = pyproj.Geod(ellps="WGS84") + expedition = Expedition.from_yaml("expedition_dir/expedition.yaml") + expedition.ship_config.ship_speed_knots = 10.0 + expedition.schedule = Schedule( + waypoints=[ + Waypoint(location=Location(0, 0), time=base_time), + Waypoint(location=Location(0.01, 0), time=base_time + timedelta(days=1)), + ] + ) + + expedition.schedule._verified = False + + with pytest.raises( + AssertionError, match=r"Schedule must be verified before simulation." + ): + simulate_schedule(projection, expedition) From fe4f23ef69725495b1d1be3c50367e6d0d2e5957 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:20:56 +0200 Subject: [PATCH 154/191] filter out placeholder wps from Instrument object if necessary --- src/virtualship/instruments/base.py | 42 +++++++++++++++-------------- src/virtualship/utils.py | 2 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index f13a8338..cd55a817 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -3,12 +3,12 @@ import abc import collections import inspect +import itertools import tempfile from dataclasses import dataclass from datetime import timedelta -from itertools import pairwise from pathlib import Path -from typing import TYPE_CHECKING, ClassVar, Literal +from typing import TYPE_CHECKING, Any, ClassVar, Literal import copernicusmarine import numpy as np @@ -26,7 +26,7 @@ _find_files_in_timerange, _find_nc_file_with_variable, _get_bathy_data, - _get_instrument_relevant_waypoints, + _get_instr_relevant_wps, _get_waypoint_latlons, _select_product_id, _SpinnerAutoStop, @@ -69,7 +69,7 @@ def __init_subclass__(cls, **kwargs: object) -> None: def __init__( self, expedition: Expedition, - variables: dict, + variables: dict[str, Any], add_bathymetry: bool, verbose_progress: bool, from_data: Path | None, @@ -78,29 +78,31 @@ def __init__( """Initialise instrument.""" self.expedition = expedition self.from_data = from_data - self.variables = collections.OrderedDict(variables) self.add_bathymetry = add_bathymetry self.verbose_progress = verbose_progress - self.fetch_spec = fetch_spec or FetchSpec() + self.fetch_spec = fetch_spec if fetch_spec is not None else FetchSpec() self._tmp_dirs: list[tempfile.TemporaryDirectory] = [] - # only waypoints relevant to this instrument; avoid needlessly ballooning fieldset to full expedition schedule - relevant_waypoints = _get_instrument_relevant_waypoints( - expedition.schedule.waypoints, self.instrument_type - ) + # filter to waypoints relevant to this instrument + wps_in_use = self.expedition.schedule._get_wps_in_use() + relevant_waypoints = _get_instr_relevant_wps(wps_in_use, self.instrument_type) - wp_lats, wp_lons = _get_waypoint_latlons(relevant_waypoints) - wp_times = [wp.time for wp in relevant_waypoints if wp.time is not None] - assert all(earlier <= later for earlier, later in pairwise(wp_times)), ( - "Waypoint times are not in ascending order" - ) - self.wp_times = wp_times + if not relevant_waypoints: + raise ValueError( + f"No relevant waypoints found for instrument '{self.instrument_type}'." + ) + + self.wp_times = [wp.time for wp in relevant_waypoints if wp.time is not None] - self.min_time, self.max_time = ( - wp_times[0], - wp_times[-1] + timedelta(days=1), - ) # avoid edge issues + # verify time ordering + if not all(a <= b for a, b in itertools.pairwise(self.wp_times)): + raise ValueError("Relevant waypoint times are not in ascending order.") + + # spatio-temporal bounding box + wp_lats, wp_lons = _get_waypoint_latlons(relevant_waypoints) + self.min_time = self.wp_times[0] + self.max_time = self.wp_times[-1] + timedelta(days=1) # avoid edge issues self.min_lat, self.max_lat = min(wp_lats), max(wp_lats) self.min_lon, self.max_lon = min(wp_lons), max(wp_lons) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 5e3f2d8c..75e336a7 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -457,7 +457,7 @@ def _get_waypoint_latlons(waypoints): return wp_lats, wp_lons -def _get_instrument_relevant_waypoints(waypoints, instrument_type) -> list: +def _get_instr_relevant_wps(waypoints, instrument_type) -> list: """Subset of waypoints that are relevant to this `instrument_type`.""" from virtualship.models import Port # avoid circular import problems From de66fc0481086eccb70261937fa7e6a724e576cb Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:47:13 +0200 Subject: [PATCH 155/191] tidy up base.py with SpatialBounds object for fieldset bounding box --- src/virtualship/instruments/base.py | 119 +++++++++++++++------------- 1 file changed, 65 insertions(+), 54 deletions(-) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index cd55a817..5126bcd6 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -6,7 +6,7 @@ import itertools import tempfile from dataclasses import dataclass -from datetime import timedelta +from datetime import datetime, timedelta from pathlib import Path from typing import TYPE_CHECKING, Any, ClassVar, Literal @@ -35,7 +35,44 @@ if TYPE_CHECKING: from virtualship.instruments.sensors import SensorType - from virtualship.models import Expedition + from virtualship.models import Expedition, Waypoint + + +@dataclass(frozen=True) +class SpatialBounds: + """Spatio-temporal bounding box for instrument's fieldset.""" + + min_lat: float + max_lat: float + min_lon: float + max_lon: float + min_time: datetime + max_time: datetime + + @classmethod + def from_waypoints(cls, waypoints: list[Waypoint]) -> SpatialBounds: + """Create a SpatialBounds instance from a list of waypoints.""" + lats, lons = _get_waypoint_latlons(waypoints) + times = [wp.time for wp in waypoints if wp.time is not None] + return cls( + min_lat=min(lats), + max_lat=max(lats), + min_lon=min(lons), + max_lon=max(lons), + min_time=times[0], + max_time=times[-1] + timedelta(days=1), # avoid edge issues + ) + + def with_buffer( + self, latlon_buffer: float = 0.0 + ) -> tuple[float, float, float, float]: + """Return (min_lon, max_lon, min_lat, max_lat) including optional spatial buffer.""" + return ( + self.min_lon - latlon_buffer, + self.max_lon + latlon_buffer, + self.min_lat - latlon_buffer, + self.max_lat + latlon_buffer, + ) @dataclass @@ -56,7 +93,7 @@ class Instrument(abc.ABC): sensor_kernels: ClassVar[dict[SensorType, collections.abc.Callable]] def __init_subclass__(cls, **kwargs: object) -> None: - """Ensure non-abstract subclasses (i.e. final/concrete instrument classes) define sensor_kernels as a class attribute.""" + """Ensure concrete instrument subclasses define required class attributes.""" super().__init_subclass__(**kwargs) if inspect.isabstract(cls): return @@ -87,24 +124,18 @@ def __init__( # filter to waypoints relevant to this instrument wps_in_use = self.expedition.schedule._get_wps_in_use() relevant_waypoints = _get_instr_relevant_wps(wps_in_use, self.instrument_type) - if not relevant_waypoints: raise ValueError( f"No relevant waypoints found for instrument '{self.instrument_type}'." ) - self.wp_times = [wp.time for wp in relevant_waypoints if wp.time is not None] - # verify time ordering - if not all(a <= b for a, b in itertools.pairwise(self.wp_times)): + wp_times = [wp.time for wp in relevant_waypoints if wp.time is not None] + if not all(a <= b for a, b in itertools.pairwise(wp_times)): raise ValueError("Relevant waypoint times are not in ascending order.") - # spatio-temporal bounding box - wp_lats, wp_lons = _get_waypoint_latlons(relevant_waypoints) - self.min_time = self.wp_times[0] - self.max_time = self.wp_times[-1] + timedelta(days=1) # avoid edge issues - self.min_lat, self.max_lat = min(wp_lats), max(wp_lats) - self.min_lon, self.max_lon = min(wp_lons), max(wp_lons) + # spatio-temporal bounding box of all relevant waypoints + self.bounds = SpatialBounds.from_waypoints(relevant_waypoints) def close(self): """Explicitly cleanup all tmp dirs.""" @@ -197,7 +228,6 @@ def _generate_fieldset(self) -> parcels.FieldSet: """ combined_fieldset = None keys = list(self.variables.keys()) - time_buffer = self.fetch_spec.time_buffer for key in keys: @@ -209,8 +239,8 @@ def _generate_fieldset(self) -> parcels.FieldSet: files = _find_files_in_timerange( data_dir, - self.min_time, - self.max_time + timedelta(days=time_buffer), + self.bounds.min_time, + self.bounds.max_time + timedelta(days=time_buffer), ) _, field_var_name = _find_nc_file_with_variable( @@ -254,13 +284,17 @@ def _get_copernicus_ds( """Get Copernicus Marine dataset for direct ingestion.""" product_id = _select_product_id( physical=physical, - schedule_start=self.min_time, - schedule_end=self.max_time, + schedule_start=self.bounds.min_time, + schedule_end=self.bounds.max_time, variable=var if not physical else None, ) - # spatial bounds with buffer, if spatial constraints apply - min_lon_wbuf, max_lon_wbuf, min_lat_wbuf, max_lat_wbuf = self.spatial_bounds + buf = self.fetch_spec.latlon_buffer if self.fetch_spec.spatial else 0.0 + min_lon, max_lon, min_lat, max_lat = ( + self.bounds.with_buffer(buf) + if self.fetch_spec.spatial + else (None, None, None, None) + ) min_depth = ( abs(self.fetch_spec.depth_min) @@ -275,13 +309,13 @@ def _get_copernicus_ds( return copernicusmarine.open_dataset( dataset_id=product_id, - minimum_longitude=min_lon_wbuf, - maximum_longitude=max_lon_wbuf, - minimum_latitude=min_lat_wbuf, - maximum_latitude=max_lat_wbuf, + minimum_longitude=min_lon, + maximum_longitude=max_lon, + minimum_latitude=min_lat, + maximum_latitude=max_lat, variables=[var], - start_datetime=self.min_time, - end_datetime=self.max_time + timedelta(days=time_buffer), + start_datetime=self.bounds.min_time, + end_datetime=self.bounds.max_time + timedelta(days=time_buffer), minimum_depth=min_depth, maximum_depth=max_depth, coordinates_selection_method="outside", @@ -305,9 +339,8 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: f"Missing or invalid 'positive' attribute for 'depth' coordinate in {files[0].parent}. Expected 'positive: up' or 'positive: down'. Original error: {e}" ) from e - # sel only relevant latlon and depth subsets, to speed up simulations (avoid bringing in potentially global data) - # spatial bounds with buffer, if spatial constraints apply - min_lon_wbuf, max_lon_wbuf, min_lat_wbuf, max_lat_wbuf = self.spatial_bounds + buf = self.fetch_spec.latlon_buffer if self.fetch_spec.spatial else 0.0 + min_lon, max_lon, min_lat, max_lat = self.bounds.with_buffer(buf) depth_min = self.fetch_spec.depth_min depth_max = self.fetch_spec.depth_max @@ -317,20 +350,16 @@ def _get_local_ds(self, files: list[Path]) -> xr.Dataset: depth_sel = { "depth": [depth_min], "method": "nearest", - } # preserve depth dim with square brackets + } else: - # max, min slice because depth is negative and positive: up depth_sel = {"depth": slice(depth_max, depth_min)} ds = ds.sel( - longitude=slice(min_lon_wbuf, max_lon_wbuf), - latitude=slice(min_lat_wbuf, max_lat_wbuf), + longitude=slice(min_lon, max_lon), + latitude=slice(min_lat, max_lat), ) - # separate sel (from lat, lon above) for depth to allow `nearest` selection if not using slices - # will leave as is if both_none, as intended ds = ds.sel(**depth_sel) - return ds def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: @@ -339,12 +368,10 @@ def _via_tmp_ds(self, ds: xr.Dataset) -> xr.Dataset: self._tmp_dirs.append(tmp_dir) tmp_store = Path(tmp_dir.name) / f"tmp_{id(ds)}.zarr" - # strip pre-existing per-variable encoding, which may interfere with zarr defaults ds_to_write = ds.copy() for variable in ds_to_write.variables.values(): variable.encoding = {} - # TODO: potential trade off between speed and memory usage here... could remove to reduce memory footprint, but may slow down writing (?) ds_to_write = ds_to_write.chunk( {dim: size for dim, size in ds_to_write.sizes.items()} ) @@ -388,22 +415,6 @@ def instrument_type(self) -> InstrumentType: """Return the InstrumentType for this instrument instance.""" return next(k for k, v in INSTRUMENT_CLASS_MAP.items() if type(self) is v) - @property - def spatial_bounds( - self, - ) -> tuple[float | None, float | None, float | None, float | None]: - """Return (min_lon, max_lon, min_lat, max_lat) bounds including buffer if spatial constraints apply.""" - if not self.fetch_spec.spatial: - return None, None, None, None - - buf = self.fetch_spec.latlon_buffer - return ( - self.min_lon - buf, - self.max_lon + buf, - self.min_lat - buf, - self.max_lat + buf, - ) - @dataclass(frozen=True) class UnderwayCoordinates: From 646f732317869990ce2c899c5e1f41d9e16fa747 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 14:04:18 +0200 Subject: [PATCH 156/191] add tests for spatial bounds and refactor to use waypoints and expedition fixtures --- tests/instruments/test_base.py | 155 +++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 67 deletions(-) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index b6955491..e493776d 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from datetime import datetime from typing import ClassVar from unittest.mock import MagicMock, patch @@ -11,6 +12,7 @@ from virtualship.instruments.base import ( FetchSpec, Instrument, + SpatialBounds, UnderwayCoordinates, UnderwayInstrument, ) @@ -24,6 +26,30 @@ # ============================================================================= +@pytest.fixture() +def mock_waypoints(): + """Shared fixture providing mock Waypoint objects.""" + wp1 = MagicMock() + wp1.location.latitude = 10.0 + wp1.location.longitude = -20.0 + wp1.time = datetime(2026, 1, 1, 12, 0) + + wp2 = MagicMock() + wp2.location.latitude = 15.0 + wp2.location.longitude = -15.0 + wp2.time = datetime(2026, 1, 5, 12, 0) + + return [wp1, wp2] + + +@pytest.fixture() +def mock_expedition(mock_waypoints): + """Shared fixture providing a mock Expedition initialized with waypoints.""" + expedition = MagicMock() + expedition.schedule._get_wps_in_use.return_value = mock_waypoints + return expedition + + @pytest.fixture() def fieldset(): """Minimal Parcels FieldSet containing a temperature field.""" @@ -49,7 +75,7 @@ def fieldset(): @pytest.fixture() def pset(fieldset): - """Minimal ParticleSet initialized with a custom Particle class and the fieldset fixture.""" + """Minimal ParticleSet initialized with a custom Particle class and fieldset fixture.""" SampleParticle = parcels.Particle.add_variable(parcels.Variable("temperature")) t1 = np.datetime64("2024-01-01T00:00:00") @@ -59,18 +85,16 @@ def pset(fieldset): # ============================================================================= -# Instrument base class testing +# SpatialBounds & FetchSpec Tests # ============================================================================= def test_FetchSpec(): fetch_spec = FetchSpec() - # test that default values are set assert fetch_spec.latlon_buffer is not None assert fetch_spec.time_buffer is not None - # test setting values (in new instance) and that original is unchanged in memory fetch_spec2 = FetchSpec(latlon_buffer=0.5, time_buffer=1.0) assert fetch_spec2.latlon_buffer == 0.5 assert fetch_spec2.time_buffer == 1.0 @@ -78,6 +102,42 @@ def test_FetchSpec(): assert fetch_spec.latlon_buffer != fetch_spec2.latlon_buffer +def test_spatial_bounds_from_waypoints(mock_waypoints): + """Verify bounds calculations and 1-day time buffer addition.""" + with patch( + "virtualship.instruments.base._get_waypoint_latlons", + return_value=([10.0, 15.0], [-20.0, -15.0]), + ): + bounds = SpatialBounds.from_waypoints(mock_waypoints) + + assert bounds.min_lat == 10.0 + assert bounds.max_lat == 15.0 + assert bounds.min_lon == -20.0 + assert bounds.max_lon == -15.0 + assert bounds.min_time == datetime(2026, 1, 1, 12, 0) + assert bounds.max_time == datetime(2026, 1, 6, 12, 0) # +1 day applied + + +def test_spatial_bounds_with_buffer(): + """Verify buffer padding returns correct order (min_lon, max_lon, min_lat, max_lat).""" + bounds = SpatialBounds( + min_lat=-10.0, + max_lat=10.0, + min_lon=-50.0, + max_lon=-40.0, + min_time=datetime(2026, 1, 1), + max_time=datetime(2026, 1, 2), + ) + + assert bounds.with_buffer(0.0) == (-50.0, -40.0, -10.0, 10.0) + assert bounds.with_buffer(0.5) == (-50.5, -39.5, -10.5, 10.5) + + +# ============================================================================= +# Instrument Base Class Tests +# ============================================================================= + + def test_all_instruments_have_instrument_class(): for instrument in InstrumentType: instrument_class = get_instrument_class(instrument) @@ -89,18 +149,18 @@ class DummyInstrument(Instrument): sensor_kernels = {} # noqa - def simulate(self, data_dir, measurements, out_path): + def simulate(self, measurements, out_path): """Dummy simulate implementation for test.""" self.simulate_called = True @property def instrument_type(self) -> InstrumentType: - """Return a valid InstrumentType for the test.""" + """Return a valid InstrumentType for testing.""" return InstrumentType.CTD class _FakeFieldSet: - """Minimal fieldset.""" + """Minimal fieldset structure.""" def __init__(self, **fields): for name, value in fields.items(): @@ -112,14 +172,10 @@ def to_windowed_arrays(self): return self -def test_load_input_data(): +def test_load_input_data(mock_expedition): """Test Instrument.load_input_data with mocks.""" - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - dummy = DummyInstrument( - expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=False, @@ -151,14 +207,10 @@ def test_load_input_data(): assert fieldset == fake_fieldset -def test_gets_uv_vectorfield_when_u_and_v_present(): +def test_gets_uv_vectorfield_when_u_and_v_present(mock_expedition): """load_input_data creates a 'UV' VectorField when U and V fields are present.""" - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - dummy = DummyInstrument( - expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + expedition=mock_expedition, variables={"U": "uo", "V": "vo"}, add_bathymetry=False, verbose_progress=False, @@ -187,14 +239,9 @@ def test_gets_uv_vectorfield_when_u_and_v_present(): assert result.fields["UV"] is mock_uv -def test_execute_calls_simulate(monkeypatch): - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - mock_schedule = MagicMock() - mock_schedule.waypoints = [mock_waypoint] +def test_execute_calls_simulate(mock_expedition): dummy = DummyInstrument( - expedition=MagicMock(schedule=mock_schedule), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=True, @@ -205,16 +252,11 @@ def test_execute_calls_simulate(monkeypatch): dummy.simulate.assert_called_once() -def test_fetch_spec_applied_to_instrument(): +def test_fetch_spec_applied_to_instrument(mock_expedition): """FetchSpec values are correctly stored on the instrument.""" - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - mock_schedule = MagicMock() - mock_schedule.waypoints = [mock_waypoint] fetch_spec = FetchSpec(latlon_buffer=5.0, depth_min=-10.0) dummy = DummyInstrument( - expedition=MagicMock(schedule=mock_schedule), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=False, @@ -223,19 +265,14 @@ def test_fetch_spec_applied_to_instrument(): ) assert dummy.fetch_spec.latlon_buffer == 5.0 assert dummy.fetch_spec.depth_min == -10.0 - # unset values use dataclass defaults assert dummy.fetch_spec.time_buffer == 0.0 assert dummy.fetch_spec.depth_max is None -def test_via_tmp_ds_roundtrip(): +def test_via_tmp_ds_roundtrip(mock_expedition): """_via_tmp_ds writes to a tmp file and re-opens it.""" - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - with DummyInstrument( - expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=False, @@ -249,22 +286,16 @@ def test_via_tmp_ds_roundtrip(): assert isinstance(result, xr.Dataset) assert "temperature" in result - assert ( - result is not ds - ) # result is new object loaded from tmp file, not the original + assert result is not ds result.close() ds.close() -def test_instrument_context_manager(): - """Test that context manager cleans up temporary directories upon exit.""" - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - +def test_instrument_context_manager(mock_expedition): + """Test context manager cleanup of temporary directories.""" with DummyInstrument( - expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=False, @@ -279,17 +310,12 @@ def test_instrument_context_manager(): result.close() ds.close() - # outside 'with' block, tmp dirs should be cleared assert len(dummy._tmp_dirs) == 0 -def test_generate_fieldset_combines_fields(): - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - +def test_generate_fieldset_combines_fields(mock_expedition): dummy = DummyInstrument( - expedition=MagicMock(schedule=MagicMock(waypoints=[mock_waypoint])), + expedition=mock_expedition, variables={"A": "a", "B": "b"}, add_bathymetry=False, verbose_progress=False, @@ -313,14 +339,9 @@ def test_generate_fieldset_combines_fields(): fs_A.__add__.assert_called_once_with(fs_B) -def test_load_input_data_error(monkeypatch): - mock_waypoint = MagicMock() - mock_waypoint.location.latitude = 1.0 - mock_waypoint.location.longitude = 2.0 - mock_schedule = MagicMock() - mock_schedule.waypoints = [mock_waypoint] +def test_load_input_data_error(mock_expedition, monkeypatch): dummy = DummyInstrument( - expedition=MagicMock(schedule=mock_schedule), + expedition=mock_expedition, variables={"A": "a"}, add_bathymetry=False, verbose_progress=False, @@ -331,10 +352,10 @@ def test_load_input_data_error(monkeypatch): ) import virtualship.errors - try: + with pytest.raises( + virtualship.errors.CopernicusCatalogueError, match="Failed to load input data" + ): dummy.load_input_data() - except virtualship.errors.CopernicusCatalogueError as e: - assert "Failed to load input data" in str(e) def test_instrument_subclass_without_sensor_kernels_error(): From 8b139c07ba332d24365032ab6f6b407fe747fb82 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:13:23 +0200 Subject: [PATCH 157/191] sort out test_expedition to handle new Port logic --- tests/expedition/test_expedition.py | 434 ++++++++++------------------ 1 file changed, 159 insertions(+), 275 deletions(-) diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index 0543dc40..d05acfec 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -29,27 +29,19 @@ expedition_dir = Path("expedition_dir") -def test_import_export_expedition(tmpdir) -> None: - out_path = tmpdir.join(EXPEDITION) +@pytest.fixture +def base_expedition(): + """Shared expedition instance loaded directly from expedition_dir.""" + return _get_expedition(expedition_dir) - # arbitrary time for testing - base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") - schedule = Schedule( - waypoints=[ - Waypoint(location=Location(0, 0), time=base_time, instrument=None), - Waypoint( - location=Location(1, 1), - time=base_time + timedelta(hours=1), - instrument=None, - ), - ] - ) - get_expedition = _get_expedition(expedition_dir) +def test_import_export_expedition(tmpdir, base_expedition) -> None: + out_path = tmpdir.join(EXPEDITION) + expedition = Expedition( - schedule=schedule, - instruments_config=get_expedition.instruments_config, - ship_config=get_expedition.ship_config, + schedule=base_expedition.schedule, + instruments_config=base_expedition.instruments_config, + ship_config=base_expedition.ship_config, ) expedition.to_yaml(out_path) @@ -57,60 +49,36 @@ def test_import_export_expedition(tmpdir) -> None: assert expedition == expedition2 -def test_verify_schedule() -> None: - schedule = Schedule( - waypoints=[ - Waypoint( - location=Location(0, 0), - time=datetime(2022, 1, 1, 1, 0, 0), - instrument=[], - ), - Waypoint( - location=Location(1, 0), - time=datetime(2022, 1, 2, 1, 0, 0), - instrument=[], - ), - ] +def test_verify_schedule(base_expedition) -> None: + schedule = base_expedition.schedule + schedule.verify( + base_expedition.ship_config.ship_speed_knots, + base_expedition.instruments_config, + ignore_land_test=True, ) - ship_speed_knots = _get_expedition(expedition_dir).ship_config.ship_speed_knots - instruments_config = _get_expedition(expedition_dir).instruments_config - - schedule.verify(ship_speed_knots, instruments_config, ignore_land_test=True) assert schedule._verified, ( "Schedule should be marked as verified after successful verification." ) -def test_get_instruments() -> None: - get_expedition = _get_expedition(expedition_dir) - schedule = Schedule( - waypoints=[ - Waypoint(location=Location(0, 0), instrument=["CTD"]), - Waypoint(location=Location(1, 0), instrument=["XBT", "ARGO_FLOAT"]), - Waypoint(location=Location(1, 0), instrument=["CTD"]), - ] - ) +def test_get_instruments(base_expedition) -> None: expedition = Expedition( - schedule=schedule, - instruments_config=get_expedition.instruments_config, - ship_config=get_expedition.ship_config, - ) - assert ( - set(instrument.name for instrument in expedition.get_instruments()) - == { - "CTD", - "UNDERWATER_ST", # not added above but underway instruments are auto present from instruments_config in expedition_dir/expedition.yaml - "ADCP", # as above - "ARGO_FLOAT", - "XBT", - } + schedule=base_expedition.schedule, + instruments_config=base_expedition.instruments_config, + ship_config=base_expedition.ship_config, ) + assert set(instrument.name for instrument in expedition.get_instruments()) == { + "CTD", + "UNDERWATER_ST", + "ADCP", + "ARGO_FLOAT", + "DRIFTER", + } -def test_verify_on_land(): +def test_verify_on_land(base_expedition): """Test that schedule verification raises error for waypoints on land (0.0 m bathymetry).""" - # bathymetry fieldset with NaNs at specific locations lat = np.array([0, 1.0, 2.0]) lon = np.array([0, 1.0, 2.0]) bathymetry = np.array( @@ -122,9 +90,7 @@ def test_verify_on_land(): ) ds_bathymetry = xr.Dataset( - { - "deptho": (("lat", "lon"), bathymetry), - }, + {"deptho": (("lat", "lon"), bathymetry)}, coords={ "lon": (("lon"), lon, {"units": "degrees_east"}), "lat": (("lat"), lat, {"units": "degrees_north"}), @@ -134,25 +100,17 @@ def test_verify_on_land(): ds_fset = parcels.convert.copernicusmarine_to_sgrid( fields={"bathymetry": ds_bathymetry["deptho"]}, ) - bathymetry_fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset) - # waypoints placed in NaN bathy cells - waypoints = [ - Waypoint( - location=Location(0.0, 1.0), time=datetime(2022, 1, 1, 1, 0, 0) - ), # NaN cell - Waypoint( - location=Location(1.0, 2.0), time=datetime(2022, 1, 2, 1, 0, 0) - ), # NaN cell - Waypoint( - location=Location(2.0, 0.0), time=datetime(2022, 1, 3, 1, 0, 0) - ), # NaN cell - ] - - schedule = Schedule(waypoints=waypoints) - ship_speed_knots = _get_expedition(expedition_dir).ship_config.ship_speed_knots - instruments_config = _get_expedition(expedition_dir).instruments_config + schedule = Schedule( + waypoints=[ + Port(location=Location(0, 0), time=datetime(2022, 1, 1, 1, 0, 0)), + Waypoint(location=Location(0.0, 1.0), time=datetime(2022, 1, 2, 1, 0, 0)), + Waypoint(location=Location(1.0, 2.0), time=datetime(2022, 1, 3, 1, 0, 0)), + Waypoint(location=Location(2.0, 0.0), time=datetime(2022, 1, 4, 1, 0, 0)), + Port(location=Location(1, 0), time=datetime(2022, 1, 5, 1, 0, 0)), + ] + ) with patch( "virtualship.models.expedition._get_bathy_data", @@ -163,114 +121,81 @@ def test_verify_on_land(): match=r"The following waypoint\(s\) throw\(s\) error\(s\):", ): schedule.verify( - ship_speed_knots, - instruments_config, + base_expedition.ship_config.ship_speed_knots, + base_expedition.instruments_config, ignore_land_test=False, from_data=None, ) -def add_ports( - waypoints: list[Waypoint], - departure_port: Port | None = None, - arrival_port: Port | None = None, - start_time: datetime | None = None, -) -> list[Waypoint]: - """Add ports to the first and last in list of waypoints.""" - if departure_port is None: - departure_port = Port(location=Location(0, 0), time=start_time) - if arrival_port is None: - arrival_port = Port( - location=Location(1, 0), - time=start_time + timedelta(days=1) if start_time is not None else None, - ) - - return [departure_port] + waypoints + [arrival_port] - - @pytest.mark.parametrize( - "schedule,error,match", + "waypoints,error,match", [ pytest.param( - Schedule(waypoints=[Waypoint(location=Location(0, 0))]), + [Waypoint(location=Location(0, 0))], ScheduleError, - "First and last waypoints must be Ports (of arrival/departure).", + r"First and last waypoints must be Ports \(of arrival/departure\)\.", id="NoPorts", ), pytest.param( - Schedule( - add_ports( - waypoints=[ - Port(location=Location(0, 0)), - Port(location=Location(1, 0)), - ] - ) - ), + [ + Port(location=Location(0, 0)), + Port(location=Location(1, 0)), + ], ScheduleError, "At least one non-port waypoint must be provided.", id="NoWaypoints", ), pytest.param( - Schedule( - add_ports( - waypoints=[ - Waypoint(location=Location(0, 0)), - Waypoint( - location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) - ), - ] - ) - ), + [ + Port(location=Location(0, 0)), + Waypoint(location=Location(0, 0)), + Waypoint(location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0)), + Port(location=Location(1, 0)), + ], ScheduleError, - "First waypoint must have a specified time.", + "Waypoint 1 must have a specified time.", id="FirstWaypointHasTime", ), pytest.param( - Schedule( - add_ports( - waypoints=[ - Waypoint( - location=Location(0, 0), time=datetime(2022, 1, 2, 1, 0, 0) - ), - Waypoint(location=Location(0, 0)), - Waypoint( - location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0) - ), - ] - ) - ), + [ + Port(location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0)), + Waypoint(location=Location(0, 0), time=datetime(2022, 1, 2, 1, 0, 0)), + Waypoint(location=Location(0, 0)), + Waypoint(location=Location(1, 0), time=datetime(2022, 1, 1, 1, 0, 0)), + Port(location=Location(1, 0), time=datetime(2022, 1, 3, 0, 0, 0)), + ], ScheduleError, - "Waypoint\\(s\\) : each waypoint should be timed after all previous waypoints", + r"Waypoint\(s\).*?: each waypoint should be timed after all previous waypoints", id="SequentialWaypoints", ), pytest.param( - Schedule( - waypoints=[ - Waypoint( - location=Location(0, 0), - time=datetime(2022, 1, 1, 1, 0, 0), - instrument=[], - ), - Waypoint( - location=Location(1, 0), - time=datetime(2022, 1, 1, 1, 1, 0), - instrument=[], - ), - ] - ), + [ + Port(location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0)), + Waypoint( + location=Location(0, 0), + time=datetime(2022, 1, 1, 1, 0, 0), + instrument=[], + ), + Waypoint( + location=Location(1, 0), + time=datetime(2022, 1, 1, 1, 1, 0), + instrument=[], + ), + Port(location=Location(1, 0), time=datetime(2022, 1, 2, 0, 0, 0)), + ], ScheduleError, - "Waypoint planning is not valid: would arrive too late at waypoint 2\\.", + r"Waypoint planning is not valid: would arrive too late at waypoint 2\.", id="NotEnoughTime", ), ], ) -def test_verify_schedule_errors(schedule: Schedule, error, match) -> None: - expedition = _get_expedition(expedition_dir) - +def test_verify_schedule_errors(base_expedition, waypoints: list, error, match) -> None: with pytest.raises(error, match=match): + schedule = Schedule(waypoints=waypoints) schedule.verify( - expedition.ship_config.ship_speed_knots, - expedition.instruments_config, + base_expedition.ship_config.ship_speed_knots, + base_expedition.instruments_config, ignore_land_test=True, ) @@ -285,109 +210,65 @@ def expedition(tmp_file): @pytest.fixture def expedition_no_xbt(expedition): for waypoint in expedition.schedule.waypoints: - if waypoint.instrument and any( - instrument.name == "XBT" for instrument in waypoint.instrument - ): - waypoint.instrument = [ - instrument - for instrument in waypoint.instrument - if instrument.name != "XBT" - ] - + instruments = getattr(waypoint, "instrument", None) + if instruments and any(instrument.name == "XBT" for instrument in instruments): + waypoint.instrument = [inst for inst in instruments if inst.name != "XBT"] return expedition -@pytest.fixture -def instruments_config_no_xbt(expedition): - delattr(expedition.instruments_config, "xbt_config") - return expedition.instruments_config - - -@pytest.fixture -def instruments_config_no_ctd(expedition): - delattr(expedition.instruments_config, "ctd_config") - return expedition.instruments_config - - -@pytest.fixture -def instruments_config_no_argo_float(expedition): - delattr(expedition.instruments_config, "argo_float_config") - return expedition.instruments_config - - -@pytest.fixture -def instruments_config_no_drifter(expedition): - delattr(expedition.instruments_config, "drifter_config") - return expedition.instruments_config - - -@pytest.fixture -def instruments_config_no_adcp(expedition): - delattr(expedition.instruments_config, "adcp_config") - return expedition.instruments_config - - -@pytest.fixture -def instruments_config_no_underwater_st(expedition): - delattr(expedition.instruments_config, "ship_underwater_st_config") - return expedition.instruments_config - - -def test_verify_instruments_config(expedition) -> None: - expedition.instruments_config.verify(expedition) - - -def test_verify_instruments_config_no_instrument(expedition, expedition_no_xbt) -> None: - expedition.instruments_config.verify(expedition_no_xbt) - - -@pytest.mark.parametrize( - "instruments_config_fixture,error,match", - [ - pytest.param( - "instruments_config_no_xbt", - InstrumentsConfigError, +@pytest.fixture( + params=[ + ( + "xbt_config", + "XBT", "Expedition includes instrument 'XBT', but instruments_config does not provide configuration for it.", - id="InstrumentsConfigNoXBT", ), - pytest.param( - "instruments_config_no_ctd", - InstrumentsConfigError, + ( + "ctd_config", + "CTD", "Expedition includes instrument 'CTD', but instruments_config does not provide configuration for it.", - id="InstrumentsConfigNoCTD", ), - pytest.param( - "instruments_config_no_argo_float", - InstrumentsConfigError, + ( + "argo_float_config", + "ARGO_FLOAT", "Expedition includes instrument 'ARGO_FLOAT', but instruments_config does not provide configuration for it.", - id="InstrumentsConfigNoARGO_FLOAT", ), - pytest.param( - "instruments_config_no_drifter", - InstrumentsConfigError, + ( + "drifter_config", + "DRIFTER", "Expedition includes instrument 'DRIFTER', but instruments_config does not provide configuration for it.", - id="InstrumentsConfigNoDRIFTER", ), - pytest.param( - "instruments_config_no_adcp", - InstrumentsConfigError, + ( + "adcp_config", + "ADCP", r"Underway instrument config attribute\(s\) are missing from YAML\. Must be Config object or None\.", - id="InstrumentsConfigNoADCP", ), - pytest.param( - "instruments_config_no_underwater_st", - InstrumentsConfigError, + ( + "ship_underwater_st_config", + "UNDERWATER_ST", r"Underway instrument config attribute\(s\) are missing from YAML\. Must be Config object or None\.", - id="InstrumentsConfigNoUNDERWATER_ST", ), - ], + ] ) +def missing_instrument_config(request, expedition): + attr_name, error_match = request.param + delattr(expedition.instruments_config, attr_name) + return expedition.instruments_config, error_match + + +def test_verify_instruments_config(expedition) -> None: + expedition.instruments_config.verify(expedition) + + +def test_verify_instruments_config_no_instrument(expedition, expedition_no_xbt) -> None: + expedition.instruments_config.verify(expedition_no_xbt) + + def test_verify_instruments_config_errors( - request, expedition, instruments_config_fixture, error, match + expedition, missing_instrument_config ) -> None: - instruments_config = request.getfixturevalue(instruments_config_fixture) - - with pytest.raises(error, match=match): + instruments_config, match = missing_instrument_config + with pytest.raises(InstrumentsConfigError, match=match): instruments_config.verify(expedition) @@ -395,43 +276,29 @@ def test_all_instrument_configs_use_mixin(expedition): """Every registered instrument config must inherit _InstrumentConfigMixin and define the required ClassVars.""" instrument_configs = [ iconfig - for _, iconfig in expedition.instruments_config.__dict__.items() + for iconfig in expedition.instruments_config.__dict__.values() if iconfig ] for iconfig in instrument_configs: - assert issubclass(iconfig.__class__, _InstrumentConfigMixin), ( - f"{iconfig.__class__.__name__} does not inherit _InstrumentConfigMixin" + cls = iconfig.__class__ + assert issubclass(cls, _InstrumentConfigMixin), ( + f"{cls.__name__} does not inherit _InstrumentConfigMixin" ) - assert "_instrument_type" in iconfig.__class__.__dict__, ( - f"{iconfig.__class__.__name__} does not define _instrument_type" + assert "_instrument_type" in cls.__dict__, ( + f"{cls.__name__} does not define _instrument_type" ) - assert "_instrument_name" in iconfig.__class__.__dict__, ( - f"{iconfig.__class__.__name__} does not define _instrument_name" + assert "_instrument_name" in cls.__dict__, ( + f"{cls.__name__} does not define _instrument_name" ) - assert iconfig.__class__._instrument_type == iconfig._instrument_type, ( - f"{iconfig.__class__.__name__}._instrument_type does not match its registered InstrumentType" + assert cls._instrument_type == iconfig._instrument_type, ( + f"{cls.__name__}._instrument_type mismatch" ) -def test_waypoint_yaml_line() -> None: - """Each waypoint entry in the raw YAML dump should start with '- instrument:'.""" - base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") - schedule = Schedule( - waypoints=[ - Waypoint(location=Location(0, 0), time=base_time, instrument=None), - Waypoint( - location=Location(1, 1), - time=base_time + timedelta(hours=1), - instrument=None, - ), - Waypoint( - location=Location(2, 2), - time=base_time + timedelta(hours=2), - instrument=["CTD"], - ), - ] - ) +def test_waypoint_yaml_lines(base_expedition) -> None: + """Each full waypoint entry in the raw YAML dump should start with '- instrument:', whereas Port waypoints should start with just '- location:'.""" + schedule = base_expedition.schedule raw = yaml.dump( { "schedule": { @@ -441,17 +308,34 @@ def test_waypoint_yaml_line() -> None: default_flow_style=False, ) - lines = [ + standard_lines = [ line for line in raw.splitlines() if line.lstrip().startswith("- instrument:") ] - assert len(lines) == len(schedule.waypoints), ( - f"Expected {len(schedule.waypoints)} lines starting with '- instrument:' in the YAML dump, " - f"got {len(lines)}. The Waypoint field order or teminology may have changed. " + port_lines = [ + line for line in raw.splitlines() if line.lstrip().startswith("- location:") + ] + + port_wps = [wp for wp in schedule.waypoints if isinstance(wp, Port)] + standard_wps = [wp for wp in schedule.waypoints if not isinstance(wp, Port)] + + assert len(port_wps) == 2, ( + "There should be exactly 2 Port waypoints (departure and arrival)." + ) + + assert len(port_lines) == len(port_wps), ( + f"Expected {len(port_wps)} lines starting with '- location:' in the YAML dump, " + f"got {len(port_lines)}. The Port/Waypoint field order or terminology may have changed. " + "Note this can have implications for the placement of port/waypoint number comments in Expedition.to_yaml()." + ) + + assert len(standard_lines) == len(standard_wps), ( + f"Expected {len(standard_wps)} lines starting with '- instrument:' in the YAML dump, " + f"got {len(standard_lines)}. The Waypoint field order or terminology may have changed. " "Note this can have implications for the placement of waypoint number comments in Expedition.to_yaml()." ) -def test_wps_in_use(): +def test_wps_in_use(base_expedition): """Test that _get_wps_in_use() correctly returns waypoints excluding placeholder ports.""" base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") schedule = Schedule( @@ -464,8 +348,8 @@ def test_wps_in_use(): ) expedition = Expedition( schedule=schedule, - instruments_config=_get_expedition(expedition_dir).instruments_config, - ship_config=_get_expedition(expedition_dir).ship_config, + instruments_config=base_expedition.instruments_config, + ship_config=base_expedition.ship_config, ) wps_in_use = expedition.schedule._get_wps_in_use() From 7b158cd583c37afbc4406a0e6c4b17ee58f5855a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:14:44 +0200 Subject: [PATCH 158/191] tidy up unnecessary lines --- tests/expedition/test_expedition.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index d05acfec..bc380921 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -220,32 +220,26 @@ def expedition_no_xbt(expedition): params=[ ( "xbt_config", - "XBT", "Expedition includes instrument 'XBT', but instruments_config does not provide configuration for it.", ), ( "ctd_config", - "CTD", "Expedition includes instrument 'CTD', but instruments_config does not provide configuration for it.", ), ( "argo_float_config", - "ARGO_FLOAT", "Expedition includes instrument 'ARGO_FLOAT', but instruments_config does not provide configuration for it.", ), ( "drifter_config", - "DRIFTER", "Expedition includes instrument 'DRIFTER', but instruments_config does not provide configuration for it.", ), ( "adcp_config", - "ADCP", r"Underway instrument config attribute\(s\) are missing from YAML\. Must be Config object or None\.", ), ( "ship_underwater_st_config", - "UNDERWATER_ST", r"Underway instrument config attribute\(s\) are missing from YAML\. Must be Config object or None\.", ), ] From 53bc885195d86dfdf380b4f415b653bf8eacc96e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:15:33 +0200 Subject: [PATCH 159/191] more robust validation of ports --- src/virtualship/models/expedition.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index edb05ae1..5785f10f 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -122,9 +122,9 @@ class Schedule(pydantic.BaseModel): @classmethod def _wp_ports(cls, value: list[Port | Waypoint]) -> None: """First and last waypoints are Ports, plus has at least one non-port waypoint.""" - if not isinstance(value[0], Port) & isinstance(value[-1], Port): + if not isinstance(value[0], Port) or not isinstance(value[-1], Port): raise ScheduleError( - "First and last waypoints must be Ports (of arrival/departure)." + "First and last waypoints must be Ports (of arrival/departure). One or the other is currently missing." ) if not any(isinstance(wp, Waypoint) for wp in value): raise ScheduleError("At least one non-port waypoint must be provided.") From 602a2c041bdac2f14fed226a8c5e20b8d1544664 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:15:53 +0200 Subject: [PATCH 160/191] test suite expedition.yaml updated for new port logic --- tests/expedition/expedition_dir/expedition.yaml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/expedition/expedition_dir/expedition.yaml b/tests/expedition/expedition_dir/expedition.yaml index 6392076b..630d7342 100644 --- a/tests/expedition/expedition_dir/expedition.yaml +++ b/tests/expedition/expedition_dir/expedition.yaml @@ -2,23 +2,31 @@ # schedule: waypoints: + # Port of Departure + - location: + latitude: 0 + longitude: 0 + time: 2023-01-01 00:00:00 + # Waypoint 1 - instrument: - CTD location: latitude: 0 longitude: 0 - time: 2023-01-01 00:00:00 + time: 2023-01-02 00:00:00 + # Waypoint 2 - instrument: - DRIFTER - ARGO_FLOAT location: latitude: 0.01 longitude: 0.01 - time: 2023-01-02 00:00:00 - - location: # empty waypoint + time: 2023-01-03 00:00:00 + # Port of Arrival + - location: latitude: 0.02 longitude: 0.01 - time: 2023-01-02 03:00:00 + time: 2023-01-04 03:00:00 instruments_config: adcp_config: num_bins: 40 From 72ce6d0988f92ef9e08ae1af577ef943102fdd78 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 15:18:47 +0200 Subject: [PATCH 161/191] new test for filtering out placeholder ports --- tests/instruments/test_base.py | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/instruments/test_base.py b/tests/instruments/test_base.py index e493776d..44b4f13a 100644 --- a/tests/instruments/test_base.py +++ b/tests/instruments/test_base.py @@ -385,6 +385,42 @@ def test_instrument_samples_initial_conditions(fieldset, pset): ) +def test_instrument_init_filters_out_placeholder_ports(mock_expedition, mock_waypoints): + """Verify Instrument init uses _get_wps_in_use to strip null ports.""" + null_port = MagicMock() + null_port.location.latitude = None + null_port.location.longitude = None + null_port.time = None + + # insert placeholder ports around the valid mock_waypoints + mock_expedition.schedule._get_wps_in_use.return_value = [ + null_port, + *mock_waypoints, + null_port, + ] + + with patch( + "virtualship.instruments.base._get_instr_relevant_wps", + return_value=mock_waypoints, + ) as mock_filter: + dummy = DummyInstrument( + expedition=mock_expedition, + variables={"A": "a"}, + add_bathymetry=False, + verbose_progress=False, + from_data=None, + ) + + mock_filter.assert_called_once_with( + mock_expedition.schedule._get_wps_in_use(), + dummy.instrument_type, + ) + + assert dummy.bounds.min_lat == 10.0 + assert dummy.bounds.max_lat == 15.0 + assert dummy.bounds.min_time == datetime(2026, 1, 1, 12, 0) + + # ============================================================================= # UnderwayInstrument intermediate class testing # ============================================================================= From 8de92c1e3a4b1c9526ba501cb51c45f9e968acac Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:39:18 +0200 Subject: [PATCH 162/191] add more checks to Schedule object --- src/virtualship/models/expedition.py | 31 ++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 5785f10f..82c9b6ce 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -130,6 +130,23 @@ def _wp_ports(cls, value: list[Port | Waypoint]) -> None: raise ScheduleError("At least one non-port waypoint must be provided.") return value + @pydantic.field_validator("waypoints", mode="after") + @staticmethod + def _validate_waypoints_ports( + value: list[Port | Waypoint], + ) -> list[Port | Waypoint]: + """Warn if Port waypoints are half-complete: they will still be ignored.""" + first_incomplete = isinstance(value[0], Port) and not value[0].is_in_use + last_incomplete = isinstance(value[-1], Port) and not value[-1].is_in_use + + if first_incomplete or last_incomplete: + print( + "\nWARNING: Departure and/or arrival port is incomplete in the schedule " + "(missing time, location or both). The simulation will continue but the port will be ignored.\n" + ) + + return value + def verify( self, ship_speed: float, @@ -254,13 +271,13 @@ def _get_wps_in_use(self) -> list[Port | Waypoint]: def departure_port_in_use(self) -> bool: """Check if the departure port is in use (i.e., has a specified time and location), or is placeholder.""" p = self.waypoints[0] - return all(v is not None for v in (p.time, p.location.lat, p.location.lon)) + return isinstance(p, Port) and p.is_in_use @property def arrival_port_in_use(self) -> bool: """Check if the arrival port is in use (i.e., has a specified time and location), or is placeholder.""" p = self.waypoints[-1] - return all(v is not None for v in (p.time, p.location.lat, p.location.lon)) + return isinstance(p, Port) and p.is_in_use class Port(pydantic.BaseModel): @@ -271,6 +288,16 @@ class Port(pydantic.BaseModel): model_config = pydantic.ConfigDict(extra="forbid") + @property + def is_in_use(self) -> bool: + """Return True if the port has both a valid time and location (lat/lon).""" + return ( + self.time is not None + and self.location is not None + and self.location.lat is not None + and self.location.lon is not None + ) + class Waypoint(pydantic.BaseModel): """A Waypoint to sail to with an optional time and an optional instrument.""" From f41f4debf7f7182f91f8228efcc3e1a860efdeba Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:46:01 +0200 Subject: [PATCH 163/191] support empty Ports --- src/virtualship/cli/_plan.py | 70 ++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index ad01ca64..7e8d6476 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -87,6 +87,14 @@ def _default_sensors(config_class) -> list: return sensors_field.default_factory() +def parse_waypoint_datetime(year, month, day, hour, minute): + """Parses date/time values into a datetime object if all components are present.""" + values = (year, month, day, hour, minute) + if all(v is not None and v != Select.NULL for v in values): + return datetime.datetime(*(int(v) for v in values)) + return None + + DEFAULT_TS_CONFIG = {"period_minutes": 5.0} DEFAULT_ADCP_CONFIG = { @@ -554,19 +562,28 @@ def _update_instrument_configs(self): def _update_schedule(self): for i, wp in enumerate(self.expedition.schedule.waypoints): - wp.location = Location( - latitude=float(self.query_one(f"#wp{i}_lat").value), - longitude=float(self.query_one(f"#wp{i}_lon").value), - ) - wp.time = datetime.datetime( - int(self.query_one(f"#wp{i}_year").value), - int(self.query_one(f"#wp{i}_month").value), - int(self.query_one(f"#wp{i}_day").value), - int(self.query_one(f"#wp{i}_hour").value), - int(self.query_one(f"#wp{i}_minute").value), - 0, + wp.time = parse_waypoint_datetime( + self.query_one(f"#wp{i}_year", Select).value, + self.query_one(f"#wp{i}_month", Select).value, + self.query_one(f"#wp{i}_day", Select).value, + self.query_one(f"#wp{i}_hour", Select).value, + self.query_one(f"#wp{i}_minute", Select).value, ) + lat_val = self.query_one(f"#wp{i}_lat").value + lon_val = self.query_one(f"#wp{i}_lon").value + + if isinstance(wp, Port) and (lat_val == "" or lon_val == ""): + wp.location = Location( + latitude=float(lat_val) if lat_val != "" else None, + longitude=float(lon_val) if lon_val != "" else None, + ) + else: + wp.location = Location( + latitude=float(lat_val), + longitude=float(lon_val), + ) + if not isinstance(wp, Port): wp.instrument = [] for instrument in [ @@ -1099,19 +1116,28 @@ def sync_ui_waypoints(self): for i, wp in enumerate(expedition_editor.expedition.schedule.waypoints): try: - wp.location = Location( - latitude=float(expedition_editor.query_one(f"#wp{i}_lat").value), - longitude=float(expedition_editor.query_one(f"#wp{i}_lon").value), - ) - wp.time = datetime.datetime( - int(expedition_editor.query_one(f"#wp{i}_year").value), - int(expedition_editor.query_one(f"#wp{i}_month").value), - int(expedition_editor.query_one(f"#wp{i}_day").value), - int(expedition_editor.query_one(f"#wp{i}_hour").value), - int(expedition_editor.query_one(f"#wp{i}_minute").value), - 0, + wp.time = parse_waypoint_datetime( + self.query_one(f"#wp{i}_year", Select).value, + self.query_one(f"#wp{i}_month", Select).value, + self.query_one(f"#wp{i}_day", Select).value, + self.query_one(f"#wp{i}_hour", Select).value, + self.query_one(f"#wp{i}_minute", Select).value, ) + lat_val = expedition_editor.query_one(f"#wp{i}_lat").value + lon_val = expedition_editor.query_one(f"#wp{i}_lon").value + + if isinstance(wp, Port) and (lat_val == "" or lon_val == ""): + wp.location = Location( + latitude=float(lat_val) if lat_val != "" else None, + longitude=float(lon_val) if lon_val != "" else None, + ) + else: + wp.location = Location( + latitude=float(lat_val), + longitude=float(lon_val), + ) + if not isinstance(wp, Port): wp.instrument = [] From 7239d379b32dfc20d65d9f60bd324c229f4d6975 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 20:58:22 +0200 Subject: [PATCH 164/191] refactor Schedule validators --- src/virtualship/models/expedition.py | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 82c9b6ce..0e44ebbc 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -120,26 +120,18 @@ class Schedule(pydantic.BaseModel): @pydantic.field_validator("waypoints", mode="after") @classmethod - def _wp_ports(cls, value: list[Port | Waypoint]) -> None: - """First and last waypoints are Ports, plus has at least one non-port waypoint.""" + def _validate_waypoints(cls, value: list[Port | Waypoint]) -> list[Port | Waypoint]: + """Ensure First and last waypoints are Ports, schedule contains non-port waypoints, and warn on incomplete ports.""" if not isinstance(value[0], Port) or not isinstance(value[-1], Port): raise ScheduleError( - "First and last waypoints must be Ports (of arrival/departure). One or the other is currently missing." + "First and last waypoints must be Ports (of arrival/departure). " + "One or the other is currently missing." ) + if not any(isinstance(wp, Waypoint) for wp in value): raise ScheduleError("At least one non-port waypoint must be provided.") - return value - @pydantic.field_validator("waypoints", mode="after") - @staticmethod - def _validate_waypoints_ports( - value: list[Port | Waypoint], - ) -> list[Port | Waypoint]: - """Warn if Port waypoints are half-complete: they will still be ignored.""" - first_incomplete = isinstance(value[0], Port) and not value[0].is_in_use - last_incomplete = isinstance(value[-1], Port) and not value[-1].is_in_use - - if first_incomplete or last_incomplete: + if not value[0].is_in_use or not value[-1].is_in_use: print( "\nWARNING: Departure and/or arrival port is incomplete in the schedule " "(missing time, location or both). The simulation will continue but the port will be ignored.\n" From 00efb18e43dde938fdd6a4cdf25f4a2c21997cf8 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:23:54 +0200 Subject: [PATCH 165/191] use centralised warning msg for incomplete ports --- src/virtualship/utils.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 75e336a7..d322edd4 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -97,6 +97,13 @@ BATHYMETRY_ID = "cmems_mod_glo_phy_my_0.083deg_static" +# ===================================================== +# SECTION: warnings and messages +# ===================================================== + + +INCOMPLETE_PORT_MSG = "WARNING: Departure and/or arrival port is incomplete in the schedule (missing time, location or both). The simulation will continue but the ports will be ignored." + # ===================================================== # SECTION: decorators / dynamic registries and mapping From 4dfac2f058b7cc9fe31530d964a1ed7308147a3f Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:24:05 +0200 Subject: [PATCH 166/191] add warning on save for incomplete ports --- src/virtualship/cli/_plan.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index 7e8d6476..932270c4 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -44,7 +44,7 @@ XBTConfig, ) from virtualship.models.expedition import Port -from virtualship.utils import EXPEDITION +from virtualship.utils import EXPEDITION, INCOMPLETE_PORT_MSG UNEXPECTED_MSG_ONSAVE = ( "Please ensure that:\n" @@ -1182,18 +1182,14 @@ def save_pressed(self) -> None: try: ship_speed_value = self.get_ship_speed(expedition_editor) - self.sync_ui_waypoints() # call to ensure waypoint inputs are synced - # verify schedule instruments_config = expedition_editor.expedition.instruments_config + schedule = expedition_editor.expedition.schedule - expedition_editor.expedition.schedule.verify( - ship_speed_value, - instruments_config, - ignore_land_test=True, - ) + schedule.verify(ship_speed_value, instruments_config, ignore_land_test=True) + # save changes expedition_saved = expedition_editor.save_changes() if expedition_saved: @@ -1203,6 +1199,17 @@ def save_pressed(self) -> None: timeout=20, ) + # check for incomplete ports and warn the user, but allow save to continue + if ( + not schedule.departure_port.is_in_use + or not schedule.arrival_port.is_in_use + ): + self.notify( + INCOMPLETE_PORT_MSG, + severity="warning", + timeout=20, + ) + except Exception as e: self.notify( escape( From 0dafa9bbaa0e57caec349900c773aad1162594f7 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:30:49 +0200 Subject: [PATCH 167/191] enhance messaging --- src/virtualship/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index d322edd4..00d3c916 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -102,7 +102,10 @@ # ===================================================== -INCOMPLETE_PORT_MSG = "WARNING: Departure and/or arrival port is incomplete in the schedule (missing time, location or both). The simulation will continue but the ports will be ignored." +INCOMPLETE_PORT_MSG = ( + "WARNING: Departure and/or arrival port is/are incomplete in the schedule (missing time, location, or both). " + "The simulation will continue but incomplete ports will be ignored." +) # ===================================================== From ae2617356646fd1726cc406c0037f017845c15e5 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:32:38 +0200 Subject: [PATCH 168/191] consolidate field validators, simplift Schedule properties and cast first and last waypoints to Ports for enhanced readability elsewhere in codebase --- src/virtualship/models/expedition.py | 44 +++++++++++++--------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 0e44ebbc..f94d89e2 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -3,7 +3,7 @@ import itertools from datetime import datetime, timedelta from pathlib import Path -from typing import ClassVar +from typing import ClassVar, cast import numpy as np import pydantic @@ -14,6 +14,7 @@ from virtualship.instruments.sensors import SENSOR_REGISTRY, SensorType, _Sensor from virtualship.instruments.types import InstrumentType from virtualship.utils import ( + INCOMPLETE_PORT_MSG, _calc_sail_time, _calc_wp_stationkeeping_time, _get_bathy_data, @@ -121,7 +122,7 @@ class Schedule(pydantic.BaseModel): @pydantic.field_validator("waypoints", mode="after") @classmethod def _validate_waypoints(cls, value: list[Port | Waypoint]) -> list[Port | Waypoint]: - """Ensure First and last waypoints are Ports, schedule contains non-port waypoints, and warn on incomplete ports.""" + """Ensure first and last waypoints are Port objects, schedule contains non-port waypoints, and warn on incomplete ports.""" if not isinstance(value[0], Port) or not isinstance(value[-1], Port): raise ScheduleError( "First and last waypoints must be Ports (of arrival/departure). " @@ -132,13 +133,20 @@ def _validate_waypoints(cls, value: list[Port | Waypoint]) -> list[Port | Waypoi raise ScheduleError("At least one non-port waypoint must be provided.") if not value[0].is_in_use or not value[-1].is_in_use: - print( - "\nWARNING: Departure and/or arrival port is incomplete in the schedule " - "(missing time, location or both). The simulation will continue but the port will be ignored.\n" - ) + print(f"\n{INCOMPLETE_PORT_MSG}") return value + @property + def departure_port(self) -> Port: + """Departure port (always the first waypoint).""" + return cast(Port, self.waypoints[0]) + + @property + def arrival_port(self) -> Port: + """Arrival port (always the last waypoint).""" + return cast(Port, self.waypoints[-1]) + def verify( self, ship_speed: float, @@ -151,8 +159,8 @@ def verify( print("\nVerifying route... ") # is the departure port in use or a placeholder (i.e. all None)? - check_idx = 0 if self.departure_port_in_use else 1 - wp_str = "Departure port" if self.departure_port_in_use else "Waypoint 1" + check_idx = 0 if self.departure_port.is_in_use else 1 + wp_str = "Departure port" if self.departure_port.is_in_use else "Waypoint 1" if self.waypoints[check_idx].time is None: raise ScheduleError(f"{wp_str} must have a specified time.") @@ -205,7 +213,7 @@ def verify( # check that ship will arrive on time at each waypoint (in case no unexpected event happen) time = ( self.waypoints[0].time - if self.departure_port_in_use + if self.departure_port.is_in_use else self.waypoints[1].time ) @@ -253,24 +261,14 @@ def verify( def _get_wps_in_use(self) -> list[Port | Waypoint]: """Return waypoints that are in use (i.e., have a specified time and location), i.e. excluding placeholder departure/arrival ports.""" - start_slice = 0 if self.departure_port_in_use else 1 + start_slice = 0 if self.departure_port.is_in_use else 1 end_slice = ( - len(self.waypoints) if self.arrival_port_in_use else len(self.waypoints) - 1 + len(self.waypoints) + if self.arrival_port.is_in_use + else len(self.waypoints) - 1 ) return self.waypoints[start_slice:end_slice] - @property - def departure_port_in_use(self) -> bool: - """Check if the departure port is in use (i.e., has a specified time and location), or is placeholder.""" - p = self.waypoints[0] - return isinstance(p, Port) and p.is_in_use - - @property - def arrival_port_in_use(self) -> bool: - """Check if the arrival port is in use (i.e., has a specified time and location), or is placeholder.""" - p = self.waypoints[-1] - return isinstance(p, Port) and p.is_in_use - class Port(pydantic.BaseModel): """A port stop: a location the ship visits with no instrument deployments made.""" From 941822986ffaceed3f0dc3d90f024a8a5f635582 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 09:59:35 +0200 Subject: [PATCH 169/191] fix some plan tool validation/save changes logic --- src/virtualship/cli/_plan.py | 53 ++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/virtualship/cli/_plan.py b/src/virtualship/cli/_plan.py index 932270c4..1acbd97d 100644 --- a/src/virtualship/cli/_plan.py +++ b/src/virtualship/cli/_plan.py @@ -7,7 +7,6 @@ from textual.app import App, ComposeResult from textual.containers import Container, Horizontal, VerticalScroll from textual.dom import NoMatches -from textual.markup import escape from textual.screen import ModalScreen, Screen from textual.validation import Function, Integer from textual.widgets import ( @@ -443,8 +442,8 @@ def save_changes(self) -> bool: """Save changes to expedition.yaml.""" try: self._update_ship_speed() - self._update_instrument_configs() self._update_schedule() + self._update_instrument_configs() self.expedition.to_yaml(self.path.joinpath(EXPEDITION)) return True except UserError: @@ -505,6 +504,7 @@ def _update_instrument_configs(self): kwargs["max_depth_meter"] = -1000.0 else: kwargs["max_depth_meter"] = -150.0 + # collect sensor toggles default_sensor_configs = _default_sensors(config_class) if default_sensor_configs: @@ -515,20 +515,22 @@ def _update_instrument_configs(self): f"#{instrument_name}_sensor_{sc.sensor_type.value}", Switch ).value ] - if not sensors: - # for schedule-based instruments, only raise if actually used in a waypoint - # for underway, this is handled by the on/off toggle - instrument_type = info.get("instrument_type") - is_active = instrument_type is None or any( - instrument_type - in ( - wp.instrument - if isinstance(wp.instrument, list) - else [wp.instrument] - ) - for wp in self.expedition.schedule.waypoints - if wp.instrument + + instrument_type = info.get("instrument_type") + + # safe check for instrument existence across all waypoint types + is_active = instrument_type is None or any( + instrument_type + in ( + wp.instrument + if isinstance(wp.instrument, list) + else [wp.instrument] ) + for wp in self.expedition.schedule.waypoints + if getattr(wp, "instrument", None) + ) + + if not sensors: if is_active: title = info.get( "title", instrument_name.replace("_", " ").title() @@ -537,9 +539,16 @@ def _update_instrument_configs(self): f"'{title}' has no sensors selected. " f"At least one sensor must be enabled for each active instrument." ) - kwargs["sensors"] = ( - sensors if sensors else _default_sensors(config_class) - ) + else: + # if the instrument is not active in the schedule and no sensors are selected: + # reset to default sensors (or keep default_sensor_configs) so pydantic validation passes. + sensors = [ + SensorConfig(sensor_type=sc.sensor_type) + for sc in default_sensor_configs + ] + + kwargs["sensors"] = sensors + try: setattr( self.expedition.instruments_config, @@ -1182,14 +1191,13 @@ def save_pressed(self) -> None: try: ship_speed_value = self.get_ship_speed(expedition_editor) - self.sync_ui_waypoints() # call to ensure waypoint inputs are synced + self.sync_ui_waypoints() instruments_config = expedition_editor.expedition.instruments_config schedule = expedition_editor.expedition.schedule schedule.verify(ship_speed_value, instruments_config, ignore_land_test=True) - # save changes expedition_saved = expedition_editor.save_changes() if expedition_saved: @@ -1212,11 +1220,10 @@ def save_pressed(self) -> None: except Exception as e: self.notify( - escape( - f"*** Error saving changes ***:\n\n{e}\n" - ), # escape avoids issues with special characters being interpreted as markup + f"*** Error saving changes ***:\n\n{e}\n", severity="error", timeout=20, + markup=False, ) return False From 24f66bd4235b22084735700a7b03799906bc52ca Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 09:59:51 +0200 Subject: [PATCH 170/191] adapt tests to handle new Ports properly --- tests/cli/test_plan.py | 50 ++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/tests/cli/test_plan.py b/tests/cli/test_plan.py index a38d61e9..0b5eb51f 100644 --- a/tests/cli/test_plan.py +++ b/tests/cli/test_plan.py @@ -17,6 +17,7 @@ SensorConfig, Waypoint, ) +from virtualship.models.expedition import Port from virtualship.utils import EXPEDITION, _get_example_expedition NEW_SPEED = "8.0" @@ -76,6 +77,10 @@ async def _expand_instrument_configs( async def test_UI_changes(tmp_path): """Test making changes to UI inputs and saving to YAML (simulated botton presses and typing inputs).""" waypoints = [ + Port( + location=None, + time=None, + ), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -91,6 +96,10 @@ async def test_UI_changes(tmp_path): time=datetime(2022, 1, 1, 2, 0, 0), instrument=["CTD"], ), + Port( + location=None, + time=None, + ), ] _make_expedition(tmp_path, waypoints) @@ -125,18 +134,18 @@ async def test_UI_changes(tmp_path): wp_collapsible.collapsed = False await pilot.pause() lat_input, lon_input = ( - wp_collapsible.query_one("#wp1_lat", Input), - wp_collapsible.query_one("#wp1_lon", Input), + wp_collapsible.query_one("#wp2_lat", Input), + wp_collapsible.query_one("#wp2_lon", Input), ) await simulate_input(pilot, lat_input, NEW_LAT) await simulate_input(pilot, lon_input, NEW_LON) # toggle CTD on first waypoint - await pilot.click("#wp0_CTD") + await pilot.click("#wp1_CTD") await pilot.pause(0.1) # toggle XBT on first waypoint - await pilot.click("#wp0_XBT") + await pilot.click("#wp1_XBT") await pilot.pause(0.1) # re-collapse widget editors to make save button visible on screen @@ -151,10 +160,11 @@ async def test_UI_changes(tmp_path): await pilot.pause(0.5) # verify success notification received in UI (also useful for displaying potential debugging messages) - plan_screen.notify.assert_called_once_with( - "Changes saved successfully", - severity="information", - timeout=20, + calls = plan_screen.notify.call_args_list + assert any( + call[0][0] == "Changes saved successfully" + and call[1].get("severity") == "information" + for call in calls ) # verify changes to speed, lat, lon in saved YAML @@ -177,6 +187,7 @@ async def test_UI_changes(tmp_path): async def test_UI_opens_with_null_time_and_instrument(tmp_path): """Test that the UI opens correctly when waypoints have time: null and instrument: null.""" waypoints = [ + Port(location=None, time=None), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -184,6 +195,7 @@ async def test_UI_opens_with_null_time_and_instrument(tmp_path): ), Waypoint(location=Location(0.01, 0.01), time=None, instrument=None), Waypoint(location=Location(0.02, 0.02), time=None, instrument=None), + Port(location=None, time=None), ] _make_expedition(tmp_path, waypoints) @@ -213,6 +225,7 @@ async def test_sensor_toggle_saved_to_yaml(tmp_path): _make_expedition( tmp_path, [ + Port(location=None, time=None), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -223,6 +236,7 @@ async def test_sensor_toggle_saved_to_yaml(tmp_path): time=datetime(2022, 1, 1, 1, 0, 0), instrument=None, ), + Port(location=None, time=None), ], ) @@ -242,8 +256,11 @@ async def test_sensor_toggle_saved_to_yaml(tmp_path): await pilot.click(plan_screen.query_one("#save_button", Button)) await pilot.pause(0.5) - plan_screen.notify.assert_called_once_with( - "Changes saved successfully", severity="information", timeout=20 + calls = plan_screen.notify.call_args_list + assert any( + call[0][0] == "Changes saved successfully" + and call[1].get("severity") == "information" + for call in calls ) with open(tmp_path / EXPEDITION) as f: @@ -259,6 +276,7 @@ async def test_deselecting_all_sensors_on_active_instrument_blocks_save(tmp_path _make_expedition( tmp_path, [ + Port(location=None, time=None), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -269,6 +287,7 @@ async def test_deselecting_all_sensors_on_active_instrument_blocks_save(tmp_path time=datetime(2022, 1, 1, 1, 0, 0), instrument=None, ), + Port(location=None, time=None), ], ) @@ -302,6 +321,7 @@ async def test_deselecting_all_sensors_on_inactive_instrument(tmp_path): _make_expedition( tmp_path, [ + Port(location=None, time=None), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -312,6 +332,7 @@ async def test_deselecting_all_sensors_on_inactive_instrument(tmp_path): time=datetime(2022, 1, 1, 1, 0, 0), instrument=None, ), + Port(location=None, time=None), ], ) @@ -333,8 +354,11 @@ async def test_deselecting_all_sensors_on_inactive_instrument(tmp_path): await pilot.click(plan_screen.query_one("#save_button", Button)) await pilot.pause(0.5) - plan_screen.notify.assert_called_once_with( - "Changes saved successfully", severity="information", timeout=20 + calls = plan_screen.notify.call_args_list + assert any( + call[0][0] == "Changes saved successfully" + and call[1].get("severity") == "information" + for call in calls ) @@ -354,6 +378,7 @@ async def test_sensor_initial_state_reflects_config(tmp_path): _make_expedition( tmp_path, [ + Port(location=None, time=None), Waypoint( location=Location(0, 0), time=datetime(2022, 1, 1, 0, 0, 0), @@ -364,6 +389,7 @@ async def test_sensor_initial_state_reflects_config(tmp_path): time=datetime(2022, 1, 1, 1, 0, 0), instrument=None, ), + Port(location=None, time=None), ], instruments_config, ) From 5d6c62d0aa3422c4d87294026c28f765bc4fed10 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:32:15 +0200 Subject: [PATCH 171/191] update tests to handle Ports properly --- tests/expedition/test_simulate_schedule.py | 28 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/expedition/test_simulate_schedule.py b/tests/expedition/test_simulate_schedule.py index c92acdb6..8bb31934 100644 --- a/tests/expedition/test_simulate_schedule.py +++ b/tests/expedition/test_simulate_schedule.py @@ -10,6 +10,7 @@ simulate_schedule, ) from virtualship.models import Expedition, Location, Schedule, Waypoint +from virtualship.models.expedition import Port def test_simulate_schedule_feasible() -> None: @@ -21,16 +22,21 @@ def test_simulate_schedule_feasible() -> None: expedition.ship_config.ship_speed_knots = 10.0 expedition.schedule = Schedule( waypoints=[ + Port(location=None, time=None), Waypoint(location=Location(0, 0), time=base_time), Waypoint(location=Location(0.01, 0), time=base_time + timedelta(days=1)), + Port(location=None, time=None), ] ) + # assume the schedule has been verified + expedition.schedule._verified = True result = simulate_schedule(projection, expedition) assert isinstance(result, ScheduleOk) +### TODO: this kind of test should be moved to schedule.verify() [if it doesn't already have it] now that the redundant timing check has been removed from simulate_schedule() def test_simulate_schedule_too_far() -> None: """Test schedule with two waypoints that are very far away and cannot be reached in time is not OK.""" base_time = datetime.strptime("2022-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S") @@ -40,10 +46,14 @@ def test_simulate_schedule_too_far() -> None: expedition.ship_config.ship_speed_knots = 10.0 expedition.schedule = Schedule( waypoints=[ + Port(location=None, time=None), Waypoint(location=Location(0, 0), time=base_time), Waypoint(location=Location(1.0, 0), time=base_time + timedelta(minutes=1)), + Port(location=None, time=None), ] ) + # assume the schedule has been verified + expedition.schedule._verified = True result = simulate_schedule(projection, expedition) @@ -82,26 +92,34 @@ def test_ship_path_inside_domain() -> None: # waypoints with enough distance where curvature is clear expedition.schedule = Schedule( waypoints=[ + Port(location=None, time=None), Waypoint(location=wp1, time=base_time), Waypoint(location=wp2, time=base_time + timedelta(days=5)), Waypoint(location=wp3, time=base_time + timedelta(days=10)), Waypoint(location=wp4, time=base_time + timedelta(days=15)), + Port(location=None, time=None), ] ) # get waypoint domain bounds + wps_in_use = expedition.schedule._get_wps_in_use() + wp_max_lat, wp_min_lat, wp_max_lon, wp_min_lon = ( - max(wp.location.lat for wp in expedition.schedule.waypoints), - min(wp.location.lat for wp in expedition.schedule.waypoints), - max(wp.location.lon for wp in expedition.schedule.waypoints), - min(wp.location.lon for wp in expedition.schedule.waypoints), + max(wp.location.lat for wp in wps_in_use), + min(wp.location.lat for wp in wps_in_use), + max(wp.location.lon for wp in wps_in_use), + min(wp.location.lon for wp in wps_in_use), ) + # assume the schedule has been verified + expedition.schedule._verified = True + result = simulate_schedule(projection, expedition) assert isinstance(result, ScheduleOk) # adcp measurements path adcp_measurements = result.measurements_to_simulate.adcps + adcp_lats = [m.location.lat for m in adcp_measurements] adcp_lons = [m.location.lon for m in adcp_measurements] @@ -134,8 +152,10 @@ def test_does_not_simulate_unverified(): expedition.ship_config.ship_speed_knots = 10.0 expedition.schedule = Schedule( waypoints=[ + Port(location=None, time=None), Waypoint(location=Location(0, 0), time=base_time), Waypoint(location=Location(0.01, 0), time=base_time + timedelta(days=1)), + Port(location=None, time=None), ] ) From 2af657f99c0d9b9ad6118ad91b593b125af62530 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:33:33 +0200 Subject: [PATCH 172/191] remove redundant test now that timing verification is removed from simulate_schedule --- tests/expedition/test_simulate_schedule.py | 25 ---------------------- 1 file changed, 25 deletions(-) diff --git a/tests/expedition/test_simulate_schedule.py b/tests/expedition/test_simulate_schedule.py index 8bb31934..f33e3b52 100644 --- a/tests/expedition/test_simulate_schedule.py +++ b/tests/expedition/test_simulate_schedule.py @@ -6,7 +6,6 @@ from virtualship.expedition.simulate_schedule import ( ScheduleOk, - ScheduleProblem, simulate_schedule, ) from virtualship.models import Expedition, Location, Schedule, Waypoint @@ -36,30 +35,6 @@ def test_simulate_schedule_feasible() -> None: assert isinstance(result, ScheduleOk) -### TODO: this kind of test should be moved to schedule.verify() [if it doesn't already have it] now that the redundant timing check has been removed from simulate_schedule() -def test_simulate_schedule_too_far() -> None: - """Test schedule with two waypoints that are very far away and cannot be reached in time is not OK.""" - base_time = datetime.strptime("2022-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S") - - projection = pyproj.Geod(ellps="WGS84") - expedition = Expedition.from_yaml("expedition_dir/expedition.yaml") - expedition.ship_config.ship_speed_knots = 10.0 - expedition.schedule = Schedule( - waypoints=[ - Port(location=None, time=None), - Waypoint(location=Location(0, 0), time=base_time), - Waypoint(location=Location(1.0, 0), time=base_time + timedelta(minutes=1)), - Port(location=None, time=None), - ] - ) - # assume the schedule has been verified - expedition.schedule._verified = True - - result = simulate_schedule(projection, expedition) - - assert isinstance(result, ScheduleProblem) - - def test_time_in_minutes_in_ship_schedule() -> None: """Test whether the pydantic serializer picks up the time *in minutes* in the ship schedule.""" instruments_config = Expedition.from_yaml( From b0f87055a41c6d54bd75a5747f0db186f3ac5252 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:49:34 +0200 Subject: [PATCH 173/191] update all instrument tests to handle new wps_in_use logic --- tests/instruments/test_adcp.py | 21 ++++++++++++-------- tests/instruments/test_argo_float.py | 18 +++++++++++++---- tests/instruments/test_ctd.py | 18 +++++++++++++---- tests/instruments/test_drifter.py | 18 +++++++++++++---- tests/instruments/test_ship_underwater_st.py | 21 ++++++++++++-------- tests/instruments/test_xbt.py | 21 ++++++++++++-------- 6 files changed, 81 insertions(+), 36 deletions(-) diff --git a/tests/instruments/test_adcp.py b/tests/instruments/test_adcp.py index ab13f99c..d5792094 100644 --- a/tests/instruments/test_adcp.py +++ b/tests/instruments/test_adcp.py @@ -32,15 +32,20 @@ def adcp_expedition(): """Minimal Expedition for ADCPInstrument instantiation.""" + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=[], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: ClassVar[list] = [ - Waypoint( - location=Location(1, 2), - time=BASE_TIME, - instrument=InstrumentType.ADCP, - ), - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( adcp_config=ADCPConfig( diff --git a/tests/instruments/test_argo_float.py b/tests/instruments/test_argo_float.py index 2917a875..1f519816 100644 --- a/tests/instruments/test_argo_float.py +++ b/tests/instruments/test_argo_float.py @@ -3,6 +3,7 @@ import contextlib import io from datetime import datetime, timedelta +from typing import ClassVar import numpy as np import parcels @@ -128,11 +129,20 @@ def create_argo_float(waypoint): def create_dummy_expedition(sensors, lifetime=timedelta(days=1), location=(1, 2)): """Create a DummyExpedition class with specified sensors and parameters.""" + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(*location), + time=BASE_TIME, + instrument=[InstrumentType.ARGO_FLOAT], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: list[Waypoint] = [ # noqa: RUF012 - Waypoint(location=Location(*location), time=BASE_TIME) - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( argo_float_config=ArgoFloatConfig( diff --git a/tests/instruments/test_ctd.py b/tests/instruments/test_ctd.py index 3e63a8bd..cc8a4ad1 100644 --- a/tests/instruments/test_ctd.py +++ b/tests/instruments/test_ctd.py @@ -5,6 +5,7 @@ """ import datetime +from typing import ClassVar import numpy as np import parcels @@ -35,11 +36,20 @@ def create_dummy_expedition( ): """Create a DummyExpedition class with specified sensors and parameters.""" + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(*location), + time=BASE_TIME, + instrument=[InstrumentType.CTD], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: list[Waypoint] = [ # noqa: RUF012 - Waypoint(location=Location(*location), time=BASE_TIME) - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( ctd_config=CTDConfig( diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 21ac2afa..704c9216 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -1,6 +1,7 @@ """Test the simulation of drifters.""" import datetime +from typing import ClassVar import numpy as np import parcels @@ -34,11 +35,20 @@ def create_dummy_expedition( if sensors is None: sensors = [SensorConfig(sensor_type=SensorType.TEMPERATURE)] + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(*location), + time=BASE_TIME, + instrument=[InstrumentType.DRIFTER], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: list[Waypoint] = [ # noqa: RUF012 - Waypoint(location=Location(*location), time=BASE_TIME) - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( drifter_config=DrifterConfig( diff --git a/tests/instruments/test_ship_underwater_st.py b/tests/instruments/test_ship_underwater_st.py index 1bf1689c..f7e0e0a2 100644 --- a/tests/instruments/test_ship_underwater_st.py +++ b/tests/instruments/test_ship_underwater_st.py @@ -30,15 +30,20 @@ def underwater_st_expedition(): """Minimal Expedition for Underwater_STInstrument instantiation.""" + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=[], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: ClassVar[list] = [ - Waypoint( - location=Location(1, 2), - time=BASE_TIME, - instrument=InstrumentType.UNDERWATER_ST, - ), - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( ship_underwater_st_config=ShipUnderwaterSTConfig( diff --git a/tests/instruments/test_xbt.py b/tests/instruments/test_xbt.py index d55ce4fb..e3661df7 100644 --- a/tests/instruments/test_xbt.py +++ b/tests/instruments/test_xbt.py @@ -38,15 +38,20 @@ def xbt_expedition(): """Minimal Expedition for Underwater_STInstrument instantiation.""" + class DummySchedule: + waypoints: ClassVar[list] = [ + Waypoint( + location=Location(1, 2), + time=BASE_TIME, + instrument=[InstrumentType.XBT], + ), + ] + + def _get_wps_in_use(self): + return self.waypoints + class DummyExpedition: - class schedule: - waypoints: ClassVar[list] = [ - Waypoint( - location=Location(1, 2), - time=BASE_TIME, - instrument=InstrumentType.XBT, - ), - ] + schedule = DummySchedule() instruments_config = InstrumentsConfig( xbt_config=XBTConfig( From fa18a9ec44885e0280951f77d3a50db3e1f76e6a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:01:23 +0200 Subject: [PATCH 174/191] handle inactive ports properly in problem count selection --- src/virtualship/make_realistic/problems/simulator.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index 3bc59199..1cb8ced1 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -94,8 +94,11 @@ def select_problems( if difficulty_level == "easy": return None - # # if only one waypoint, return just a pre-departure problem - if len(self.waypoints) < 2: + # filter out any inactive Ports + wps_in_use = self.expedition.schedule._get_wps_in_use() + + # if only one waypoint, return just a pre-departure problem + if len(wps_in_use) < 2: pre_departure = [p for p in GENERAL_PROBLEMS if p.pre_departure] return { "problem_class": [random.choice(pre_departure)], @@ -109,8 +112,8 @@ def select_problems( ] num_problems = self._calculate_problem_count( difficulty_level=difficulty_level, - expedition_days=(self.waypoints[-1].time - self.waypoints[0].time).days, - num_waypoints=len(self.waypoints), + expedition_days=(wps_in_use[-1].time - wps_in_use[0].time).days, + num_waypoints=len(wps_in_use), num_instruments=len(instruments_in_expedition), max_available=len(GENERAL_PROBLEMS) + len(valid_instruments), ) From b3d8ac54c111f014ceb0b1727701915df50aa45b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:01:46 +0200 Subject: [PATCH 175/191] remove post_init: verification already performed in Schedule object --- src/virtualship/make_realistic/problems/simulator.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index 1cb8ced1..ea764657 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -73,12 +73,6 @@ def __init__(self, expedition: Expedition, expedition_dir: str | Path): self.waypoints = expedition.schedule.waypoints - def __post_init__(self): - """Ensure first and last waypoints are Ports. Allows the problem selection to work properly.""" - assert isinstance(self.waypoints[0], Port) & isinstance( - self.waypoints[-1], Port - ), "First and last waypoints must be Port types." - def select_problems( self, instruments_in_expedition: set[InstrumentType], From 5dcf7af9038d24ccd9069046cb6b44ab9eb6733e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:00:53 +0200 Subject: [PATCH 176/191] problem simulator handles inactive departure port for pre-departure problems --- .../make_realistic/problems/simulator.py | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index ea764657..be6cc53d 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -70,9 +70,11 @@ def __init__(self, expedition: Expedition, expedition_dir: str | Path): """Initialise ProblemSimulator with a schedule and probability level.""" self.expedition = expedition self.expedition_dir = Path(expedition_dir) - self.waypoints = expedition.schedule.waypoints + # version with inactive Ports (if any) filtered out + self.wps_in_use = self.expedition.schedule._get_wps_in_use() + def select_problems( self, instruments_in_expedition: set[InstrumentType], @@ -88,11 +90,13 @@ def select_problems( if difficulty_level == "easy": return None - # filter out any inactive Ports - wps_in_use = self.expedition.schedule._get_wps_in_use() + # isolate only the non-port waypoints + non_port_wps = [ + i for i, wp in enumerate(self.wps_in_use) if not isinstance(wp, Port) + ] # if only one waypoint, return just a pre-departure problem - if len(wps_in_use) < 2: + if len(non_port_wps) < 2: pre_departure = [p for p in GENERAL_PROBLEMS if p.pre_departure] return { "problem_class": [random.choice(pre_departure)], @@ -104,10 +108,12 @@ def select_problems( for p in INSTRUMENT_PROBLEMS if p.instrument_type in instruments_in_expedition ] + + # use all waypoints (incl. Ports) here num_problems = self._calculate_problem_count( difficulty_level=difficulty_level, - expedition_days=(wps_in_use[-1].time - wps_in_use[0].time).days, - num_waypoints=len(wps_in_use), + expedition_days=(self.wps_in_use[-1].time - self.wps_in_use[0].time).days, + num_waypoints=len(self.wps_in_use), num_instruments=len(instruments_in_expedition), max_available=len(GENERAL_PROBLEMS) + len(valid_instruments), ) @@ -206,10 +212,14 @@ def _assign_problems_to_waypoints( assigned_problems: list[ProblemType] = [] assigned_indices: list[int | None] = [] + has_active_departure_port = isinstance(self.wps_in_use[0], Port) + for problem in selected: if getattr(problem, "pre_departure", False): assigned_problems.append(problem) - assigned_indices.append(0) # noqa; pre-departure problem is always associated with the departure port (index 0) + + # index is 0 if there is an active departure port, otherwise None (no waypoint associated with pre-departure problem) + assigned_indices.append(0 if has_active_departure_port else None) continue if not avail_indices: @@ -246,10 +256,10 @@ def _assign_problems_to_waypoints( if not assigned_problems: return None - # sort chronologically (waypoint 0 first, then remaining waypoint index order) + # sort chronologically (waypoint 0/None first, then remaining waypoint index order) paired = sorted( zip(assigned_problems, assigned_indices, strict=True), - key=lambda x: 0 if x[1] == 0 else x[1], + key=lambda x: (x[1] is not None, x[1]), ) return { "problem_class": [p for p, _ in paired], @@ -297,7 +307,12 @@ def _log_problem( problem_wp_i will often == public_wp (given 0-indexing), but this makes the logic explicit and clear. """ waypoints = self.waypoints - public_wp = _get_public_wp(problem_wp_i, waypoints) + + if problem_wp_i is None: + # pre-departure problem but no active Port in the schedule, so pretend the problem is at departure port for user messaging + public_wp = None + else: + public_wp = _get_public_wp(problem_wp_i, waypoints) alert_msg = ( LOG_MESSAGING["pre_departure"] @@ -353,6 +368,12 @@ def _log_problem( def _has_contingency(self, problem: ProblemType, problem_wp_i: int | None) -> bool: """Check whether scheduled contingency covers expected delay duration.""" + # special case where pretending that a pre-departure problem is at the departure port but there is no active Port in the schedule (problem_wp_i = None) + # always returns False, as there is no way to determine whether there is enough contingency time in this case + is_pre_departure_no_active_port = problem.pre_departure and problem_wp_i is None + if is_pre_departure_no_active_port: + return False + curr_wp, next_wp = ( self.waypoints[problem_wp_i], self.waypoints[problem_wp_i + 1], From 8a89cd46d5fd6d8902095bae8a176e5e7fc2b1a0 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:57:11 +0200 Subject: [PATCH 177/191] update tests to handle port logic --- src/virtualship/utils.py | 2 +- .../make_realistic/problems/test_simulator.py | 63 +++++++++++++++---- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 00d3c916..2e173562 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -570,7 +570,7 @@ def build_particle_class_from_sensors( return Particle.add_variable(nonsensor_variables + sensor_variables) -def _get_public_wp(raw_wp_i: int | None, waypoints: list) -> int | None: +def _get_public_wp(raw_wp_i: int, waypoints: list) -> int | None: """ Get the public waypoint number for a given raw waypoint index (accounting for Port waypoints). diff --git a/tests/make_realistic/problems/test_simulator.py b/tests/make_realistic/problems/test_simulator.py index efec1203..3a039963 100644 --- a/tests/make_realistic/problems/test_simulator.py +++ b/tests/make_realistic/problems/test_simulator.py @@ -2,8 +2,6 @@ import random from datetime import datetime, timedelta -import numpy as np - from virtualship.instruments.types import InstrumentType from virtualship.make_realistic.problems.scenarios import ( GENERAL_PROBLEMS, @@ -11,14 +9,15 @@ InstrumentProblem, ) from virtualship.make_realistic.problems.simulator import ProblemSimulator -from virtualship.models.expedition import ( +from virtualship.models import ( Expedition, InstrumentsConfig, + Location, + Port, Schedule, ShipConfig, Waypoint, ) -from virtualship.models.location import Location from virtualship.utils import REPORT @@ -42,6 +41,17 @@ def _make_simple_expedition( ) waypoints.append(wp) + # bound waypoints list with Ports + waypoints.insert( + 0, Port(location=Location(-1, -1), time=sample_datetime - timedelta(hours=12)) + ) + waypoints.append( + Port( + location=Location(-1, -1), + time=sample_datetime + timedelta(days=num_waypoints + 1), + ) + ) + schedule = Schedule(waypoints=waypoints) instruments = InstrumentsConfig() ship = ShipConfig(ship_speed_knots=10.0) @@ -60,7 +70,7 @@ def test_select_problems_single_waypoint_returns_pre_departure(tmp_path): assert isinstance(problems, dict) assert len(problems["problem_class"]) == 1 - assert problems["waypoint_i"] == [None] + assert problems["waypoint_i"] == [0] # port of departure is always 0th problem_cls = problems["problem_class"][0] assert isinstance(problem_cls, GeneralProblem) @@ -87,8 +97,8 @@ def test_no_instruments_no_instruments_problems(tmp_path): def test_select_problems_difficulty_level_zero(): """Selecting difficulty level 'easy' should return None (no problems selected), no matter how many waypoints.""" - for n_wps in np.arange(1, 5): # for a range of waypoint counts - expedition = _make_simple_expedition(num_waypoints=n_wps) + for n_wps in range(1, 5): # for a range of waypoint counts + expedition = _make_simple_expedition(num_waypoints=int(n_wps)) instruments_in_expedition = expedition.get_instruments() simulator = ProblemSimulator(expedition, ".") @@ -144,7 +154,29 @@ def test_hash_to_json(tmp_path): def test_has_contingency_pre_departure(tmp_path): + """Should calculate that there is not enough contingency for a pre-departure problem (with active departure port).""" + expedition = _make_simple_expedition(num_waypoints=2) + simulator = ProblemSimulator(expedition, str(tmp_path)) + + pre_departure_problem = next( + gp for gp in GENERAL_PROBLEMS if getattr(gp, "pre_departure", False) + ) + assert pre_departure_problem is not None, ( + "Need at least one pre-departure problem class in the general problem registry" + ) + + # _has_contingency should return False for pre-departure (waypoint = None) + assert simulator._has_contingency(pre_departure_problem, 0) is False + + +def test_has_contingency_pre_departure_inactive_port(tmp_path): + """Should automatically return False for pre-departure problems when there is no active Port in the schedule (waypoint = None).""" expedition = _make_simple_expedition(num_waypoints=2) + + # make port of departure inactive + expedition.schedule.waypoints[0].location = None + expedition.schedule.waypoints[0].time = None + simulator = ProblemSimulator(expedition, str(tmp_path)) pre_departure_problem = next( @@ -154,8 +186,12 @@ def test_has_contingency_pre_departure(tmp_path): "Need at least one pre-departure problem class in the general problem registry" ) + problem_wp_i = ( + None # no active port, so no waypoint index for pre-departure problem + ) + # _has_contingency should return False for pre-departure (waypoint = None) - assert simulator._has_contingency(pre_departure_problem, None) is False + assert simulator._has_contingency(pre_departure_problem, problem_wp_i) is False def test_select_problems_difficulty_levels(tmp_path): @@ -239,8 +275,9 @@ def test_has_contingency_during_expedition(tmp_path): ) # short distance expedition should have contingency, long distance should not (given time between waypoints and ship speed is constant) - assert short_simulator._has_contingency(problem_cls, problem_waypoint_i=0) is True - assert long_simulator._has_contingency(problem_cls, problem_waypoint_i=0) is False + # problem_wp_i=1 corresponds to the first waypoint after departure port (waypoint 0) when departure port is active + assert short_simulator._has_contingency(problem_cls, problem_wp_i=1) is True + assert long_simulator._has_contingency(problem_cls, problem_wp_i=1) is False def test_post_expedition_report(tmp_path): @@ -294,9 +331,9 @@ def test_instrument_problems_only_selected_when_instruments_present(tmp_path): def test_instrument_not_present_doesnt_select_instrument_problem(tmp_path): expedition = _make_simple_expedition(num_waypoints=3, no_instruments=True) - # prescribe instruments at waypoints, for this test case each should only be present at one waypoint - expedition.schedule.waypoints[0].instrument = [InstrumentType.CTD] - expedition.schedule.waypoints[1].instrument = [ + # prescribe instruments at (non port, i.e. > 0th) waypoints, for this test case each should only be present at one waypoint + expedition.schedule.waypoints[1].instrument = [InstrumentType.CTD] + expedition.schedule.waypoints[2].instrument = [ InstrumentType.ARGO_FLOAT, InstrumentType.DRIFTER, ] From 8160f23f72eedfc43c4c62355f7bfa6cddead8f1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:26:55 +0200 Subject: [PATCH 178/191] checkpoint verify must handle Port logic and whether departure port is inactive or active (affects pre-departure problem logic) --- src/virtualship/models/checkpoint.py | 147 ++++++++++++++------------- 1 file changed, 78 insertions(+), 69 deletions(-) diff --git a/src/virtualship/models/checkpoint.py b/src/virtualship/models/checkpoint.py index a486ca4e..75b4795d 100644 --- a/src/virtualship/models/checkpoint.py +++ b/src/virtualship/models/checkpoint.py @@ -69,19 +69,26 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: """ new_schedule = expedition.schedule + # problem_wp_i is None for a pre-departure problem where the departure port is an inactive placeholder + # so there is no real problem waypoint to anchor timing calculations to + has_problem_location = self.problem_wp_i is not None + problem_wp_i = self.problem_wp_i if has_problem_location else 0 + # failed waypoint is the waypoint immediately *after* the problem waypoint (i.e. the one that will not be reached in time) - failed_wp_i = self.problem_wp_i + 1 + failed_wp_i = problem_wp_i + 1 # public waypoint number of problem and failed waypoints, for use in error messages - public_problem_wp = _get_public_wp( - self.problem_wp_i, self.past_schedule.waypoints + public_problem_wp = ( + _get_public_wp(problem_wp_i, self.past_schedule.waypoints) + if has_problem_location + else None ) public_failed_wp = _get_public_wp(failed_wp_i, self.past_schedule.waypoints) # 1) check that past waypoints have not been changed (up to but not including failed_wp) if ( - not new_schedule.waypoints[: int(failed_wp_i)] - == self.past_schedule.waypoints[: int(failed_wp_i)] + not new_schedule.waypoints[:failed_wp_i] + == self.past_schedule.waypoints[:failed_wp_i] ): raise CheckpointError( f"Past waypoints in schedule have been changed! Restore past schedule and only change future waypoints (waypoint {int(public_failed_wp)} onwards)." @@ -92,69 +99,71 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: str(path.resolve()) for path in problems_dir.glob("problem_*.json") ] - if len(hash_fpaths) > 0: - for file in hash_fpaths: - with open(file, encoding="utf-8") as f: - problem = json.load(f) - - # continue if problem is already resolved, else perform checks to see if delay is accounted for - if problem["resolved"]: - continue - else: - delay_duration = timedelta( - hours=float(problem["delay_duration_hours"]) - ) + for file in hash_fpaths: + with open(file, encoding="utf-8") as f: + problem = json.load(f) - problem_waypoint = new_schedule.waypoints[self.problem_wp_i] - failed_waypoint = new_schedule.waypoints[failed_wp_i] - scheduled_time_diff = failed_waypoint.time - problem_waypoint.time - - stationkeeping_time = ( - _calc_wp_stationkeeping_time( - problem_waypoint.instrument, - expedition, - ) - if not isinstance(problem_waypoint, Port) - else timedelta(0) - ) + # continue if problem is already resolved, else perform checks to see if delay is accounted for + if problem["resolved"]: + continue + + delay_duration = timedelta(hours=float(problem["delay_duration_hours"])) + failed_waypoint = new_schedule.waypoints[failed_wp_i] - sail_time = _calc_sail_time( - problem_waypoint.location, - failed_waypoint.location, - ship_speed_knots=expedition.ship_config.ship_speed_knots, - projection=PROJECTION, - )[0] - - min_time_required = sail_time + delay_duration + stationkeeping_time - - if scheduled_time_diff >= min_time_required: - print( - "\n\n🎉 Previous problem has been resolved in the schedule.\n" - ) - - # save back to json file changing the resolved status to True - problem["resolved"] = True - with open(file, "w", encoding="utf-8") as f_out: - json.dump(problem, f_out, indent=4) - - # only handle the first unresolved problem found; others will be handled in subsequent runs but are not yet known to the user - break - - else: - problem_wp_str = ( - "in-port" - if problem["problem_wp_i"] == 0 # i.e. pre-departure - else f"at waypoint {public_problem_wp}" - ) - time_elapsed = sail_time + delay_duration + stationkeeping_time - - raise CheckpointError( - f"The problem encountered in previous simulation has not been resolved in the schedule! Please adjust the schedule to account for delays caused by the problem (by using `virtualship plan` or directly editing the {EXPEDITION} file).\n\n" - f"The problem was associated with a delay duration of {problem['delay_duration_hours']} hours {problem_wp_str} (meaning waypoint {public_failed_wp} could not be reached in time). " - f"Currently, the ship would reach waypoint {public_failed_wp} at {problem_waypoint.time + time_elapsed}, but the scheduled time is {failed_waypoint.time}." - + ( - f"\n\nHint: don't forget to factor in the time required to deploy the instruments {problem_wp_str} when rescheduling waypoint {public_failed_wp}." - if problem["problem_wp_i"] != 0 - else "" - ) - ) + if has_problem_location: + problem_waypoint = new_schedule.waypoints[problem_wp_i] + + stationkeeping_time = ( + _calc_wp_stationkeeping_time( + problem_waypoint.instrument, + expedition, + ) + if not isinstance(problem_waypoint, Port) + else timedelta(0) + ) + + sail_time = _calc_sail_time( + problem_waypoint.location, + failed_waypoint.location, + ship_speed_knots=expedition.ship_config.ship_speed_knots, + projection=PROJECTION, + )[0] + + available_time = failed_waypoint.time - problem_waypoint.time + min_time_required = sail_time + delay_duration + stationkeeping_time + expected_arrival = problem_waypoint.time + min_time_required + else: + # no departure location/time to sail from (departure port is an inactive placeholder) + original_time = self.past_schedule.waypoints[failed_wp_i].time + available_time = failed_waypoint.time - original_time + min_time_required = delay_duration + expected_arrival = original_time + delay_duration + + if available_time >= min_time_required: + print("\n\n🎉 Previous problem has been resolved in the schedule.\n") + + # save back to json file changing the resolved status to True + problem["resolved"] = True + with open(file, "w", encoding="utf-8") as f_out: + json.dump(problem, f_out, indent=4) + + # only handle the first unresolved problem found; others will be handled in subsequent runs but are not yet known to the user + break + + else: + problem_wp_str = ( + "in-port" + if public_problem_wp is None + else f"at waypoint {public_problem_wp}" + ) + + raise CheckpointError( + f"The problem encountered in previous simulation has not been resolved in the schedule! Please adjust the schedule to account for delays caused by the problem (by using `virtualship plan` or directly editing the {EXPEDITION} file).\n\n" + f"The problem was associated with a delay duration of {problem['delay_duration_hours']} hours {problem_wp_str} (meaning waypoint {public_failed_wp} could not be reached in time). " + f"Currently, the ship would reach waypoint {public_failed_wp} at {expected_arrival}, but the scheduled time is {failed_waypoint.time}." + + ( + f"\n\nHint: don't forget to factor in the time required to deploy the instruments {problem_wp_str} when rescheduling waypoint {public_failed_wp}." + if public_problem_wp is not None + else "" + ) + ) From 4ad8a5d9e30a7bc735ea08ac6981d31fcfffbb18 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:27:54 +0200 Subject: [PATCH 179/191] update tests for more complicated checkpoint verify logic; plus new test(s) for when pre-departure problem but inactive departure port --- tests/test_checkpoint.py | 129 ++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 23 deletions(-) diff --git a/tests/test_checkpoint.py b/tests/test_checkpoint.py index d501b72d..d1d4dfc2 100644 --- a/tests/test_checkpoint.py +++ b/tests/test_checkpoint.py @@ -5,7 +5,7 @@ import pytest from virtualship.models.checkpoint import Checkpoint -from virtualship.models.expedition import Expedition, Schedule, Waypoint +from virtualship.models.expedition import Expedition, Port, Schedule, Waypoint from virtualship.models.location import Location from virtualship.utils import _get_example_expedition @@ -14,10 +14,14 @@ def expedition(tmp_file): with open(tmp_file, "w") as file: file.write(_get_example_expedition()) + return Expedition.from_yaml(tmp_file) -def make_dummy_checkpoint(failed_waypoint_i=None): +def make_dummy_checkpoint(problem_wp_i=None): + departure_port = Port( + location=Location(-1.0, 0.0), time=datetime(2024, 2, 1, 8, 0, 0) + ) wp1 = Waypoint( location=Location(latitude=0.0, longitude=0.0), time=datetime(2024, 2, 1, 10, 0, 0), @@ -28,9 +32,10 @@ def make_dummy_checkpoint(failed_waypoint_i=None): time=datetime(2024, 2, 1, 12, 0, 0), instrument=[], ) + arrival_port = Port(location=Location(2.0, 0.0), time=datetime(2024, 2, 1, 8, 0, 0)) - schedule = Schedule(waypoints=[wp1, wp2]) - return Checkpoint(past_schedule=schedule, failed_waypoint_i=failed_waypoint_i) + schedule = Schedule(waypoints=[departure_port, wp1, wp2, arrival_port]) + return Checkpoint(past_schedule=schedule, problem_wp_i=problem_wp_i) def test_to_and_from_yaml(tmp_path): @@ -43,26 +48,31 @@ def test_to_and_from_yaml(tmp_path): assert loaded.past_schedule.waypoints[0].time == cp.past_schedule.waypoints[0].time -def test_verify_no_failed_waypoint(expedition): - cp = make_dummy_checkpoint(failed_waypoint_i=None) +def test_verify_no_problems_encountered(expedition): + """With an empty problems dir, verify() should not raise, regardless of problem_wp_i.""" + cp = make_dummy_checkpoint(problem_wp_i=1) + expedition.schedule = cp.past_schedule cp.verify(expedition, Path("/tmp/empty")) # should not raise errors def test_verify_past_waypoints_changed(expedition): - cp = make_dummy_checkpoint(failed_waypoint_i=1) + cp = make_dummy_checkpoint(problem_wp_i=1) + expedition.schedule = cp.past_schedule - # change past waypoints + # change a past waypoint (waypoint 1, which is within the protected prefix for problem_wp_i=1) new_wp1 = Waypoint( location=Location(latitude=0.0, longitude=0.0), time=datetime(2024, 2, 1, 11, 0, 0), instrument=None, ) - new_wp2 = Waypoint( - location=Location(latitude=1.0, longitude=1.0), - time=datetime(2024, 2, 1, 12, 0, 0), - instrument=None, + new_schedule = Schedule( + waypoints=[ + cp.past_schedule.waypoints[0], + new_wp1, + cp.past_schedule.waypoints[2], + cp.past_schedule.waypoints[-1], + ] ) - new_schedule = Schedule(waypoints=[new_wp1, new_wp2]) expedition.schedule = new_schedule with pytest.raises(Exception) as excinfo: @@ -83,6 +93,73 @@ def test_verify_problem_resolution( delay_duration_hours, should_resolve, ): + # departure port is active, so it is itself the problem waypoint (problem_wp_i=0); + # locations are kept very close together so sail time is negligible and the test + # isolates the delay-vs-buffer comparison. + departure_port = Port( + location=Location(0.0, 0.0), time=datetime(2024, 2, 1, 8, 0, 0) + ) + wp1 = Waypoint( + location=Location(latitude=0.0, longitude=0.001), + time=datetime(2024, 2, 1, 10, 0, 0), + instrument=[], + ) + arrival_port = Port( + location=Location(0.0, 0.002), time=datetime(2024, 2, 1, 12, 0, 0) + ) + past_schedule = Schedule(waypoints=[departure_port, wp1, arrival_port]) + cp = Checkpoint(past_schedule=past_schedule, problem_wp_i=0) + + # new schedule: push wp1 back by 1 hour (departure port must stay unchanged, as it + # is before the failed waypoint) + new_wp1 = Waypoint( + location=wp1.location, + time=datetime(2024, 2, 1, 11, 0, 0), + instrument=[], + ) + new_arrival_port = Port( + location=arrival_port.location, time=datetime(2024, 2, 1, 13, 0, 0) + ) + new_schedule = Schedule(waypoints=[departure_port, new_wp1, new_arrival_port]) + expedition.schedule = new_schedule + + # unresolved problem file + problem = { + "resolved": False, + "delay_duration_hours": delay_duration_hours, + "problem_wp_i": 0, + } + problem_file = tmp_path / "problem_1.json" + with open(problem_file, "w") as f: + json.dump(problem, f) + + # check if resolution is detected correctly + if should_resolve: + cp.verify(expedition, tmp_path) + with open(problem_file) as f: + updated = json.load(f) + assert updated["resolved"] is True + else: + with pytest.raises(Exception) as excinfo: + cp.verify(expedition, tmp_path) + assert "has not been resolved in the schedule" in str(excinfo.value) + + +@pytest.mark.parametrize( + "delay_duration_hours, should_resolve", + [ + (1.0, True), # pushing wp1 back by 2h absorbs a 1h delay + (5.0, False), # pushing wp1 back by 2h does not absorb a 5h delay + ], +) +def test_verify_problem_resolution_pre_departure_no_active_port( + tmp_path, + expedition, + delay_duration_hours, + should_resolve, +): + """problem_wp_i is None for a pre-departure problem with no active departure port.""" + departure_port = Port() # inactive placeholder: no location/time wp1 = Waypoint( location=Location(latitude=0.0, longitude=0.0), time=datetime(2024, 2, 1, 10, 0, 0), @@ -93,30 +170,36 @@ def test_verify_problem_resolution( time=datetime(2024, 2, 1, 12, 0, 0), instrument=[], ) - past_schedule = Schedule(waypoints=[wp1, wp2]) - cp = Checkpoint(past_schedule=past_schedule, failed_waypoint_i=1) + arrival_port = Port( + location=Location(2.0, 0.0), time=datetime(2024, 2, 1, 14, 0, 0) + ) + + past_schedule = Schedule(waypoints=[departure_port, wp1, wp2, arrival_port]) + cp = Checkpoint(past_schedule=past_schedule, problem_wp_i=None) - # new schedule - new_wp1 = wp1 + # new schedule: push wp1 (and everything after it) back by 2 hours + new_wp1 = Waypoint( + location=wp1.location, + time=datetime(2024, 2, 1, 12, 0, 0), + instrument=[], + ) new_wp2 = Waypoint( - location=Location(latitude=1.0, longitude=1.0), - time=datetime(2024, 2, 1, 20, 0, 0), + location=wp2.location, + time=datetime(2024, 2, 1, 14, 0, 0), instrument=[], ) - new_schedule = Schedule(waypoints=[new_wp1, new_wp2]) + new_schedule = Schedule(waypoints=[departure_port, new_wp1, new_wp2, arrival_port]) expedition.schedule = new_schedule - # unresolved problem file problem = { "resolved": False, "delay_duration_hours": delay_duration_hours, - "problem_waypoint_i": 0, + "problem_wp_i": None, } problem_file = tmp_path / "problem_1.json" with open(problem_file, "w") as f: json.dump(problem, f) - # check if resolution is detected correctly if should_resolve: cp.verify(expedition, tmp_path) with open(problem_file) as f: From 89070f3b55df53698722f77a71550c87c51fb86a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:31:01 +0200 Subject: [PATCH 180/191] remove redundant ScheduleProblem class now that feasibility logic is solely handled in schedule.verify --- src/virtualship/cli/_run.py | 17 ----------------- src/virtualship/expedition/simulate_schedule.py | 16 +++------------- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 7767309c..1be28e92 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -10,7 +10,6 @@ from virtualship.expedition.simulate_schedule import ( MeasurementsToSimulate, - ScheduleProblem, simulate_schedule, ) from virtualship.make_realistic.problems.simulator import ProblemSimulator @@ -19,7 +18,6 @@ from virtualship.utils import ( CACHE, CHECKPOINT, - EXPEDITION, EXPEDITION_IDENTIFIER, EXPEDITION_LATEST, PROBLEMS_ENCOUNTERED, @@ -28,7 +26,6 @@ RESULTS, SELECTED_PROBLEMS, _get_expedition, - _save_checkpoint, expedition_cost, get_instrument_class, ) @@ -112,20 +109,6 @@ def _run( expedition=expedition, ) - # handle cases where user defined schedule is incompatible (i.e. not enough time between waypoints, not problems) - if isinstance(schedule_results, ScheduleProblem): - print( - f"Please update your schedule (`virtualship plan` or directly in {EXPEDITION}) and continue the expedition by executing the `virtualship run` command again.\nCheckpoint has been saved to {expedition_dir.joinpath(CHECKPOINT)}." - ) - _save_checkpoint( - Checkpoint( - past_schedule=expedition.schedule, - failed_waypoint_i=schedule_results.failed_waypoint_i, - ), - expedition_dir, - ) - return - # delete and create results directory results_dir = expedition_dir.joinpath(RESULTS) _warn_overwrite_results_dir(results_dir) diff --git a/src/virtualship/expedition/simulate_schedule.py b/src/virtualship/expedition/simulate_schedule.py index 25b75fae..cbf8a430 100644 --- a/src/virtualship/expedition/simulate_schedule.py +++ b/src/virtualship/expedition/simulate_schedule.py @@ -31,14 +31,6 @@ class ScheduleOk: measurements_to_simulate: MeasurementsToSimulate -@dataclass -class ScheduleProblem: - """Result of schedule that could not be fully completed.""" - - time: datetime - failed_wp: int - - @dataclass class MeasurementsToSimulate: """ @@ -69,15 +61,13 @@ def get_attr_for_instrumenttype(cls, instrument_type): xbts: list[XBT] = field(default_factory=list, init=False) -def simulate_schedule( - projection: pyproj.Geod, expedition: Expedition -) -> ScheduleOk | ScheduleProblem: +def simulate_schedule(projection: pyproj.Geod, expedition: Expedition) -> ScheduleOk: """ Simulate a schedule. :param projection: The projection to use for sailing. :param expedition: Expedition object containing the schedule to simulate. - :returns: Either the results of a successfully simulated schedule, or information on where the schedule became infeasible. + :returns: The results of the simulated schedule. """ return _ScheduleSimulator(projection, expedition).simulate() @@ -115,7 +105,7 @@ def __init__(self, projection: pyproj.Geod, expedition: Expedition) -> None: self._next_adcp_time = self._time self._next_ship_underwater_st_time = self._time - def simulate(self) -> ScheduleOk | ScheduleProblem: + def simulate(self) -> ScheduleOk: # TODO: instrument config mapping (as introduced in #269) should be helpful for refactoring here (i.e. #236)... for waypoint in self._wps_in_use: From b7660e56550b60668b02f603920ee0099221a107 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:37:51 +0200 Subject: [PATCH 181/191] move incomplete ports warning to run so that calls once: schedule pydantic validation can occur multiple times when running --- src/virtualship/cli/_run.py | 8 +++++++- src/virtualship/models/expedition.py | 6 +----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 1be28e92..27045ac1 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -20,6 +20,7 @@ CHECKPOINT, EXPEDITION_IDENTIFIER, EXPEDITION_LATEST, + INCOMPLETE_PORT_MSG, PROBLEMS_ENCOUNTERED, PROJECTION, REPORT, @@ -75,6 +76,11 @@ def _run( expedition_dir = Path(expedition_dir) expedition = _get_expedition(expedition_dir) + schedule = expedition.schedule + + # warn if the departure and/or arrival port is incomplete + if not schedule.departure_port.is_in_use or not schedule.arrival_port.is_in_use: + print(f"\n{INCOMPLETE_PORT_MSG}") # unique id to determine if an expedition has 'changed' since last run (to avoid re-selecting problems when user makes tweaks to schedule to deal with problems encountered) cache_dir = expedition_dir.joinpath(CACHE) @@ -97,7 +103,7 @@ def _run( print("\n---- WAYPOINT VERIFICATION ----") - expedition.schedule.verify( + schedule.verify( expedition.ship_config.ship_speed_knots, expedition.instruments_config, from_data=Path(from_data) if from_data else None, diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index f94d89e2..752c2443 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -14,7 +14,6 @@ from virtualship.instruments.sensors import SENSOR_REGISTRY, SensorType, _Sensor from virtualship.instruments.types import InstrumentType from virtualship.utils import ( - INCOMPLETE_PORT_MSG, _calc_sail_time, _calc_wp_stationkeeping_time, _get_bathy_data, @@ -122,7 +121,7 @@ class Schedule(pydantic.BaseModel): @pydantic.field_validator("waypoints", mode="after") @classmethod def _validate_waypoints(cls, value: list[Port | Waypoint]) -> list[Port | Waypoint]: - """Ensure first and last waypoints are Port objects, schedule contains non-port waypoints, and warn on incomplete ports.""" + """Ensure first and last waypoints are Port objects and schedule contains non-port waypoints.""" if not isinstance(value[0], Port) or not isinstance(value[-1], Port): raise ScheduleError( "First and last waypoints must be Ports (of arrival/departure). " @@ -132,9 +131,6 @@ def _validate_waypoints(cls, value: list[Port | Waypoint]) -> list[Port | Waypoi if not any(isinstance(wp, Waypoint) for wp in value): raise ScheduleError("At least one non-port waypoint must be provided.") - if not value[0].is_in_use or not value[-1].is_in_use: - print(f"\n{INCOMPLETE_PORT_MSG}") - return value @property From 130b3b798b1441cb7424db6e8ab9b286c6ccf609 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 13:47:46 +0200 Subject: [PATCH 182/191] add additional unit tests --- tests/expedition/test_expedition.py | 35 +++++++++++++++++++++++++++++ tests/test_utils.py | 20 ++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/tests/expedition/test_expedition.py b/tests/expedition/test_expedition.py index bc380921..7c919f41 100644 --- a/tests/expedition/test_expedition.py +++ b/tests/expedition/test_expedition.py @@ -349,3 +349,38 @@ def test_wps_in_use(base_expedition): wps_in_use = expedition.schedule._get_wps_in_use() assert len(wps_in_use) == 2 # placeholder waypoints should be removed assert all(isinstance(wp, Waypoint) for wp in wps_in_use) + + +def test_wps_in_use_asymmetric_placeholder_ports(): + """Only the inactive side (departure and/or arrival) should be excluded, not both.""" + base_time = datetime.strptime("1950-01-01", "%Y-%m-%d") + wp1 = Waypoint(location=Location(1, 1), time=base_time + timedelta(hours=1)) + active_arrival = Port(location=Location(2, 2), time=base_time + timedelta(hours=2)) + + # inactive departure, active arrival + schedule = Schedule(waypoints=[Port(location=None, time=None), wp1, active_arrival]) + wps_in_use = schedule._get_wps_in_use() + assert wps_in_use == [wp1, active_arrival] + + # active departure, inactive arrival + active_departure = Port(location=Location(0, 0), time=base_time) + schedule = Schedule( + waypoints=[active_departure, wp1, Port(location=None, time=None)] + ) + wps_in_use = schedule._get_wps_in_use() + assert wps_in_use == [active_departure, wp1] + + +@pytest.mark.parametrize( + "location, time, expected", + [ + (Location(0, 0), datetime(2024, 1, 1), True), + (None, datetime(2024, 1, 1), False), + (Location(0, 0), None, False), + (None, None, False), + (Location(None, None), datetime(2024, 1, 1), False), + ], +) +def test_port_is_in_use(location, time, expected): + """A Port is only 'in use' when it has both a fully-specified location and a time.""" + assert Port(location=location, time=time).is_in_use is expected diff --git a/tests/test_utils.py b/tests/test_utils.py index 4fd45671..53d42c29 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -10,7 +10,7 @@ import virtualship.utils from virtualship.instruments.sensors import SensorType from virtualship.instruments.types import InstrumentType -from virtualship.models.expedition import Expedition, SensorConfig +from virtualship.models.expedition import Expedition, Port, SensorConfig, Waypoint from virtualship.models.location import Location from virtualship.utils import ( PROJECTION, @@ -19,6 +19,7 @@ _find_nc_file_with_variable, _get_bathy_data, _get_example_expedition, + _get_public_wp, _select_product_id, _start_end_in_product_timerange, build_particle_class_from_sensors, @@ -311,6 +312,23 @@ class DrifterConfig: ) +def test_get_public_wp(): + """Port waypoints have no public number; non-port waypoints are numbered 1-indexed, ignoring ports.""" + waypoints = [ + Port(location=Location(0, 0)), # index 0: departure port + Waypoint(location=Location(1, 1)), # index 1: public waypoint 1 + Port(location=Location(2, 2)), # index 2: stop-over port + Waypoint(location=Location(3, 3)), # index 3: public waypoint 2 + Port(location=Location(4, 4)), # index 4: arrival port + ] + + assert _get_public_wp(0, waypoints) is None + assert _get_public_wp(1, waypoints) == 1 + assert _get_public_wp(2, waypoints) is None + assert _get_public_wp(3, waypoints) == 2 + assert _get_public_wp(4, waypoints) is None + + def test_calc_wp_stationkeeping_time_no_instruments(expedition): """Test calc_wp_stationkeeping_time handles no instruments, either marked as 'null' or empty list.""" stationkeeping_emptylist = _calc_wp_stationkeeping_time( From 16e7ce26940d765d41c654f5ea49fdce679f2f2a Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:06:38 +0200 Subject: [PATCH 183/191] use helper function to reduce repetition --- tests/test_checkpoint.py | 68 ++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/tests/test_checkpoint.py b/tests/test_checkpoint.py index d1d4dfc2..d6a8b9f8 100644 --- a/tests/test_checkpoint.py +++ b/tests/test_checkpoint.py @@ -55,6 +55,30 @@ def test_verify_no_problems_encountered(expedition): cp.verify(expedition, Path("/tmp/empty")) # should not raise errors +def _write_problem_and_assert_resolution( + tmp_path, cp, expedition, problem_wp_i, delay_duration_hours, should_resolve +): + """Write an unresolved problem file, then assert whether cp.verify() resolves or rejects it.""" + problem = { + "resolved": False, + "delay_duration_hours": delay_duration_hours, + "problem_wp_i": problem_wp_i, + } + problem_file = tmp_path / "problem_1.json" + with open(problem_file, "w") as f: + json.dump(problem, f) + + if should_resolve: + cp.verify(expedition, tmp_path) + with open(problem_file) as f: + updated = json.load(f) + assert updated["resolved"] is True + else: + with pytest.raises(Exception) as excinfo: + cp.verify(expedition, tmp_path) + assert "has not been resolved in the schedule" in str(excinfo.value) + + def test_verify_past_waypoints_changed(expedition): cp = make_dummy_checkpoint(problem_wp_i=1) expedition.schedule = cp.past_schedule @@ -123,26 +147,9 @@ def test_verify_problem_resolution( new_schedule = Schedule(waypoints=[departure_port, new_wp1, new_arrival_port]) expedition.schedule = new_schedule - # unresolved problem file - problem = { - "resolved": False, - "delay_duration_hours": delay_duration_hours, - "problem_wp_i": 0, - } - problem_file = tmp_path / "problem_1.json" - with open(problem_file, "w") as f: - json.dump(problem, f) - - # check if resolution is detected correctly - if should_resolve: - cp.verify(expedition, tmp_path) - with open(problem_file) as f: - updated = json.load(f) - assert updated["resolved"] is True - else: - with pytest.raises(Exception) as excinfo: - cp.verify(expedition, tmp_path) - assert "has not been resolved in the schedule" in str(excinfo.value) + _write_problem_and_assert_resolution( + tmp_path, cp, expedition, 0, delay_duration_hours, should_resolve + ) @pytest.mark.parametrize( @@ -191,21 +198,6 @@ def test_verify_problem_resolution_pre_departure_no_active_port( new_schedule = Schedule(waypoints=[departure_port, new_wp1, new_wp2, arrival_port]) expedition.schedule = new_schedule - problem = { - "resolved": False, - "delay_duration_hours": delay_duration_hours, - "problem_wp_i": None, - } - problem_file = tmp_path / "problem_1.json" - with open(problem_file, "w") as f: - json.dump(problem, f) - - if should_resolve: - cp.verify(expedition, tmp_path) - with open(problem_file) as f: - updated = json.load(f) - assert updated["resolved"] is True - else: - with pytest.raises(Exception) as excinfo: - cp.verify(expedition, tmp_path) - assert "has not been resolved in the schedule" in str(excinfo.value) + _write_problem_and_assert_resolution( + tmp_path, cp, expedition, None, delay_duration_hours, should_resolve + ) From bd20250f7713bb926c4db9190a6025d3e076f28e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:07:13 +0200 Subject: [PATCH 184/191] helper function reduces duplicate code --- .../make_realistic/problems/test_simulator.py | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/tests/make_realistic/problems/test_simulator.py b/tests/make_realistic/problems/test_simulator.py index 3a039963..474514ed 100644 --- a/tests/make_realistic/problems/test_simulator.py +++ b/tests/make_realistic/problems/test_simulator.py @@ -60,6 +60,15 @@ def _make_simple_expedition( ) +def _get_pre_departure_problem() -> GeneralProblem: + """Return a pre-departure problem class from the general problem registry.""" + problem = next(gp for gp in GENERAL_PROBLEMS if getattr(gp, "pre_departure", False)) + assert problem is not None, ( + "Need at least one pre-departure problem class in the general problem registry" + ) + return problem + + def test_select_problems_single_waypoint_returns_pre_departure(tmp_path): expedition = _make_simple_expedition(num_waypoints=1) instruments_in_expedition = expedition.get_instruments() @@ -158,12 +167,7 @@ def test_has_contingency_pre_departure(tmp_path): expedition = _make_simple_expedition(num_waypoints=2) simulator = ProblemSimulator(expedition, str(tmp_path)) - pre_departure_problem = next( - gp for gp in GENERAL_PROBLEMS if getattr(gp, "pre_departure", False) - ) - assert pre_departure_problem is not None, ( - "Need at least one pre-departure problem class in the general problem registry" - ) + pre_departure_problem = _get_pre_departure_problem() # _has_contingency should return False for pre-departure (waypoint = None) assert simulator._has_contingency(pre_departure_problem, 0) is False @@ -179,16 +183,10 @@ def test_has_contingency_pre_departure_inactive_port(tmp_path): simulator = ProblemSimulator(expedition, str(tmp_path)) - pre_departure_problem = next( - gp for gp in GENERAL_PROBLEMS if getattr(gp, "pre_departure", False) - ) - assert pre_departure_problem is not None, ( - "Need at least one pre-departure problem class in the general problem registry" - ) + pre_departure_problem = _get_pre_departure_problem() - problem_wp_i = ( - None # no active port, so no waypoint index for pre-departure problem - ) + # no active port, so no waypoint index for pre-departure problem + problem_wp_i = None # _has_contingency should return False for pre-departure (waypoint = None) assert simulator._has_contingency(pre_departure_problem, problem_wp_i) is False From 5b97ca8fb24d2380376ef1777a3c8db610349821 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:10:58 +0200 Subject: [PATCH 185/191] tidy up messy bits of code and move json methods to utils to enable wider use --- .../make_realistic/problems/simulator.py | 43 +++++++------------ src/virtualship/utils.py | 11 +++++ 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index be6cc53d..e94c1963 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -1,12 +1,11 @@ from __future__ import annotations -import json import random import sys import time from datetime import timedelta from pathlib import Path -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from rich import box from rich.console import Console @@ -34,7 +33,9 @@ _calc_wp_stationkeeping_time, _get_public_wp, _make_hash, + _read_json, _save_checkpoint, + _write_json, ) if TYPE_CHECKING: @@ -91,16 +92,15 @@ def select_problems( return None # isolate only the non-port waypoints - non_port_wps = [ - i for i, wp in enumerate(self.wps_in_use) if not isinstance(wp, Port) - ] + num_non_port_wps = sum(1 for wp in self.wps_in_use if not isinstance(wp, Port)) # if only one waypoint, return just a pre-departure problem - if len(non_port_wps) < 2: + if num_non_port_wps < 2: pre_departure = [p for p in GENERAL_PROBLEMS if p.pre_departure] return { "problem_class": [random.choice(pre_departure)], - "waypoint_i": [0], # noqa; pre-departure problem is always associated with the departure port (index 0) + # pre-departure problem is always associated with the departure port (index 0) + "waypoint_i": [0], } valid_instruments = [ @@ -164,7 +164,8 @@ def _sample_problems( bias = min(0.7, num_instruments / (num_instruments + 2)) n_inst = round(num_problems * bias) n_gen = min(len(general_pool), num_problems - n_inst) - n_inst = num_problems - n_gen # noqa; recalc in case n_gen was capped to len(GENERAL_PROBLEMS) + # recalc in case n_gen was capped to len(GENERAL_PROBLEMS) + n_inst = num_problems - n_gen return general_pool[:n_gen] + instrument_pool[:n_inst] @@ -205,14 +206,10 @@ def _assign_problems_to_waypoints( ] random.shuffle(avail_indices) - assert 0 not in avail_indices, ( - "Index 0 (departure port) should not be in available waypoint indices for non-pre-departure problems." - ) - assigned_problems: list[ProblemType] = [] assigned_indices: list[int | None] = [] - has_active_departure_port = isinstance(self.wps_in_use[0], Port) + has_active_departure_port = self.expedition.schedule.departure_port.is_in_use for problem in selected: if getattr(problem, "pre_departure", False): @@ -333,9 +330,9 @@ def _log_problem( impact_str = LOG_MESSAGING["problem_avoided"] result_str = "The expedition will carry on shortly as planned." # update problem JSON state to resolved - data = self._read_json(hash_fpath) + data = _read_json(hash_fpath) data["resolved"] = True - self._write_json(hash_fpath, data) + _write_json(hash_fpath, data) else: affected = "in-port" if public_wp is None else f"at waypoint {public_wp}" impact_str = ( @@ -416,14 +413,14 @@ def cache_selected_problems( "waypoint_i": problems["waypoint_i"], "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), } - ProblemSimulator._write_json(fpath, payload) + _write_json(fpath, payload) @staticmethod def load_selected_problems( selected_problems_fpath: str | Path, ) -> SelectedProblemsDict: """Load selected problems suite from a cached JSON file.""" - data = ProblemSimulator._read_json(Path(selected_problems_fpath)) + data = _read_json(Path(selected_problems_fpath)) general_lookup = {cls.short_name: cls for cls in GENERAL_PROBLEMS} instrument_lookup = {cls.short_name: cls for cls in INSTRUMENT_PROBLEMS} @@ -477,17 +474,7 @@ def _hash_to_json( "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "resolved": False, } - ProblemSimulator._write_json(hash_path, hash_data) - - @staticmethod - def _read_json(path: Path) -> dict[str, Any]: - with open(path, encoding="utf-8") as f: - return json.load(f) - - @staticmethod - def _write_json(path: Path, data: dict[str, Any]) -> None: - with open(path, "w", encoding="utf-8") as f: - json.dump(data, f, indent=4) + _write_json(hash_path, hash_data) @staticmethod def _tabular_outputter( diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 2e173562..604e4639 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -2,6 +2,7 @@ import glob import hashlib +import json import re import sys from datetime import datetime, timedelta @@ -493,6 +494,16 @@ def _save_checkpoint(checkpoint: Checkpoint, expedition_dir: Path) -> None: checkpoint.to_yaml(file_path) +def _read_json(path: Path) -> dict: + with open(path, encoding="utf-8") as f: + return json.load(f) + + +def _write_json(path: Path, data: dict) -> None: + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) + + def _calc_sail_time( location1: Location, location2: Location, From b2aa9315b298e1442a9971f6a950c69fc7ee00f9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:12:09 +0200 Subject: [PATCH 186/191] clean up and clarify code; also use utils json functions --- src/virtualship/models/checkpoint.py | 70 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/src/virtualship/models/checkpoint.py b/src/virtualship/models/checkpoint.py index 75b4795d..3c70b13f 100644 --- a/src/virtualship/models/checkpoint.py +++ b/src/virtualship/models/checkpoint.py @@ -2,7 +2,6 @@ from __future__ import annotations -import json from datetime import timedelta from pathlib import Path @@ -18,6 +17,8 @@ _calc_sail_time, _calc_wp_stationkeeping_time, _get_public_wp, + _read_json, + _write_json, ) @@ -91,61 +92,58 @@ def verify(self, expedition: Expedition, problems_dir: Path) -> None: == self.past_schedule.waypoints[:failed_wp_i] ): raise CheckpointError( - f"Past waypoints in schedule have been changed! Restore past schedule and only change future waypoints (waypoint {int(public_failed_wp)} onwards)." + f"Past waypoints in schedule have been changed! Restore past schedule and only change future waypoints (waypoint {public_failed_wp} onwards)." ) # 2) check that problems have been resolved in the new schedule + failed_waypoint = new_schedule.waypoints[failed_wp_i] + + if has_problem_location: + problem_waypoint = new_schedule.waypoints[problem_wp_i] + + stationkeeping_time = ( + _calc_wp_stationkeeping_time(problem_waypoint.instrument, expedition) + if not isinstance(problem_waypoint, Port) + else timedelta(0) + ) + + sail_time = _calc_sail_time( + problem_waypoint.location, + failed_waypoint.location, + ship_speed_knots=expedition.ship_config.ship_speed_knots, + projection=PROJECTION, + )[0] + + available_time = failed_waypoint.time - problem_waypoint.time + base_time = problem_waypoint.time + fixed_delay_offset = sail_time + stationkeeping_time + else: + # no departure location/time to sail from (departure port is an inactive placeholder) + base_time = self.past_schedule.waypoints[failed_wp_i].time + available_time = failed_waypoint.time - base_time + fixed_delay_offset = timedelta(0) + hash_fpaths = [ str(path.resolve()) for path in problems_dir.glob("problem_*.json") ] for file in hash_fpaths: - with open(file, encoding="utf-8") as f: - problem = json.load(f) + problem = _read_json(file) # continue if problem is already resolved, else perform checks to see if delay is accounted for if problem["resolved"]: continue delay_duration = timedelta(hours=float(problem["delay_duration_hours"])) - failed_waypoint = new_schedule.waypoints[failed_wp_i] - - if has_problem_location: - problem_waypoint = new_schedule.waypoints[problem_wp_i] - - stationkeeping_time = ( - _calc_wp_stationkeeping_time( - problem_waypoint.instrument, - expedition, - ) - if not isinstance(problem_waypoint, Port) - else timedelta(0) - ) - - sail_time = _calc_sail_time( - problem_waypoint.location, - failed_waypoint.location, - ship_speed_knots=expedition.ship_config.ship_speed_knots, - projection=PROJECTION, - )[0] - - available_time = failed_waypoint.time - problem_waypoint.time - min_time_required = sail_time + delay_duration + stationkeeping_time - expected_arrival = problem_waypoint.time + min_time_required - else: - # no departure location/time to sail from (departure port is an inactive placeholder) - original_time = self.past_schedule.waypoints[failed_wp_i].time - available_time = failed_waypoint.time - original_time - min_time_required = delay_duration - expected_arrival = original_time + delay_duration + min_time_required = fixed_delay_offset + delay_duration + expected_arrival = base_time + min_time_required if available_time >= min_time_required: print("\n\n🎉 Previous problem has been resolved in the schedule.\n") # save back to json file changing the resolved status to True problem["resolved"] = True - with open(file, "w", encoding="utf-8") as f_out: - json.dump(problem, f_out, indent=4) + _write_json(file, problem) # only handle the first unresolved problem found; others will be handled in subsequent runs but are not yet known to the user break From a2b0dec584be0ca3f0e9d31e77f90dcb74b7b193 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:12:25 +0200 Subject: [PATCH 187/191] cleaner use of wps_in_use --- src/virtualship/models/expedition.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/virtualship/models/expedition.py b/src/virtualship/models/expedition.py index 752c2443..c65e137e 100644 --- a/src/virtualship/models/expedition.py +++ b/src/virtualship/models/expedition.py @@ -154,11 +154,13 @@ def verify( """Verify the feasibility and correctness of the schedule's waypoints.""" print("\nVerifying route... ") + # waypoints excluding any inactive placeholder departure/arrival ports + wps_in_use = self._get_wps_in_use() + # is the departure port in use or a placeholder (i.e. all None)? - check_idx = 0 if self.departure_port.is_in_use else 1 wp_str = "Departure port" if self.departure_port.is_in_use else "Waypoint 1" - if self.waypoints[check_idx].time is None: + if wps_in_use[0].time is None: raise ScheduleError(f"{wp_str} must have a specified time.") # check waypoint times are in ascending order @@ -207,13 +209,7 @@ def verify( ) # check that ship will arrive on time at each waypoint (in case no unexpected event happen) - time = ( - self.waypoints[0].time - if self.departure_port.is_in_use - else self.waypoints[1].time - ) - - wps_in_use = self._get_wps_in_use() + time = wps_in_use[0].time for wp_i, (wp, wp_next) in enumerate(itertools.pairwise(wps_in_use)): stationkeeping_time = _calc_wp_stationkeeping_time( From 2782ae60d56f83b54fc0e91894800c7da4d58075 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:23:49 +0200 Subject: [PATCH 188/191] prevent expedition report writing a pre-departure problem at an active port as "waypoint 1" --- src/virtualship/cli/_run.py | 2 +- src/virtualship/make_realistic/problems/simulator.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/virtualship/cli/_run.py b/src/virtualship/cli/_run.py index 27045ac1..18fa922d 100644 --- a/src/virtualship/cli/_run.py +++ b/src/virtualship/cli/_run.py @@ -211,7 +211,7 @@ def _run( ) if problems: - ProblemSimulator.post_expedition_report( + problem_simulator.post_expedition_report( problems, expedition_dir.joinpath(RESULTS, REPORT) ) print("\n----- RECORD OF PROBLEMS ENCOUNTERED ------") diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index e94c1963..3660fb8f 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -441,16 +441,19 @@ def load_selected_problems( return {"problem_class": selected_classes, "waypoint_i": waypoint_indices} - @staticmethod def post_expedition_report( - problems: SelectedProblemsDict, report_fpath: str | Path + self, problems: SelectedProblemsDict, report_fpath: str | Path ) -> None: """Append human-readable report summary of all occurring problems.""" with open(report_fpath, "a", encoding="utf-8") as f: for problem, wp_i in zip( problems["problem_class"], problems["waypoint_i"], strict=True ): - affected = "in-port" if wp_i is None else f"{wp_i + 1}" + # None means pre-departure with no active departure port + public_wp = ( + None if wp_i is None else _get_public_wp(wp_i, self.waypoints) + ) + affected = "in-port" if public_wp is None else f"{public_wp}" delay_hrs = problem.delay_duration.total_seconds() / 3600.0 f.write( f"---\nWaypoint: {affected}\n" From 3d4bf33489ff41f7060a21b0fcaccd46a50a4b81 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:24:33 +0200 Subject: [PATCH 189/191] add test for expedition report writing regression --- tests/make_realistic/problems/test_simulator.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/make_realistic/problems/test_simulator.py b/tests/make_realistic/problems/test_simulator.py index 474514ed..c3b790b0 100644 --- a/tests/make_realistic/problems/test_simulator.py +++ b/tests/make_realistic/problems/test_simulator.py @@ -308,6 +308,21 @@ def test_post_expedition_report(tmp_path): ) +def test_post_expedition_report_pre_departure_labeled_in_port(tmp_path): + """A pre-departure problem against an active departure port (wp_i=0, a Port index) should be labeled 'in-port'.""" + expedition = _make_simple_expedition(num_waypoints=2) + simulator = ProblemSimulator(expedition, str(tmp_path)) + + problems = {"problem_class": [_get_pre_departure_problem()], "waypoint_i": [0]} + + report_path = tmp_path / REPORT + simulator.post_expedition_report(problems, report_path) + + content = report_path.read_text(encoding="utf-8") + assert "Waypoint: in-port" in content + assert "Waypoint: 1" not in content + + def test_instrument_problems_only_selected_when_instruments_present(tmp_path): expedition = _make_simple_expedition(num_waypoints=3, no_instruments=True) instruments_in_expedition = expedition.get_instruments() From ddfd2c5365c3c680fc6764940094de1d256ba705 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:41:33 +0200 Subject: [PATCH 190/191] fix bug whereby pre-departure problem is checked on InstrumentProblem objects --- src/virtualship/make_realistic/problems/simulator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/virtualship/make_realistic/problems/simulator.py b/src/virtualship/make_realistic/problems/simulator.py index 3660fb8f..2206a1c6 100644 --- a/src/virtualship/make_realistic/problems/simulator.py +++ b/src/virtualship/make_realistic/problems/simulator.py @@ -367,7 +367,9 @@ def _has_contingency(self, problem: ProblemType, problem_wp_i: int | None) -> bo """Check whether scheduled contingency covers expected delay duration.""" # special case where pretending that a pre-departure problem is at the departure port but there is no active Port in the schedule (problem_wp_i = None) # always returns False, as there is no way to determine whether there is enough contingency time in this case - is_pre_departure_no_active_port = problem.pre_departure and problem_wp_i is None + is_pre_departure_no_active_port = ( + getattr(problem, "pre_departure", False) and problem_wp_i is None + ) if is_pre_departure_no_active_port: return False From 8a18e86d496292c8f1d53238332a4208823772e1 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:57:29 +0200 Subject: [PATCH 191/191] add _initialise.py to list of files to ignore in typechecking, given not yet active --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index a5f1f8e6..0b2fa359 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,6 +125,7 @@ warn_unused_ignores = true exclude = [ # Temporarily exclude files. As we improve typechecking across the codebase, remove these + "src/virtualship/cli/_initialise.py", "src/virtualship/cli/_plan.py", "src/virtualship/cli/_run.py", "src/virtualship/cli/commands.py",