From 9bad450be189ecfeb8d6cbbbd58c608ecf743330 Mon Sep 17 00:00:00 2001 From: Guillaume Maze Date: Wed, 16 Oct 2024 10:55:11 +0200 Subject: [PATCH] codespell + flake8 OK --- argopy/__init__.py | 2 +- argopy/data_fetchers/argovis_data.py | 13 +- argopy/data_fetchers/erddap_data.py | 5 - argopy/data_fetchers/gdac_data.py | 34 +- argopy/data_fetchers/gdac_data_processors.py | 20 - argopy/data_fetchers/proto.py | 2 +- argopy/errors.py | 1 + argopy/extensions/canyon_med.py | 2 +- argopy/extensions/params_data_mode.py | 3 +- argopy/fetchers.py | 5 +- argopy/options.py | 4 +- argopy/related/reference_tables.py | 2 +- argopy/stores/__init__.py | 2 +- argopy/stores/argo_index_pd.py | 1 - argopy/stores/filesystems.py | 1 - ...a8139d6634f89f95e4e60ffaf8b2834a8a4e03c.nc | Bin 12366708 -> 12650392 bytes ...de288d51dd030262b7085db0eab41a3eb.ncHeader | 435 ++++++------------ ...676d2698a8ef9135bde278cdbb05612d9.ncHeader | 72 ++- ...6e076b13f2a48403f72b31c45590a0f6b1618d9.nc | Bin 8208680 -> 8209732 bytes ...2af79fceb3ba19166e3733b9638f578e7803e89.nc | Bin 1229536 -> 1224300 bytes ...55c7c659bae31d4114aa848c0764c5636.ncHeader | 268 +++-------- ...15ada0a5524f6cc160c7a158c98641ac6.ncHeader | 144 +++--- argopy/utils/monitors.py | 6 - argopy/utils/transform.py | 118 +++-- argopy/xarray.py | 8 - .../working-with-argo-data/owc_workflow_eg.py | 39 +- 26 files changed, 486 insertions(+), 701 deletions(-) diff --git a/argopy/__init__.py b/argopy/__init__.py index 1ed013c4..32dc4c5e 100644 --- a/argopy/__init__.py +++ b/argopy/__init__.py @@ -42,7 +42,7 @@ from .utils import MonitoredThreadPoolExecutor # noqa: E402, F401 from .utils import monitor_status as status # noqa: E402 from .related import TopoFetcher, OceanOPSDeployments, ArgoNVSReferenceTables, ArgoDocs, ArgoDOI # noqa: E402 -from .extensions import CanyonMED +from .extensions import CanyonMED # noqa: E402 # diff --git a/argopy/data_fetchers/argovis_data.py b/argopy/data_fetchers/argovis_data.py index d759d8c1..b065bb92 100755 --- a/argopy/data_fetchers/argovis_data.py +++ b/argopy/data_fetchers/argovis_data.py @@ -7,8 +7,7 @@ import warnings from ..stores import httpstore -from ..options import OPTIONS, DEFAULT, VALIDATE, PARALLEL_SETUP -from ..utils.format import format_oneline +from ..options import OPTIONS, DEFAULT, PARALLEL_SETUP from ..utils.chunking import Chunker from ..utils.decorators import deprecated from ..errors import DataNotFound @@ -87,7 +86,7 @@ def __init__( """ self.definition = "Argovis Argo data fetcher" self.dataset_id = OPTIONS["ds"] if ds == "" else ds - self.user_mode = kwargs["mode"] if "mode" in kwargs else OPTIONS["mode"] + self.user_mode = kwargs["mode"] if "mode" in kwargs else OPTIONS["mode"] self.server = kwargs["server"] if "server" in kwargs else api_server timeout = OPTIONS["api_timeout"] if api_timeout == 0 else api_timeout self.store_opts = { @@ -144,7 +143,6 @@ def _add_history(self, this, txt): this.attrs["history"] = txt return this - @property def cachepath(self): """Return path to cache file for this request""" @@ -165,7 +163,10 @@ def safe_for_fsspec_cache(url): return [safe_for_fsspec_cache(url) for url in urls] - @deprecated("Not serializable, please use 'argovis_data_processors.pre_process'", version="1.0.0") + @deprecated( + "Not serializable, please use 'argovis_data_processors.pre_process'", + version="1.0.0", + ) def json2dataframe(self, profiles): """convert json data to Pandas DataFrame""" # Make sure we deal with a list @@ -213,7 +214,7 @@ def to_dataframe(self, errors: str = "ignore") -> pd.DataFrame: """Load Argo data and return a Pandas dataframe""" # Download data: - preprocess_opts = {'key_map': self.key_map} + preprocess_opts = {"key_map": self.key_map} df_list = self.fs.open_mfjson( self.uri, method=self.parallel_method, diff --git a/argopy/data_fetchers/erddap_data.py b/argopy/data_fetchers/erddap_data.py index 6f9a1f55..c49458fd 100644 --- a/argopy/data_fetchers/erddap_data.py +++ b/argopy/data_fetchers/erddap_data.py @@ -11,21 +11,16 @@ """ import xarray as xr -import pandas as pd import numpy as np import copy -import time from abc import abstractmethod -import getpass from typing import Union from aiohttp import ClientResponseError import logging from erddapy.erddapy import ERDDAP, parse_dates from erddapy.erddapy import _quote_string_constraints as quote_string_constraints -import warnings from ..options import OPTIONS, PARALLEL_SETUP -from ..utils.format import format_oneline from ..utils.lists import list_bgc_s_variables, list_core_parameters from ..utils.decorators import deprecated from ..errors import ErddapServerError, DataNotFound diff --git a/argopy/data_fetchers/gdac_data.py b/argopy/data_fetchers/gdac_data.py index cf04b079..35f2c63a 100644 --- a/argopy/data_fetchers/gdac_data.py +++ b/argopy/data_fetchers/gdac_data.py @@ -13,7 +13,7 @@ import getpass import logging -from ..utils.format import format_oneline, argo_split_path +from ..utils.format import argo_split_path from ..utils.decorators import deprecated from ..options import OPTIONS, check_gdac_path, PARALLEL_SETUP from ..errors import DataNotFound @@ -40,8 +40,8 @@ class GDACArgoDataFetcher(ArgoDataFetcherProto): This class is a prototype not meant to be instantiated directly """ - data_source = "gdac" + data_source = "gdac" ### # Methods to be customised for a specific request @@ -119,7 +119,7 @@ def __init__( cachedir=cachedir, timeout=self.timeout, ) - self.fs = self.indexfs.fs["src"] # Re-use the appropriate file system + self.fs = self.indexfs.fs["src"] # Reuse the appropriate file system nrows = None if "N_RECORDS" in kwargs: @@ -140,7 +140,9 @@ def __repr__(self): summary.append(self._repr_access_point) summary.append(self._repr_server) if hasattr(self.indexfs, "index"): - summary.append("📗 Index: %s (%i records)" % (self.indexfs.index_file, self.N_RECORDS)) + summary.append( + "📗 Index: %s (%i records)" % (self.indexfs.index_file, self.N_RECORDS) + ) else: summary.append("📕 Index: %s (not loaded)" % self.indexfs.index_file) if hasattr(self.indexfs, "search"): @@ -233,7 +235,10 @@ def clear_cache(self): self.fs.clear_cache() return self - @deprecated("Not serializable, please use 'gdac_data_processors.pre_process_multiprof'", version="1.0.0") + @deprecated( + "Not serializable, please use 'gdac_data_processors.pre_process_multiprof'", + version="1.0.0", + ) def _preprocess_multiprof(self, ds): """Pre-process one Argo multi-profile file as a collection of points @@ -332,13 +337,13 @@ def to_xarray(self, errors: str = "ignore"): if hasattr(self, "BOX"): access_point = "BOX" - access_point_opts = {'BOX': self.BOX} + access_point_opts = {"BOX": self.BOX} elif hasattr(self, "CYC"): access_point = "CYC" - access_point_opts = {'CYC': self.CYC} + access_point_opts = {"CYC": self.CYC} elif hasattr(self, "WMO"): access_point = "WMO" - access_point_opts = {'WMO': self.WMO} + access_point_opts = {"WMO": self.WMO} # Download and pre-process data: ds = self.fs.open_mfdataset( @@ -379,7 +384,7 @@ def to_xarray(self, errors: str = "ignore"): ds.attrs["Fetched_from"] = self.server try: ds.attrs["Fetched_by"] = getpass.getuser() - except: + except: # noqa: E722 ds.attrs["Fetched_by"] = "anonymous" ds.attrs["Fetched_date"] = pd.to_datetime("now", utc=True).strftime( "%Y/%m/%d" @@ -393,17 +398,20 @@ def to_xarray(self, errors: str = "ignore"): return ds - @deprecated("Not serializable, please use 'gdac_data_processors.filter_points'", version="1.0.0") + @deprecated( + "Not serializable, please use 'gdac_data_processors.filter_points'", + version="1.0.0", + ) def filter_points(self, ds): if hasattr(self, "BOX"): access_point = "BOX" - access_point_opts = {'BOX': self.BOX} + access_point_opts = {"BOX": self.BOX} elif hasattr(self, "CYC"): access_point = "CYC" - access_point_opts = {'CYC': self.CYC} + access_point_opts = {"CYC": self.CYC} elif hasattr(self, "WMO"): access_point = "WMO" - access_point_opts = {'WMO': self.WMO} + access_point_opts = {"WMO": self.WMO} return filter_points(ds, access_point=access_point, **access_point_opts) def transform_data_mode(self, ds: xr.Dataset, **kwargs): diff --git a/argopy/data_fetchers/gdac_data_processors.py b/argopy/data_fetchers/gdac_data_processors.py index 7e94d8b3..763e9b96 100644 --- a/argopy/data_fetchers/gdac_data_processors.py +++ b/argopy/data_fetchers/gdac_data_processors.py @@ -1,7 +1,5 @@ import numpy as np -import pandas as pd import xarray as xr -import getpass def pre_process_multiprof( @@ -58,24 +56,6 @@ def pre_process_multiprof( ds.argo.profile2point() ) # Default output is a collection of points, along N_POINTS - - # Attributes are added by the caller - - # if dataset_id == "phy": - # ds.attrs["DATA_ID"] = "ARGO" - # if dataset_id in ["bgc", "bgc-s"]: - # ds.attrs["DATA_ID"] = "ARGO-BGC" - # - # ds.attrs["DOI"] = "http://doi.org/10.17882/42182" - # - # # ds.attrs["Fetched_from"] = server - # ds.attrs["Fetched_constraints"] = cname - # try: - # ds.attrs["Fetched_by"] = getpass.getuser() - # except: # noqa: E722 - # ds.attrs["Fetched_by"] = "anonymous" - # ds.attrs["Fetched_date"] = pd.to_datetime("now", utc=True).strftime("%Y/%m/%d") - # ds.attrs["Fetched_uri"] = ds.encoding["source"] ds = ds[np.sort(ds.data_vars)] if pre_filter_points: diff --git a/argopy/data_fetchers/proto.py b/argopy/data_fetchers/proto.py index f2da03cf..016776de 100644 --- a/argopy/data_fetchers/proto.py +++ b/argopy/data_fetchers/proto.py @@ -6,7 +6,7 @@ import warnings import logging from ..plot import dashboard -from ..utils.lists import list_standard_variables, list_bgc_s_variables +from ..utils.lists import list_standard_variables from ..utils.format import UriCName, format_oneline diff --git a/argopy/errors.py b/argopy/errors.py index f00fe900..2cc2705e 100644 --- a/argopy/errors.py +++ b/argopy/errors.py @@ -5,6 +5,7 @@ log = logging.getLogger("argopy.errors") + class NoData(ValueError): """Raise for no data""" def __init__(self, path: str = "?"): diff --git a/argopy/extensions/canyon_med.py b/argopy/extensions/canyon_med.py index feaeaa42..5d1c278e 100644 --- a/argopy/extensions/canyon_med.py +++ b/argopy/extensions/canyon_med.py @@ -47,7 +47,7 @@ class CanyonMED(ArgoAccessorExtension): .. [2] Fourrier, M., Coppola, L., Claustre, H., D’Ortenzio, F., Sauzède, R., and Gattuso, J.-P. (2021). Corrigendum: A Regional Neural Network Approach to Estimate Water-Column Nutrient Concentrations and Carbonate System Variables in the Mediterranean Sea: CANYON-MED. Frontiers in Marine Science 8. doi:10.3389/fmars.2021.650509. """ - # todo This class work with pandas dataframe, but we should keep xarray dataset internaly for the predictions + # todo This class work with pandas dataframe, but we should keep xarray dataset internally for the predictions ne = 7 """Number of inputs""" diff --git a/argopy/extensions/params_data_mode.py b/argopy/extensions/params_data_mode.py index 35b4cd3c..9892b495 100644 --- a/argopy/extensions/params_data_mode.py +++ b/argopy/extensions/params_data_mode.py @@ -1,5 +1,4 @@ import numpy as np -import pandas as pd import xarray as xr import logging import time @@ -32,7 +31,7 @@ class ParamsDataMode(ArgoAccessorExtension): :meth:`datamode.split` Examples - -------- + -------- >>> from argopy import DataFetcher >>> ArgoSet = DataFetcher(mode='expert').float(1902605) >>> ds = ArgoSet.to_xarray() diff --git a/argopy/fetchers.py b/argopy/fetchers.py index 025ae117..b0e9306c 100755 --- a/argopy/fetchers.py +++ b/argopy/fetchers.py @@ -21,7 +21,6 @@ InvalidFetcherAccessPoint, InvalidFetcher, OptionValueError, - OptionDeprecatedWarning, ) from .related import ( get_coriolis_profile_id, @@ -492,10 +491,10 @@ def workflow(xds): return xds else: - workflow = lambda x: x # Empty processor + workflow = lambda x: x # noqa: E731 else: - workflow = lambda x: x # Empty processor + workflow = lambda x: x # noqa: E731 self._pp_workflow = workflow diff --git a/argopy/options.py b/argopy/options.py index 21cc2c86..73564772 100644 --- a/argopy/options.py +++ b/argopy/options.py @@ -134,12 +134,12 @@ def VALIDATE(key, val): if key in _VALIDATORS: if not _VALIDATORS[key](val): raise OptionValueError( - f"option '%s' given an invalid value: '%s'" % (key, val) + f"option '{key}' given an invalid value: '{val}'" ) else: return val else: - raise ValueError(f"option '%s' has no validation method" % key) + raise ValueError(f"option '{key}' has no validation method") def PARALLEL_SETUP(parallel): diff --git a/argopy/related/reference_tables.py b/argopy/related/reference_tables.py index d92acf95..5139f5f7 100644 --- a/argopy/related/reference_tables.py +++ b/argopy/related/reference_tables.py @@ -59,7 +59,7 @@ class ArgoNVSReferenceTables: "R28", "R40", - + "RD2", "RMC", "RP2", diff --git a/argopy/stores/__init__.py b/argopy/stores/__init__.py index 55f9be94..4b447222 100644 --- a/argopy/stores/__init__.py +++ b/argopy/stores/__init__.py @@ -1,7 +1,7 @@ # from .argo_index_deprec import indexstore, indexfilter_wmo, indexfilter_box from .filesystems import filestore, httpstore, memorystore, ftpstore, s3store from .filesystems import httpstore_erddap, httpstore_erddap_auth -from .filesystems import has_distributed, distributed +from .filesystems import has_distributed, distributed # noqa: F401 from .argo_index_pa import indexstore_pyarrow as indexstore_pa from .argo_index_pd import indexstore_pandas as indexstore_pd diff --git a/argopy/stores/argo_index_pd.py b/argopy/stores/argo_index_pd.py index 5b3ee0a0..41701406 100644 --- a/argopy/stores/argo_index_pd.py +++ b/argopy/stores/argo_index_pd.py @@ -236,7 +236,6 @@ def read_dac_wmo(self, index=False): return results - def read_params(self, index=False): if self.convention not in ["argo_bio-profile_index", "argo_synthetic-profile_index", diff --git a/argopy/stores/filesystems.py b/argopy/stores/filesystems.py index e399d324..5ef5b6ed 100644 --- a/argopy/stores/filesystems.py +++ b/argopy/stores/filesystems.py @@ -45,7 +45,6 @@ FileSystemHasNoCache, CacheFileNotFound, DataNotFound, - NoDataLeft, InvalidMethod, ErddapHTTPUnauthorized, ErddapHTTPNotFound, diff --git a/argopy/tests/test_data/0a9892220be0aee7ef6dfd747a8139d6634f89f95e4e60ffaf8b2834a8a4e03c.nc b/argopy/tests/test_data/0a9892220be0aee7ef6dfd747a8139d6634f89f95e4e60ffaf8b2834a8a4e03c.nc index ce75370bfe01fdc822f2d8982c0339be585ca7b2..ce3028ae2528cf20794f211a5e4c77172edf2fb7 100644 GIT binary patch delta 173721 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 bi~p~{XPbh!rO5?xzs-A?To$)U+yeI delta 5411 zcmeI${ZCU@7zgm)LQAU%?NBJCv*o?W%WlhyrNDgMbjpiUH#=ILfG|Z2-B84d4i&kJ z8YmpM%kYiOWM+glPQ04b@nOxp#ea=X8rJ<`!L5pQ^-bG|B0WYf z##J~lM4?K>6@z{04_zRvR*M#oYO~%>B6qdBCqih}l`_)G>!OU!Ey7^@RsZh=m)8o; zL@6U}Y!xjv&n0J*9{Qfr;{1lVld~nYB2h>bQRuWnOv*3*h{})X$b-~5<0Hac{Tu#j zWvPSor!5$-_RSLei474#Yj^rOzwWY=OX&rH&VgdXk?%-%MqoK%Fyll2{4M+R zq&aJ1DRWDjSqR}$;p>MGDrp%X=e-KHL21C;1l@1(jB0A&5 zEG!>^J+<$9O^FnS8YMC(@F?MmliHBQE(-_%(mG|Fijcor%;H z4Eydl^Q}r)TUf6p^@XxM7p>eyD+6K(fl!culwP!kJ?P}FsbwICDKHhnVH!lxYwE~N zE?RLfvRcgB??uYF^Y?2kC3Iv$7CZwi7{CbGkOR4p2eZKh`Cx_un$S_$SVrBZ zB43~4B6t?&z+9LI^I-ujgy-OSSOkmV1y}-0X+m*vV;L7eS_~yn3cl-Q@FFaS6|fRs zf|p?xSZMs{E3J*3YM`8|2COy@*WYJ@)vyL$g|$!tm9)RFYEtgro^_nJry6SDHCPWD zpq6@jHU@I1_>6kx!Jokdf(Zl@_`fD_UBa14H^UZaq^8oX{X<++Q4?%~H(@(8!w%R< zn~L6=bXYo*TR3O(F4zrwpcVE)8+9gg!NW566%kAzn7|W}01nHsp$OCbdSkFl>ETQl2poiW;9cOM8{VU) z3q6xgRJ-#KXLlZkBXAUsK`*>d?amK^C+ZXNw-o%>A(%igfk!9mY7gIgu1m(RTJKQ( z=V5x>`YAnb{Y>dOz2fA?D6XpJBsjqZeIURo_#93Hg?{(~&cFbig)eDU%~xCS8UZf{ J;(ad%{s!B=jP3vc diff --git a/argopy/tests/test_data/0dff09b865c98d376e650f80954c0d8de288d51dd030262b7085db0eab41a3eb.ncHeader b/argopy/tests/test_data/0dff09b865c98d376e650f80954c0d8de288d51dd030262b7085db0eab41a3eb.ncHeader index 36b69947..7a69c0ad 100644 --- a/argopy/tests/test_data/0dff09b865c98d376e650f80954c0d8de288d51dd030262b7085db0eab41a3eb.ncHeader +++ b/argopy/tests/test_data/0dff09b865c98d376e650f80954c0d8de288d51dd030262b7085db0eab41a3eb.ncHeader @@ -1,6 +1,6 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { dimensions: - row = 29599; + row = 29763; bbp700_adjusted_qc_strlen = 1; bbp700_qc_strlen = 1; cdom_adjusted_qc_strlen = 1; @@ -32,145 +32,74 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { temp_adjusted_qc_strlen = 1; temp_qc_strlen = 1; variables: - float bbp700(row=29599); - :_ChunkSizes = 106, 787; // int + float bbp700(row=29763); :_FillValue = 99999.0f; // float :actual_range = -1.953782E-4f, 0.04400722f; // float - :C_format = "%.7f"; :cf_standard_name = "-"; - :FORTRAN_format = "F.7"; :long_name = "Particle backscattering at 700 nanometers"; - :resolution = 1.0E-7f; // float :sdn_parameter_urn = "SDN:P01::BB117NIR"; :units = "m-1"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float bbp700_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 4.475482E-5f, 0.04400722f; // float - :C_format = "%.7f"; - :FORTRAN_format = "F.7"; - :long_name = "Particle backscattering at 700 nanometers"; - :resolution = 1.0E-7f; // float - :units = "m-1"; + float bbp700_adjusted(row=29763); + :actual_range = 4.475482E-5f, 99999.0f; // float - float bbp700_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 8.950965E-6f, 0.002592091f; // float - :C_format = "%.7f"; - :FORTRAN_format = "F.7"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 1.0E-7f; // float - :units = "m-1"; + float bbp700_adjusted_error(row=29763); + :actual_range = 8.950965E-6f, 99999.0f; // float - char bbp700_adjusted_qc(row=29599, bbp700_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char bbp700_adjusted_qc(row=29763, bbp700_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char bbp700_qc(row=29599, bbp700_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char bbp700_qc(row=29763, bbp700_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float cdom(row=29599); - :_ChunkSizes = 106, 787; // int + float cdom(row=29763); :_FillValue = 99999.0f; // float :actual_range = -2.8832f, 18.4705f; // float - :C_format = "%.3f"; :cf_standard_name = "-"; - :FORTRAN_format = "F.3"; :long_name = "Concentration of coloured dissolved organic matter in sea water"; - :resolution = 0.001f; // float :sdn_parameter_urn = "SDN:P01::CDOMZZ01"; :units = "ppb"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float cdom_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :C_format = "%.3f"; - :FORTRAN_format = "F.3"; - :long_name = "Concentration of coloured dissolved organic matter in sea water"; - :resolution = 0.001f; // float - :units = "ppb"; + float cdom_adjusted(row=29763); + :actual_range = 99999.0f, 99999.0f; // float - float cdom_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :C_format = "%.3f"; - :FORTRAN_format = "F.3"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 0.001f; // float - :units = "ppb"; + float cdom_adjusted_error(row=29763); + :actual_range = 99999.0f, 99999.0f; // float - char cdom_adjusted_qc(row=29599, cdom_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char cdom_adjusted_qc(row=29763, cdom_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char cdom_qc(row=29599, cdom_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char cdom_qc(row=29763, cdom_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float chla(row=29599); - :_ChunkSizes = 106, 787; // int + float chla(row=29763); :_FillValue = 99999.0f; // float :actual_range = -0.1728f, 13.45299f; // float - :C_format = "%.4f"; :cf_standard_name = "mass_concentration_of_chlorophyll_a_in_sea_water"; - :FORTRAN_format = "F.4"; :long_name = "Chlorophyll-A"; - :resolution = 0.025f; // float :sdn_parameter_urn = "SDN:P01::CPHLPR01"; - :standard_name = "mass_concentration_of_chlorophyll_a_in_sea_water"; :units = "mg/m3"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float chla_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = -0.04015f, 4.0661f; // float - :C_format = "%.4f"; - :FORTRAN_format = "F.4"; - :long_name = "Chlorophyll-A"; - :resolution = 0.025f; // float - :standard_name = "mass_concentration_of_chlorophyll_a_in_sea_water"; - :units = "mg/m3"; + float chla_adjusted(row=29763); + :actual_range = -0.04015f, 99999.0f; // float - float chla_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :C_format = "%.4f"; - :FORTRAN_format = "F.4"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 0.025f; // float - :units = "mg/m3"; + float chla_adjusted_error(row=29763); + :actual_range = 99999.0f, 99999.0f; // float - char chla_adjusted_qc(row=29599, chla_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char chla_adjusted_qc(row=29763, chla_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char chla_qc(row=29599, chla_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char chla_qc(row=29763, chla_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - int config_mission_number(row=29599); - :_ChunkSizes = 106; // int + int config_mission_number(row=29763); + :_ChunkSizes = 223; // int :_FillValue = 99999; // int :actual_range = 0, 65; // int :colorBarMaximum = 100.0; // double @@ -179,7 +108,7 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :ioos_category = "Statistics"; :long_name = "Unique number denoting the missions performed by the float"; - float cp660(row=29599); + float cp660(row=29763); :_FillValue = 99999.0f; // float :actual_range = 0.1697397f, 19.58223f; // float :cf_standard_name = "-"; @@ -189,19 +118,19 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = NaNf; // float :valid_min = NaNf; // float - float cp660_adjusted(row=29599); + float cp660_adjusted(row=29763); :actual_range = 99999.0f, 99999.0f; // float - float cp660_adjusted_error(row=29599); + float cp660_adjusted_error(row=29763); :actual_range = 99999.0f, 99999.0f; // float - char cp660_adjusted_qc(row=29599, cp660_adjusted_qc_strlen=1); + char cp660_adjusted_qc(row=29763, cp660_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - char cp660_qc(row=29599, cp660_qc_strlen=1); + char cp660_qc(row=29763, cp660_qc_strlen=1); :_Encoding = "ISO-8859-1"; - int cycle_number(row=29599); + int cycle_number(row=29763); :_FillValue = 99999; // int :actual_range = 0, 367; // int :cf_role = "profile_id"; @@ -210,8 +139,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :conventions = "0...N, 0 : launch cycle (if exists), 1 : first complete cycle"; :long_name = "Float cycle number"; - char direction(row=29599, direction_strlen=1); - :_ChunkSizes = 106; // int + char direction(row=29763, direction_strlen=1); + :_ChunkSizes = 223; // int :_Encoding = "ISO-8859-1"; :colorBarMaximum = 360.0; // double :colorBarMinimum = 0.0; // double @@ -219,215 +148,145 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :ioos_category = "Currents"; :long_name = "Direction of the station profiles"; - float down_irradiance380(row=29599); - :_ChunkSizes = 106, 787; // int + float down_irradiance380(row=29763); :_FillValue = 99999.0f; // float :actual_range = 4.040283E-5f, 0.6385083f; // float - :C_format = "%.6f"; :cf_standard_name = "-"; - :FORTRAN_format = "F.6"; :long_name = "Downwelling irradiance at 380 nanometers"; - :resolution = 1.0E-6f; // float :sdn_parameter_urn = "SDN:P01::RXUD380E"; :units = "W/m^2/nm"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float down_irradiance380_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = -4.40309E-5f, 0.6381621f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Downwelling irradiance at 380 nanometers"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance380_adjusted(row=29763); + :actual_range = -4.40309E-5f, 99999.0f; // float - float down_irradiance380_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 2.5E-5f, 0.01276324f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance380_adjusted_error(row=29763); + :actual_range = 2.5E-5f, 99999.0f; // float - char down_irradiance380_adjusted_qc(row=29599, down_irradiance380_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance380_adjusted_qc(row=29763, down_irradiance380_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char down_irradiance380_qc(row=29599, down_irradiance380_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance380_qc(row=29763, down_irradiance380_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float down_irradiance412(row=29599); - :_ChunkSizes = 106, 787; // int + float down_irradiance412(row=29763); :_FillValue = 99999.0f; // float :actual_range = -1.153E-4f, 1.227665f; // float - :C_format = "%.6f"; :cf_standard_name = "-"; - :FORTRAN_format = "F.6"; :long_name = "Downwelling irradiance at 412 nanometers"; - :resolution = 1.0E-6f; // float :sdn_parameter_urn = "SDN:P01::RXUD412E"; :units = "W/m^2/nm"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float down_irradiance412_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = -1.226209E-5f, 1.075224f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Downwelling irradiance at 412 nanometers"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance412_adjusted(row=29763); + :actual_range = -1.226209E-5f, 99999.0f; // float - float down_irradiance412_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 2.5E-5f, 0.02150448f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance412_adjusted_error(row=29763); + :actual_range = 2.5E-5f, 99999.0f; // float - char down_irradiance412_adjusted_qc(row=29599, down_irradiance412_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance412_adjusted_qc(row=29763, down_irradiance412_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char down_irradiance412_qc(row=29599, down_irradiance412_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance412_qc(row=29763, down_irradiance412_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float down_irradiance490(row=29599); - :_ChunkSizes = 106, 787; // int + float down_irradiance490(row=29763); :_FillValue = 99999.0f; // float :actual_range = -1.273E-4f, 1.711586f; // float - :C_format = "%.6f"; :cf_standard_name = "-"; - :FORTRAN_format = "F.6"; :long_name = "Downwelling irradiance at 490 nanometers"; - :resolution = 1.0E-6f; // float :sdn_parameter_urn = "SDN:P01::RXUD490E"; :units = "W/m^2/nm"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float down_irradiance490_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = -4.264853E-5f, 1.310853f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Downwelling irradiance at 490 nanometers"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance490_adjusted(row=29763); + :actual_range = -4.264853E-5f, 99999.0f; // float - float down_irradiance490_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 2.5E-5f, 0.02621705f; // float - :C_format = "%.6f"; - :FORTRAN_format = "F.6"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 1.0E-6f; // float - :units = "W/m^2/nm"; + float down_irradiance490_adjusted_error(row=29763); + :actual_range = 2.5E-5f, 99999.0f; // float - char down_irradiance490_adjusted_qc(row=29599, down_irradiance490_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance490_adjusted_qc(row=29763, down_irradiance490_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char down_irradiance490_qc(row=29599, down_irradiance490_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char down_irradiance490_qc(row=29763, down_irradiance490_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float downwelling_par(row=29599); - :_ChunkSizes = 106, 787; // int + float downwelling_par(row=29763); :_FillValue = 99999.0f; // float :actual_range = -0.01326383f, 1939.872f; // float - :C_format = "%.3f"; :cf_standard_name = "downwelling_photosynthetic_photon_flux_in_sea_water"; - :FORTRAN_format = "F.3"; :long_name = "Downwelling photosynthetic available radiation"; - :resolution = 0.001f; // float :sdn_parameter_urn = "SDN:P01::DWIRRXUD"; - :standard_name = "downwelling_photosynthetic_photon_flux_in_sea_water"; :units = "microMoleQuanta/m^2/sec"; :valid_max = NaNf; // float :valid_min = NaNf; // float - float downwelling_par_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = -0.03640744f, 1509.441f; // float - :C_format = "%.3f"; - :FORTRAN_format = "F.3"; - :long_name = "Downwelling photosynthetic available radiation"; - :resolution = 0.001f; // float - :standard_name = "downwelling_photosynthetic_photon_flux_in_sea_water"; - :units = "microMoleQuanta/m^2/sec"; + float downwelling_par_adjusted(row=29763); + :actual_range = -0.03640744f, 99999.0f; // float - float downwelling_par_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int - :_FillValue = 99999.0f; // float - :actual_range = 0.03f, 75.47203f; // float - :C_format = "%.3f"; - :FORTRAN_format = "F.3"; - :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; - :resolution = 0.001f; // float - :units = "microMoleQuanta/m^2/sec"; + float downwelling_par_adjusted_error(row=29763); + :actual_range = 0.03f, 99999.0f; // float - char downwelling_par_adjusted_qc(row=29599, downwelling_par_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char downwelling_par_adjusted_qc(row=29763, downwelling_par_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - char downwelling_par_qc(row=29599, downwelling_par_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char downwelling_par_qc(row=29763, downwelling_par_qc_strlen=1); :_Encoding = "ISO-8859-1"; - :conventions = "Argo reference table 2"; - :long_name = "quality flag"; - float doxy(row=29599); + float doxy(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = -1526.135f, 11356.0f; // float + :C_format = "%.3f"; :cf_standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; + :FORTRAN_format = "F.3"; :long_name = "Dissolved oxygen"; + :resolution = 0.001f; // float :sdn_parameter_urn = "SDN:P01::DOXMZZXX"; + :standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; :units = "micromole/kg"; :valid_max = 600.0f; // float :valid_min = -5.0f; // float - float doxy_adjusted(row=29599); - :actual_range = -1655.856f, 99999.0f; // float + float doxy_adjusted(row=29763); + :_ChunkSizes = 223, 166; // int + :_FillValue = 99999.0f; // float + :actual_range = -1655.856f, 12321.26f; // float + :C_format = "%.3f"; + :FORTRAN_format = "F.3"; + :long_name = "Dissolved oxygen"; + :resolution = 0.001f; // float + :standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; + :units = "micromole/kg"; + :valid_max = 600.0f; // float + :valid_min = -5.0f; // float - float doxy_adjusted_error(row=29599); - :actual_range = 2.630909f, 99999.0f; // float + float doxy_adjusted_error(row=29763); + :_ChunkSizes = 223, 166; // int + :_FillValue = 99999.0f; // float + :actual_range = 2.630909f, 31.84704f; // float + :C_format = "%.3f"; + :FORTRAN_format = "F.3"; + :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; + :resolution = 0.001f; // float + :units = "micromole/kg"; - char doxy_adjusted_qc(row=29599, doxy_adjusted_qc_strlen=1); + char doxy_adjusted_qc(row=29763, doxy_adjusted_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; + :conventions = "Argo reference table 2"; + :long_name = "quality flag"; - char doxy_qc(row=29599, doxy_qc_strlen=1); + char doxy_qc(row=29763, doxy_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; + :conventions = "Argo reference table 2"; + :long_name = "quality flag"; - double latitude(row=29599); + double latitude(row=29763); :_CoordinateAxisType = "Lat"; :_FillValue = 99999.0; // double :actual_range = 55.00095666666667, 56.99997; // double @@ -441,7 +300,7 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 90.0; // double :valid_min = -90.0; // double - double longitude(row=29599); + double longitude(row=29763); :_CoordinateAxisType = "Lon"; :_FillValue = 99999.0; // double :actual_range = -54.999, -47.00874350000001; // double @@ -455,7 +314,7 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 180.0; // double :valid_min = -180.0; // double - float nitrate(row=29599); + float nitrate(row=29763); :_FillValue = 99999.0f; // float :actual_range = 3.829968f, 12.175f; // float :cf_standard_name = "moles_of_nitrate_per_unit_mass_in_sea_water"; @@ -465,21 +324,21 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = NaNf; // float :valid_min = NaNf; // float - float nitrate_adjusted(row=29599); + float nitrate_adjusted(row=29763); :actual_range = 0.9696299f, 99999.0f; // float - float nitrate_adjusted_error(row=29599); + float nitrate_adjusted_error(row=29763); :actual_range = 0.7363588f, 99999.0f; // float - char nitrate_adjusted_qc(row=29599, nitrate_adjusted_qc_strlen=1); + char nitrate_adjusted_qc(row=29763, nitrate_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - char nitrate_qc(row=29599, nitrate_qc_strlen=1); + char nitrate_qc(row=29763, nitrate_qc_strlen=1); :_Encoding = "ISO-8859-1"; - float ph_in_situ_total(row=29599); + float ph_in_situ_total(row=29763); :_FillValue = 99999.0f; // float - :actual_range = 5.686137f, 8.225677f; // float + :actual_range = 4.186288f, 8.225677f; // float :cf_standard_name = "sea_water_ph_reported_on_total_scale"; :long_name = "pH"; :sdn_parameter_urn = "SDN:P01::PHMASSXX"; @@ -487,34 +346,34 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = NaNf; // float :valid_min = NaNf; // float - float ph_in_situ_total_adjusted(row=29599); + float ph_in_situ_total_adjusted(row=29763); :actual_range = 99999.0f, 99999.0f; // float - float ph_in_situ_total_adjusted_error(row=29599); + float ph_in_situ_total_adjusted_error(row=29763); :actual_range = 99999.0f, 99999.0f; // float - char ph_in_situ_total_adjusted_qc(row=29599, ph_in_situ_total_adjusted_qc_strlen=1); + char ph_in_situ_total_adjusted_qc(row=29763, ph_in_situ_total_adjusted_qc_strlen=1); :_Encoding = "ISO-8859-1"; - char ph_in_situ_total_qc(row=29599, ph_in_situ_total_qc_strlen=1); + char ph_in_situ_total_qc(row=29763, ph_in_situ_total_qc_strlen=1); :_Encoding = "ISO-8859-1"; - char platform_number(row=29599, platform_number_strlen=7); + char platform_number(row=29763, platform_number_strlen=7); :_Encoding = "ISO-8859-1"; :cf_role = "trajectory_id"; :conventions = "WMO float identifier : A9IIIII"; :ioos_category = "Identifier"; :long_name = "Float unique identifier"; - char position_qc(row=29599); + char position_qc(row=29763); :actual_range = "18"; :colorBarMaximum = 150.0; // double :colorBarMinimum = 0.0; // double :conventions = "Argo reference table 2"; :long_name = "Quality on position (latitude and longitude)"; - float pres(row=29599); - :_ChunkSizes = 106, 787; // int + float pres(row=29763); + :_ChunkSizes = 223, 166; // int :_CoordinateAxisType = "Height"; :_FillValue = 99999.0f; // float :actual_range = 0.0f, 10.0f; // float @@ -530,8 +389,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 12000.0f; // float :valid_min = 0.0f; // float - float pres_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int + float pres_adjusted(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = -4.768372E-7f, 10.49f; // float :axis = "Z"; @@ -544,8 +403,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 12000.0f; // float :valid_min = 0.0f; // float - float pres_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int + float pres_adjusted_error(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 2.0f, 2.4f; // float :C_format = "%.3f"; @@ -554,20 +413,20 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :resolution = 0.001f; // float :units = "decibar"; - char pres_adjusted_qc(row=29599, pres_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char pres_adjusted_qc(row=29763, pres_adjusted_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - char pres_qc(row=29599, pres_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char pres_qc(row=29763, pres_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - float psal(row=29599); - :_ChunkSizes = 106, 787; // int + float psal(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 1.208f, 35.02467f; // float :C_format = "%.4f"; @@ -581,8 +440,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 41.0f; // float :valid_min = 2.0f; // float - float psal_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int + float psal_adjusted(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 1.868f, 35.02467f; // float :C_format = "%.4f"; @@ -594,8 +453,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 41.0f; // float :valid_min = 2.0f; // float - float psal_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int + float psal_adjusted_error(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 0.004f, 1.046394f; // float :C_format = "%.4f"; @@ -604,20 +463,20 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :resolution = 1.0E-4f; // float :units = "psu"; - char psal_adjusted_qc(row=29599, psal_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char psal_adjusted_qc(row=29763, psal_adjusted_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - char psal_qc(row=29599, psal_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char psal_qc(row=29763, psal_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - float temp(row=29599); - :_ChunkSizes = 106, 787; // int + float temp(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = -1.401f, 15.6335f; // float :C_format = "%.3f"; @@ -631,8 +490,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 40.0f; // float :valid_min = -2.5f; // float - float temp_adjusted(row=29599); - :_ChunkSizes = 106, 787; // int + float temp_adjusted(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = -1.401f, 12.905f; // float :C_format = "%.3f"; @@ -644,8 +503,8 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :valid_max = 40.0f; // float :valid_min = -2.5f; // float - float temp_adjusted_error(row=29599); - :_ChunkSizes = 106, 787; // int + float temp_adjusted_error(row=29763); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 0.002f, 0.002f; // float :C_format = "%.3f"; @@ -654,21 +513,21 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :resolution = 0.001f; // float :units = "degree_Celsius"; - char temp_adjusted_qc(row=29599, temp_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char temp_adjusted_qc(row=29763, temp_adjusted_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - char temp_qc(row=29599, temp_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + char temp_qc(row=29763, temp_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; - double time(row=29599); + double time(row=29763); :_CoordinateAxisType = "Time"; - :actual_range = 1.063557316224E9, 1.72760868E9; // double + :actual_range = 1.063557316224E9, 1.72899174E9; // double :axis = "T"; :conventions = "Relative julian days with decimal part (as parts of day)"; :ioos_category = "Time"; @@ -678,7 +537,7 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :time_origin = "01-JAN-1970 00:00:00"; :units = "seconds since 1970-01-01T00:00:00Z"; - char time_qc(row=29599); + char time_qc(row=29763); :actual_range = "11"; :colorBarMaximum = 150.0; // double :colorBarMinimum = 0.0; // double @@ -703,9 +562,9 @@ netcdf ArgoFloats-synthetic-BGC_0abd_084b_d559.nc { :geospatial_lon_max = -47.00874350000001; // double :geospatial_lon_min = -54.999; // double :geospatial_lon_units = "degrees_east"; - :history = "2024-09-24T16:12:38Z creation (software version 1.18 (version 11.01.2024 for ARGO_simplified_profile)) -2024-10-01T14:01:18Z (local files) -2024-10-01T14:01:18Z https://erddap.ifremer.fr/erddap/tabledap/ArgoFloats-synthetic-BGC.nc?bbp700,bbp700_adjusted,bbp700_adjusted_error,bbp700_adjusted_qc,bbp700_qc,cdom,cdom_adjusted,cdom_adjusted_error,cdom_adjusted_qc,cdom_qc,chla,chla_adjusted,chla_adjusted_error,chla_adjusted_qc,chla_qc,config_mission_number,cp660,cp660_adjusted,cp660_adjusted_error,cp660_adjusted_qc,cp660_qc,cycle_number,direction,down_irradiance380,down_irradiance380_adjusted,down_irradiance380_adjusted_error,down_irradiance380_adjusted_qc,down_irradiance380_qc,down_irradiance412,down_irradiance412_adjusted,down_irradiance412_adjusted_error,down_irradiance412_adjusted_qc,down_irradiance412_qc,down_irradiance490,down_irradiance490_adjusted,down_irradiance490_adjusted_error,down_irradiance490_adjusted_qc,down_irradiance490_qc,downwelling_par,downwelling_par_adjusted,downwelling_par_adjusted_error,downwelling_par_adjusted_qc,downwelling_par_qc,doxy,doxy_adjusted,doxy_adjusted_error,doxy_adjusted_qc,doxy_qc,latitude,longitude,nitrate,nitrate_adjusted,nitrate_adjusted_error,nitrate_adjusted_qc,nitrate_qc,ph_in_situ_total,ph_in_situ_total_adjusted,ph_in_situ_total_adjusted_error,ph_in_situ_total_adjusted_qc,ph_in_situ_total_qc,platform_number,position_qc,pres,pres_adjusted,pres_adjusted_error,pres_adjusted_qc,pres_qc,psal,psal_adjusted,psal_adjusted_error,psal_adjusted_qc,psal_qc,temp,temp_adjusted,temp_adjusted_error,temp_adjusted_qc,temp_qc,time,time_qc&longitude%3E=-55&longitude%3C=-47&latitude%3E=55&latitude%3C=57&pres%3E=0&pres%3C=10&latitude!=NaN&longitude!=NaN&distinct()&orderBy(%22time,pres%22)"; + :history = "2024-10-15T19:15:14Z creation (software version 1.18 (version 11.01.2024 for ARGO_simplified_profile)) +2024-10-16T08:41:04Z (local files) +2024-10-16T08:41:04Z https://erddap.ifremer.fr/erddap/tabledap/ArgoFloats-synthetic-BGC.nc?bbp700,bbp700_adjusted,bbp700_adjusted_error,bbp700_adjusted_qc,bbp700_qc,cdom,cdom_adjusted,cdom_adjusted_error,cdom_adjusted_qc,cdom_qc,chla,chla_adjusted,chla_adjusted_error,chla_adjusted_qc,chla_qc,config_mission_number,cp660,cp660_adjusted,cp660_adjusted_error,cp660_adjusted_qc,cp660_qc,cycle_number,direction,down_irradiance380,down_irradiance380_adjusted,down_irradiance380_adjusted_error,down_irradiance380_adjusted_qc,down_irradiance380_qc,down_irradiance412,down_irradiance412_adjusted,down_irradiance412_adjusted_error,down_irradiance412_adjusted_qc,down_irradiance412_qc,down_irradiance490,down_irradiance490_adjusted,down_irradiance490_adjusted_error,down_irradiance490_adjusted_qc,down_irradiance490_qc,downwelling_par,downwelling_par_adjusted,downwelling_par_adjusted_error,downwelling_par_adjusted_qc,downwelling_par_qc,doxy,doxy_adjusted,doxy_adjusted_error,doxy_adjusted_qc,doxy_qc,latitude,longitude,nitrate,nitrate_adjusted,nitrate_adjusted_error,nitrate_adjusted_qc,nitrate_qc,ph_in_situ_total,ph_in_situ_total_adjusted,ph_in_situ_total_adjusted_error,ph_in_situ_total_adjusted_qc,ph_in_situ_total_qc,platform_number,position_qc,pres,pres_adjusted,pres_adjusted_error,pres_adjusted_qc,pres_qc,psal,psal_adjusted,psal_adjusted_error,psal_adjusted_qc,psal_qc,temp,temp_adjusted,temp_adjusted_error,temp_adjusted_qc,temp_qc,time,time_qc&longitude%3E=-55&longitude%3C=-47&latitude%3E=55&latitude%3C=57&pres%3E=0&pres%3C=10&latitude!=NaN&longitude!=NaN&distinct()&orderBy(%22time,pres%22)"; :id = "https://doi.org/10.17882/42182"; :infoUrl = "http://www.argodatamgt.org/Documentation"; :institution = "Argo"; @@ -728,7 +587,7 @@ completeness, or usefulness, of this information."; :subsetVariables = "data_type, data_centre, platform_type, wmo_inst_type, time_qc, position_qc, pres_qc"; :summary = "Argo float synthetic vertical profiles : BGC data"; :testOutOfDate = "now-5days"; - :time_coverage_end = "2024-09-29T11:18:00Z"; + :time_coverage_end = "2024-10-15T11:29:00Z"; :time_coverage_start = "2003-09-14T16:35:16Z"; :title = "Argo float synthetic vertical profiles : BGC data"; :user_manual_version = "1.0"; diff --git a/argopy/tests/test_data/163a1c42f872d1a3d10a795d581fa8e676d2698a8ef9135bde278cdbb05612d9.ncHeader b/argopy/tests/test_data/163a1c42f872d1a3d10a795d581fa8e676d2698a8ef9135bde278cdbb05612d9.ncHeader index bdb0e8c0..912c4b74 100644 --- a/argopy/tests/test_data/163a1c42f872d1a3d10a795d581fa8e676d2698a8ef9135bde278cdbb05612d9.ncHeader +++ b/argopy/tests/test_data/163a1c42f872d1a3d10a795d581fa8e676d2698a8ef9135bde278cdbb05612d9.ncHeader @@ -13,7 +13,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { temp_qc_strlen = 1; variables: int config_mission_number(row=83615); - :_ChunkSizes = 106; // int + :_ChunkSizes = 223; // int :_FillValue = 99999; // int :actual_range = 1, 12; // int :colorBarMaximum = 100.0; // double @@ -32,7 +32,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :long_name = "Float cycle number"; char direction(row=83615, direction_strlen=1); - :_ChunkSizes = 106; // int + :_ChunkSizes = 223; // int :_Encoding = "ISO-8859-1"; :colorBarMaximum = 360.0; // double :colorBarMinimum = 0.0; // double @@ -41,26 +41,54 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :long_name = "Direction of the station profiles"; float doxy(row=83615); + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 259.8413f, 344.439f; // float + :C_format = "%.3f"; :cf_standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; + :FORTRAN_format = "F.3"; :long_name = "Dissolved oxygen"; + :resolution = 0.001f; // float :sdn_parameter_urn = "SDN:P01::DOXMZZXX"; + :standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; :units = "micromole/kg"; :valid_max = 600.0f; // float :valid_min = -5.0f; // float float doxy_adjusted(row=83615); - :actual_range = 264.4146f, 99999.0f; // float + :_ChunkSizes = 223, 166; // int + :_FillValue = 99999.0f; // float + :actual_range = 264.4146f, 350.5012f; // float + :C_format = "%.3f"; + :FORTRAN_format = "F.3"; + :long_name = "Dissolved oxygen"; + :resolution = 0.001f; // float + :standard_name = "moles_of_oxygen_per_unit_mass_in_sea_water"; + :units = "micromole/kg"; + :valid_max = 600.0f; // float + :valid_min = -5.0f; // float float doxy_adjusted_error(row=83615); - :actual_range = 12.55041f, 99999.0f; // float + :_ChunkSizes = 223, 166; // int + :_FillValue = 99999.0f; // float + :actual_range = 12.55041f, 17.08033f; // float + :C_format = "%.3f"; + :FORTRAN_format = "F.3"; + :long_name = "Contains the error on the adjusted values as determined by the delayed mode QC process"; + :resolution = 0.001f; // float + :units = "micromole/kg"; char doxy_adjusted_qc(row=83615, doxy_adjusted_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; + :conventions = "Argo reference table 2"; + :long_name = "quality flag"; char doxy_qc(row=83615, doxy_qc_strlen=1); + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; + :conventions = "Argo reference table 2"; + :long_name = "quality flag"; double latitude(row=83615); :_CoordinateAxisType = "Lat"; @@ -105,7 +133,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :long_name = "Quality on position (latitude and longitude)"; float pres(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_CoordinateAxisType = "Height"; :_FillValue = 99999.0f; // float :actual_range = -0.29f, 2005.056f; // float @@ -122,7 +150,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = 0.0f; // float float pres_adjusted(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = -4.054f, 2003.352f; // float :axis = "Z"; @@ -136,7 +164,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = 0.0f; // float float pres_adjusted_error(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :C_format = "%.3f"; :FORTRAN_format = "F.3"; @@ -145,19 +173,19 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :units = "decibar"; char pres_adjusted_qc(row=83615, pres_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; char pres_qc(row=83615, pres_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; float psal(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 27.411f, 34.936f; // float :C_format = "%.4f"; @@ -172,7 +200,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = 2.0f; // float float psal_adjusted(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 34.20806f, 34.93495f; // float :C_format = "%.4f"; @@ -185,7 +213,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = 2.0f; // float float psal_adjusted_error(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :C_format = "%.4f"; :FORTRAN_format = "F.4"; @@ -194,19 +222,19 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :units = "psu"; char psal_adjusted_qc(row=83615, psal_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; char psal_qc(row=83615, psal_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; float temp(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 3.139f, 12.609f; // float :C_format = "%.3f"; @@ -221,7 +249,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = -2.5f; // float float temp_adjusted(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :actual_range = 3.139f, 12.609f; // float :C_format = "%.3f"; @@ -234,7 +262,7 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :valid_min = -2.5f; // float float temp_adjusted_error(row=83615); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_FillValue = 99999.0f; // float :C_format = "%.3f"; :FORTRAN_format = "F.3"; @@ -243,13 +271,13 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :units = "degree_Celsius"; char temp_adjusted_qc(row=83615, temp_adjusted_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; char temp_qc(row=83615, temp_qc_strlen=1); - :_ChunkSizes = 106, 787; // int + :_ChunkSizes = 223, 166; // int :_Encoding = "ISO-8859-1"; :conventions = "Argo reference table 2"; :long_name = "quality flag"; @@ -291,9 +319,9 @@ netcdf ArgoFloats-synthetic-BGC_0478_10ce_d179.nc { :geospatial_lon_max = -43.740898; // double :geospatial_lon_min = -53.10385516666667; // double :geospatial_lon_units = "degrees_east"; - :history = "2024-09-24T16:12:38Z creation (software version 1.18 (version 11.01.2024 for ARGO_simplified_profile)) -2024-10-01T14:03:29Z (local files) -2024-10-01T14:03:29Z https://erddap.ifremer.fr/erddap/tabledap/ArgoFloats-synthetic-BGC.nc?config_mission_number,cycle_number,direction,doxy,doxy_adjusted,doxy_adjusted_error,doxy_adjusted_qc,doxy_qc,latitude,longitude,platform_number,position_qc,pres,pres_adjusted,pres_adjusted_error,pres_adjusted_qc,pres_qc,psal,psal_adjusted,psal_adjusted_error,psal_adjusted_qc,psal_qc,temp,temp_adjusted,temp_adjusted_error,temp_adjusted_qc,temp_qc,time,time_qc&platform_number=~%226904241%22&latitude!=NaN&longitude!=NaN&distinct()&orderBy(%22time,pres%22)"; + :history = "2024-10-15T19:15:14Z creation (software version 1.18 (version 11.01.2024 for ARGO_simplified_profile)) +2024-10-16T08:54:33Z (local files) +2024-10-16T08:54:33Z https://erddap.ifremer.fr/erddap/tabledap/ArgoFloats-synthetic-BGC.nc?config_mission_number,cycle_number,direction,doxy,doxy_adjusted,doxy_adjusted_error,doxy_adjusted_qc,doxy_qc,latitude,longitude,platform_number,position_qc,pres,pres_adjusted,pres_adjusted_error,pres_adjusted_qc,pres_qc,psal,psal_adjusted,psal_adjusted_error,psal_adjusted_qc,psal_qc,temp,temp_adjusted,temp_adjusted_error,temp_adjusted_qc,temp_qc,time,time_qc&platform_number=~%226904241%22&latitude!=NaN&longitude!=NaN&distinct()&orderBy(%22time,pres%22)"; :id = "https://doi.org/10.17882/42182"; :infoUrl = "http://www.argodatamgt.org/Documentation"; :institution = "Argo"; diff --git a/argopy/tests/test_data/256df2864499d7cd270eb5e126e076b13f2a48403f72b31c45590a0f6b1618d9.nc b/argopy/tests/test_data/256df2864499d7cd270eb5e126e076b13f2a48403f72b31c45590a0f6b1618d9.nc index 90320954930073ce0177f0394fd313210bbf327b..749364fe086701851ff41512b7b5b622e8594fb7 100644 GIT binary patch delta 1186 zcmZ9|TS${(7zglu@3z!wwk+LAbDlQc+~M24d6<@`EK4&pvt_20hqPwXwDT@XjU=MN z$4kL3MsyJwet}+g(M8@!M4(h;;6)OP1QCir`g;0V63Mecn?Qa| zBuNcw@+GTjL}RCsWP#>1yGfc-ObOa(n$B3Oo3)K>e1RTnQ>f3h)gNBc?}{lIEi?`q zj;{7CrV6Wb%-RO2@`IPYXpN+bRYx!cZiI#xl}+6)8VK|c8m1{vtBjCK+|W3<*rm0)=UGs#Q&=Cl`?Tg_laXe0r7RhSB^~%i$jSDjx7&~PxXvr!37E= zIoI|Sza%lnoKNUmO2Ovlq9?VOW0g@foK~_?OvEX^v$g>W8rEy8UnuXB(S$K??bT|f zVlqJf^!4#Lqd1>_jbqCFbk-D-Fk_10nCT4#%^?ZLGv`=oKIK@p5_(zV1j($S0S(VQ z^v=2-FlL*=Lci&~eRKFpdc1OI{xb{fA-^MJ{+#2NB548FR`#@XbW)*3MT^eVkiYx# zz4TPr2>T}Vvc4#>+4TcAd_h&&KiG0WEX?WFkDI&YL&f4~e=x4kHg?}O#sLE<$UqL; zAPmAG0u&GlQLr7NVFxH-C&a)m*bT7|2P#m52DG4qcu0UfkO+E6f@Da6R7e8@7$F@p zzyxN<1PfTf26o`V0ZtIW1zC^{Igkr($b)>?3;Un|3ZV#!p#=6rDI9=9?n1mG{RXp2j`&)nxO?+;R3WlJ6wcI;Drvj f3_j?DF1P~S&;wWD8eE4Pa1(C9?Qz?f|Ied;=rOcU delta 1158 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 iusr+D99CmX! List[xr.Dataset]: +def drop_variables_not_in_all_datasets( + ds_collection: List[xr.Dataset], +) -> List[xr.Dataset]: """Drop variables that are not in all datasets (the lowest common denominator) Parameters @@ -149,7 +152,9 @@ def fillvalue(da): return results -def merge_param_with_param_adjusted(ds: xr.Dataset, param: str, errors: str = 'raise') -> xr.Dataset: +def merge_param_with_param_adjusted( + ds: xr.Dataset, param: str, errors: str = "raise" +) -> xr.Dataset: """Copy _ADJUSTED values onto for points where param data mode is 'A' or 'D' After values have been copied, all _ADJUSTED* variables are dropped to avoid confusion. @@ -177,21 +182,23 @@ def merge_param_with_param_adjusted(ds: xr.Dataset, param: str, errors: str = 'r """ if "%s_ADJUSTED" % param not in ds: - if errors == 'raise': - raise InvalidDatasetStructure("Parameter '%s_ADJUSTED' adjusted values not found in this dataset" % param) + if errors == "raise": + raise InvalidDatasetStructure( + "Parameter '%s_ADJUSTED' adjusted values not found in this dataset" + % param + ) else: return ds if ds.argo._type != "point": - raise InvalidDatasetStructure( - "Method only available to a collection of points" - ) + raise InvalidDatasetStructure("Method only available to a collection of points") core_ds = False if "%s_DATA_MODE" % param not in ds and param in list_core_parameters(): if "DATA_MODE" not in ds: - if errors == 'raise': - raise InvalidDatasetStructure( - "Parameter '%s' data mode not found in this dataset (no 'DATA_MODE')" % param + if errors == "raise": + raise InvalidDatasetStructure( + "Parameter '%s' data mode not found in this dataset (no 'DATA_MODE')" + % param ) else: return ds @@ -208,32 +215,49 @@ def merge_param_with_param_adjusted(ds: xr.Dataset, param: str, errors: str = 'r if "%s_ERROR" % param not in ds and "%s_ADJUSTED_ERROR" % param in ds: ds["%s_ERROR" % param] = ds["%s_ADJUSTED_ERROR" % param].copy() - ii_measured = np.logical_or.reduce((ds["%s_DATA_MODE" % param] == 'R', - ds["%s_DATA_MODE" % param] == 'A', - ds["%s_DATA_MODE" % param] == 'D')) - ii_missing = np.logical_and.reduce((ds["%s_DATA_MODE" % param] != 'R', - ds["%s_DATA_MODE" % param] != 'A', - ds["%s_DATA_MODE" % param] != 'D')) - assert ii_measured.sum() + ii_missing.sum() == len(ds['N_POINTS']), "Unexpected data mode values !" - - ii_measured_adj = np.logical_and.reduce((ii_measured, - np.logical_or.reduce((ds["%s_DATA_MODE" % param] == 'A', - ds["%s_DATA_MODE" % param] == 'D')) - )) + ii_measured = np.logical_or.reduce( + ( + ds["%s_DATA_MODE" % param] == "R", + ds["%s_DATA_MODE" % param] == "A", + ds["%s_DATA_MODE" % param] == "D", + ) + ) + ii_missing = np.logical_and.reduce( + ( + ds["%s_DATA_MODE" % param] != "R", + ds["%s_DATA_MODE" % param] != "A", + ds["%s_DATA_MODE" % param] != "D", + ) + ) + assert ii_measured.sum() + ii_missing.sum() == len( + ds["N_POINTS"] + ), "Unexpected data mode values !" + + ii_measured_adj = np.logical_and.reduce( + ( + ii_measured, + np.logical_or.reduce( + (ds["%s_DATA_MODE" % param] == "A", ds["%s_DATA_MODE" % param] == "D") + ), + ) + ) # Copy param_adjusted values onto param indexes where data_mode is in 'a' or 'd': - ds["%s" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds["%s_ADJUSTED" % param].loc[ - dict(N_POINTS=ii_measured_adj)] + ds["%s" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds[ + "%s_ADJUSTED" % param + ].loc[dict(N_POINTS=ii_measured_adj)] ds = ds.drop_vars(["%s_ADJUSTED" % param]) if "%s_ADJUSTED_QC" % param in ds and "%s_ADJUSTED_QC" % param in ds: - ds["%s_QC" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds["%s_ADJUSTED_QC" % param].loc[ - dict(N_POINTS=ii_measured_adj)] + ds["%s_QC" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds[ + "%s_ADJUSTED_QC" % param + ].loc[dict(N_POINTS=ii_measured_adj)] ds = ds.drop_vars(["%s_ADJUSTED_QC" % param]) if "%s_ERROR" % param in ds and "%s_ADJUSTED_ERROR" % param in ds: - ds["%s_ERROR" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds["%s_ADJUSTED_ERROR" % param].loc[ - dict(N_POINTS=ii_measured_adj)] + ds["%s_ERROR" % param].loc[dict(N_POINTS=ii_measured_adj)] = ds[ + "%s_ADJUSTED_ERROR" % param + ].loc[dict(N_POINTS=ii_measured_adj)] ds = ds.drop_vars(["%s_ADJUSTED_ERROR" % param]) if core_ds: @@ -242,11 +266,13 @@ def merge_param_with_param_adjusted(ds: xr.Dataset, param: str, errors: str = 'r return ds -def filter_param_by_data_mode(ds: xr.Dataset, - param: str, - dm: Union[str, List[str]] = ['R', 'A', 'D'], - mask: bool = False, - errors: str = 'raise') -> xr.Dataset: +def filter_param_by_data_mode( + ds: xr.Dataset, + param: str, + dm: Union[str, List[str]] = ["R", "A", "D"], + mask: bool = False, + errors: str = "raise", +) -> xr.Dataset: """Filter measurements according to a parameter data mode Filter the dataset to keep points where a parameter is in any of the data mode specified. @@ -281,9 +307,10 @@ def filter_param_by_data_mode(ds: xr.Dataset, core_ds = False if "%s_DATA_MODE" % param not in ds and param in list_core_parameters(): if "DATA_MODE" not in ds: - if errors == 'raise': + if errors == "raise": raise InvalidDatasetStructure( - "Parameter '%s' data mode not found in this dataset (no 'DATA_MODE')" % param + "Parameter '%s' data mode not found in this dataset (no 'DATA_MODE')" + % param ) else: return ds @@ -327,19 +354,24 @@ def split_data_mode(ds: xr.Dataset) -> xr.Dataset: """ if "STATION_PARAMETERS" in ds and "PARAMETER_DATA_MODE" in ds: - u64 = lambda s: "%s%s" % (s, " " * (64 - len(s))) - params = [p.strip() for p in np.unique(ds['STATION_PARAMETERS'])] + u64 = lambda s: "%s%s" % (s, " " * (64 - len(s))) # noqa: E731 + params = [p.strip() for p in np.unique(ds["STATION_PARAMETERS"])] for param in params: - name = "%s_DATA_MODE" % param.replace("_PARAMETER", "").replace("PARAMETER_", "") - mask = ds['STATION_PARAMETERS'] == xr.full_like(ds['STATION_PARAMETERS'], u64(param), - dtype=ds['STATION_PARAMETERS'].dtype) - da = ds['PARAMETER_DATA_MODE'].where(mask, drop=True).isel(N_PARAM=0) + name = "%s_DATA_MODE" % param.replace("_PARAMETER", "").replace( + "PARAMETER_", "" + ) + mask = ds["STATION_PARAMETERS"] == xr.full_like( + ds["STATION_PARAMETERS"], + u64(param), + dtype=ds["STATION_PARAMETERS"].dtype, + ) + da = ds["PARAMETER_DATA_MODE"].where(mask, drop=True).isel(N_PARAM=0) da = da.rename(name) - da = da.astype(ds['PARAMETER_DATA_MODE'].dtype) + da = da.astype(ds["PARAMETER_DATA_MODE"].dtype) ds[name] = da - ds = ds.drop_vars('PARAMETER_DATA_MODE') + ds = ds.drop_vars("PARAMETER_DATA_MODE") ds.argo.add_history("Transformed with 'split_data_mode'") return ds diff --git a/argopy/xarray.py b/argopy/xarray.py index 2474198d..a64f0b7c 100644 --- a/argopy/xarray.py +++ b/argopy/xarray.py @@ -5,7 +5,6 @@ import pandas as pd import xarray as xr import logging -from typing import Union, List from xarray.backends import BackendEntrypoint # For xarray > 0.18 try: @@ -27,13 +26,6 @@ ) from .utils import list_core_parameters from .utils import toYearFraction -from .utils import ( - merge_param_with_param_adjusted, - filter_param_by_data_mode, - split_data_mode, -) -from .utils import deprecated - from .errors import InvalidDatasetStructure, DataNotFound, OptionValueError log = logging.getLogger("argopy.xarray") diff --git a/docs/user-guide/working-with-argo-data/owc_workflow_eg.py b/docs/user-guide/working-with-argo-data/owc_workflow_eg.py index e2f05065..806cd59e 100644 --- a/docs/user-guide/working-with-argo-data/owc_workflow_eg.py +++ b/docs/user-guide/working-with-argo-data/owc_workflow_eg.py @@ -9,13 +9,21 @@ FLOAT_NAME = "6903010" # Set-up where to save OWC analysis results: -results_folder = './analysis/%s' % FLOAT_NAME +results_folder = "./analysis/%s" % FLOAT_NAME Path(results_folder).mkdir(parents=True, exist_ok=True) shutil.rmtree(results_folder) # Clean up folder content -Path(os.path.sep.join([results_folder, 'float_source'])).mkdir(parents=True, exist_ok=True) -Path(os.path.sep.join([results_folder, 'float_calib'])).mkdir(parents=True, exist_ok=True) -Path(os.path.sep.join([results_folder, 'float_mapped'])).mkdir(parents=True, exist_ok=True) -Path(os.path.sep.join([results_folder, 'float_plots'])).mkdir(parents=True, exist_ok=True) +Path(os.path.sep.join([results_folder, "float_source"])).mkdir( + parents=True, exist_ok=True +) +Path(os.path.sep.join([results_folder, "float_calib"])).mkdir( + parents=True, exist_ok=True +) +Path(os.path.sep.join([results_folder, "float_mapped"])).mkdir( + parents=True, exist_ok=True +) +Path(os.path.sep.join([results_folder, "float_plots"])).mkdir( + parents=True, exist_ok=True +) # fetch the default configuration and parameters USER_CONFIG = owc.configuration.load() @@ -24,19 +32,22 @@ for k in USER_CONFIG: if "FLOAT" in k and "data/" in USER_CONFIG[k][0:5]: USER_CONFIG[k] = os.path.abspath(USER_CONFIG[k].replace("data", results_folder)) -USER_CONFIG['CONFIG_DIRECTORY'] = os.path.abspath('../data/constants') -USER_CONFIG['HISTORICAL_DIRECTORY'] = os.path.abspath( - '/Volumes/OWC/CLIMATOLOGY/') # where to find ARGO_for_DMQC_2020V03 and CTD_for_DMQC_2021V01 folders -USER_CONFIG['HISTORICAL_ARGO_PREFIX'] = 'ARGO_for_DMQC_2020V03/argo_' -USER_CONFIG['HISTORICAL_CTD_PREFIX'] = 'CTD_for_DMQC_2021V01/ctd_' + +USER_CONFIG["CONFIG_DIRECTORY"] = os.path.abspath("../data/constants") +USER_CONFIG["HISTORICAL_DIRECTORY"] = os.path.abspath( + "/Volumes/OWC/CLIMATOLOGY/" +) # where to find ARGO_for_DMQC_2020V03 and CTD_for_DMQC_2021V01 folders +USER_CONFIG["HISTORICAL_ARGO_PREFIX"] = "ARGO_for_DMQC_2020V03/argo_" +USER_CONFIG["HISTORICAL_CTD_PREFIX"] = "CTD_for_DMQC_2021V01/ctd_" print(owc.configuration.print_cfg(USER_CONFIG)) # Create float source data with argopy: -fetcher_for_real = DataFetcher(src='gdac', cache=True, mode='expert').float(FLOAT_NAME) -fetcher_sample = DataFetcher(src='gdac', cache=True, mode='expert').profile(FLOAT_NAME, [1, - 2]) # To reduce execution time for demo +fetcher_for_real = DataFetcher(src="gdac", cache=True, mode="expert").float(FLOAT_NAME) +fetcher_sample = DataFetcher(src="gdac", cache=True, mode="expert").profile( + FLOAT_NAME, [1, 2] +) # To reduce execution time for demo ds = fetcher_sample.load().data -ds.argo.create_float_source(path=USER_CONFIG['FLOAT_SOURCE_DIRECTORY'], force='default') +ds.argo.create_float_source(path=USER_CONFIG["FLOAT_SOURCE_DIRECTORY"], force="default") # Prepare data for calibration: map salinity on theta levels owc.calibration.update_salinity_mapping("", USER_CONFIG, FLOAT_NAME)