Conversation
…ensors for instruments
…ated validations for each instrument
…igher level for scalability
… kernels from the argo vertical movement kernel to enable easier scalability
…operty shorthands
…ensors for instruments
…ated validations for each instrument
…igher level for scalability
…operty shorthands
…p into refactor-sensors
for more information, see https://pre-commit.ci
…p into refactor-sensors
erikvansebille
left a comment
There was a problem hiding this comment.
Looks good! A few comments below
There was a problem hiding this comment.
There seems to still be a lot of duplication between CTD and CTD_BGC. Was the intention for this PR not to remove that duplication/ Or will that come in a next PR?
There was a problem hiding this comment.
Yes, indeed it will come in the next PR... the CTD_BGC will soon be removed but I decided not to do it in this PR so as to keep it focused
| Variable("lifetime", dtype=np.float32), | ||
| ] | ||
| ) | ||
| _DRIFTER_FIXED_VARIABLES = [ |
There was a problem hiding this comment.
Not sure whether FIXED is the right term here (and in other instruments). Suggests they are fixed to the instrument. Would NONSENSOR be a better term? Or do you have another term?
| TEMPERATURE = "TEMPERATURE" | ||
| SALINITY = "SALINITY" | ||
| VELOCITY = "VELOCITY" | ||
| OXYGEN = "OXYGEN" | ||
| CHLOROPHYLL = "CHLOROPHYLL" | ||
| NITRATE = "NITRATE" | ||
| PHOSPHATE = "PHOSPHATE" | ||
| PH = "PH" | ||
| PHYTOPLANKTON = "PHYTOPLANKTON" | ||
| PRIMARY_PRODUCTION = "PRIMARY_PRODUCTION" |
There was a problem hiding this comment.
Why is this list needed? Can we do without? Seems like an extra place to change when adding a sensor..
| _ST_SENSOR_KERNELS: dict[SensorType, callable] = { | ||
| SensorType.TEMPERATURE: _sample_temperature, | ||
| SensorType.SALINITY: _sample_salinity, | ||
| } |
There was a problem hiding this comment.
Why explicitly mention them here, if they are also part of sensors.py? Seems a duplication?
| import yaml | ||
|
|
||
| from virtualship.errors import InstrumentsConfigError, ScheduleError | ||
| from virtualship.instruments.sensors import ( |
There was a problem hiding this comment.
Why not import all? So that if a new sensor is added, it can automatically also be imported here?
| """ | ||
| FieldSet-key → Copernicus-variable mapping for enabled sensors. | ||
|
|
||
| VELOCITY is a special case: one sensor provides two FieldSet variables (U and V). |
There was a problem hiding this comment.
But in Parcels, it should sample fieldset.UV, which is one Field?
There was a problem hiding this comment.
Oops! Overcomplicated things here unnecessarily
| ], | ||
| description=( | ||
| "Sensors fitted to the BGC CTD. " | ||
| "Supported: CHLOROPHYLL, NITRATE, OXYGEN, PH, PHOSPHATE, PHYTOPLANKTON, PRIMARY_PRODUCTION. " |
There was a problem hiding this comment.
Make this list the same order as the list above? Otherwise, more difficult to see whether the list is complete
| @pydantic.field_validator("sensors", mode="after") | ||
| @classmethod | ||
| def _check_sensor_compatibility(cls, value) -> list[SensorConfig]: | ||
| return _check_sensor_compatibility(value, XBT_SUPPORTED_SENSORS, "XBT") | ||
|
|
||
| @pydantic.field_serializer("sensors") | ||
| def _serialize_sensors(self, value: list[SensorConfig], _info): | ||
| return _serialize_sensor_list(value) | ||
|
|
||
| def active_variables(self) -> dict[str, str]: | ||
| """FieldSet-key → Copernicus-variable mapping for enabled sensors.""" | ||
| return build_variables_from_sensors(self.sensors) | ||
|
|
There was a problem hiding this comment.
Why are these functions required for every instrument? Can't they be reused?
| particle_vars=[ | ||
| "U", | ||
| "V", | ||
| ], # two particle variables associated with one sensor |
There was a problem hiding this comment.
Great to add so much more unit testing!
Overview
This PR centralises/abstracts instrument sensor/variable sampling logic so that each instrument declares which sensors it carries (e.g.
TEMPERATURE,SALINITY,VELOCITY). Users can configure which sensors are active for each instrument in the expedition YAML.This helps pave the way for easy addition of BGC sensors to the Argo float in a future PR (#234), and consolidation of CTD + CTD_BGC into a single instrument (#260) with a combined sensor allowlist. Also makes it straightforward to add new sensors to any instrument in the future (e.g., #312, #313), and streamlines them process for developers to add new instruments (i.e. #237)
Major changes
sensors.pyininstruments/defines theSensorTypeclass and per-instrument allowlists (so that there is control over which sensors each instrument supports and users cannot configure unsupported sensors).SensorConfigpydantic model andsensorsfield in every instrument config inexpedition.py.SensorRegistryinutils.pythat maps eachSensorTypeto its FieldSet key, Copernicus variable name, category (phys/bgc), and Parcels particle variable name(s).cycle_phasefor Argo Floats.API change
As mentioned above, the instruments config section of the expedition YAML now has a
sensorslist field, where users specify which sensors are active. For example, below the CTD is configured to sampleTEMPERATUREandSALINITY:sensorslist is omitted, it default to all valid sensors for that instrument.Additional change
Follow-up PRs
planCLI tool will need updating to account for sensor configuration options. Currently not broken but doesn't give option to configure sensors. (New issue to be opened)CTDandCTD_BGCto one instrument #260)Tests