ooi-data-explorations 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ooi_data_explorations-0.2.3/.gitignore +120 -0
- ooi_data_explorations-0.2.3/LICENSE.txt +21 -0
- ooi_data_explorations-0.2.3/PKG-INFO +457 -0
- ooi_data_explorations-0.2.3/README.md +410 -0
- ooi_data_explorations-0.2.3/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/camds/uncabled.ipynb +412 -0
- ooi_data_explorations-0.2.3/examples/ctdbp/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/ctdbp/combine_mooring_ctdbp.py +212 -0
- ooi_data_explorations-0.2.3/examples/ctdbp/recovered_host_ctdbp.py +52 -0
- ooi_data_explorations-0.2.3/examples/ctdbp/recovered_inst_ctdbp.py +51 -0
- ooi_data_explorations-0.2.3/examples/ctdbp/telemetered_ctdbp.py +52 -0
- ooi_data_explorations-0.2.3/examples/ctdpf/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/ctdpf/cspp_ctdpf.py +47 -0
- ooi_data_explorations-0.2.3/examples/dosta/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/dosta/combine_mooring_dosta.py +210 -0
- ooi_data_explorations-0.2.3/examples/dosta/recovered_host_ctdbp_dosta.py +52 -0
- ooi_data_explorations-0.2.3/examples/dosta/recovered_host_solo_dosta.py +52 -0
- ooi_data_explorations-0.2.3/examples/dosta/recovered_inst_ctdbp_dosta.py +52 -0
- ooi_data_explorations-0.2.3/examples/dosta/telemetered_ctdbp_dosta.py +52 -0
- ooi_data_explorations-0.2.3/examples/dosta/telemetered_solo_dosta.py +52 -0
- ooi_data_explorations-0.2.3/examples/flort/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/flort/cabled_profiler_flort.py +39 -0
- ooi_data_explorations-0.2.3/examples/flort/cspp_flort.py +50 -0
- ooi_data_explorations-0.2.3/examples/flort/recovered_host_flort.py +51 -0
- ooi_data_explorations-0.2.3/examples/flort/recovered_inst_flort.py +51 -0
- ooi_data_explorations-0.2.3/examples/flort/telemetered_flort.py +51 -0
- ooi_data_explorations-0.2.3/examples/flort/wfp_flort.py +50 -0
- ooi_data_explorations-0.2.3/examples/metbk/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/metbk/recovered_host_metbk.py +48 -0
- ooi_data_explorations-0.2.3/examples/metbk/telemetered_bulk_flux.py +50 -0
- ooi_data_explorations-0.2.3/examples/metbk/telemetered_metbk.py +50 -0
- ooi_data_explorations-0.2.3/examples/notebooks/dosta/ooiea_cabled_dosta_processing.ipynb +1784 -0
- ooi_data_explorations-0.2.3/examples/notebooks/dosta/ooiea_dosta_annotations_hitl_qc.ipynb +220 -0
- ooi_data_explorations-0.2.3/examples/notebooks/dosta/ooiea_dosta_quality_assessments.ipynb +786 -0
- ooi_data_explorations-0.2.3/examples/notebooks/dosta/ooiea_uncabled_dosta_data.ipynb +368 -0
- ooi_data_explorations-0.2.3/examples/notebooks/fdchp/.gitignore +1 -0
- ooi_data_explorations-0.2.3/examples/notebooks/fdchp/FdchpExample.ipynb +552 -0
- ooi_data_explorations-0.2.3/examples/notebooks/fdchp/ProcessFdchpRaw.ipynb +6235 -0
- ooi_data_explorations-0.2.3/examples/notebooks/ifcb/combining_ifcb_and_environmental.ipynb +1619 -0
- ooi_data_explorations-0.2.3/examples/notebooks/m2m_explorations.ipynb +2313 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/acs137_20210302_pre_deployment_adat.csv +84 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/acs137_20210302_pre_deployment_cdat.csv +84 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/process_kdata_cabled_profiler_ce04osps.ipynb +3863 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/process_kdata_cabled_profiler_rs01sbps.ipynb +3902 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/process_kdata_optaa.ipynb +2283 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/process_thredds_optaa.ipynb +2292 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/process_thredds_optaa_cspp.ipynb +1078 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/processing_workflow_using_the_cspp_optaa.ipynb +5364 -0
- ooi_data_explorations-0.2.3/examples/notebooks/optaa/when_things_go_bad.ipynb +2087 -0
- ooi_data_explorations-0.2.3/examples/notebooks/pco2a/carbonate_climatologies.ipynb +686 -0
- ooi_data_explorations-0.2.3/examples/notebooks/pco2a/regional_pco2_comparisons.png +0 -0
- ooi_data_explorations-0.2.3/examples/notebooks/pco2a/regional_ph_comparisons.png +0 -0
- ooi_data_explorations-0.2.3/examples/notebooks/pco2w/PCO2_Calculations.ipynb +2880 -0
- ooi_data_explorations-0.2.3/examples/notebooks/pco2w/ce01issm_pco2w_C0119_converted_2019-10-31.csv +2357 -0
- ooi_data_explorations-0.2.3/examples/notebooks/phsen/creating_annotations.ipynb +1983 -0
- ooi_data_explorations-0.2.3/examples/nutnr/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/nutnr/cspp_nutnr.py +47 -0
- ooi_data_explorations-0.2.3/examples/nutnr/recovered_host_nutnr.py +52 -0
- ooi_data_explorations-0.2.3/examples/nutnr/recovered_inst_nutnr.py +52 -0
- ooi_data_explorations-0.2.3/examples/nutnr/telemetered_nutnr.py +52 -0
- ooi_data_explorations-0.2.3/examples/optaa/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/optaa/cabled_benthic_optaa.py +48 -0
- ooi_data_explorations-0.2.3/examples/optaa/cabled_profiler_optaa.py +48 -0
- ooi_data_explorations-0.2.3/examples/optaa/cspp_optaa.py +49 -0
- ooi_data_explorations-0.2.3/examples/optaa/recovered_host_optaa.py +49 -0
- ooi_data_explorations-0.2.3/examples/optaa/telemetered_optaa.py +54 -0
- ooi_data_explorations-0.2.3/examples/pco2a/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/pco2a/recovered_host_pco2a.py +59 -0
- ooi_data_explorations-0.2.3/examples/pco2a/telemetered_pco2a.py +57 -0
- ooi_data_explorations-0.2.3/examples/pco2w/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/pco2w/combine_mooring_pco2w.py +195 -0
- ooi_data_explorations-0.2.3/examples/pco2w/recovered_host_pco2w.py +52 -0
- ooi_data_explorations-0.2.3/examples/pco2w/recovered_inst_pco2w.py +51 -0
- ooi_data_explorations-0.2.3/examples/pco2w/streamed_pco2w.py +52 -0
- ooi_data_explorations-0.2.3/examples/pco2w/telemetered_pco2w.py +52 -0
- ooi_data_explorations-0.2.3/examples/phsen/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/phsen/combine_mooring_phsen.py +180 -0
- ooi_data_explorations-0.2.3/examples/phsen/imodem_phsen.py +51 -0
- ooi_data_explorations-0.2.3/examples/phsen/recovered_host_phsen.py +52 -0
- ooi_data_explorations-0.2.3/examples/phsen/recovered_inst_phsen.py +51 -0
- ooi_data_explorations-0.2.3/examples/phsen/streamed_phsen.py +52 -0
- ooi_data_explorations-0.2.3/examples/phsen/telemetered_phsen.py +52 -0
- ooi_data_explorations-0.2.3/examples/spkir/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/spkir/cspp_spkir.py +47 -0
- ooi_data_explorations-0.2.3/examples/spkir/recovered_host_spkir.py +47 -0
- ooi_data_explorations-0.2.3/examples/spkir/telemetered_spkir.py +45 -0
- ooi_data_explorations-0.2.3/examples/tensorflow/sealion_detection_example.ipynb +708 -0
- ooi_data_explorations-0.2.3/examples/tensorflow/sealion_training_example.ipynb +371 -0
- ooi_data_explorations-0.2.3/examples/vel3d/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/vel3d/recovered_host_vel3d.py +48 -0
- ooi_data_explorations-0.2.3/examples/vel3d/recovered_wfp_vel3d.py +42 -0
- ooi_data_explorations-0.2.3/examples/vel3d/telemetered_vel3d.py +47 -0
- ooi_data_explorations-0.2.3/examples/vel3d/telemetered_wfp_vel3d.py +42 -0
- ooi_data_explorations-0.2.3/examples/velpt/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/velpt/cspp_velpt.py +47 -0
- ooi_data_explorations-0.2.3/examples/velpt/recovered_host_velpt.py +45 -0
- ooi_data_explorations-0.2.3/examples/velpt/recovered_inst_velpt.py +39 -0
- ooi_data_explorations-0.2.3/examples/velpt/telemetered_velpt.py +45 -0
- ooi_data_explorations-0.2.3/examples/water_quality/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/water_quality/wqx_ctdbp.py +147 -0
- ooi_data_explorations-0.2.3/examples/water_quality/wqx_dosta.py +145 -0
- ooi_data_explorations-0.2.3/examples/water_quality/wqx_flort.py +158 -0
- ooi_data_explorations-0.2.3/examples/water_quality/wqx_nutnr.py +146 -0
- ooi_data_explorations-0.2.3/examples/water_quality/wqx_phsen.py +144 -0
- ooi_data_explorations-0.2.3/examples/wavss/__init__.py +0 -0
- ooi_data_explorations-0.2.3/examples/wavss/recovered_host_wavss_directional.py +38 -0
- ooi_data_explorations-0.2.3/examples/wavss/recovered_host_wavss_summary.py +37 -0
- ooi_data_explorations-0.2.3/examples/wavss/telemetered_wavss_directional.py +42 -0
- ooi_data_explorations-0.2.3/examples/wavss/telemetered_wavss_summary.py +42 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/__init__.py +7 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/bottles.py +264 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/cabled/__init__.py +0 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/cabled/process_flort.py +157 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/cabled/process_optaa.py +531 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/cabled/process_phsen.py +176 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/calibrations.py +64 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/combine_data.py +238 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/common.py +1381 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/construct_urls.py +210 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/data_request.py +272 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/m2m_urls.yml +12186 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/profilers.py +296 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/__init__.py +0 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/CTDBP.ipynb +2878 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/CTDMO.ipynb +2894 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/CTDPF.ipynb +1129 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/DOSTA.ipynb +1156 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/FLORD.ipynb +1267 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/FLORT.ipynb +1320 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/METBK.ipynb +1299 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/NUTNR.ipynb +1550 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/PAR.ipynb +1101 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/PCO2A.ipynb +1069 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/PCO2W.ipynb +1090 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/PHSEN.ipynb +1099 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/WAVSS.ipynb +1301 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/cgsn/scripts/wavss_sensor_ranges.yaml +41 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/climatology.py +211 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/discrete_samples.py +196 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/__init__.py +0 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_ctdbp.py +205 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_ctdpf.py +195 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_dofst.py +199 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_dosta.py +271 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_flort.py +324 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_gliders.py +135 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_metbk.py +258 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_nutnr.py +287 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_parad.py +209 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_pco2a.py +218 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_pco2w.py +166 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_phsen.py +194 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_presf.py +193 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_spkir.py +231 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_vel3d.py +298 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_velpt.py +239 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/qartod_ce_wavss.py +187 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/reports/__init__.py +0 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/reports/reports_ce_ctdbp.py +397 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/reports/reports_ce_nutnr.py +395 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/endurance/reports/reports_ce_phsen.py +406 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/gross_range.py +281 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/plotting.py +145 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/qc_processing.py +668 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/rca/decimate.py +211 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/rca/parameterMap.csv +13 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/rca/qartodTests.csv +3 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/rca/qartod_rca.py +344 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/rca/siteParameters.csv +41 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/reporting.py +92 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/qartod/table_checker.py +270 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/__init__.py +0 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/ooim2m_cspp.py +280 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_adcp.py +452 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_ctdbp.py +216 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_ctdpf.py +144 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_dofst.py +215 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_dosta.py +547 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_fdchp.py +1141 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_flord.py +306 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_flort.py +607 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_metbk.py +384 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_mopak.py +1621 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_nutnr.py +835 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_optaa.py +843 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_parad.py +259 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_pco2a.py +289 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_pco2w.py +491 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_phsen.py +595 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_spkir.py +394 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_turbd.py +99 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_vel3d.py +1347 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_velpt.py +521 -0
- ooi_data_explorations-0.2.3/ooi_data_explorations/uncabled/process_wavss.py +540 -0
- ooi_data_explorations-0.2.3/pyproject.toml +115 -0
- ooi_data_explorations-0.2.3/setup.py +59 -0
- ooi_data_explorations-0.2.3/version.py +1 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# specific repo ignores
|
|
2
|
+
config.yaml
|
|
3
|
+
|
|
4
|
+
# Byte-compiled / optimized / DLL files
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*$py.class
|
|
8
|
+
|
|
9
|
+
# C extensions
|
|
10
|
+
*.so
|
|
11
|
+
|
|
12
|
+
# Distribution / packaging
|
|
13
|
+
.Python
|
|
14
|
+
build/
|
|
15
|
+
develop-eggs/
|
|
16
|
+
dist/
|
|
17
|
+
downloads/
|
|
18
|
+
eggs/
|
|
19
|
+
.eggs/
|
|
20
|
+
lib/
|
|
21
|
+
lib64/
|
|
22
|
+
parts/
|
|
23
|
+
sdist/
|
|
24
|
+
var/
|
|
25
|
+
wheels/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
.installed.cfg
|
|
28
|
+
*.egg
|
|
29
|
+
MANIFEST
|
|
30
|
+
config.yaml
|
|
31
|
+
|
|
32
|
+
# PyInstaller
|
|
33
|
+
# Usually these files are written by a python script from a template
|
|
34
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
35
|
+
*.manifest
|
|
36
|
+
*.spec
|
|
37
|
+
|
|
38
|
+
# Installer logs
|
|
39
|
+
pip-log.txt
|
|
40
|
+
pip-delete-this-directory.txt
|
|
41
|
+
|
|
42
|
+
# Unit test / coverage reports
|
|
43
|
+
htmlcov/
|
|
44
|
+
.tox/
|
|
45
|
+
.coverage
|
|
46
|
+
.coverage.*
|
|
47
|
+
.cache
|
|
48
|
+
nosetests.xml
|
|
49
|
+
coverage.xml
|
|
50
|
+
*.cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
|
|
63
|
+
# Flask stuff:
|
|
64
|
+
instance/
|
|
65
|
+
.webassets-cache
|
|
66
|
+
|
|
67
|
+
# Scrapy stuff:
|
|
68
|
+
.scrapy
|
|
69
|
+
|
|
70
|
+
# Sphinx documentation
|
|
71
|
+
docs/_build/
|
|
72
|
+
|
|
73
|
+
# PyBuilder
|
|
74
|
+
target/
|
|
75
|
+
|
|
76
|
+
# Jupyter Notebook
|
|
77
|
+
.ipynb_checkpoints
|
|
78
|
+
|
|
79
|
+
# pyenv
|
|
80
|
+
.python-version
|
|
81
|
+
|
|
82
|
+
# celery beat schedule file
|
|
83
|
+
celerybeat-schedule
|
|
84
|
+
|
|
85
|
+
# SageMath parsed files
|
|
86
|
+
*.sage.py
|
|
87
|
+
|
|
88
|
+
# Environments
|
|
89
|
+
.env
|
|
90
|
+
.venv
|
|
91
|
+
env/
|
|
92
|
+
venv/
|
|
93
|
+
ENV/
|
|
94
|
+
env.bak/
|
|
95
|
+
venv.bak/
|
|
96
|
+
|
|
97
|
+
# Spyder project settings
|
|
98
|
+
.spyderproject
|
|
99
|
+
.spyproject
|
|
100
|
+
|
|
101
|
+
# Pycharm project settings
|
|
102
|
+
.idea/
|
|
103
|
+
|
|
104
|
+
# Rope project settings
|
|
105
|
+
.ropeproject
|
|
106
|
+
|
|
107
|
+
# mkdocs documentation
|
|
108
|
+
/site
|
|
109
|
+
|
|
110
|
+
# mypy
|
|
111
|
+
.mypy_cache/
|
|
112
|
+
|
|
113
|
+
# R
|
|
114
|
+
.Rhistory
|
|
115
|
+
|
|
116
|
+
# Custom
|
|
117
|
+
*.jpg
|
|
118
|
+
*.mp4
|
|
119
|
+
|
|
120
|
+
*_build/*
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) [year] [fullname]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ooi_data_explorations
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: Tools for interacting with OOI data, including downloading, cleaning, and visualizing.
|
|
5
|
+
Author-email: Christopher Wingard <chris.wingard@oregonstate.edu>, Andrew Reed <areed@whoi.edu>, Joffrey Peters <joffreyp@gmail.com>
|
|
6
|
+
Maintainer-email: Christopher Wingard <chris.wingard@oregonstate.edu>, Andrew Reed <areed@whoi.edu>, Joffrey Peters <joffreyp@gmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE.txt
|
|
9
|
+
Keywords: Ocean Observatories Initiative,URL parameters,jupyter_server
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Framework :: Jupyter
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
16
|
+
Classifier: Programming Language :: Python
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Requires-Python: >=3.9
|
|
24
|
+
Requires-Dist: beautifulsoup4
|
|
25
|
+
Requires-Dist: dask
|
|
26
|
+
Requires-Dist: gsw
|
|
27
|
+
Requires-Dist: h5netcdf
|
|
28
|
+
Requires-Dist: matplotlib
|
|
29
|
+
Requires-Dist: munch
|
|
30
|
+
Requires-Dist: netcdf4
|
|
31
|
+
Requires-Dist: ntplib
|
|
32
|
+
Requires-Dist: numpy
|
|
33
|
+
Requires-Dist: pandas
|
|
34
|
+
Requires-Dist: pyyaml
|
|
35
|
+
Requires-Dist: requests
|
|
36
|
+
Requires-Dist: tqdm
|
|
37
|
+
Requires-Dist: urllib3
|
|
38
|
+
Requires-Dist: xarray[accel]
|
|
39
|
+
Provides-Extra: dev
|
|
40
|
+
Requires-Dist: build; extra == 'dev'
|
|
41
|
+
Requires-Dist: hatch; extra == 'dev'
|
|
42
|
+
Requires-Dist: ipykernel; extra == 'dev'
|
|
43
|
+
Requires-Dist: pre-commit; extra == 'dev'
|
|
44
|
+
Requires-Dist: requests; extra == 'dev'
|
|
45
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# OOI Data Explorations with Python
|
|
49
|
+
|
|
50
|
+
## Overview
|
|
51
|
+
|
|
52
|
+
The python code provided here was developed primarily as a toolset for the OOI Data Team to
|
|
53
|
+
facilitate accessing data from OOINet for the QC reviews, gap analyses, metadata checks, etc. that OOI performs to quality check its datasets.
|
|
54
|
+
This code is provided to the larger community in the hopes that it will be of use. The code
|
|
55
|
+
uses several methods to access data:
|
|
56
|
+
* [OOI M2M API](https://oceanobservatories.org/ooi-m2m-interface/)
|
|
57
|
+
* [OOI THREDDS Data Server](https://thredds.dataexplorer.oceanobservatories.org/thredds/catalog/ooigoldcopy/public/catalog.html)
|
|
58
|
+
* [JupyterHub-mounted NetCDF store](`/home/jovyan/ooi/kdata` from an OOI JupyterHub session)
|
|
59
|
+
|
|
60
|
+
Datasets are loaded into the user workspace as an [xarray](http://xarray.pydata.org/en/stable/) dataset, or saved to disk as a NetCDF filein different examples.
|
|
61
|
+
There are instructions below of how to setup and use the package, with several example notebooks
|
|
62
|
+
and scripts available in the examples directory.
|
|
63
|
+
|
|
64
|
+
If you have any comments, questions or issues, please don't hesitate to
|
|
65
|
+
[open an issue]((https://github.com/oceanobservatories/ooi-data-explorations/issues)).
|
|
66
|
+
|
|
67
|
+
## Table of Contents
|
|
68
|
+
|
|
69
|
+
* [Installation](#installation)
|
|
70
|
+
* [Download and Install OOI Data Explorations](#obtaining-the-code-and-configuring-the-environment)
|
|
71
|
+
* [Setup Access Credentials](#access-credentials)
|
|
72
|
+
* [Installing Bash, Git and Python](#configuring-system-for-python-install-bash-git-and-anacondaminiconda)
|
|
73
|
+
* [Usage](#usage)
|
|
74
|
+
* [M2M Terminology](#m2m-terminology)
|
|
75
|
+
* [Requesting As-Is (Mostly) Data](#requesting-as-is-mostly-data)
|
|
76
|
+
* [Simplifying the As-Is Requests](#simplifying-the-as-is-requests)
|
|
77
|
+
* [YAML Structure](#yaml-structure)
|
|
78
|
+
* [Simplified Request](#simplified-request)
|
|
79
|
+
* [Additional Utilities](#additional-utilities)
|
|
80
|
+
* [Requesting Processed Data](#requesting-processed-data)
|
|
81
|
+
* [QARTOD Workflows](#qartod-workflows)
|
|
82
|
+
|
|
83
|
+
## Installation
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
### Obtaining the Code and Configuring the Environment
|
|
88
|
+
|
|
89
|
+
If you do not have python installed, read about [Installing Bash, Git and Python](#configuring-system-for-python-install-bash-git-and-anaconda-miniconda) below before following these instructions to use this code repository.
|
|
90
|
+
|
|
91
|
+
This section describes getting a copy the python code, setting up a virtual environment, and installing this module for use in that environment.
|
|
92
|
+
|
|
93
|
+
Clone the `ooi-data-explorations` code to your local machine:
|
|
94
|
+
|
|
95
|
+
```shell
|
|
96
|
+
# download the ooi-data-explorations code
|
|
97
|
+
git clone https://github.com/oceanobservatories/ooi-data-explorations.git
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
What follows are two ways to set up a code environment to run `ooi-data-explorations` examples and use the python code base using either `conda` or `pip` as the package manager.
|
|
101
|
+
|
|
102
|
+
#### Create conda environment
|
|
103
|
+
If you prefer to use the `conda` package manager, follow this section to set up the `ooi` environment which has the dependencies needed to run the `ooi-data-explorer` python code and example notebooks.
|
|
104
|
+
``` shell
|
|
105
|
+
# configure the OOI python environment
|
|
106
|
+
cd ooi-data-explorations/python
|
|
107
|
+
conda env create -f environment.yml
|
|
108
|
+
conda init # might be required for windows users if environment is not active
|
|
109
|
+
conda activate ooi
|
|
110
|
+
|
|
111
|
+
# install the package as a local development package
|
|
112
|
+
conda develop .
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### Create a pip environment
|
|
116
|
+
If you prefer to use the `pip` package manager, follow this section to set up the `ooi` environment which has the dependencies needed to run the `ooi-data-explorer` python code and example notebooks.
|
|
117
|
+
|
|
118
|
+
```shell
|
|
119
|
+
cd ooi-data-explorations/python
|
|
120
|
+
python -m venv venv
|
|
121
|
+
source venv/bin/activate
|
|
122
|
+
pip install -r requirements.txt
|
|
123
|
+
pip install -e .
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### Ensure the python environment is available in JupyterHub
|
|
127
|
+
If using this code in a JupyterHub environment, an additional step will be needed to ensure the environment is available for running in a JupyterHub kernel.
|
|
128
|
+
If using a pip environment, a couple of additional dependencies are required. Install them with pip:
|
|
129
|
+
|
|
130
|
+
```shell
|
|
131
|
+
pip install ipykernel ipympl
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
For either the conda or pip environments, the environment must be added to a list of available kernels using the following command:
|
|
135
|
+
|
|
136
|
+
```shell
|
|
137
|
+
python -m ipykernel install --user --name=ooi
|
|
138
|
+
```
|
|
139
|
+
Now the `ooi` kernel should be listed as available when running a Jupyter Notebook.
|
|
140
|
+
|
|
141
|
+
### Access Credentials
|
|
142
|
+
|
|
143
|
+
Access credentials are required to download data from OOINet via the M2M interface. Directions on how to obtain
|
|
144
|
+
these, in addition to details about the M2M system, are [available on the OOI website](https://oceanobservatories.org/ooi-m2m-interface/).
|
|
145
|
+
|
|
146
|
+
* If you haven't already done so, either create a user account on the [OOI Data Portal](https://ooinet.oceanobservatories.org),
|
|
147
|
+
or use the CILogon button with an academic or Google account (login button is towards the upper right corner of the
|
|
148
|
+
web page) to login to the portal.
|
|
149
|
+
* Navigate to the drop down menu screen in the top-right corner of the menu bar
|
|
150
|
+
* Click on the "User Profile" element of the drop down.
|
|
151
|
+
* Copy and save the following data from the user profile: API Username and API Token.
|
|
152
|
+
|
|
153
|
+
The python code uses the [netrc](https://docs.python.org/3.6/library/netrc.html) utility to obtain your access
|
|
154
|
+
credentials. Users need to create a `.netrc` file in their home directory to store these access credentials. Using
|
|
155
|
+
either a text editor or the bash terminal, create the `.netrc` file (replacing the `<API Username>` and `<API Token>`
|
|
156
|
+
in the example below with the corresponding values from your login credentials for the [OOI Data Portal](https://ooinet.oceanobservatories.org)):
|
|
157
|
+
|
|
158
|
+
```shell script
|
|
159
|
+
cd ~
|
|
160
|
+
touch .netrc
|
|
161
|
+
chmod 600 .netrc
|
|
162
|
+
cat <<EOT >> .netrc
|
|
163
|
+
machine ooinet.oceanobservatories.org
|
|
164
|
+
login <API Username>
|
|
165
|
+
password <API Token>
|
|
166
|
+
EOT
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Configuring System for Python (Install Bash, Git and Anaconda/Miniconda)
|
|
170
|
+
|
|
171
|
+
If you already have python installed or are using the OOI JupyterHub, you can skip this section, as the required tools are already available.
|
|
172
|
+
|
|
173
|
+
In order to use the python code in this repository, you will need to set up the proper tools. There
|
|
174
|
+
are several examples on how to this, so I'll avoid reinventing the wheel here. One of the best
|
|
175
|
+
tutorials I've found has been developed by the folks at [Earth Lab](https://www.earthdatascience.org/). The
|
|
176
|
+
[tutorial](https://www.earthdatascience.org/workshops/setup-earth-analytics-python/setup-git-bash-conda/) they have
|
|
177
|
+
prepared will guide you through the process of setting up a system to use Python for Earth Science analysis from start
|
|
178
|
+
to finish, regardless of your computer's operating system. Experienced users can easily skip and skim through to the
|
|
179
|
+
sections relevant to them.
|
|
180
|
+
|
|
181
|
+
One key difference between the tutorial and my personal preference is to use the full [Anaconda](https://www.anaconda.com)
|
|
182
|
+
installation instead of [Miniconda](https://docs.conda.io/en/latest/miniconda.html) as called out in the tutorial. All
|
|
183
|
+
the tools you would need, and then some, are installed with Anaconda. You can follow the tutorial exactly as written
|
|
184
|
+
and all of the code in this project will work, but I recommend using Anaconda instead of Miniconda. There are several
|
|
185
|
+
other packages and tools provided by Anaconda that you may end up wanting to work with.
|
|
186
|
+
|
|
187
|
+
Additionally, you do not need to install Bash or Git for the code to work. You can
|
|
188
|
+
[directly download the code](https://github.com/oceanobservatories/ooi-data-explorations/archive/master.zip) instead of
|
|
189
|
+
using Git, use a text editor to [setup your access credentials](#access-credentials), and/or use the Anaconda Prompt or
|
|
190
|
+
a terminal of your choice instead of following the examples given below. I am trying to be OS independent, thus the
|
|
191
|
+
examples below assume you are using some form of bash (Git Bash if you followed the tutorial from above). Adjust as you
|
|
192
|
+
need and see fit.
|
|
193
|
+
|
|
194
|
+
Note, for Windows users only and assuming you are using Git Bash, if you already have Anaconda/Miniconda installed on
|
|
195
|
+
your machine, you do not need to uninstall/reinstall as described in the
|
|
196
|
+
[tutorial](https://www.earthdatascience.org/workshops/setup-earth-analytics-python/setup-git-bash-conda/).
|
|
197
|
+
You can leave everything as-is. However, you do need to link Git Bash to Anaconda (or Miniconda); this happens
|
|
198
|
+
automagically if you follow the sequence in the tutorial by installing Git Bash before Anaconda. If you already have
|
|
199
|
+
Anaconda installed, however, from the bash terminal add the following code to the `.bash_profile` file in your home
|
|
200
|
+
directory (assuming you installed Anaconda in your home directory, which is the default):
|
|
201
|
+
|
|
202
|
+
```shell script
|
|
203
|
+
cd ~
|
|
204
|
+
echo ". ${HOME}/Anaconda3/etc/profile.d/conda.sh" >> ~/.bash_profile
|
|
205
|
+
source .bash_profile
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Usage
|
|
209
|
+
|
|
210
|
+
The code is available in the [ooi_data_explorations](ooi_data_explorations) directory with examples (both scripts
|
|
211
|
+
and notebooks) in the [examples](examples) directory. The python code has been developed and used with Python 3.6+
|
|
212
|
+
on Windows and Linux machines. The functions are configured in a granular fashion to allow users to access the
|
|
213
|
+
data in a few different ways.
|
|
214
|
+
|
|
215
|
+
### M2M Terminology
|
|
216
|
+
|
|
217
|
+
Before using these functions, it is important to understand how requests to the
|
|
218
|
+
[OOI M2M API](https://oceanobservatories.org/ooi-m2m-interface/) are structured. A request is built around the
|
|
219
|
+
reference designator (comprised of the site, node, and sensor names), the data delivery method, and data stream (think
|
|
220
|
+
of a stream as a dataset). Beginning and ending dates for the time period of interest are optional inputs. If omitted,
|
|
221
|
+
all of the data for a particular instrument of interest will be downloaded.
|
|
222
|
+
|
|
223
|
+
* Site -- 8 character uppercase string denoting the array and location within the array of the system. These are
|
|
224
|
+
[defined](https://oceanobservatories.org/research-arrays/) on the OOI website.
|
|
225
|
+
* Node -- 5 character uppercase string (of which the first 2 characters are really the key) denoting the assembly the
|
|
226
|
+
instrument is connected to/mounted on. These can be thought of as physical locations within/under the higher level site
|
|
227
|
+
designator.
|
|
228
|
+
* Sensor -- 12 character uppercase string that indicates, among other things, the instrument class and series. The
|
|
229
|
+
instrument class and series are [defined](https://oceanobservatories.org/instruments/) on the OOI website.
|
|
230
|
+
* Delivery Method -- Method of data delivery (lowercase).
|
|
231
|
+
* `streamed` -- Real-time data delivery method for all cabled assets. Data is "streamed" to shore over the fiber
|
|
232
|
+
optic network as it outputs from an instrument.
|
|
233
|
+
* `telemetered` -- Near real-time data delivery method for most uncabled assets. Data is recorded remotely
|
|
234
|
+
by a data logger system and delivered in batches over a satellite or cellular network link on a recurring schedule
|
|
235
|
+
(e.g every 2 hours).
|
|
236
|
+
* `recovered_host` -- Usually the same data set as telemetered for uncabled assets. Key difference is this data is
|
|
237
|
+
downloaded from the data logger system after the asset is recovered. In most cases, this is 1:1 with the
|
|
238
|
+
telemetered data unless there was an issue with telemetry during the deployment or the data was decimated
|
|
239
|
+
(temporal and/or # of parameters) by the data logger system prior to transmission.
|
|
240
|
+
* `recovered_inst` -- Data recorded on and downloaded directly from an individual instrument after the instrument is
|
|
241
|
+
recovered. Not all instruments internally record data, so this method will not be available for all instruments.
|
|
242
|
+
* `recovered_wfp` -- Data recorded on and downloaded from the McLane Moored Profiler system used at several sites
|
|
243
|
+
in OOI. Telemetered data is decimated, this data set represents the full-resolution data.
|
|
244
|
+
* `recovered_cspp` -- Data recorded on and downloaded from the Coastal Surface Piercing Profiler system used in
|
|
245
|
+
the Endurance array. Telemetered data is decimated, this data set represents the full-resolution data.
|
|
246
|
+
* Stream -- A collection of parameters output by an instrument or read from a file, and parsed into a named data set.
|
|
247
|
+
Stream names are all lowercase. Streams are mostly associated with the data delivery methods and there may be more than
|
|
248
|
+
one stream per method.
|
|
249
|
+
|
|
250
|
+
### Requesting As-Is (Mostly) Data
|
|
251
|
+
|
|
252
|
+
The core functions used to request and download data are `m2m_request` and `m2m_collect`, located in the
|
|
253
|
+
[`common.py`](ooi_data_explorations/common.py) module. From those two functions, you can pretty much create your own
|
|
254
|
+
library of functions to download and process whatever data you want from the system and either save it locally or
|
|
255
|
+
continue to work on it within your python environment. It is important to note, these functions require inputs that
|
|
256
|
+
map directly to those required by the [OOI M2M API](https://oceanobservatories.org/ooi-m2m-interface/).
|
|
257
|
+
|
|
258
|
+
The data requested and downloaded by the `m2m_request` and `m2m_collect` functions is somewhat modified from the
|
|
259
|
+
original: I switch the dimensions from `obs` to `time`, drop certain timing variables that were originally never meant
|
|
260
|
+
to be exposed to the user, and clean up some basic metadata attributes. Beyond that, the data is provided as-is. No
|
|
261
|
+
effort is made to select a subset of the variables, conduct QC, clean up the variable names, or in any other way alter
|
|
262
|
+
the data obtained from the [OOI Data Portal](https://ooinet.oceanobservatories.org). For example:
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
import os
|
|
266
|
+
from ooi_data_explorations.common import m2m_request, m2m_collect
|
|
267
|
+
|
|
268
|
+
# Setup the needed information to request data from the pH sensor on the Oregon
|
|
269
|
+
# Shelf Surface Mooring near-surface (7 m depth) instrument frame (NSIF).
|
|
270
|
+
site = 'CE02SHSM' # OOI Net site designator
|
|
271
|
+
node = 'RID26' # OOI Net node designator
|
|
272
|
+
sensor = '06-PHSEND000' # OOI Net sensor designator
|
|
273
|
+
method = 'telemetered' # OOI Net data delivery method
|
|
274
|
+
stream = 'phsen_abcdef_dcl_instrument' # OOI Net stream name
|
|
275
|
+
start = '2019-04-01T00:00:00.000Z' # data for spring 2019 ...
|
|
276
|
+
stop = '2019-09-30T23:59:59.999Z' # ... through the beginning of fall
|
|
277
|
+
|
|
278
|
+
# Request the data (this may take some time).
|
|
279
|
+
r = m2m_request(site, node, sensor, method, stream, start, stop)
|
|
280
|
+
|
|
281
|
+
# Use a regex tag to download only the pH sensor data from the THREDDS catalog
|
|
282
|
+
# created by our request.
|
|
283
|
+
tag = '.*PHSEN.*\\.nc$'
|
|
284
|
+
data = m2m_collect(r, tag)
|
|
285
|
+
|
|
286
|
+
# Save the data to the users home directory under a folder called ooidata for
|
|
287
|
+
# further processing
|
|
288
|
+
out_path = os.path.join(os.path.expanduser('~'), 'ooidata')
|
|
289
|
+
out_path = os.path.abspath(out_path)
|
|
290
|
+
if not os.path.exists(out_path):
|
|
291
|
+
os.makedirs(out_path)
|
|
292
|
+
|
|
293
|
+
# setup the output file
|
|
294
|
+
out_file = ('%s.%s.%s.%s.%s.nc' % (site, node, sensor, method, stream))
|
|
295
|
+
nc_out = os.path.join(out_path, out_file)
|
|
296
|
+
|
|
297
|
+
# save the data to disk
|
|
298
|
+
data.to_netcdf(nc_out, mode='w', format='NETCDF4', engine='h5netcdf')
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
The example above will request data from the pH sensor (PHSEN) on the Oregon Shelf Surface Mooring (CE02SHSM)
|
|
302
|
+
near-surface (7 m depth) instrument frame (NSIF) via `m2m_request`. The requested data is gathered by the system in a
|
|
303
|
+
THREDDS catalog specific to the user and the request. One or more NetCDF files with the requested data will be in the
|
|
304
|
+
catalog. The second function, `m2m_collect`, will load the content of those files into an xarray dataset. A key input to
|
|
305
|
+
`m2m_collect` is the regex tag used to select the files to load. In most cases, a user could use `'.*\\.nc$'` as the
|
|
306
|
+
tag, downloading all available NetCDF files. In some cases, however, the tag used needs to be more selective. If an
|
|
307
|
+
instrument requires data from a co-located sensor, those NetCDF files will be present as well. Part of the process in
|
|
308
|
+
collecting the requested data is concatenating the downloaded data into a single xarray dataset. That will fail if the
|
|
309
|
+
individual data files contain different variables. In the above example, the pH sensor requires salinity data from a
|
|
310
|
+
co-located CTD. Both pH sensor and CTD NetCDF files will be present in the THREDDS catalog. The tag `'.*PHSEN.*\\.nc$'`
|
|
311
|
+
is used to select only the pH sensor data.
|
|
312
|
+
|
|
313
|
+
### Simplifying the As-Is Requests
|
|
314
|
+
|
|
315
|
+
Users really only need to use `m2m_request` and `m2m_collect` for the data requests. However, the user needs to
|
|
316
|
+
explicitly know all of the details (e.g. correct regex tag) and terms from above. Outside of OOI (and even inside of
|
|
317
|
+
OOI), the terminology used for sites, nodes, sensors, methods, and streams can be intimidating and confusing. In an
|
|
318
|
+
attempt to clean up some of that terminology, limit the need for the user to learn all of the OOI lingo, and to align
|
|
319
|
+
with some of the functionality in the Matlab and R utilities, I've organized a subset of all of the sources of OOI data
|
|
320
|
+
into a [YAML structure](ooi_data_explorations/m2m_urls.yml) that users can query using a simpler set of terms as part of
|
|
321
|
+
a data request. The YAML structure removes from consideration all so-called engineering sensors and instruments that
|
|
322
|
+
cannot be accessed through the API (e.g. cameras or bio-accoustic sonar), as well as most of the non-science streams
|
|
323
|
+
(engineering or metadata streams). The idea is to cover the most common needs, rather than all possible cases. Users can
|
|
324
|
+
still access any data set desired, but they need to use the [method from above](#requesting-as-is-mostly-data) to
|
|
325
|
+
explicitly call any stream not represented in the YAML structure.
|
|
326
|
+
|
|
327
|
+
#### YAML Structure
|
|
328
|
+
|
|
329
|
+
The YAML structure I've created uses the OOI site codes as-is. It simplifies the node designation by taking the 100+
|
|
330
|
+
nodes and groups them according to an assembly type indicating where co-located sensors can be found. There are 6
|
|
331
|
+
assembly types with differing numbers of subassemblies (see table below). Either the assembly or subassembly name can
|
|
332
|
+
be used to request the data.
|
|
333
|
+
|
|
334
|
+
| Assembly | Subassembly | Description |
|
|
335
|
+
| --- | --- | --- |
|
|
336
|
+
| buoy | n/a | Surface buoys with meteorological, wave, and/or sea surface (~1 m depth) instrumentation |
|
|
337
|
+
| midwater | nsif, riser, sphere, 200m_platform | Platforms located at various depths below the sea surface and above the seafloor |
|
|
338
|
+
| seafloor |mfn, bep, low-pwr-jbox, medium-pwr-jbox| Platforms resting directly on the seafloor |
|
|
339
|
+
| profiler | cspp, coastal-wfp, global-wfp, shallow-profiler, deep-profiler | Profiling systems with integrated instrumentation |
|
|
340
|
+
| glider | coastal-glider, global-glider, profiling-glider | Autonomous, buoyancy driven underwater vehicles with integrated instrumentation |
|
|
341
|
+
| auv | n/a | Autonomous underwater vehicles, currently only deployed in the Pioneer Array |
|
|
342
|
+
|
|
343
|
+
The shorter OOI instrument class name is used instead of the full sensor designator. The data delivery methods are as
|
|
344
|
+
defined above and are used to determine the stream(s) available. There is usually just one. In the few cases where
|
|
345
|
+
there is more than one, the code defaults to selecting the first. I've curated the list to make sure this is the stream
|
|
346
|
+
of interest to 99.9% of users. The key utility here is users do not have to know the stream name. You can still get at
|
|
347
|
+
the other streams, if needed, but you have to explicitly know what they are and call them as shown in example above.
|
|
348
|
+
|
|
349
|
+
The last things to consider are the date ranges to bound the request and an aggregation value. Date ranges are fairly
|
|
350
|
+
self-explanatory. You need to select a starting and ending date for the data of interest, otherwise you will get all of
|
|
351
|
+
the data for that instrument. That could potentially be a large request, so be careful. The dates entered need to be
|
|
352
|
+
recognizable as such. I'm using the [dateutil parser function](https://dateutil.readthedocs.io/en/stable/parser.html) to
|
|
353
|
+
convert the dates you enter into the proper form for the M2M API. Alternatively, you can use the deployment number and
|
|
354
|
+
the M2M API will determine the dates.
|
|
355
|
+
|
|
356
|
+
The aggregation value addresses a few cases where more than one instance of an instrument class is associated with
|
|
357
|
+
an assembly. For example the Global surface moorings have a midwater chain of 10 CTDs connected to an inductive modem
|
|
358
|
+
line. If you do not specify the aggregation flag, you will only get the first of those 10 CTDs. If, however, you set the
|
|
359
|
+
aggregation flag to `0`, you will get all of them in a data set with a variable added called `sensor_count`, so you can
|
|
360
|
+
distinguish between them. Conversely, you can request a specific instrument by using its sequential number.
|
|
361
|
+
|
|
362
|
+
#### Simplified Request
|
|
363
|
+
|
|
364
|
+
At the end of the day, users need to know the site, assembly, instrument class and data delivery method. Somewhat
|
|
365
|
+
simpler than the full site, node, sensor, method, and stream name, and hopefully more meaningful. Additionally, any
|
|
366
|
+
date/time string format, so long as it can be recognized by the
|
|
367
|
+
[dateutil parser function](https://dateutil.readthedocs.io/en/stable/parser.html), will work for setting starting and
|
|
368
|
+
ending dates for the data requests as opposed to explicitly setting the date to a format of `YYYY-MM-DDThh:mm:ss.fffZ`.
|
|
369
|
+
Or, you can just use the deployment number and let the system figure out the dates. Take a look at the examples below:
|
|
370
|
+
|
|
371
|
+
```python
|
|
372
|
+
from ooi_data_explorations.data_request import data_request
|
|
373
|
+
|
|
374
|
+
# Setup the needed information to request data from the pH sensor on the Oregon
|
|
375
|
+
# Shelf Surface Mooring near-surface (7 m depth) instrument frame (NSIF).
|
|
376
|
+
site = 'ce02shsm' # OOI site designator
|
|
377
|
+
assembly = 'midwater' # Assembly grouping name
|
|
378
|
+
instrument = 'phsen' # OOI instrument class
|
|
379
|
+
method = 'telemetered' # data delivery method
|
|
380
|
+
|
|
381
|
+
# the first four inputs are required in the order given above, the following
|
|
382
|
+
# inputs are semi optional, You need to specify at least a start date and/or
|
|
383
|
+
# stop date, or use the deployment number
|
|
384
|
+
start = '2019-04-01' # data for April 2019 ...
|
|
385
|
+
stop = '2019-05-30' # ... through May 2019
|
|
386
|
+
deploy = 9 # The Spring 2019 deployment number
|
|
387
|
+
|
|
388
|
+
# request and download the data using specific dates
|
|
389
|
+
data_01 = data_request(site, assembly, instrument, method, start=start, stop=stop)
|
|
390
|
+
|
|
391
|
+
# request and download the data using the deployment number
|
|
392
|
+
data_02 = data_request(site, assembly, instrument, method, deploy=deploy)
|
|
393
|
+
|
|
394
|
+
# Setup the needed information to request data from the CTDMO sensor on the
|
|
395
|
+
# Global Irminger Surface Mooring inductive modem line.
|
|
396
|
+
site = 'gi01sumo' # OOI site designator
|
|
397
|
+
assembly = 'riser' # Subassembly grouping name
|
|
398
|
+
instrument = 'ctdmo' # OOI instrument class
|
|
399
|
+
method = 'recovered_inst' # data delivery method
|
|
400
|
+
|
|
401
|
+
start = '2019-04-01' # data for April 2019 ...
|
|
402
|
+
stop = '2019-05-30' # ... through May 2019
|
|
403
|
+
|
|
404
|
+
# request and download the data using specific dates, this only returns the
|
|
405
|
+
# first instance of the CTDMOs
|
|
406
|
+
data_03 = data_request(site, assembly, instrument, method, start=start, stop=stop)
|
|
407
|
+
|
|
408
|
+
# request and download the data for all 10 CTDMOs
|
|
409
|
+
data_04 = data_request(site, assembly, instrument, method, start=start, stop=stop, aggregate=0)
|
|
410
|
+
|
|
411
|
+
# request and download the data for the CTDMO 5 out of 10.
|
|
412
|
+
data_05 = data_request(site, assembly, instrument, method, start=start, stop=stop, aggregate=5)
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Additional Utilities
|
|
416
|
+
|
|
417
|
+
In addition to `m2m_request` and `m2m_collect`, a collection of additional utilities are available to access instrument
|
|
418
|
+
and site deployment information. This information is collected in the OOI [Asset Management](https://github.com/oceanobservatories/asset-management)
|
|
419
|
+
database. It includes the dates, times and locations of deployments, instrument serial numbers, calibration coefficients,
|
|
420
|
+
and all the other pieces of information that combine to form the OOI metadata. These utilities and their use are
|
|
421
|
+
demonstrated in a [Jupyter notebook](examples/notebooks/m2m_explorations.ipynb) available in the [examples](examples/notebooks)
|
|
422
|
+
directory.
|
|
423
|
+
|
|
424
|
+
### Requesting Processed Data
|
|
425
|
+
|
|
426
|
+
For most individuals, the above code should satisfy your needs. For some of the data QC tasks I work through, the data
|
|
427
|
+
needs organizational reworking, renaming of variables or different processing to fit within my workflow. The
|
|
428
|
+
process_*.py modules in the [cabled](./ooi_data_explorations/cabled) and [uncabled](./ooi_data_explorations/uncabled)
|
|
429
|
+
directories represent an attempt on my part to rework the data sets into more useful forms before conducting any
|
|
430
|
+
further work. Primarily, these re-works are for my own use, but they are available for others to use. The primary steps
|
|
431
|
+
are:
|
|
432
|
+
|
|
433
|
+
* Deleting certain variables that are of no use to my needs (helps to reduce file sizes)
|
|
434
|
+
* Renaming some parameters to more consistent names (across and within datasets). The original OOI names are preserved
|
|
435
|
+
as variable level attributes termed `ooinet_variable_name`.
|
|
436
|
+
* Resetting the QC parameters to use the `flag_mask` and `flag_meaning` attributes from the
|
|
437
|
+
[CF Metadata conventions](http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html#flags).
|
|
438
|
+
* Reseting incorrectly set units and other attributes for some variables.
|
|
439
|
+
* Reworking certain parameters by splitting or reshaping the data into more useful forms.
|
|
440
|
+
* Update global attributes and otherwise cleaning up the data set.
|
|
441
|
+
|
|
442
|
+
Additionally, some instrument data is collected in burst mode (e.g. every 15 minutes for 3 minutes at 1 Hz). This
|
|
443
|
+
can make the data sets fairly large. By applying a median average to each of the bursts, the size of the data set can
|
|
444
|
+
be reduced to a more workable form, and the point-to-point variability in each burst can be smoothed out. Burst
|
|
445
|
+
averaging is optional. Most of the processing functions are set to run from the command line. Examples of how these are
|
|
446
|
+
run can be found in the [examples directory](examples). Bash scripts to automate downloading date using these processing
|
|
447
|
+
scripts are in the [utilities/harvesters](utilities/harvesters) directory.
|
|
448
|
+
|
|
449
|
+
### QARTOD Workflows
|
|
450
|
+
|
|
451
|
+
OOI is beginning the process of replacing the current automated QC algorithms with [QARTOD](https://ioos.noaa.gov/project/qartod/)
|
|
452
|
+
[tests](https://github.com/ioos/ioos_qc) developed by [IOOS](https://ioos.noaa.gov/). The workflows and functions used
|
|
453
|
+
to generate the test limits for Endurance Array assets are available under the [qartod](ooi_data_explorations/qartod)
|
|
454
|
+
directory. These workflows rely on the processing functions described above. As more QARTOD tests are developed, the
|
|
455
|
+
processing functions and the QARTOD workflows will be extended. The goal is to create a record for the community
|
|
456
|
+
detailing how the test limits were created and to facilitate regenerating those limits as more data is collected over
|
|
457
|
+
time.
|