# HG changeset patch # User A.M. Thurnherr # Date 1627137341 14400 # Node ID 8f120b9f795abfaab7b9b9c8fe1b935e06cc625f # Parent 2d8e1139acd5315ac68f44a5e197f25be51ddb54 V2.0 - lots of bug fixes - major new features: - dropped CTD scans handled correctly (no more apparent clock drifts) - support for data files collected with Nortek Signature instruments - much improved data editing - significant changes: - no minimum limit for eps_VKE - updated for GMT6 - much better data quality information in summary plots diff -r 2d8e1139acd5 -r 8f120b9f795a HISTORY --- a/HISTORY Sat Apr 10 06:00:45 2021 -0400 +++ b/HISTORY Sat Jul 24 10:35:41 2021 -0400 @@ -1,374 +1,456 @@ ====================================================================== H I S T O R Y doc: Mon Oct 12 16:09:24 2015 - dlm: Tue Nov 27 17:00:26 2018 + dlm: Sat Jul 24 10:35:19 2021 (c) 2015 A.M. Thurnherr - uE-Info: 373 28 NIL 0 0 72 3 2 4 NIL ofnI + uE-Info: 327 25 NIL 0 0 72 3 2 4 NIL ofnI ====================================================================== ---------------------------------------------------------------------- -First Released Version (howto does not cover VKE parameterization) +V1.0: + - First Released Version (howto does not cover VKE parameterization) ---------------------------------------------------------------------- -V1.0: - Oct 12, 2015: - - finalized HowTo V1.0 (antsLibVer V6.2, ADCP_tools V1.3) - - uploaded to Mercurial server +Oct 12, 2015: - finalized HowTo V1.0 (antsLibVer V6.2, ADCP_tools V1.3) + - uploaded to Mercurial server ---------------------------------------------------------------------- -First Version with Full HowTo (including VKE parameterization) +V1.1: + - First Version with Full HowTo (including VKE parameterization) ---------------------------------------------------------------------- -V1.1: - Oct 12, 2015: V1.1beta1 - - added [version.pl] - - adapted to version.pl: [LADCP_w_ocean] [LADCP_w_CTD] - [LADCP_VKE] [LADCP_w_postproc] - - modified [LADCP_w_CTD] to allow processing ASCII CNV files with - wrong number of scans in header - Nov 25-27, 2015: - - minor mods to [LADCP_w_ocean] to try to get it to work on - Windows (R. Robertson) - Dec 22, 2015: - - removed Plots/ Documentation/ Dec_17_2010/ Dec_24_2010/ - Dec_30_2010/ Oct_11_2011/ Jul_04_2011/ from repo - - moved PostProces.sh to Utilities/ and modified README - Jan 4, 2016: - - decreased default vertical resolution to 20m [defaults.pl] [LADCP_w_ocean] - - removed beta from version [version.pl] [.hg/hgrc] +Oct 12, 2015: - V1.1beta1 + - added [version.pl] + - adapted to version.pl: [LADCP_w_ocean] [LADCP_w_CTD] + [LADCP_VKE] [LADCP_w_postproc] + - modified [LADCP_w_CTD] to allow processing ASCII CNV files with + wrong number of scans in header + +Nov 25-27, 2015: + - minor mods to [LADCP_w_ocean] to try to get it to work on + Windows (R. Robertson) + +Dec 22, 2015: - removed Plots/ Documentation/ Dec_17_2010/ Dec_24_2010/ + Dec_30_2010/ Oct_11_2011/ Jul_04_2011/ from repo + - moved PostProces.sh to Utilities/ and modified README + +Jan 4, 2016: - decreased default vertical resolution to 20m [defaults.pl] [LADCP_w_ocean] + - removed beta from version [version.pl] [.hg/hgrc] ---------------------------------------------------------------------- -First Widely Released Version (many significant improvements) +V1.2: + - First Widely Released Version (many significant improvements) ---------------------------------------------------------------------- -V1.2: - Jan 5, 2016: V1.2beta - - updated [version.pl] - - added support for [ADCP_tools_lib.pl]: [version.pl] [LADCP_w_ocean] - Jan 24, 2016: - - added QC for mean residuals - - added QC for dual-head wprofs - - added automatic editing of bad time lagged data - Jan 25 -- Mar 8: - - many bug fixes and small improvements - Mar 8, 2016: - - added updated howto pdf - - updated [version.pl] with new ANTSlib prerequisite version - - published as V1.2beta +Jan 5, 2016: - V1.2beta + - updated [version.pl] + - added support for [ADCP_tools_lib.pl]: [version.pl] [LADCP_w_ocean] + +Jan 24, 2016: - added QC for mean residuals + - added QC for dual-head wprofs + - added automatic editing of bad time lagged data - Mar 9, 2016: V1.2beta2 - - added hab field to .wprof output [LADCP_w_ocean] - Mar 10, 2016: - - published +Jan 25 -- Mar 8: + - many bug fixes and small improvements + +Mar 8, 2016: - added updated howto pdf + - updated [version.pl] with new ANTSlib prerequisite version + - published as V1.2beta + +Mar 9, 2016: - V1.2beta2 + - added hab field to .wprof output [LADCP_w_ocean] + +Mar 10, 2016: - published - Mar 13, 2016: V1.2beta3 - - updated [version.pl] [.hg/hgrc] - - added simple ASCII CTD format [LADCP_w_CTD] - - added auto directory creation to [defaults.pl] - - updated howto - - published V1.2beta3 - - updated [version.pl] [.hg/hgrc] to V1.2beta4 - - added ADCP-file checks in [LADCP_w_ocean] - - updated howto +Mar 13, 2016: - V1.2beta3 + - updated [version.pl] [.hg/hgrc] + - added simple ASCII CTD format [LADCP_w_CTD] + - added auto directory creation to [defaults.pl] + - updated howto + - published V1.2beta3 + - updated [version.pl] [.hg/hgrc] to V1.2beta4 + - added ADCP-file checks in [LADCP_w_ocean] + - updated howto - Mar 16, 2016: V1.2beta4 - - published on server - - updated [version.pl] to beta5 (gmt5) - - adapted to GMT5 +Mar 16, 2016: - V1.2beta4 + - published on server + - updated [version.pl] to beta5 (gmt5) + - adapted to GMT5 - Mar 17, 2016: V1.2beta5 - - updated [.hg/hgrc] - - various plot improvements - - updated howto - - published - - V1.2beta6 [version.pl] [.hg/hgrc] - - changed surface-wave stat in [LADCP_w_ocean] +Mar 17, 2016: - V1.2beta5 + - updated [.hg/hgrc] + - various plot improvements + - updated howto + - published + - V1.2beta6 [version.pl] [.hg/hgrc] + - changed surface-wave stat in [LADCP_w_ocean] - Mar 18-29, 2016: V1.2beta6 - - [LADCP_VKE]: - - added -k to supply external eps - - re-designed QC checks (slope estimates) - - several other minor improvements - - [LADCP_wspec]: - - added median # of samples to output - - [LADCP_w_CTD]: - - added support for $ENV{VERB} - - [LADCP_w_ocean] - - added -r)ms residual filter with 4cm/s default cutoff - - fixed a couple of minor bugs (Sv correction had been disabled) - - replaced CTD w with CTD acceleration in wprof plots - Mar 29, 2016: V1.2beta6 - - update antsMinLib to 6.6, perl-tools to 1.5 [version.pl] - - updated howto - - exported [default_paths.pl] from [defaults.pl] +Mar 18-29, 2016: V1.2beta6 + - [LADCP_VKE]: + - added -k to supply external eps + - re-designed QC checks (slope estimates) + - several other minor improvements + - [LADCP_wspec]: + - added median # of samples to output + - [LADCP_w_CTD]: + - added support for $ENV{VERB} + - [LADCP_w_ocean] + - added -r)ms residual filter with 4cm/s default cutoff + - fixed a couple of minor bugs (Sv correction had been disabled) + - replaced CTD w with CTD acceleration in wprof plots +Mar 29, 2016: - V1.2beta6 + - update antsMinLib to 6.6, perl-tools to 1.5 [version.pl] + - updated howto + - exported [default_paths.pl] from [defaults.pl] + +Mar 30, 2016: - V1.2beta7 + - updated [version.pl] [.hg/hgrc] + - [LADCP_w_CTD]: added station as optional 3rd header field in + ASCII format - Mar 30, 2016: V1.2beta7 - - updated [version.pl] [.hg/hgrc] - - [LADCP_w_CTD]: added station as optional 3rd header field in - ASCII format - Mar 31, 2016: - - improved version %PARAMs in all utilities - - [LADCP_VKE] - - added averaging of spectra (inc. setting PARAMs) - - improved %PARAMs (also in [LADCP_wspec]) - - fixed slight bug in [LADCP_wspec] - - removed code to generate different output names on -d/-u - - added -q +Mar 31, 2016: - improved version %PARAMs in all utilities + - [LADCP_VKE] + - added averaging of spectra (inc. setting PARAMs) + - improved %PARAMs (also in [LADCP_wspec]) + - fixed slight bug in [LADCP_wspec] + - removed code to generate different output names on -d/-u + - added -q - Apr 3, 2016: - - reduced low-p0 cutoff from 1e-7 to 5e-8 in [LADCP_VKE] - - similarly reduced equatorial band from 5 to 3 degrees +Apr 3, 2016: - reduced low-p0 cutoff from 1e-7 to 5e-8 in [LADCP_VKE] + - similarly reduced equatorial band from 5 to 3 degrees - Apr 6, 2016: - - fixed GMT-5 related bug in [LADCP_w_ocean] - - increased calibration constant by 20% in [LADCP_VKE] - - updated howto - - published V1.2beta7 - - Apr 14, 2016: V1.2beta8 - - [LADCP_w_postproc] improved warning messages +Apr 6, 2016: - fixed GMT-5 related bug in [LADCP_w_ocean] + - increased calibration constant by 20% in [LADCP_VKE] + - updated howto + - published V1.2beta7 - Apr 16, 2016: - - [LADCP_VKE] allow for nans in LADCP_wspec output - - updated [version.pl] +Apr 14, 2016: - V1.2beta8 + - [LADCP_w_postproc] improved warning messages - May 12, 2016: - - updated version to 1.2 - - updated HowTo - - published +Apr 16, 2016: - [LADCP_VKE] allow for nans in LADCP_wspec output + - updated [version.pl] + +May 12, 2016: - updated version to 1.2 + - updated HowTo + - published ---------------------------------------------------------------------- -Adding Corrections For Beam-Pointing Errors +V1.3: + - Adding Corrections For Beam-Pointing Errors ---------------------------------------------------------------------- -V1.3: - May 12, 2016: - - updated [version.pl] - - [LADCP_w_ocean] added fields to wsamp output +May 12, 2016: - updated [version.pl] + - [LADCP_w_ocean] added fields to wsamp output + +May 17, 2015: +May 18, 2015: - [LADCP_w_ocean] added fields to wsamp output + - modified _wprof fig (mean instead of rms tilts) + - minor mods elsewhere (e.g. version info in all plots) + - added new plots [defaults.pl] requiring mods to [LADCP_w_ocean]: + - [plot_acceleration_residuals.pl] + - [plot_attitude_biases_w.pl] + - [plot_attitude_residuals.pl] + - [plot_residual_profs.pl] + - removed assumption of 1500m/s ADCP soundspeed setting (various files) + - added correct w12, w34 for earth velocity data + +May 19, 2016: - updated to ADCP_tools V1.6 (coord trans interface change) - May 17-18, 2015: - - [LADCP_w_ocean] added fields to wsamp output - - modified _wprof fig (mean instead of rms tilts) - - minor mods elsewhere (e.g. version info in all plots) - - added new plots [defaults.pl] requiring mods to [LADCP_w_ocean]: - - [plot_acceleration_residuals.pl] - - [plot_attitude_biases_w.pl] - - [plot_attitude_residuals.pl] - - [plot_residual_profs.pl] - - removed assumption of 1500m/s ADCP soundspeed setting (various files) - - added correct w12, w34 for earth velocity data +May 24: 2016: - implemented bin-depth caching + - improved LADCP_w_postproc plot + - improved various plots (esp. for partial-depth casts) + +May 25, 2016: - updated version to V1.3beta1 [version.pl] [.hg/hgrc] + - published - May 19, 2016: - - updated to ADCP_tools V1.6 (coord trans interface change) +May 26, 2016: - V1.3beta2 + - updated version to V1.3beta2 [version.pl] [.hg/hgrc] + - udated ANTS_tools lib to V1.7 (beam interpolation) + - adapted [LADCP_w_ocean] to beam interpolation + - minor improvement to [LADCP_w_postproc] + - improved [plot_wprof.pl] - May 24: 2016: - - implemented bin-depth caching - - improved LADCP_w_postproc plot - - improved various plots (esp. for partial-depth casts) +Jun 1, 2016: - improvements to [LADCP_w_ocean] + - added [default_output.pl] + - added [plot_residuals12.pl] [plot_residuals34.pl] + +Jun 2, 2016: - minor improvement and bug fix in [LADCP_w_ocean] - May 25, 2016: - - updated version to V1.3beta1 [version.pl] [.hg/hgrc] - - published +Jun 3, 2016: - minor bug fix in [LADCP_w_ocean] + +Jun 6, 2016: - minor improvement in [LADCP_w_ocean] [defaults.pl] [edit_data.pl] + +Jun 8, 2016: - removed plot_attitude_biases_w.pl + - slight improvement to [plot_attitude_residuals.pl] + +Jun 11, 2016: - began debugging w12 & w34 for Earth-coord data [LADCP_w_ocean] - May 26, 2016: V1.3beta2 - - updated version to V1.3beta2 [version.pl] [.hg/hgrc] - - udated ANTS_tools lib to V1.7 (beam interpolation) - - adapted [LADCP_w_ocean] to beam interpolation - - minor improvement to [LADCP_w_postproc] - - improved [plot_wprof.pl] +Jul 7, 2016: - major BUG in [LADCP_w_ocean] (beam-pair velocities for Earth + coord data) - Jun 1, 2016 - - improvements to [LADCP_w_ocean] - - added [default_output.pl] - - added [plot_residuals12.pl] [plot_residuals34.pl] +Jul 12, 2016: - docu in [defaults.pl] + +Jul 29, 2016: - minor plotting bug in [LADCP_w_CTD] + +Jul 31, 2016: - minor bug in [LADCP_w_ocean] [defaults.pl] - Jun 2, 2016: - - minor improvement and bug fix in [LADCP_w_ocean] +Aug 5, 2016: - committed version found on whoosher after repair + - manually uploaded from ECOGIG cruise laptop: + - [LADCP_w_ocean] changes since Jun 11, 2016 + - [defaults.pl] changes since Jun 2, 2016 + - [LADCP_w_CTD] changes since May 26, 2016 + - updated [version.pl] to require ANTSlib V6.7 + - updated HISTORY - Jun 3, 2016: - - minor bug fix in [LADCP_w_ocean] +Aug 16, 2016: - [LADCP_VKE] increased -l default 1.2e-7 based on UK2.5 SR1 + repeat section - Jun 6, 2016: - - minor improvement in [LADCP_w_ocean] [defaults.pl] [edit_data.pl] +Dec 22, 2016: - [LADCP_w_ocean] moved $opt_p to [defaults.pl] + +Dec 23, 2016: - [LADCP_w_ocean] minor bug - Jun 8, 2016: - - removed plot_attitude_biases_w.pl - - slight improvement to [plot_attitude_residuals.pl] +Sep 1, 2016: - [LADCP_VKE] changed -l to mean epsilon, and increased value to 1e-10 - Jun 11, 2016: - - began debugging w12 & w34 for Earth-coord data [LADCP_w_ocean] +Mar 6, 2017: - [LADCP_w_ocean] minor bug + - [time_lag.pl] minor bug + +Mar 7, 2017: - added time lines to [plot_time_lags.pl] - Jul 7, 2016: - - major BUG in [LADCP_w_ocean] (beam-pair velocities for Earth - coord data) +Mar 9, 2017: - tightened timelag editing condition in [time_lag.pl] + - updated [HISTORY] + +Mar 12, 2017: - adapted to antslib V6.8 [version.pl] + - adapted ADCP_tools to V1.9 + - increased -o default from 20 to 40m + - updated to V1.3 - Jul 12, 2016: - - docu in [defaults.pl] +Mar 15, 2017: - added [loadANTS.pl] for V1.3 + - updated howto + +Mar 16, 2017: - published - Jul 29, 2016: - - minor plotting bug in [LADCP_w_CTD] +---------------------------------------------------------------------- +V 1.4 +---------------------------------------------------------------------- - Jul 31, 2016: - - minor bug in [LADCP_w_ocean] [defaults.pl] +Oct 3, 2017: - added -q option to LADCP_w_CTD for reprocessing as 1Hz files - Aug 5, 2016: - - committed version found on whoosher after repair - - manually uploaded from ECOGIG cruise laptop: - - [LADCP_w_ocean] changes since Jun 11, 2016 - - [defaults.pl] changes since Jun 2, 2016 - - [LADCP_w_CTD] changes since May 26, 2016 - - updated [version.pl] to require ANTSlib V6.7 - - updated HISTORY +Oct 12, 2017: - re-wrote code in [LADCP_w_ocean] to deal with earth coordinates + (MAJOR BUG FIX) + +Oct 13, 2017: - bugfix in [edit_data.pl] + +Oct 17, 2017: - improvements and bugfix in [LADCP_VKE] - Aug 16, 2016: - - [LADCP_VKE] increased -l default 1.2e-7 based on UK2.5 SR1 - repeat section +Nov 26, 2017: - significant bug fixes in [LADCP_w_ocean] related to + - ping-coherent residual removal + - bad beam + +Nov 27, 2017: - improved gap heuristics in [time_series.pl] + - added @valid_ensmeble_range [defaults.pl] + +Nov 28, 2017: - increased version to V1.4 [version.pl] [.hg/hgrc] + - worked on updating howto + - improvements to [LADCP_w_ocean] + - removed wcorr plot from [LADCP_w_postproc] + +Nov 29, 2017: - replaced opt_i by initial_time_lag in [defaults.pl] - Dec 22, 2016: - - [LADCP_w_ocean] moved $opt_p to [defaults.pl] +Dec 9, 2017: - removed common options from [LADCP_w_ocean] [LADCP_w_postproc] + [LADCP_wspec] [LADCP_w_CTD] [LADCP_VKE] - Dec 23, 2016: - - [LADCP_w_ocean] minor bug +Dec 14, 2017: - improvements to [LADCP_wspec] + +Dec 17, 2017: - added dependencies to [LADCP_w_ocean] [LADCP_w_CTD] + +Mar 8, 2018: - improvements to [LADCP_w_CTD] - Sep 1, 2016: - - [LADCP_VKE] changed -l to mean epsilon, and increased value to - 1e-10 +Mar 9, 2018: - improvements to [LADCP_w_CTD] + +Mar 20, 2018: - added blue background color for in-ice profiles in [plot_wprof.pl] + - fixed acceleration unit error in [plot_wprof.pl] - Mar 6, 2017: - - [LADCP_w_ocean] minor bug - - [time_lag.pl] minor bug +Mar 22, 2018: - adapted howto + - massively improved time-lagging heuristic [time_lag.pl] + - improved [plot_time_lags.pl] + +Mar 27, 2018: - bugfix to new time lagging heuristic in [time_lag.pl] - Mar 7, 2017: - - added time lines to [plot_time_lags.pl] +Apr 24, 2018: - improvements to [LADCP_w_ocean] [LADCP_VKE] [defaults.pl] - Mar 9, 2017: - - tightened timelag editing condition in [time_lag.pl] - - updated [HISTORY] +Apr 25, 2018: - improvement to [LADCP_VKE] + +May 1, 2018: - added reflr_u filter in [LADCP_w_ocean] [edit_data.pl] [time_series.pl] + - added ambiguity velocity check in [LADCP_w_ocean] - Mar 12, 2017: - - adapted to antslib V6.8 [version.pl] - - adapted ADCP_tools to V1.9 - - increased -o default from 20 to 40m - - updated to V1.3 +May 2, 2018: - bug fixes in [LADCP_w_ocean], related to + - reflr threshold + - PPI + - adapted [defaults.pl] to reflr_u filter - Mar 15, 2017: - - added [loadANTS.pl] for V1.3 - - updated howto +May 13, 2018: - fixed bug in [LADCP_wspec] + +May 16, 2018: - improvement to [LADCP_wspec] + +May 22, 2018: - improvement to [LADCP_w_CTD] + +Jul 24, 2018: - improvement to [LADCP_w_CTD] - Mar 16, 2017: - - published +Sep 13, 2018: - added '.' to library path in [version.pl] + +Oct 4, 2018: - improvements to [LADCP_w_CTD] ----------------------------------------------------------------------- +Oct 5, 2018: - improvements and bugfix in [LADCP_w_CTD] + +Oct 31, 2018: - improvements to [LADCP_w_postproc] - Oct 3, 2017: - - added -q option to LADCP_w_CTD for reprocessing as 1Hz files +Nov 1, 2018: - improvements to [LADCP_w_postproc] + +Nov 2, 2018: - 2-beam residuals bug fix in [LADCP_w_ocean] - Oct 12, 2017: - - re-wrote code in [LADCP_w_ocean] to deal with earth coordinates - (MAJOR BUG FIX) +Nov 17, 2018: - updated [HISTORY] + - updated prerequisites in [version.pl] + - updated [LADCP_w_howto.pdf] + - updated [.hg/hgrc] + - published V1.4 - Oct 13, 2017: - - bugfix in [edit_data.pl] - - Oct 17, 2017: - - improvements and bugfix in [LADCP_VKE] +---------------------------------------------------------------------- +V2.0 + - lots of bug fixes + - major new features: + - dropped CTD scans handled correctly (no more apparent clock drifts) + - support for data files collected with Nortek Signature instruments + - much improved data editing + - significant changes: + - no minimum limit for eps_VKE + - updated for GMT6 + - much better data quality information in summary plots +---------------------------------------------------------------------- - Nov 26, 2017: - - significant bug fixes in [LADCP_w_ocean] related to - - ping-coherent residual removal - - bad beam +Mar 25, 2019: - [LADCP_w_CTD] changed error message to allow creating 1Hz from 4Hz file (SBE19) + - [LADCP_w_CTD] BUG: ITS was not set. How is this possible????? - Nov 27, 2017: - - improved gap heuristics in [time_series.pl] - - added @valid_ensmeble_range [defaults.pl] +Apr 12, 2019: - [LADCP_w_ocean] added logfile error message for non-existing file + +Apr 18, 2019: - [LADCP_w_ocean] added addtional RDI coordinate transformation %PARAMs - Nov 28, 2017: - - increased version to V1.4 [version.pl] [.hg/hgrc] - - worked on updating howto - - improvements to [LADCP_w_ocean] - - removed wcorr plot from [LADCP_w_postproc] +Apr 21, 2019: - [LADCP_w_CTD] modified code to allow production of 24Hz files (previous code required + min 2 samples per bin, allowing for max 12Hz sampling rate) + - [LADCP_w_ocean] BUG: removed duplicate warning about lacking water-depth info + +Aug 27, 2019: - [LADCP_w_CTD] began adding correction for dropped CTD scans - Nov 29, 2017: - - replaced opt_i by initial_time_lag in [defaults.pl] +Aug 28, 2019: - [LADCP_w_CTD] made it work + - [LADCP_w_CTD] added -g - Dec 9, 2017: - - removed common options from [LADCP_w_ocean] [LADCP_w_postproc] - [LADCP_wspec] [LADCP_w_CTD] [LADCP_VKE] +Aug 30, 2019: - [LADCP_w_CTD] renamed -g to -m)odulo error correction (not) + - [LADCP_w_CTD] added -f)ill missing data + +Sep 10, 2019: - [LADCP_w_ocean] BUG: -i was erroneously listed as the initial CTD time offset - Dec 14, 2017: - - improvements to [LADCP_wspec] - - Dec 17, 2017: - - added dependencies to [LADCP_w_ocean] [LADCP_w_CTD] +Sep 12, 2019: - [LADCP_VKE] disabled default -l cut-off (used to be 5e-11 W/kg) + - [LADCP_w_ocean] modified .prof output layout to be consistent with [LADCP_w_postproc] + +Oct 29, 2019: - [plot_*.pl] updated psscale -B to gmt5 syntax + +May 15, 2020: - [LADCP_w_ocean] BUG: re-binning on -r did not work for v12 and v34 + - [LADCP_w_ocean] BUG: before re-binning, upcast v12 and v34 were actuall from DC data + - [LADCP_w_ocean] BUG: all beam-pair velocity stats were contaminated by missing values + - [LADCP_w_ocean] made bin residuals per beam pair + - [default_output.pl] removed a couple of time-depth plots from level 1 + - [default_output.pl] changed semmantics so that pushing to plot adds, + instead of overwwriting + - [default_output.pl] BUG: one of the plots did not repect plotting level + - [plot_mean_residuals.pl] adapted to bin-residuals separate per beam pair + - [plot_mean_residuals.pl] added orange range + - [plot_mean_residuals.pl] slightly relaxed green range - Mar 8, 2018: - - improvements to [LADCP_w_CTD] +May 16, 2020: - [LADCP_w_ocean] BUG: write_residual_profs() clobbered layout + - [plot_wprof.pl] added residual profile data to background - Mar 9, 2018: - - improvements to [LADCP_w_CTD] +May 23, 2020: - [plot_wprof.pl] BUG: windows without samples made program bomb - Mar 20, 2018: - - added blue background color for in-ice profiles in [plot_wprof.pl] - - fixed acceleration unit error in [plot_wprof.pl] +May 25, 2020: - added [write_residual_profs.pl] + +Jun 22, 2020: - [LADCP_w_ocean] sscorr_w renamed to remove conflict with [RDI_Coords.pl] - Mar 22, 2018: - - adapted howto - - massively improved time-lagging heuristic [time_lag.pl] - - improved [plot_time_lags.pl] +Jun 26, 2020: - [LADCP_w_CTD] added salinity -b)ias correction + +Jun 29, 2020: - [svel_corrections.pl] renamed sscorr_w to remove conflict with RDI_Coords.pl + +Mar 17, 2021: - [LADCP_w_ocean] turned multi-ping error into warning (for Nortek files) - Mar 27, 2018: - - bugfix to new time lagging heuristic in [time_lag.pl] +Mar 23, 3021: - [LADCP_w_ocean] adapted to ADCP_tools V2.4 (Nortek PD0 files) + - [plot_wprof.pl] BUG: instrument frequency was rounded to 100kHz - Apr 24, 2018: - - improvements to [LADCP_w_ocean] [LADCP_VKE] [defaults.pl] - - Apr 25, 2018: - - improvement to [LADCP_VKE] +Apr 29, 2021: - [LADCP_w_CTD] improved warning message + +Jun 29, 2021: - [LADCP_w_CTD] improved plot labelling - May 1, 2018: - - added reflr_u filter in [LADCP_w_ocean] [edit_data.pl] [time_series.pl] - - added ambiguity velocity check in [LADCP_w_ocean] +Jun 30, 2021: - [LADCP_w_CTD] improved plot labelling + - [LADCP_w_ocean] + - BUG: rms instead of mean tilt was reported in fig + - added pitch/roll/tilt to output profile + - [default_output.pl] renamed plot_mean_residuals to plot_bin_residuals + - [plot_bin_residuals.pl] renamed from plot_mean_residuals.pl + - [plot_wprof.pl] improved quality semaphore - May 2, 2018: - - bug fixes in [LADCP_w_ocean], related to - - reflr threshold - - PPI - - adapted [defaults.pl] to reflr_u filter +Jul 1, 2021: - [LADCP_w_ocean] made %PARAMs more standard + - [LADCP_w_ocean] added %dc_w.mu, %uc_w.mu + - [plot_bin_residuals.pl] adapted to more standard %PARAMs + - [plot_wprof.pl] replaced bin setup by in legend + - [LADCP_VKE] made %PARAMs more standard + - [LADCP_w_postproc] made %PARAMs more standard + - [LADCP_w_postproc] added -z to remove biases + - [LADCP_w_postproc] added %?c_w_diff.rms to output + - [LADCP_w_postproc] BUG: dc_corr returned strange rms + - [acoustic_backscatter.pl] [bottom_tracking.pl] + [find_seabed.pl] [plot_backscatter.pl] + [plot_correlation.pl] [plot_residuals12.pl] + [plot_residuals34.pl] [plot_wsamp.pl] [time_lag.pl] made %PARAMs more standard - May 13, 2018: - - fixed bug in [LADCP_wspec] - - May 16, 2018: - - improvement to [LADCP_wspec] +Jul 6, 2021: - [LADCP_w_ocean] BUG: %uc_w.mu was off by factor 2 - May 22, 2018: - - improvement to [LADCP_w_CTD] - - Jul 24, 2018: - - improvement to [LADCP_w_CTD] - - Sep 13, 2018: - - added '.' to library path in [version.pl] - - Oct 4, 2018: - - improvements to [LADCP_w_CTD] - - Oct 5, 2018: - - improvements and bugfix in [LADCP_w_CTD] +Jul 7, 2021: - [plot_wprof.pl] added colored background to + - [LADCP_w_postproc] reversed logic of -z (enables bias correction by default) + - [LADCP_w_postproc] BUG: plot had label in wrong location for single-head profiles - Oct 31, 2018: - - improvements to [LADCP_w_postproc] - - Nov 1, 2018: - - improvements to [LADCP_w_postproc] +Jul 9, 2021: - [LADCP_w_ocean] added LR_RMS_BP_RESIDUAL, dc_lr_bp_res.rms, uc_lr_bp_res.rms + - [LADCP_w_ocean] added residuals profile filter + - [defaults.pl] - added $layer_residuals_rms_max + - [plot_wprof.pl] adapted to new residual editing (calculation in LADCP_w_ocean) + - [LADCP_w_postproc] added window correlation stats + - [LADCP_w_postproc] updated %PARAM names + - [edit_data.pl] added editHighResidualLayers() + +Jul 11, 2021: - [LADCP_w_ocean] added %dc_w.var, %uc_w.var + - [LADCP_w_ocean] reduced warning associated with residuals profile filter + - [LADCP_w_ocean] disable time-lag filtering for transmission-error corrected CTD files + +Jul 13, 2021: - [LADCP_w_ocean] set dc_w.mu, dc_w.var to nan on insufficient data + - [LADCP_w_ocean] BUG: residuals profile filter bombed when no data were removed + - [LADCP_w_ocean] BUG: rms BT discrepancy was broken (residuals profile filter) + - [LADCP_w_ocean] BUG: *_w.var did not respect -k + - [LADCP_w_CTD] improved gaps PARAMs + - [LADCP_w_CTD] added clock/transmission warnings + - [LADCP_w_postproc] BUG: dc_sig, dc_rms confusion + +Jul 23, 2021: - [LADCP_w_ocean] added %ADCP_type + - [LADCP_VKE] returned to published empirical calibration constant (20% difference is not significant) + - [LADCP_VKE] added calibration constant to output metadata + - [LADCP_VKE] changed opt_a default from nan to 0 (ambient mixing) + - [LADCP_VKE] BUG: -z default was only 1, which means that -k20 from LADCP_w_ocean applies; in + practice I found with A20 that there are the effective value is >60; which means + that this bug did not matter much in practice + - [LADCP_VKE] changed calibration constant back, because it makes sense, and because it is now + recorded in the meta-data + - [LADCP_w_postproc] added summary info to plot + - [LADCP_w_postproc] added seabed to plot + - [LADCP_w_postproc] added annotations to plot - Nov 2, 2018: - - 2-beam residuals bug fix in [LADCP_w_ocean] +Jul 24, 2021: - [HISTORY] updated + - V2.0 released + - Nov 17, 2018: - - updated [HISTORY] - - updated prerequisites in [version.pl] - - updated [LADCP_w_howto.pdf] - - updated [.hg/hgrc] diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_VKE --- a/LADCP_VKE Sat Apr 10 06:00:45 2021 -0400 +++ b/LADCP_VKE Sat Jul 24 10:35:41 2021 -0400 @@ -2,9 +2,9 @@ #====================================================================== # L A D C P _ V K E # doc: Tue Oct 14 11:05:16 2014 -# dlm: Thu Sep 12 13:49:04 2019 +# dlm: Sat Jul 24 09:44:26 2021 # (c) 2012 A.M. Thurnherr -# uE-Info: 111 71 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 120 45 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== $antsSummary = 'calculate VKE from LADCP-derived vertical-velocity profiles'; @@ -109,6 +109,16 @@ # Apr 24, 2018: - BUG: output was one field too wide (filled with nans) because antsBufNFields was not reset # Apr 25, 2018: - added -y and removed spectral bins from default output # Sep 12, 2019: - disabled default -l cut-off (used to be 5e-11 W/kg) +# Jul 1, 2021: - made %PARAMs more standard +# Jul 23, 2021: - returned to published empirical calibration constant (20% difference is not significant) +# - added calibration constant to output metadata +# - changed opt_a default from nan to 0 (ambient mixing) +# - BUG: -z default was only 1, which means that -k20 from LADCP_w_ocean applies; in +# practice I found with A20 that there are the effective value is >60; which means +# that this bug did not matter much in practice +# - changed calibration constant back, because it makes sense, and because it is now +# recorded in the meta-data +# HISTORY END ($ANTSLIB) = (`which ANTSlib` =~ m{^(.*)/[^/]*$}); ($WCALC) = ($0 =~ m{^(.*)/[^/]*$}); @@ -129,11 +139,11 @@ #---------------------------------------------------------------------- #my($c) = 0.0215; # Thurnherr et al. (GRL 2015) -my($c) = 0.026; # increased by 20% for V1.2beta7 +my($c) = 0.026; # increased by 21% for V1.2beta7 $opt_q = 3; # Equatorial band: little more than a guess based on 2015 P16N $opt_l = 0; # [W/kg]; cutoff disabled Sep 12, 2019 -$opt_a = nan; # assume background dissipation for samples that pass the tests but have eps below -l -$opt_z = 1; # number of w_ocean samples to require +$opt_a = 0; # assume background dissipation for samples that pass the tests but have eps below -l +$opt_z = 50; # number of w_ocean samples to require (note that the .wprof inputs may have harsher limits) $opt_o = 0; # remove mean before calculating spectra $opt_s = 150; # surface layer to exclude from spectra $opt_g = 40; # max gap to interpolate over @@ -196,17 +206,17 @@ if ($bufi == 0) { # do once for mulitple files &antsAddParams('ADCP_bin_length','','ADCP_blanking_distance','', # delete most %PARAMs, leaving 'ADCP_frequency','','ADCP_orientation','', # only potentially useful ones (from last file): - 'ADCP_pulse_length','','BT_max_bin_range_diff','', # %profile_id - 'BT_max_range','','BT_max_w_error','', # %water_depth - 'BT_rms_w_discrepancy','','CTD_time_lags','', # %lat + 'ADCP_pulse_length','','BT_bin_range_diff.max','', # %profile_id + 'BT_range.max','','BT_w_error.max','', # %water_depth + 'BT_w_discrepancy.rms','','CTD_time_lags','', # %lat 'LADCP_firstBin','','LADCP_lastBin','', # %lon - 'LADCP_w_ocean::version','','SS_min_samp','', # %dnXX - 'SS_max_allowed_depth_range','','SS_min_signal','', - 'Sv_ref_bin','','TL_max_allowed_three_lag_spread','', - 'dc_rms_accel_pkg','','dc_rms_tilt','', - 'uc_rms_accel_pkg','','uc_rms_tilt','', - 'max_depth','','max_elapsed','','max_ens','', - 'min_depth','','min_elapsed','','min_ens','', + 'LADCP_w_ocean::version','','SS_samp.min','', # %dnXX + 'SS_allowed_depth_range.max','','SS_signal.min','', + 'Sv_ref_bin','','TL_allowed_three_lag_spread.max','', + 'dc_pkg_accel.rms','','dc_tilt.rms','', + 'uc_pkg_accel.rms','','uc_tilt.rms','', + 'depth.max','','elapsed.max','','ens.max','', + 'depth.min','','elapsed.min','','ens.min','', 'out_basename','','outgrid_dz','','run_label','', 'outgrid_firstbin','','outgrid_lastbin','', 'outgrid_minsamp','','per_bin_valid_frac_lim','', @@ -214,7 +224,7 @@ 'refLr_lastBin','','rms_w_reflr_err','', 'rms_w_reflr_err_interior','', 'sidelobe_editing','','surface_layer_depth','', - 'vessel_draft','','w_max_lim','', + 'vessel_draft','','w_lim.max','', 'water_depth.sig','','water_depth_from','', ); } @@ -267,12 +277,13 @@ $n_input_files = 1 + @specbuf; # number of input files provided +&antsFloatOpt(\$opt_e,$c); # default parameterization +&antsFloatOpt(\$opt_x,1); # spectral fit stddev scale factor + &antsAddParams('LADCP_VKE::input_files.n',$n_input_files, 'LADCP_VKE::wsamp.min',$opt_z, - 'LADCP_VKE::eps.minlim',$opt_l); - -&antsFloatOpt(\$opt_e,$c); # default parameterization -&antsFloatOpt(\$opt_x,1); # spectral fit stddev scale factor + 'LADCP_VKE::eps.minlim',$opt_l, + 'LADCP_VKE::calibration_constant',$opt_e); if (defined($opt_c)) { # shortwave cutoff supplied $lmin = ($opt_c < 1) ? 2*$PI/$opt_c : $opt_c; @@ -363,15 +374,14 @@ for (my($bi)=0; $bi<@specbuf; $bi++) { # loop over all buffered files next unless @{$specbuf[$bi][$wi]}; # skip input files w/o valid spectra if (abs($specbuf[$bi][$wi][$df] - $ants_[$r][$df]) > 0) { # depth mismatch - die("assertion failed") unless ($wi == 0); # only allowed in bottom window +# die("assertion failed ($specbuf[$bi][$wi][$df] - $ants_[$r][$df] @ wi=$wi)") unless ($wi == 0); # only allowed in bottom window if (abs($specbuf[$bi][$wi][$df] - $ants_[$r][$df]) > abs($ants_[$r][$maxdf] - $ants_[$r][$mindf])) { - printf(STDERR "WARNING: ignoring bottom window from input file #%d because of depth mismatch\n",$bi+1) + printf(STDERR "WARNING: ignoring window #$wi from input file #%d because of depth mismatch\n",$bi+1) if ($f == $fs_fmin); next; } } -# print(STDERR "specbuf[$bi][$wi][$f] = $specbuf[$bi][$wi][$f]\n"); if (numberp($specbuf[$bi][$wi][$f])) { $sum += $specbuf[$bi][$wi][$f]; $ns++; } @@ -562,7 +572,7 @@ } #----------------------------------------------------------------------------------------------------- - # QC Tests: + # eps.VKE QC Tests: # - the following limits were independently derived # p0fit.rms <= 0.4 primary filter used in Thurnherr et al. (GRL 2015) # -3 <= p0fit.slope <= -1 based largely on 2016 I08S data with sufficient/insufficient range diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_w_CTD --- a/LADCP_w_CTD Sat Apr 10 06:00:45 2021 -0400 +++ b/LADCP_w_CTD Sat Jul 24 10:35:41 2021 -0400 @@ -2,9 +2,9 @@ #====================================================================== # L A D C P _ W _ C T D # doc: Mon Nov 3 17:34:19 2014 -# dlm: Fri Jun 26 13:07:13 2020 +# dlm: Tue Jul 13 11:33:11 2021 # (c) 2014 A.M. Thurnherr -# uE-Info: 144 14 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 226 118 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== $antsSummary = 'pre-process SBE 9plus CTD data for LADCP_w'; @@ -93,11 +93,20 @@ # Aug 30, 2019: - renamed -g to -m)odulo error correction (not) # - added -f)ill missing data # Jun 26, 2020: - added salinity -b)ias correction +# Apr 29, 2021: - improved warning message +# Jun 29, 2021: - improved plot labelling +# Jun 30, 2021: - ditto +# Jul 13, 2021: - improved gaps PARAMs +# - added clock/transmission warnings +# HISTORY END # NOTES: # w_CTD is positive during the downcast to make the sign of the apparent # water velocity consistent with w_ocean +# TODO: +# - add transmission warnings to figure? + ($ANTS) = (`which ANTSlib` =~ m{^(.*)/[^/]*$}); ($WCALC) = ($0 =~ m{^(.*)/[^/]*$}); $WCALC = '.' if ($WCALC eq ''); @@ -214,7 +223,7 @@ $fill_gaps = 1; } else { print(STDERR "\n\n") if ($opt_v > 1); - print(STDERR "WARNING: timeY and/or modError missing from $CNVfile -- cannot correct for CTD modulo errors\n"); + print(STDERR "WARNING: timeY and/or modError missing from $CNVfile -- cannot correct for CTD transmission errors\n"); } } @@ -268,13 +277,14 @@ my($scans_filled) = 0; my($scans_replaced) = 0; my($scans_deleted) = 0; + my($tot_gaps) = 0; for (my($scan)=30; $scan<@ants_; $scan++) { # start a bit more than 1 second into the cast next if ($ants_[$scan][$systimeF] == $ants_[$scan-1][$systimeF]); # skip forward to next systime second if ($ants_[$scan][$systimeF] > $ants_[$scan-1][$systimeF]+1) { # gap spans at least one full second print(STDERR "\n\n") if ($opt_v > 1); - printf(STDERR "WARNING: %d full seconds of data missing at elapsed %d s\n", + printf(STDERR "WARNING: $CNVfile: %d full seconds of data missing at elapsed %d s\n", $ants_[$scan][$systimeF]-$ants_[$scan-1][$systimeF]-1, $ants_[$scan-1][$systimeF]-$ants_[0][$systimeF]); my(@splicescan); # scan to splice in @@ -306,6 +316,7 @@ for (my($s)=$second_start; $s<=$scan; $s++) { $ngaps++ if ($ants_[$s][$xmerrF] > $ants_[$s-1][$xmerrF]); } + $tot_gaps += $ngaps; my(@splicescan); # scan to splice in $splicescan[$systimeF] = $ants_[$second_start][$systimeF]; @@ -364,17 +375,29 @@ # $sts = 1; # } - &antsAddParams('gaps_scans_filled',$scans_filled, - 'scans_removed',$scans_deleted, - 'gap_scans_cleared',$scans_replaced); + &antsAddParams('CTD_transmission_errors',$tot_gaps, + 'CTD_scans_added',$scans_filled, + 'CTD_scans_deleted',$scans_deleted, + 'CTD_gap_scans_cleared',$scans_replaced); if ($opt_v>1 && $scans_filled) { - printf(STDERR "\n\t%d scans removed (clock drift)",$scans_deleted); - printf(STDERR "\n\t%d scans added (gaps & clock drift)",$scans_filled); + printf(STDERR "\n\t%d scans removed (clock jitter/drift)",$scans_deleted); + printf(STDERR "\n\t%d scans added (gaps & clock jitter/drift)",$scans_filled); printf(STDERR "\n\t%d scans cleared (gap clusters)",$scans_replaced); } printf(STDERR "\n") if ($opt_v); -} # if ($fill_gaps + + if ($tot_gaps) { + printf(STDERR "WARNING: $CNVfile: %d transmission errors\n",$tot_gaps); + printf(STDERR "WARNING: $CNVfile: CTD clock drift (%d scans removed)\n",$scans_deleted-$scans_filled) + if ($scans_deleted-$scans_filled > 2); + } else { + printf(STDERR "WARNING: $CNVfile: CTD clock drift (%d scans removed)\n",$scans_deleted-$scans_filled) + if ($scans_deleted-$scans_filled > 2); + printf(STDERR "WARNING: $CNVfile: CTD clock drift (%d scans added)\n",$scans_filled-$scans_deleted) + if ($scans_filled-$scans_deleted > 2); + } +} # if ($fill_gaps) #---------------------------------------------------------------------- # Redirect STDOUT to %.6Hz & create %_w_CTD.ps,%_sspd.ps if STDOUT is a tty @@ -906,12 +929,13 @@ } GMT_psbasemap('-Bg60a30f5:"Elapsed Time [min]":/g1a1f0.1:"Downward Package Velocity [ms@+-1@+]":WeSn'); GMT_unitcoords(); - GMT_pstext('-F+f14,Helvetica,coral+jBR'); print(GMT "0.98 0.96 dc\n"); - GMT_pstext('-F+f14,Helvetica,SeaGreen+jBR'); print(GMT "0.98 0.93 uc\n"); - GMT_pstext('-F+f14,Helvetica,magenta+jBR'); print(GMT "0.98 0.89 winch\n"); + GMT_pstext('-F+f14,Helvetica,coral+jBR -Gwhite'); print(GMT "0.98 0.96 downcast\n"); + GMT_pstext('-F+f14,Helvetica,SeaGreen+jBR -Gwhite'); print(GMT "0.98 0.92 upcast\n"); + GMT_pstext('-F+f14,Helvetica,magenta+jBR -Gwhite'); print(GMT "0.98 0.88 winch\n"); GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); if (defined($outfile)) { printf(GMT "0.01 1.06 $outfile\n",$id); } else { printf(GMT "0.01 1.06 %03d\n",$id); } + GMT_pstext('-F+f9,Helvetica,orange+jBL -N -Gwhite'); print(GMT "0.01 0.01 V$VERSION\n"); GMT_end(); my($xmin) = round($min_sspd-3,5); @@ -928,11 +952,12 @@ GMT_psxy('-W1.5,SeaGreen') if ($r == $atBtm); } GMT_unitcoords(); - GMT_pstext('-F+f14,Helvetica,coral+jTR'); print(GMT "0.98 0.02 dc\n"); - GMT_pstext('-F+f14,Helvetica,SeaGreen+jTR'); print(GMT "0.98 0.06 uc\n"); + GMT_pstext('-F+f14,Helvetica,coral+jTR -Gwhite'); print(GMT "0.98 0.02 downcast\n"); + GMT_pstext('-F+f14,Helvetica,SeaGreen+jTR -Gwhite'); print(GMT "0.98 0.06 upcast\n"); GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); if (defined($outfile)) { printf(GMT "0.01 -0.06 $outfile\n",$id); } else { printf(GMT "0.01 -0.06 %03d\n",$id); } + GMT_pstext('-F+f9,Helvetica,orange+jBL -N -Gwhite'); print(GMT "0.01 0.99 V$VERSION\n"); GMT_end(); } diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_w_HowTo.pdf Binary file LADCP_w_HowTo.pdf has changed diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_w_howto.pdf Binary file LADCP_w_howto.pdf has changed diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_w_ocean --- a/LADCP_w_ocean Sat Apr 10 06:00:45 2021 -0400 +++ b/LADCP_w_ocean Sat Jul 24 10:35:41 2021 -0400 @@ -2,9 +2,9 @@ #====================================================================== # L A D C P _ W _ O C E A N # doc: Fri Dec 17 18:11:13 2010 -# dlm: Tue Mar 23 09:16:10 2021 +# dlm: Fri Jul 23 08:50:23 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 308 65 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 323 36 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # TODO: @@ -306,6 +306,21 @@ # Jun 22, 2020: - sscorr_w renamed to remove conflict with [RDI_Coords.pl] # Mar 17, 2021: - turned multi-ping error into warning (for Nortek files) # Mar 23, 3021: - adapted to ADCP_tools V2.4 (Nortek PD0 files) +# Jun 30, 2021: - BUG: rms instead of mean tilt was reported in fig +# - added pitch/roll/tilt to output profile +# Jul 1, 2021: - made %PARAMs more standard +# - added %dc_w.mu, %uc_w.mu +# Jul 6, 2021: - BUG: %uc_w.mu was off by factor 2 +# Jul 9, 2021: - added LR_RMS_BP_RESIDUAL, dc_lr_bp_res.rms, uc_lr_bp_res.rms +# - added residuals profile filter +# Jul 11, 2021: - added %dc_w.var, %uc_w.var +# - reduced warning associated with residuals profile filter +# - disable time-lag filtering for transmission-error corrected CTD files +# Jul 13, 2021: - set dc_w.mu, dc_w.var to nan on insufficient data +# - BUG: residuals profile filter bombed when no data were removed +# - BUG: rms BT discrepancy was broken (residuals profile filter) +# - BUG: *_w.var did not respect -k +# Jul 23, 2021: - added %ADCP_type # HISTORY END # CTD REQUIREMENTS @@ -316,6 +331,14 @@ # - w_winch OPTIONAL; winch-speed estimate # - temp OPTIONAL; used for backscatter calculation # - %lat/%lon OPTIONAL +# - %CTD_transmission_errors OPTIONAL; if defined, -l is implicitly enabled + +# OUTPUT PITCH +# - gimbal pitch is used + +# OUTPUT EQUIVALENCES: +# 1) list -Q %uc_w.var UL/042.wprof +# list dc_w='$dc_w-%dc_w.mu' UL/042.wprof | avg -Qm dc_w # 2-BEAM SOLUTIONS # - both for beam- and earth-coordinate data, two separate two-beam @@ -422,7 +445,7 @@ if ($opt_V) { printf(STDERR "+------------------------------+\n"); printf(STDERR "| LADCP_w Software V%s |\n",$VERSION); - printf(STDERR "| (c) 2015-2017 A.M. Thurnherr |\n"); + printf(STDERR "| (c) 2015-2021 A.M. Thurnherr |\n"); printf(STDERR "+------------------------------+\n"); exit(0); } @@ -649,6 +672,7 @@ &antsAddParams('ADCP_bin_length',$LADCP{BIN_LENGTH}, 'ADCP_pulse_length',$LADCP{TRANSMITTED_PULSE_LENGTH}, + 'ADCP_type',$LADCP{INSTRUMENT_TYPE}, 'ADCP_frequency',$LADCP{BEAM_FREQUENCY}, 'ADCP_blanking_distance',$LADCP{BLANKING_DISTANCE}); @@ -931,13 +955,13 @@ my($dc_sumTilts,$dc_n,$uc_sumTilts,$uc_n) = (0,0,0,0); $fprm = $pte = 0; for ($ens=0; $ens<=$#{$LADCP{ENSEMBLE}}; $ens++) { - my($ne) = editTilt($ens,$opt_t); + my($ne) = editTilt($ens,$opt_t); # this sets the TILT field if ($ne == 0) { if ($ens <= $LADCP_atbottom) { - $dc_sumTilts += &SQR($LADCP{ENSEMBLE}[$ens]->{TILT}); + $dc_sumTilts += $LADCP{ENSEMBLE}[$ens]->{TILT}; $dc_n++; } else { - $uc_sumTilts += &SQR($LADCP{ENSEMBLE}[$ens]->{TILT}); + $uc_sumTilts += $LADCP{ENSEMBLE}[$ens]->{TILT}; $uc_n++; } } else { @@ -945,9 +969,9 @@ } $fprm += editFarBins($ens,$first_bad_bin) if defined($first_bad_bin); } -my($dc_mean_tilt) = ($dc_n > 0) ? sqrt($dc_sumTilts/$dc_n) : nan; -my($uc_mean_tilt) = ($uc_n > 0) ? sqrt($uc_sumTilts/$uc_n) : nan; -&antsAddParams('dc_mean_tilt',$dc_mean_tilt,'uc_mean_tilt',$uc_mean_tilt); +my($dc_mean_tilt) = ($dc_n > 0) ? $dc_sumTilts/$dc_n : nan; +my($uc_mean_tilt) = ($uc_n > 0) ? $uc_sumTilts/$uc_n : nan; +&antsAddParams('dc_tilt.mu',$dc_mean_tilt,'uc_tilt.mu',$uc_mean_tilt); progress("\tattitude threshold (max_tilt = %d deg): %d velocites removed (%d%% of total)\n", $opt_t,$pte,round(100*$pte/$nvv)); @@ -963,6 +987,9 @@ error("$CTD_file: no data\n") unless (&antsIn()); undef($antsOldHeaders); +$opt_l = 1 # disable time-lag filtering + if defined($P{CTD_transmission_errors}); # for transmission-corrected CTD files + &antsAddDeps($CTD_file); &antsAddParams('lat',$P{lat}) if defined($P{lat}); &antsAddParams('lon',$P{lon}) if defined($P{lon}); @@ -1138,7 +1165,7 @@ progress("Merging CTD with LADCP data...\n"); -&antsAddParams('w_max_lim',$w_max_lim); +&antsAddParams('w_lim.max',$w_max_lim); my($cli) = 0; # current-lag index my($lag) = $CTD_time_lag[$cli]; # current lag @@ -1213,7 +1240,7 @@ my($dc_rms_apkg) = ($dc_n > 0) ? sqrt($dc_sumsq / $dc_n) : nan; # rms package acceleration my($uc_rms_apkg) = ($uc_n > 0) ? sqrt($uc_sumsq / $uc_n) : nan; -&antsAddParams('dc_rms_accel_pkg',$dc_rms_apkg,'uc_rms_accel_pkg',$uc_rms_apkg); +&antsAddParams('dc_accel_pkg.rms',$dc_rms_apkg,'uc_accel_pkg.rms',$uc_rms_apkg); if ($nWsq > 0 && $nWsqI > 0) { &antsAddParams('rms_w_reflr_err',sqrt($sumWsq/$nWsq),'rms_w_reflr_err_interior',sqrt($sumWsqI/$nWsqI)); @@ -1582,6 +1609,7 @@ if defined($LADCP{ENSEMBLE}[$ens]->{V34}[$bin]); push(@{$DNCAST{PITCH}[$bi]},$LADCP{ENSEMBLE}[$ens]->{GIMBAL_PITCH}); push(@{$DNCAST{ROLL}[$bi]},$LADCP{ENSEMBLE}[$ens]->{ROLL}); + push(@{$DNCAST{TILT}[$bi]},$LADCP{ENSEMBLE}[$ens]->{TILT}); } } @@ -1595,6 +1623,7 @@ $DNCAST{MEDIAN_V34}[$bi] = median(@{$DNCAST{V34}[$bi]}); $DNCAST{MEAN_PITCH}[$bi] = avg(@{$DNCAST{PITCH}[$bi]}); $DNCAST{MEAN_ROLL}[$bi] = avg(@{$DNCAST{ROLL}[$bi]}); + $DNCAST{MEAN_TILT}[$bi] = avg(@{$DNCAST{TILT}[$bi]}); $DNCAST{MAD_W}[$bi] = mad2($DNCAST{MEDIAN_W}[$bi],@{$DNCAST{W}[$bi]}); $DNCAST{N_SAMP}[$bi] = @{$DNCAST{W}[$bi]}; } @@ -1651,6 +1680,7 @@ if defined($LADCP{ENSEMBLE}[$ens]->{V34}[$bin]); push(@{$UPCAST{PITCH}[$bi]},$LADCP{ENSEMBLE}[$ens]->{GIMBAL_PITCH}); push(@{$UPCAST{ROLL}[$bi]},$LADCP{ENSEMBLE}[$ens]->{ROLL}); + push(@{$UPCAST{TILT}[$bi]},$LADCP{ENSEMBLE}[$ens]->{TILT}); } } @@ -1664,6 +1694,7 @@ $UPCAST{MEDIAN_V34}[$bi] = median(@{$UPCAST{V34}[$bi]}); $UPCAST{MEAN_PITCH}[$bi] = avg(@{$UPCAST{PITCH}[$bi]}); $UPCAST{MEAN_ROLL}[$bi] = avg(@{$UPCAST{ROLL}[$bi]}); + $UPCAST{MEAN_TILT}[$bi] = avg(@{$UPCAST{TILT}[$bi]}); $UPCAST{MAD_W}[$bi] = mad2($UPCAST{MEDIAN_W}[$bi],@{$UPCAST{W}[$bi]}); $UPCAST{N_SAMP}[$bi] = @{$UPCAST{W}[$bi]}; } @@ -1802,6 +1833,7 @@ if defined($LADCP{ENSEMBLE}[$ens]->{V34}[$bin]); push(@{$DNCAST{PITCH}[$bi]},$LADCP{ENSEMBLE}[$ens]->{GIMBAL_PITCH}); push(@{$DNCAST{ROLL}[$bi]},$LADCP{ENSEMBLE}[$ens]->{ROLL}); + push(@{$DNCAST{TILT}[$bi]},$LADCP{ENSEMBLE}[$ens]->{TILT}); } } for (my($bi)=0; $bi<=$#{$DNCAST{ENSEMBLE}}; $bi++) { # bin data into profile @@ -1814,6 +1846,7 @@ $DNCAST{MEDIAN_V34}[$bi] = median(@{$DNCAST{V34}[$bi]}); $DNCAST{MEAN_PITCH}[$bi] = avg(@{$DNCAST{PITCH}[$bi]}); $DNCAST{MEAN_ROLL}[$bi] = avg(@{$DNCAST{ROLL}[$bi]}); + $DNCAST{MEAN_TILT}[$bi] = avg(@{$DNCAST{TILT}[$bi]}); $DNCAST{MAD_W}[$bi] = mad2($DNCAST{MEDIAN_W}[$bi],@{$DNCAST{W}[$bi]}); $DNCAST{N_SAMP}[$bi] = @{$DNCAST{W}[$bi]}; } @@ -1840,7 +1873,8 @@ push(@{$UPCAST{V34}[$bi]},$LADCP{ENSEMBLE}[$ens]->{V34}[$bin]) if defined($LADCP{ENSEMBLE}[$ens]->{V34}[$bin]); push(@{$UPCAST{PITCH}[$bi]},$LADCP{ENSEMBLE}[$ens]->{GIMBAL_PITCH}); - push(@{$UPCAST{ROLL}[$bi]},$LADCP{ENSEMBLE}[$ens]->{ROLL}); + push(@{$UPCAST{ROLL}<[$bi]},$LADCP{ENSEMBLE}[$ens]->{ROLL}); + push(@{$UPCAST{TILT}[$bi]},$LADCP{ENSEMBLE}[$ens]->{TILT}); } } for (my($bi)=0; $bi<=$#{$UPCAST{ENSEMBLE}}; $bi++) { @@ -1853,6 +1887,7 @@ $UPCAST{MEDIAN_V34}[$bi] = median(@{$UPCAST{V34}[$bi]}); $UPCAST{MEAN_PITCH}[$bi] = avg(@{$UPCAST{PITCH}[$bi]}); $UPCAST{MEAN_ROLL}[$bi] = avg(@{$UPCAST{ROLL}[$bi]}); + $UPCAST{MEAN_TILT}[$bi] = avg(@{$UPCAST{TILT}[$bi]}); $UPCAST{MAD_W}[$bi] = mad2($UPCAST{MEDIAN_W}[$bi],@{$UPCAST{W}[$bi]}); $UPCAST{N_SAMP}[$bi] = @{$UPCAST{W}[$bi]}; } @@ -1860,11 +1895,11 @@ $lastGoodEns = $realLastGoodEns; # now the ensemble range is final -&antsAddParams('min_depth',$min_depth,'max_depth',$max_depth, # define plot range limits - 'min_ens',$LADCP{ENSEMBLE}[$firstGoodEns]->{NUMBER}, - 'max_ens',$LADCP{ENSEMBLE}[$lastGoodEns]->{NUMBER}, - 'min_elapsed',$LADCP{ENSEMBLE}[$firstGoodEns]->{CTD_ELAPSED}, - 'max_elapsed',$LADCP{ENSEMBLE}[$lastGoodEns]->{CTD_ELAPSED}); +&antsAddParams('depth.min',$min_depth,'depth.max',$max_depth, # plot range limits + 'ens.min',$LADCP{ENSEMBLE}[$firstGoodEns]->{NUMBER}, + 'ens.max',$LADCP{ENSEMBLE}[$lastGoodEns]->{NUMBER}, + 'elapsed.min',$LADCP{ENSEMBLE}[$firstGoodEns]->{CTD_ELAPSED}, + 'elapsed.max',$LADCP{ENSEMBLE}[$lastGoodEns]->{CTD_ELAPSED}); #----------------------------------------------- # Add residuals to depth-binned profiles (wprof) @@ -1891,6 +1926,12 @@ $DNCAST{MEAN_RESIDUAL34}[$bi] = avg(@{$DNCAST{RESIDUAL34}[$bi]}); } +for (my($bi)=0; $bi<$#{$DNCAST{ENSEMBLE}}; $bi++) { # rms beampair residual in 5-bin-thick layers + $DNCAST{LR_RMS_BP_RESIDUAL}[$bi] = + rms(@{$DNCAST{MEAN_RESIDUAL12}}[max(0,$bi-2)..min($#{$DNCAST{ENSEMBLE}},$bi+2)], + @{$DNCAST{MEAN_RESIDUAL34}}[max(0,$bi-2)..min($#{$DNCAST{ENSEMBLE}},$bi+2)]); +} + for ($ens=$LADCP_atbottom; $ens<=$lastGoodEns; $ens++) { next unless numberp($LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH}); my(@bindepth) = binDepths($ens); @@ -1910,159 +1951,217 @@ $UPCAST{MEAN_RESIDUAL34}[$bi] = avg(@{$UPCAST{RESIDUAL34}[$bi]}); } +for (my($bi)=0; $bi<$#{$UPCAST{ENSEMBLE}}; $bi++) { # rms beampair residual in 5-bin-thick layers + $UPCAST{LR_RMS_BP_RESIDUAL}[$bi] = + rms(@{$UPCAST{MEAN_RESIDUAL12}}[max(0,$bi-2)..min($#{$UPCAST{ENSEMBLE}},$bi+2)], + @{$UPCAST{MEAN_RESIDUAL34}}[max(0,$bi-2)..min($#{$UPCAST{ENSEMBLE}},$bi+2)]); +} + progress("\n"); +#----------------------------------------------- +# Apply high-layer-residuals filter +#----------------------------------------------- + +progress("Applying residuals profile filter...\n"); +&antsAddParams('layer_residuals_rms.max',$layer_residuals_rms_max); +progress("\t5-bin rms residuals > $layer_residuals_rms_max: "); +my($nbrm) = editHighResidualLayers($layer_residuals_rms_max); +my($nbrmf) = 0; +$nbrmf = $nbrm / (@{$DNCAST{LR_RMS_BP_RESIDUAL}}+@{$UPCAST{LR_RMS_BP_RESIDUAL}}) + if ($nbrm > 0); +progress("$nbrm bins removed (%d%% of profile)\n",round(100*$nbrmf)); +warning(2,"large fraction (%d%%) of profile exceeds residuals-profile threshold\n",round(100*$nbrmf)) + if ($nbrmf >= 0.1); + +#------------------------ +# Profile is now final +# => calc , w.var +#------------------------ + +my($dcw,$ucw,$nw) = (0,0); # (vertically averaged) +for (my($bi)=0; $bi<@{$DNCAST{ENSEMBLE}}; $bi++) { + next unless ($DNCAST{N_SAMP}[$bi]>=$opt_k) && numberp($DNCAST{MEDIAN_W}[$bi]); + $dcw += $DNCAST{MEDIAN_W}[$bi]; + $nw++; +} +$dcw = $nw ? ($dcw/$nw) : nan; +$nw = 0; +for (my($bi)=0; $bi<@{$UPCAST{ENSEMBLE}}; $bi++) { + next unless ($UPCAST{N_SAMP}[$bi]>=$opt_k) && numberp($UPCAST{MEDIAN_W}[$bi]); + $ucw += $UPCAST{MEDIAN_W}[$bi]; + $nw++; +} +$ucw = $nw ? ($ucw/$nw) : nan; + +my($dcss,$ucss,$nw) = (0,0); # variance(w) +for (my($bi)=0; $bi<@{$DNCAST{ENSEMBLE}}; $bi++) { + next unless ($DNCAST{N_SAMP}[$bi]>=$opt_k) && numberp($DNCAST{MEDIAN_W}[$bi]); + $dcss += ($DNCAST{MEDIAN_W}[$bi] - $dcw)**2; + $nw++; +} +$dcss = ($nw > 1) ? ($dcss/$nw) : nan; +$nw = 0; +for (my($bi)=0; $bi<@{$UPCAST{ENSEMBLE}}; $bi++) { + next unless ($UPCAST{N_SAMP}[$bi]>=$opt_k) && numberp($UPCAST{MEDIAN_W}[$bi]); + $ucss += ($UPCAST{MEDIAN_W}[$bi] - $ucw)**2; + $nw++; +} +$ucss = ($nw > 1) ? ($ucss/$nw) : nan; + +&antsAddParams('dc_w.mu',$dcw,'dc_w.var',$dcss,'uc_w.mu',$ucw,'uc_w.var',$ucss); + #------------------------------------------------- # Calculate and Output ADCP-Bin-Averaged Residuals #------------------------------------------------- -#if (@out_BR) { - progress("Binning vertical-velocity residuals wrt. ADCP bin number..."); +progress("Binning vertical-velocity residuals wrt. ADCP bin number..."); - local(@dc_bres12,@uc_bres12,@dc_bres34,@uc_bres34); - for ($ens=$firstGoodEns; $ens<$LADCP_atbottom; $ens++) { # DOWNCAST - next unless numberp($LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH}); - my(@bindepth) = binDepths($ens); - for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { - next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); - push(@{$dc_bres12[$bin]}, - $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] - - $DNCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]) - if numberp($DNCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]); - push(@{$dc_bres34[$bin]}, - $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] - - $DNCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]) - if numberp($DNCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]); - } +local(@dc_bres12,@uc_bres12,@dc_bres34,@uc_bres34); +for ($ens=$firstGoodEns; $ens<$LADCP_atbottom; $ens++) { # DOWNCAST + next unless numberp($LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH}); + my(@bindepth) = binDepths($ens); + for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { + next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); + next unless numberp($DNCAST{MEDIAN_W}[$bindepth[$bin]/$opt_o]); + push(@{$dc_bres12[$bin]}, + $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] + - $DNCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]) + if numberp($DNCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]); + push(@{$dc_bres34[$bin]}, + $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] + - $DNCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]) + if numberp($DNCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]); } - for ($ens=$LADCP_atbottom; $ens<=$lastGoodEns; $ens++) { # UPCAST - next unless numberp($LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH}); - my(@bindepth) = binDepths($ens); - for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { - next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); - push(@{$uc_bres12[$bin]}, - $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] - - $UPCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]) - if numberp($UPCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]); - push(@{$uc_bres34[$bin]}, - $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] - - $UPCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]) - if numberp($UPCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]); - } +} +for ($ens=$LADCP_atbottom; $ens<=$lastGoodEns; $ens++) { # UPCAST + next unless numberp($LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH}); + my(@bindepth) = binDepths($ens); + for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { + next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); + next unless numberp($UPCAST{MEDIAN_W}[$bindepth[$bin]/$opt_o]); + push(@{$uc_bres12[$bin]}, + $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] + - $UPCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]) + if numberp($UPCAST{MEDIAN_W12}[$bindepth[$bin]/$opt_o]); + push(@{$uc_bres34[$bin]}, + $LADCP{ENSEMBLE}[$ens]->{SSCORRECTED_OCEAN_W}[$bin] + - $UPCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]) + if numberp($UPCAST{MEDIAN_W34}[$bindepth[$bin]/$opt_o]); } - local(@dc_avg_bres12,@uc_avg_bres12,@dc_avg_bres12_nsamp,@uc_avg_bres12_nsamp); # means/stddevs - local(@dc_avg_bres34,@uc_avg_bres34,@dc_avg_bres34_nsamp,@uc_avg_bres34_nsamp); - for (my($bin)=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { - $dc_bres12_nsamp[$bin] = @{$dc_bres12[$bin]}; - if ($dc_bres12_nsamp[$bin] > 0) { - $dc_avg_bres12[$bin] = avg(@{$dc_bres12[$bin]}); - $dc_sig_bres12[$bin] = stddev2($dc_avg_bres12[$bin],@{$dc_bres12[$bin]}); - } else { - $dc_avg_bres12[$bin] = nan; - $dc_sig_bres12[$bin] = nan; - } - $uc_bres12_nsamp[$bin] = @{$uc_bres12[$bin]}; - if ($uc_bres12_nsamp[$bin] > 0) { - $uc_avg_bres12[$bin] = avg(@{$uc_bres12[$bin]}); - $uc_sig_bres12[$bin] = stddev2($uc_avg_bres12[$bin],@{$uc_bres12[$bin]}); - } else { - $uc_avg_bres12[$bin] = nan; - $uc_sig_bres12[$bin] = nan; - } - $dc_bres34_nsamp[$bin] = @{$dc_bres34[$bin]}; - if ($dc_bres34_nsamp[$bin] > 0) { - $dc_avg_bres34[$bin] = avg(@{$dc_bres34[$bin]}); - $dc_sig_bres34[$bin] = stddev2($dc_avg_bres34[$bin],@{$dc_bres34[$bin]}); - } else { - $dc_avg_bres34[$bin] = nan; - $dc_sig_bres34[$bin] = nan; - } - $uc_bres34_nsamp[$bin] = @{$uc_bres34[$bin]}; - if ($uc_bres34_nsamp[$bin] > 0) { - $uc_avg_bres34[$bin] = avg(@{$uc_bres34[$bin]}); - $uc_sig_bres34[$bin] = stddev2($uc_avg_bres34[$bin],@{$uc_bres34[$bin]}); - } else { - $uc_avg_bres34[$bin] = nan; - $uc_sig_bres34[$bin] = nan; - } +} +local(@dc_avg_bres12,@uc_avg_bres12,@dc_avg_bres12_nsamp,@uc_avg_bres12_nsamp); # means/stddevs +local(@dc_avg_bres34,@uc_avg_bres34,@dc_avg_bres34_nsamp,@uc_avg_bres34_nsamp); +for (my($bin)=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { + $dc_bres12_nsamp[$bin] = @{$dc_bres12[$bin]}; + if ($dc_bres12_nsamp[$bin] > 0) { + $dc_avg_bres12[$bin] = avg(@{$dc_bres12[$bin]}); + $dc_sig_bres12[$bin] = stddev2($dc_avg_bres12[$bin],@{$dc_bres12[$bin]}); + } else { + $dc_avg_bres12[$bin] = nan; + $dc_sig_bres12[$bin] = nan; } + $uc_bres12_nsamp[$bin] = @{$uc_bres12[$bin]}; + if ($uc_bres12_nsamp[$bin] > 0) { + $uc_avg_bres12[$bin] = avg(@{$uc_bres12[$bin]}); + $uc_sig_bres12[$bin] = stddev2($uc_avg_bres12[$bin],@{$uc_bres12[$bin]}); + } else { + $uc_avg_bres12[$bin] = nan; + $uc_sig_bres12[$bin] = nan; + } + $dc_bres34_nsamp[$bin] = @{$dc_bres34[$bin]}; + if ($dc_bres34_nsamp[$bin] > 0) { + $dc_avg_bres34[$bin] = avg(@{$dc_bres34[$bin]}); + $dc_sig_bres34[$bin] = stddev2($dc_avg_bres34[$bin],@{$dc_bres34[$bin]}); + } else { + $dc_avg_bres34[$bin] = nan; + $dc_sig_bres34[$bin] = nan; + } + $uc_bres34_nsamp[$bin] = @{$uc_bres34[$bin]}; + if ($uc_bres34_nsamp[$bin] > 0) { + $uc_avg_bres34[$bin] = avg(@{$uc_bres34[$bin]}); + $uc_sig_bres34[$bin] = stddev2($uc_avg_bres34[$bin],@{$uc_bres34[$bin]}); + } else { + $uc_avg_bres34[$bin] = nan; + $uc_sig_bres34[$bin] = nan; + } +} - local($uc_bres12_max_nsamp,$dc_bres12_max_nsamp) = (0,0); # calc rms in block of well sampled bins - local($uc_bres34_max_nsamp,$dc_bres34_max_nsamp) = (0,0); - for (my($bin)=$LADCP_firstBin; $bin<=$LADCP_lastBin-1; $bin++) { # SKIP 1ST BIN!!! - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); # skip bins not included in gridded output - $dc_bres12_max_nsamp = $dc_bres12_nsamp[$bin] # nsamp in best sampled bin - if ($dc_bres12_nsamp[$bin] > $dc_bres12_max_nsamp); - $uc_bres12_max_nsamp = $uc_bres12_nsamp[$bin] - if ($uc_bres12_nsamp[$bin] > $uc_bres12_max_nsamp); - $dc_bres34_max_nsamp = $dc_bres34_nsamp[$bin] # nsamp in best sampled bin - if ($dc_bres34_nsamp[$bin] > $dc_bres34_max_nsamp); - $uc_bres34_max_nsamp = $uc_bres34_nsamp[$bin] - if ($uc_bres34_nsamp[$bin] > $uc_bres34_max_nsamp); +local($uc_bres12_max_nsamp,$dc_bres12_max_nsamp) = (0,0); # calc rms in block of well sampled bins +local($uc_bres34_max_nsamp,$dc_bres34_max_nsamp) = (0,0); +for (my($bin)=$LADCP_firstBin; $bin<=$LADCP_lastBin-1; $bin++) { # SKIP 1ST BIN!!! + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); # skip bins not included in gridded output + $dc_bres12_max_nsamp = $dc_bres12_nsamp[$bin] # nsamp in best sampled bin + if ($dc_bres12_nsamp[$bin] > $dc_bres12_max_nsamp); + $uc_bres12_max_nsamp = $uc_bres12_nsamp[$bin] + if ($uc_bres12_nsamp[$bin] > $uc_bres12_max_nsamp); + $dc_bres34_max_nsamp = $dc_bres34_nsamp[$bin] # nsamp in best sampled bin + if ($dc_bres34_nsamp[$bin] > $dc_bres34_max_nsamp); + $uc_bres34_max_nsamp = $uc_bres34_nsamp[$bin] + if ($uc_bres34_nsamp[$bin] > $uc_bres34_max_nsamp); +} +my($dc_sumsq12,$uc_sumsq12,$dc_n12,$uc_n12) = (0,0,0,0); # calc rms residuals +my($dc_sumsq34,$uc_sumsq34,$dc_n34,$uc_n34) = (0,0,0,0); +for (my($bin)=$LADCP_firstBin; $bin<=$LADCP_lastBin-1; $bin++) { # SKIP 1ST BIN + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); # skip bins not included in gridded output + if ($dc_bres12_nsamp[$bin] >= $dc_bres12_max_nsamp/3) { # skip bins with < 1/3 max(nsamp) + $dc_sumsq12 += $dc_avg_bres12[$bin]**2; + $dc_n12++; } - my($dc_sumsq12,$uc_sumsq12,$dc_n12,$uc_n12) = (0,0,0,0); # calc rms residuals - my($dc_sumsq34,$uc_sumsq34,$dc_n34,$uc_n34) = (0,0,0,0); - for (my($bin)=$LADCP_firstBin; $bin<=$LADCP_lastBin-1; $bin++) { # SKIP 1ST BIN - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); # skip bins not included in gridded output - if ($dc_bres12_nsamp[$bin] >= $dc_bres12_max_nsamp/3) { # skip bins with < 1/3 max(nsamp) - $dc_sumsq12 += $dc_avg_bres12[$bin]**2; - $dc_n12++; - } - if ($uc_bres12_nsamp[$bin] >= $uc_bres12_max_nsamp/3) { - $uc_sumsq12 += $uc_avg_bres12[$bin]**2; - $uc_n12++; - } - if ($dc_bres34_nsamp[$bin] >= $dc_bres34_max_nsamp/3) { # skip bins with < 1/3 max(nsamp) - $dc_sumsq34 += $dc_avg_bres34[$bin]**2; - $dc_n34++; - } - if ($uc_bres34_nsamp[$bin] >= $uc_bres34_max_nsamp/3) { - $uc_sumsq34 += $uc_avg_bres34[$bin]**2; - $uc_n34++; - } + if ($uc_bres12_nsamp[$bin] >= $uc_bres12_max_nsamp/3) { + $uc_sumsq12 += $uc_avg_bres12[$bin]**2; + $uc_n12++; + } + if ($dc_bres34_nsamp[$bin] >= $dc_bres34_max_nsamp/3) { # skip bins with < 1/3 max(nsamp) + $dc_sumsq34 += $dc_avg_bres34[$bin]**2; + $dc_n34++; + } + if ($uc_bres34_nsamp[$bin] >= $uc_bres34_max_nsamp/3) { + $uc_sumsq34 += $uc_avg_bres34[$bin]**2; + $uc_n34++; } - $dc_bres12_rms = ($dc_n12 > 0) ? sqrt($dc_sumsq12/$dc_n12) : nan; - $uc_bres12_rms = ($uc_n12 > 0) ? sqrt($uc_sumsq12/$uc_n12) : nan; - $dc_bres34_rms = ($dc_n34 > 0) ? sqrt($dc_sumsq34/$dc_n34) : nan; - $uc_bres34_rms = ($uc_n34 > 0) ? sqrt($uc_sumsq34/$uc_n34) : nan; +} +$dc_bres12_rms = ($dc_n12 > 0) ? sqrt($dc_sumsq12/$dc_n12) : nan; +$uc_bres12_rms = ($uc_n12 > 0) ? sqrt($uc_sumsq12/$uc_n12) : nan; +$dc_bres34_rms = ($dc_n34 > 0) ? sqrt($dc_sumsq34/$dc_n34) : nan; +$uc_bres34_rms = ($uc_n34 > 0) ? sqrt($uc_sumsq34/$uc_n34) : nan; - &antsAddParams('dc_bin_residuals12.rms',$dc_bres12_rms, - 'dc_bin_residuals34.rms',$dc_bres34_rms, - 'uc_bin_residuals12.rms',$uc_bres12_rms, - 'uc_bin_residuals34.rms',$uc_bres34_rms); - - progress("\n\twriting binned residuals to "); +&antsAddParams('dc_bin_residuals12.rms',$dc_bres12_rms, + 'dc_bin_residuals34.rms',$dc_bres34_rms, + 'uc_bin_residuals12.rms',$uc_bres12_rms, + 'uc_bin_residuals34.rms',$uc_bres34_rms); + +progress("\n\twriting binned residuals to "); - my($saveParams) = $antsCurParams; - @antsNewLayout = ('bin','dc_residual12','dc_residual12.sig','dc_residual12.nsamp', - 'uc_residual12','uc_residual12.sig','uc_residual12.nsamp', - 'dc_residual34','dc_residual34.sig','dc_residual34.nsamp', - 'uc_residual34','uc_residual34.sig','uc_residual34.nsamp'); - &antsAddParams('BR_max_bin',max(scalar(@dc_bres12),scalar(@uc_bres12), - scalar(@dc_bres34),scalar(@uc_bres34))); +my($saveParams) = $antsCurParams; +@antsNewLayout = ('bin','dc_residual12','dc_residual12.sig','dc_residual12.nsamp', + 'uc_residual12','uc_residual12.sig','uc_residual12.nsamp', + 'dc_residual34','dc_residual34.sig','dc_residual34.nsamp', + 'uc_residual34','uc_residual34.sig','uc_residual34.nsamp'); +&antsAddParams('BR_bin.max',max(scalar(@dc_bres12),scalar(@uc_bres12), + scalar(@dc_bres34),scalar(@uc_bres34))); - foreach my $of (@out_BR) { - progress("<$of> "); - my($sub,$arg) = ($of =~ /^([^\(]+)\(([^\)]+)\)$/); # plot_sub(out_file) - if (defined($arg)) { - require "$WCALC/${sub}.pl"; - &{$sub}($arg); - next; - } - $of = ">$of" unless ($of =~ /^$|^\s*\|/); - open(STDOUT,$of) || error("$of: $!\n"); - undef($antsActiveHeader) unless ($ANTS_TOOLS_AVAILABLE); - for (my($bin)=0; $bin&2"); +foreach my $of (@out_BR) { + progress("<$of> "); + my($sub,$arg) = ($of =~ /^([^\(]+)\(([^\)]+)\)$/); # plot_sub(out_file) + if (defined($arg)) { + require "$WCALC/${sub}.pl"; + &{$sub}($arg); + next; } - $antsCurParams = $saveParams; - progress("\n"); -#} + $of = ">$of" unless ($of =~ /^$|^\s*\|/); + open(STDOUT,$of) || error("$of: $!\n"); + undef($antsActiveHeader) unless ($ANTS_TOOLS_AVAILABLE); + for (my($bin)=0; $bin&2"); +} +$antsCurParams = $saveParams; +progress("\n"); #-------------------------------------------------- # Calculate BT-referenced vertical-velocity profile @@ -2075,14 +2174,14 @@ my($sumSq) = my($n) = 0; for (my($bi)=0; $bi<=$#{$BT{MEDIAN_W}}; $bi++) { - next unless defined($BT{MEDIAN_W}[$bi]); + next unless numbersp($BT{MEDIAN_W}[$bi],$DNCAST{MEDIAN_W}[$bi],$UPCAST{MEDIAN_W}[$bi]); next unless ($BT{N_SAMP}[$bi]>=$opt_k && $DNCAST{N_SAMP}[$bi]>=$opt_k && $UPCAST{N_SAMP}[$bi]>=$opt_k); $sumSq += ($BT{MEDIAN_W}[$bi] - $DNCAST{MEDIAN_W}[$bi]/2 - $UPCAST{MEDIAN_W}[$bi]/2)**2; $n++; } if ($n > 0) { my($rms) = round(sqrt($sumSq/$n),0.001); - &antsAddParams('BT_rms_w_discrepancy',$rms); + &antsAddParams('BT_w_discrepancy.rms',$rms); progress("\t$rms m/s rms vertical-velocity discrepancy\n"); } } @@ -2128,6 +2227,7 @@ for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); my($bi) = $bindepth[$bin]/$opt_o; + next unless numberp($DNCAST{MEDIAN_W}[$bi]); &antsOut( $LADCP{ENSEMBLE}[$ens]->{NUMBER},$bin+1, $CTD{ELAPSED}[$LADCP{ENSEMBLE}[$ens]->{CTD_SCAN}], @@ -2168,6 +2268,7 @@ for ($bin=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { next unless numberp($LADCP{ENSEMBLE}[$ens]->{W}[$bin]); my($bi) = $bindepth[$bin]/$opt_o; + next unless numberp($UPCAST{MEDIAN_W}[$bi]); &antsOut( $LADCP{ENSEMBLE}[$ens]->{NUMBER},$bin+1, $CTD{ELAPSED}[$LADCP{ENSEMBLE}[$ens]->{CTD_SCAN}], @@ -2217,8 +2318,12 @@ push(@antsNewLayout,'depth','hab', # consistent with [LADCP_w_postproc] 'dc_elapsed','dc_w','dc_w.mad','dc_w.nsamp', 'uc_elapsed','uc_w','uc_w.mad','uc_w.nsamp'); - push(@antsNewLayout,'dc_depth','dc_w12','dc_w34','dc_v12','dc_v34', # additional fields (inconsistent w postproc) + push(@antsNewLayout,'dc_lr_bp_res.rms', # additional fields (inconsistent w postproc) + 'dc_depth','dc_w12','dc_w34','dc_v12','dc_v34', + 'uc_lr_bp_res.rms', 'uc_depth','uc_w12','uc_w34','uc_v12','uc_v34', + 'dc_pitch.mu','dc_roll.mu','dc_tilt.mu', + 'uc_pitch.mu','uc_roll.mu','uc_tilt.mu', 'BT_w','BT_w.mad','BT_w.nsamp'); foreach my $of (@out_profile) { @@ -2244,12 +2349,16 @@ $UPCAST{MEAN_ELAPSED}[$bi], # uc data consistent w postproc $UPCAST{N_SAMP}[$bi]>=$opt_k?$UPCAST{MEDIAN_W}[$bi]:nan, $UPCAST{MAD_W}[$bi],$UPCAST{N_SAMP}[$bi], - $DNCAST{MEAN_DEPTH}[$bi], # remaining dc data + $DNCAST{LR_RMS_BP_RESIDUAL}[$bi], # remaining dc data + $DNCAST{MEAN_DEPTH}[$bi], $DNCAST{MEDIAN_W12}[$bi],$DNCAST{MEDIAN_W34}[$bi], $DNCAST{MEDIAN_V12}[$bi],$DNCAST{MEDIAN_V34}[$bi], - $UPCAST{MEAN_DEPTH}[$bi], # remaining uc data + $UPCAST{LR_RMS_BP_RESIDUAL}[$bi], # remaining uc data + $UPCAST{MEAN_DEPTH}[$bi], $UPCAST{MEDIAN_W12}[$bi],$UPCAST{MEDIAN_W34}[$bi], $UPCAST{MEDIAN_V12}[$bi],$UPCAST{MEDIAN_V34}[$bi], + $DNCAST{MEAN_PITCH}[$bi],$DNCAST{MEAN_ROLL}[$bi],$DNCAST{MEAN_TILT}[$bi], # instrument tilt + $UPCAST{MEAN_PITCH}[$bi],$UPCAST{MEAN_ROLL}[$bi],$UPCAST{MEAN_TILT}[$bi], $BT{N_SAMP}[$bi]>=$opt_k?$BT{MEDIAN_W}[$bi]:nan, # BT data $BT{MAD_W}[$bi],$BT{N_SAMP}[$bi] ); diff -r 2d8e1139acd5 -r 8f120b9f795a LADCP_w_postproc --- a/LADCP_w_postproc Sat Apr 10 06:00:45 2021 -0400 +++ b/LADCP_w_postproc Sat Jul 24 10:35:41 2021 -0400 @@ -2,9 +2,9 @@ #====================================================================== # L A D C P _ W _ P O S T P R O C # doc: Fri Apr 24 17:15:59 2015 -# dlm: Thu Nov 1 10:55:34 2018 +# dlm: Fri Jul 23 14:03:05 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 71 77 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 740 38 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== $antsSummary = 'edit and re-grid LADCP vertical-velocity samples'; @@ -69,6 +69,19 @@ # Dec 9, 2017: - added $antsSuppressCommonOptions = 1; # Oct 31, 2018: - improved label (no longer explained/residual stddev) # Nov 1, 2018: - made layout consistent for dual- and single-head profiles +# Jul 1, 2021: - made %PARAMs more standard +# - added -z to remove biases +# - added %?c_w_diff.rms to output +# - BUG: dc_corr returned strange rms +# Jul 7, 2021: - reversed logic of -z (enables bias correction by default) +# - BUG: plot had label in wrong location for single-head profiles +# Jul 9, 2021: - added window correlation stats +# - updated %PARAM names +# Jul 13, 2021: - BUG: dc_sig, dc_rms confusion +# Jul 23, 2021: - added summary info to plot +# - added seabed to plot +# - added annotations to plot +# HISTORY END ($ANTS) = (`which ANTSlib` =~ m{^(.*)/[^/]*$}); @@ -85,8 +98,9 @@ &antsAddParams('LADCP_w_postproc::version',$VERSION); $antsSuppressCommonOptions = 1; -&antsUsage('b:d:i:k:l:o:p:v:w:',1, +&antsUsage('b:d:i:k:l:o:p:v:w:z',1, '[profile -i)d ]', + '[disable -z)eroing of (disable bias correction)]', '[-o)utput bin ] [-k) require samples]', '[-v)alid bins
,
[,
    ,]', '[-w) ,[,,]', @@ -156,9 +170,6 @@ #---------------------------------------------------------------------- if (-t STDOUT) { -# $opt_p = defined($opt_d) ? "$opt_d/%03d_wprof.ps,$opt_d/%03d_wcorr.ps" -# : '%03d_wprof.ps,%03d_wcorr.ps' -# unless defined($opt_p); $opt_p = defined($opt_d) ? "$opt_d/%03d_wprof.ps" : '%03d_wprof.ps' unless defined($opt_p); $outfile = defined($opt_d) ? sprintf('%s/%03d.wprof',$opt_d,$id) @@ -235,26 +246,36 @@ } #---------------------------------------------------------------------- -# Main Program +# Correlation Statistics +# +# return values: +# R correlation coefficient w_DL,w_UL +# var variance of avg(w_DL,w_UL) +# DL_var variance of w_DL +# UL_var variance of w_DL +# rms_diff rms of w_DL-w_UL #---------------------------------------------------------------------- -sub dc_corr() +sub dc_corr($$) { + my($fi,$li) = @_; my($n) = 0; my($ax,$ay) = (0,0); + my($ssq_diff) = 0; - for (my($bi)=int($opt_s/$opt_o); $bi<@DL_dc_median; $bi++) { + for (my($bi)=$fi; $bi<=$li; $bi++) { next unless numberp($DL_dc_median[$bi]) && numberp($UL_dc_median[$bi]); $n++; $ax += $DL_dc_median[$bi]; $ay += $UL_dc_median[$bi]; + $ssq_diff += ($DL_dc_median[$bi] - $UL_dc_median[$bi])**2; } - return (nan,nan,nan) unless ($n > 2); + return (nan,nan,nan,nan,nan) unless ($n > 2); $ax /= $n; $ay /= $n; my($syy,$sxy,$sxx) = (0,0,0); - for (my($bi)=int($opt_s/$opt_o); $bi<@DL_dc_median; $bi++) { + for (my($bi)=$fi; $bi<=$li; $bi++) { next unless numberp($DL_dc_median[$bi]) && numberp($UL_dc_median[$bi]); my($xt) = $DL_dc_median[$bi] - $ax; my($yt) = $UL_dc_median[$bi] - $ay; @@ -263,27 +284,33 @@ $sxy += $xt * $yt; } my($R) = $sxy/(sqrt($sxx * $syy) + 1e-16); - my($rms) = sqrt($sxx/$n); - return ($R,$rms); + my($var) = ($sxx + $syy) / (2*$n); # variance of avg(w_DL,w_UL) + my($var_DL) = $sxx/$n; + my($var_UL) = $syy/$n; + my($rms_diff) = sqrt($ssq_diff/$n); + return ($R,$var,$var_DL,$var_UL,$rms_diff); } -sub uc_corr(@) +sub uc_corr($$) { + my($fi,$li) = @_; my($n) = 0; my($ax,$ay) = (0,0); + my($ssq_diff) = 0; - for (my($bi)=int($opt_s/$opt_o); $bi<@DL_dc_median; $bi++) { + for (my($bi)=$fi; $bi<=$li; $bi++) { next unless numberp($DL_uc_median[$bi]) && numberp($UL_uc_median[$bi]); $n++; $ax += $DL_uc_median[$bi]; $ay += $UL_uc_median[$bi]; + $ssq_diff += ($DL_uc_median[$bi] - $UL_uc_median[$bi])**2; } - return (nan,nan,nan) unless ($n > 2); + return (nan,nan,nan,nan,nan) unless ($n > 2); $ax /= $n; $ay /= $n; my($syy,$sxy,$sxx) = (0,0,0); - for (my($bi)=int($opt_s/$opt_o); $bi<@DL_dc_median; $bi++) { + for (my($bi)=$fi; $bi<=$li; $bi++) { next unless numberp($DL_uc_median[$bi]) && numberp($UL_uc_median[$bi]); my($xt) = $DL_uc_median[$bi] - $ax; my($yt) = $UL_uc_median[$bi] - $ay; @@ -292,11 +319,16 @@ $sxy += $xt * $yt; } my($R) = $sxy/(sqrt($sxx * $syy) + 1e-16); - my($sig) = sqrt(($sxx+$syy)/(2*$n)); # stddev of average w signal from DL & UL - return ($R,$sig); + my($var) = ($sxx + $syy) / (2*$n); # variance of avg(w_DL,w_UL) + my($var_DL) = $sxx/$n; + my($var_UL) = $syy/$n; + my($rms_diff) = sqrt($ssq_diff/$n); + return ($R,$var,$var_DL,$var_UL,$rms_diff); } #---------------------------------------------------------------------- +# Main Program +#---------------------------------------------------------------------- $dcwF = &fnr($Ddwf); $ucwF = &fnr($Duwf); $eF = &fnr('elapsed'); @@ -304,10 +336,18 @@ $bF = &fnr('bin'); $dcF = &fnr('downcast'); -$first_label = &antsRequireParam('run_label'); -$bin_length = &antsRequireParam('ADCP_bin_length'); -$pulse_length = &antsRequireParam('ADCP_pulse_length'); -$blanking_dist = &antsRequireParam('ADCP_blanking_distance'); +$first_label = &antsRequireParam('run_label'); + +$bin_length = &antsRequireParam('ADCP_bin_length'); +$pulse_length = &antsRequireParam('ADCP_pulse_length'); +$blanking_dist = &antsRequireParam('ADCP_blanking_distance'); +$instrument_type = &antsRequireParam('ADCP_type'); +$xducer_frequency = &antsRequireParam('ADCP_frequency'); +$orientation = &antsRequireParam('ADCP_orientation'); + +$dc_var = &antsRequireParam('dc_w.var'); # for dual-head LADCPs, variables will be +$uc_var = &antsRequireParam('uc_w.var'); # overwritten by [du]c_corr() + ($dayNoP,$dn) = &antsFindParam('dn\d\d'); croak("$0: cannot determine day number\n") unless defined($dayNoP); @@ -404,21 +444,21 @@ # blanking distance: use smaller value, which is conservative e.g. for filters for ringing # my($warned); - unless (round($bin_length) == round($P{ADCP_bin_length})) { + unless (round($bin_length) == round(&antsRequireParam('ADCP_bin_length'))) { unless ($warned) { &antsInfo("WARNING: inconsistent ADCP sampling parameters in profile #$id --- using conservative values"); $warned = 1; } $bin_length = min($bin_length,$P{ADCP_bin_length}); } - unless (round($pulse_length) == round($P{ADCP_pulse_length})) { + unless (round($pulse_length) == round(&antsRequireParam('ADCP_pulse_length'))) { unless ($warned) { &antsInfo("WARNING: inconsistent ADCP sampling parameters in profile #$id --- using conservative values"); $warned = 1; } $pulse_length = min($pulse_length,$P{ADCP_pulse_length}); } - unless (round($blanking_dist) == round($P{ADCP_blanking_distance})) { + unless (round($blanking_dist) == round(&antsRequireParam('ADCP_blanking_distance'))) { unless ($warned) { &antsInfo("WARNING: inconsistent ADCP sampling parameters in profile #$id --- using conservative values"); $warned = 1; @@ -426,6 +466,10 @@ $blanking_dist = min($blanking_dist,$P{ADCP_blanking_distance}); } + $instrument_type2 = &antsRequireParam('ADCP_type'); # for summary info + $xducer_frequency2 = &antsRequireParam('ADCP_frequency'); + $orientation2 = &antsRequireParam('ADCP_orientation'); + $PROF = $STN = $ID = $id; $RUN = antsRequireParam('run_label'); # set variables for editing undef(@rngMin); undef(@rngMax); undef(@bins); unless ($return = do "./EditParams") { # man perlfunc @@ -460,13 +504,15 @@ my($bi) = $ants_[0][$dF]/$opt_o; if ($ants_[0][$dcF]) { # downcast - push(@{$dcw[$bi]},$ants_[0][$dcwF]); # vertical velocity - push(@{$dcw1[$bi]},$ants_[0][$dcwF]) if ($dual_head); # single-instrument w - push(@{$dce[$bi]},$ants_[0][$eF]); # elapsed time + push(@{$dcw[$bi]}, $ants_[0][$dcwF] - (!$opt_z ? $P{'dc_w.mu'} : 0)); # vertical velocity + push(@{$dcw1[$bi]},$ants_[0][$dcwF] - (!$opt_z ? $P{'dc_w.mu'} : 0)) # single-instrument w + if ($dual_head); + push(@{$dce[$bi]}, $ants_[0][$eF]); # elapsed time } else { # upcast - push(@{$ucw[$bi]},$ants_[0][$ucwF]); - push(@{$ucw1[$bi]},$ants_[0][$ucwF]) if ($dual_head); - push(@{$uce[$bi]},$ants_[0][$eF]); + push(@{$ucw[$bi]}, $ants_[0][$ucwF] - (!$opt_z ? $P{'uc_w.mu'} : 0)); + push(@{$ucw1[$bi]},$ants_[0][$ucwF] - (!$opt_z ? $P{'uc_w.mu'} : 0)) + if ($dual_head); + push(@{$uce[$bi]}, $ants_[0][$eF]); } } # file-read loop @@ -480,9 +526,35 @@ ? $DL_uc_median[$bi] - $UL_uc_median[$bi] : nan; } - ($dc_R,$dc_sig) = &dc_corr(); # correlation statistics - ($uc_R,$uc_sig) = &uc_corr(); - &antsAddParams('dc_R',$dc_R,'uc_R',$uc_R,'dc_w.sig',$dc_sig,'uc_w.sig',$uc_sig); + ($dc_R,$dc_var,$dc_var_DL,$dc_var_UL,$dc_rms_wdiff) = &dc_corr(int($opt_s/$opt_o),$#dcw1); # correlation statistics + ($uc_R,$uc_var,$uc_var_DL,$uc_var_UL,$uc_rms_wdiff) = &uc_corr(int($opt_s/$opt_o),$#ucw1); + &antsAddParams('dc_w.R',$dc_R,'uc_w.R',$uc_R, + 'DL_dc_w.var',$dc_var_DL,'UL_dc_w.var',$dc_var_UL, + 'DL_uc_w.var',$uc_var_DL,'UL_uc_w.var',$uc_var_UL, + 'dc_w.var',$dc_var,'uc_w.var',$uc_var, + 'dc_wdiff.rms',$dc_rms_wdiff,'uc_wdiff.rms',$uc_rms_wdiff); + + my($last_depth,$last_bi,$dc_sumsq_res,$dc_n,$uc_sumsq_res,$uc_n); # window correlation + for (my($bi)=0; $bi<=$#dcw1; $bi++) { + ($dc_R[$bi],$dc_var[$bi],$dummy,$dummy,$dc_rms_wdiff[$bi]) = + &dc_corr(max(0,$bi-int(250/$opt_o)),min($#dcw1,$bi+int(250/$opt_o))); + ($uc_R[$bi],$uc_var[$bi],$dummy,$dummy,$uc_rms_wdiff[$bi]) = + &uc_corr(max(0,$bi-int(250/$opt_o)),min($#dcw1,$bi+int(250/$opt_o))); + } + +# my($depth) = ($bi+0.5) * $opt_o; +# unless (defined($last_bi)) { +# $last_bi = $bi; +# $last_depth = $depth; +# next; +# } +# if ($depth >= $last_depth+500 || $bi == $#dcw1) { +# ($dc_R[$bi],$dc_rms[$bi],$dc_rms_wdiff[$bi]) = &dc_corr($last_bi,$bi); +# ($uc_R[$bi],$uc_rms[$bi],$uc_rms_wdiff[$bi]) = &uc_corr($last_bi,$bi); +# undef($last_bi); +# next; +# } +# } if (defined($opt_p)) { # plot 2nd-instrument profiles GMT_psxy('-W1,coral,.'); @@ -501,18 +573,21 @@ #---------------------------------------------------------------------- # Average and Output Profiles, Add to Summary Plot +# - same output file layout for single- and dual-head systems #---------------------------------------------------------------------- @antsNewLayout = ('depth','hab', 'dc_elapsed','dc_w','dc_w.mad','dc_w.nsamp', 'uc_elapsed','uc_w','uc_w.mad','uc_w.nsamp', - 'dc_w.diff','uc_w.diff'); # DL-UL differences + 'dc_w.diff','uc_w.diff', # DL-UL differences + 'dc_w.R','dc_w.var','dc_wdiff.rms', + 'uc_w.R','uc_w.var','uc_wdiff.rms'); if ($dual_head) { # dual-head output &antsAddParams('profile_id',$id,'lat',$P{lat},'lon',$P{lon}); # selected %PARAMs &antsAddParams($dayNoP,$dn,'run_label',"$first_label & $P{run_label}"); &antsAddParams('outgrid_dz',$opt_o,'outgrid_minsamp',$opt_k); - &antsAddParams('min_depth',round($min_depth),'max_depth',round($max_depth)); + &antsAddParams('depth.min',round($min_depth),'depth.max',round($max_depth)); &antsAddParams('water_depth',$P{water_depth},'water_depth.sig',$P{water_depth.sig}); &antsAddParams('ADCP_bin_length',$bin_length,'ADCP_pulse_length',$pulse_length); &antsAddParams('ADCP_blanking_distance',$blanking_dist); @@ -540,9 +615,11 @@ (($ucns[$bi]>=$opt_k)?$ucwm[$bi]:nan),(($ucns[$bi]>=$opt_k)?$ucwmad[$bi]:nan), scalar(@{$ucw[$bi]})); if ($dual_head) { - push(@{$out[$bi]},$dc_diff[$bi],$uc_diff[$bi]); + push(@{$out[$bi]},$dc_diff[$bi],$uc_diff[$bi], + $dc_R[$bi],$dc_var[$bi],$dc_rms_wdiff[$bi], + $uc_R[$bi],$uc_var[$bi],$uc_rms_wdiff[$bi]); } else { - push(@{$out[$bi]},nan,nan); + push(@{$out[$bi]},nan,nan,nan,nan,nan,nan); } &antsOut(@{$out[$bi]}); } @@ -550,6 +627,11 @@ if (defined($opt_p)) { # complete summary plot GMT_setR($R); + if ($P{water_depth} > 0) { # SEABED + GMT_psxy('-G204/153/102'); + print(GMT "$xmin $ymax\n0.07 $ymax\n0.07 $P{water_depth}\n $xmin $P{water_depth}\n"); + } + GMT_psxy('-W1.5,coral'); # median profiles for (my($bi)=0; $bi<=$#dcw; $bi++) { printf(GMT "%f %f\n",(($dcns[$bi]>=$opt_k)?$dcwm[$bi]:nan),($bi+0.5)*$opt_o); @@ -592,32 +674,78 @@ if ($dual_head) { GMT_psxy('-W1,100/100/255'); # surface layer limit print(GMT "-0.1 $opt_s\n0.07 $opt_s\n"); - GMT_unitcoords(); - if ($dc_R < 0.3 || !numberp($dc_R)) { # correlation statistics - &antsInfo("WARNING: low dc correlation (r = %.1f) between UL and DL data in profile #$id",$dc_R); - GMT_pstext('-F+f12,Helvetica,coral+jTL -Gred'); - } elsif ($dc_R < 0.5) { GMT_pstext('-F+f12,Helvetica,coral+jTL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,coral+jTL -Gwhite'); } - printf(GMT "%f %f r = %.1f\n",0.62,0.01,$dc_R); - GMT_pstext('-F+f12,Helvetica,coral+jTR -Gwhite'); - printf(GMT "%f %f [%.1f cm/s stddev]\n",0.99,0.01,100*$dc_sig); - if ($uc_R < 0.3 || !numberp($uc_R)) { - &antsInfo("WARNING: low uc correlation (r = %.1f) between UL and DL data in profile #$id",$uc_R); - GMT_pstext('-F+f12,Helvetica,SeaGreen+jTL -Gred'); - } elsif ($uc_R < 0.5) { GMT_pstext('-F+f12,Helvetica,SeaGreen+jTL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,SeaGreen+jTL -Gwhite'); } - printf(GMT "%f %f r = %.1f\n",0.62,0.05,$uc_R); - GMT_pstext('-F+f12,Helvetica,SeaGreen+jTR -Gwhite'); - printf(GMT "%f %f [%.1f cm/s stddev]\n",0.99,0.05,100*$uc_sig); + } + + GMT_unitcoords(); + my(@y) = (1.018,1.052,1.076,1.109); + + GMT_pstext('-F+f9,Helvetica,CornFlowerBlue+jTL -N'); # summary information + if ($dual_head) { + printf(GMT "0.64 $y[0] Dual-Head (%d / %d kHz)\n", + round($xducer_frequency,50),round($xducer_frequency2,50)); + } else { + printf(GMT "0.64 $y[0] %d kHz $instrument_type $orientation\n", + round($xducer_frequency,50)); + } + print( GMT "0.64 $y[1] rms \n 0.77 $y[1] :\n"); + if ($dual_head) { + printf(GMT "0.64 $y[2] rms @~D@~w\n 0.77 %f :\n",$y[2]+0.007); + printf(GMT "0.64 %f correl. (r)\n 0.77 $y[3] :\n",$y[3]-0.005); } - GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); + if ($dual_head) { + if ($dc_rms_wdiff > sqrt($dc_var)) { + GMT_pstext('-F+f9,Helvetica,coral+jTR -N -Gyellow'); + } else { + GMT_pstext('-F+f9,Helvetica,coral+jTR -N'); + } + if (numberp($dc_R)) { + &antsInfo("WARNING: low dc correlation (r = %.1f) between UL and DL data in profile #$id",$dc_R) + if ($dc_R < 0.3); + printf(GMT "0.88 %f %.1fmm/s\n",$y[1]-0.005,round(sqrt($dc_var)*1000,.1)); + printf(GMT "0.88 %f %.1fmm/s\n",$y[2]+0.001,round($dc_rms_wdiff*1000,.1)); + printf(GMT "0.88 %f %.1f",$y[3]-0.005,$dc_R); + } else { + &antsInfo("WARNING: no overlap between UL and DL dc data below the surface layer in profile #$id"); + } + } else { + GMT_pstext('-F+f9,Helvetica,coral+jTR -N'); + printf(GMT "0.88 %f %.1fmm/s\n",$y[1]-0.005,round(sqrt($dc_var)*1000,.1)); + } + + if ($dual_head) { + if ($uc_rms_wdiff > sqrt($uc_var)) { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTR -N -Gyellow'); + } else { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTR -N'); + } + if (numberp($uc_R)) { + &antsInfo("WARNING: low uc correlation (r = %.1f) between UL and DL data in profile #$id",$uc_R) + if ($uc_R < 0.3); + printf(GMT "0.99 %f %.1fmm/s\n",$y[1]-0.005,round(sqrt($uc_var)*1000,.1)); + printf(GMT "0.99 %f %.1fmm/s\n",$y[2]+0.001,round($uc_rms_wdiff*1000,.1)); + printf(GMT "0.99 %f %.1f",$y[3]-0.005,$uc_R); + } else { + &antsInfo("WARNING: no overlap between UL and DL uc data below the surface layer in profile #$id"); + } + } else { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTR -N'); + printf(GMT "0.99 %f %.1fmm/s\n",$y[1]-0.005,round(sqrt($uc_var)*1000,.1)); + } + + GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); # annotations if (defined($outfile)) { print(GMT "0.01 -0.06 $outfile [$P{run_label}]\n"); } else { printf(GMT "0.01 -0.06 %03d\n [$P{run_label}]",$id); } GMT_pstext('-F+f12,Helvetica+jMR'); - print(GMT '0.62 0.98 m.a.d.'); + print(GMT '0.62 0.98 m.abs.dev.'); GMT_pstext('-F+f9,Helvetica,orange+jBR -N -Gwhite'); print(GMT "0.99 0.99 V$VERSION\n"); + GMT_pstext('-F+f12,Helvetica,coral+jTL -Gwhite'); + print(GMT "0.02 0.02 downcast\n"); + GMT_pstext('-F+f12,Helvetica,SeaGreen+jTL -Gwhite'); + print(GMT "0.24 0.02 upcast\n"); + GMT_pstext('-F+f12,Helvetica+jBL -Gwhite'); + print(GMT "0.02 0.98 b.track\n"); GMT_end(); diff -r 2d8e1139acd5 -r 8f120b9f795a acoustic_backscatter.pl --- a/acoustic_backscatter.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/acoustic_backscatter.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # A C O U S T I C _ B A C K S C A T T E R . P L # doc: Wed Oct 20 13:02:27 2010 -# dlm: Tue May 24 16:34:24 2016 +# dlm: Thu Jul 1 09:37:40 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 212 0 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 32 46 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -29,6 +29,9 @@ # Mar 26, 2016: - BUG: nSv was declared local to this scope even though it is used outside # May 18, 2016: - improved logging # May 24, 2016: - calc_binDepths() -> binDepths() +# Jul 1, 2021: - made %PARAMs more standard +# HISTORY END + #---------------------------------------------------------------------- # Volume Scattering Coefficient, following Deines (IEEE 1999) @@ -227,8 +230,8 @@ my($search_below) = int($_[0]); # grid index to begin search my(@wdepth,@Sv_rng); # list of water_depth indices - &antsAddParams('SS_min_signal',$SS_min_signal,'SS_min_samp',$SS_min_samp, - 'SS_max_allowed_depth_range',$SS_max_allowed_depth_range); + &antsAddParams('SS_signal.min',$SS_min_signal,'SS_samp.min',$SS_min_samp, + 'SS_allowed_depth_range.max',$SS_max_allowed_depth_range); for (my($bin)=$LADCP_firstBin-1; $bin<=$LADCP_lastBin-1; $bin++) { # find backscatter min/max below $search_below in each bin my($minSv,$maxSv,$depthmaxSv,$lastvalid) = (1e99,-1e99,-1,-1); diff -r 2d8e1139acd5 -r 8f120b9f795a bottom_tracking.pl --- a/bottom_tracking.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/bottom_tracking.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # B O T T O M _ T R A C K I N G . P L # doc: Wed Oct 20 21:05:37 2010 -# dlm: Tue May 1 21:48:54 2018 +# dlm: Thu Jul 1 09:38:25 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 21 14 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 20 13 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -16,6 +16,8 @@ # Jan 26, 2016: - added %PARAMs # May 24, 2016: - calc_binDepths() -> binDepths() # May 1, 2018: - log-file cosmetics +# Jul 1, 2021: - made %PARAMs more standard +# HISTORY END # This code is derived from the one used in LADCPproc, with the following # differences: @@ -119,9 +121,9 @@ { my($LADCP_start,$LADCP_end,$wd,$sig_wd) = @_; - &antsAddParams('BT_max_range',$BT_max_range, - 'BT_max_bin_range_diff',$BT_max_bin_range_diff, - 'BT_max_w_error',$BT_max_w_error); + &antsAddParams('BT_range.max',$BT_max_range, + 'BT_bin_range_diff.max',$BT_max_bin_range_diff, + 'BT_w_error.max',$BT_max_w_error); for (my($ens)=$LADCP_start; $ens<=$LADCP_end; $ens++) { next unless ($wd-$LADCP{ENSEMBLE}[$ens]->{CTD_DEPTH} < $BT_max_range); diff -r 2d8e1139acd5 -r 8f120b9f795a default_output.pl --- a/default_output.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/default_output.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # D E F A U L T _ O U T P U T . P L # doc: Wed Jun 1 19:21:19 2016 -# dlm: Sat May 16 12:19:26 2020 +# dlm: Wed Jun 30 09:01:13 2021 # (c) 2016 A.M. Thurnherr -# uE-Info: 71 0 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 19 69 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # NOTES: @@ -16,6 +16,7 @@ # - changed semmantics so that pushing to plot adds, # instead of overwwriting # - BUG: one of the plots did not repect plotting level +# Jun 30, 2021: - renamed plot_mean_residuals to plot_bin_residuals #---------------------------------------------------------------------- # Processing log (diagnostic messages) output @@ -96,7 +97,7 @@ # Per-bin vertical-velocity residuals (plot only) #---------------------------------------------------------------------- -push(@out_BR,"plot_mean_residuals($plot_dir/${out_basename}_bin_residuals.ps)") +push(@out_BR,"plot_bin_residuals($plot_dir/${out_basename}_bin_residuals.ps)") if ($plotting_level > 0); #---------------------------------------------------------------------- diff -r 2d8e1139acd5 -r 8f120b9f795a defaults.pl --- a/defaults.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/defaults.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # D E F A U L T S . P L # doc: Tue Oct 11 17:11:21 2011 -# dlm: Sat May 16 10:53:34 2020 +# dlm: Fri Jul 9 13:30:48 2021 # (c) 2011 A.M. Thurnherr -# uE-Info: 90 31 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 360 33 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -88,6 +88,9 @@ # May 2, 2018: - added max_hspeed # - replaced $PPI_seabed_editing_required by &PPI_seabed_editing_required # May 16, 2020: - updated doc +# Jun 30, 2021: - ditto +# Jul 9, 2021: - added $layer_residuals_rms_max +# HISTORY END #====================================================================== # Output Log Files @@ -348,6 +351,14 @@ } } + +# After the beam-pair residuals have been binned into profiles, rms +# values in 5-output-bin-thick layers (200m by default) are calculated. +# Vertical velocities from bins with values greater than the following +# limit are set to nan in the the output. + +$layer_residuals_rms_max = 0.003; + #====================================================================== # Time Lagging #====================================================================== @@ -529,7 +540,7 @@ # - in contrast to -b, the other bins are still used e.g. for BT # - values recorded in %outgrid_firstbin, %outgrid_lastbin # - values beyond range are: -# - greyed out in *_mean_residuals.ps +# - greyed out in *_bin_residuals.ps # - not used in *_w.ps, *_residuals.ps $outGrid_firstBin = '*'; # use $LADCP_firstBin (-b) diff -r 2d8e1139acd5 -r 8f120b9f795a edit_data.pl --- a/edit_data.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/edit_data.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # E D I T _ D A T A . P L # doc: Sat May 22 21:35:55 2010 -# dlm: Tue Mar 23 05:29:53 2021 +# dlm: Fri Jul 9 13:41:36 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 409 100 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 597 63 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -45,6 +45,7 @@ # May 1, 2018: - added editLargeHSpeeds() # Nov 17, 2018: - BUG: spurious letter "z" had crept in at some stage # Mar 23, 2021: - updated PPI doc +# Jul 9, 2021: - added editHighResidualLayers() # END OF HISTORY # NOTES: @@ -571,5 +572,34 @@ } #====================================================================== +# $nbrm = editHighResidualLayers($max_lr_res) +# - filter applied after gridding +# - filter based on observation that profiles of beam-pair residuals +# are good indicators of bad data, but very noisy +# - current version uses estimates in 5-bin-thick layers (200m by +# default) +# - filter cutoff based on 2021 A20 cruise which crossed region with +# very weak backscatter +#====================================================================== + +sub editHighResidualLayers($) +{ + my($limit) = @_; + + my($nbrm) = 0; + for (my($bi)=0; $bi<=$#{$DNCAST{LR_RMS_BP_RESIDUAL}}; $bi++) { + next unless ($DNCAST{LR_RMS_BP_RESIDUAL}[$bi] > $limit); + $DNCAST{MEDIAN_W}[$bi] = $DNCAST{MEDIAN_W12}[$bi] = $DNCAST{MEDIAN_W34}[$bi] = nan; + $nbrm++; + } + for (my($bi)=0; $bi<=$#{$UPCAST{LR_RMS_BP_RESIDUAL}}; $bi++) { + next unless ($UPCAST{LR_RMS_BP_RESIDUAL}[$bi] > $limit); + $UPCAST{MEDIAN_W}[$bi] = $UPCAST{MEDIAN_W12}[$bi] = $UPCAST{MEDIAN_W34}[$bi] = nan; + $nbrm++; + } + return $nbrm; +} + +#====================================================================== 1; diff -r 2d8e1139acd5 -r 8f120b9f795a find_seabed.pl --- a/find_seabed.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/find_seabed.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # F I N D _ S E A B E D . P L # doc: Sun May 23 20:26:11 2010 -# dlm: Thu May 19 10:40:55 2016 +# dlm: Thu Jul 1 09:39:12 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 18 46 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 19 46 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -16,6 +16,7 @@ # Jan 26, 2016: - added %PARAMs # May 18, 2016: - removed assumption of 1500m/s soundspeed setting # May 19, 2016: - updated to ADCP_tools V1.6 +# Jul 1, 2021: - made %PARAMs more standard # NOTES: # 1) BT range is corrected for sound speed at the transducer. This is not @@ -38,10 +39,10 @@ my($i,$dd,$sd,$nd); my(@guesses); - &antsAddParams('SS_min_allowed_range',$SS_min_allowed_range, - 'SS_max_allowed_range',$SS_max_allowed_range, + &antsAddParams('SS_allowed_range.min',$SS_min_allowed_range, + 'SS_allowed_range.max',$SS_max_allowed_range, 'SS_search_window_halfwidth',$SS_search_window_halfwidth, - 'SS_max_allowed_depth_range',$SS_max_allowed_depth_range); + 'SS_allowed_depth_range.max',$SS_max_allowed_depth_range); return undef unless ($be-$SS_search_window_halfwidth >= 0 && $be+$SS_search_window_halfwidth <= $#{$d->{ENSEMBLE}}); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_backscatter.pl --- a/plot_backscatter.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_backscatter.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ B A C K S C A T T E R . P L # doc: Tue Jul 28 13:21:09 2015 -# dlm: Tue Oct 29 13:13:02 2019 +# dlm: Thu Jul 1 13:32:33 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 73 54 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 30 42 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -15,6 +15,7 @@ # May 24, 2016: - calc_binDepths() -> binDepths() # - fixed for partial-depth casts # Oct 29, 2019: - updated psscale -B to gmt5 syntax +# Jul 1, 2021: - adapted to more standard %PARAMs require "$ANTS/libGMT.pl"; @@ -22,18 +23,18 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_bin_residuals.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plot_bin_residuals.pl Sat Jul 24 10:35:41 2021 -0400 @@ -0,0 +1,159 @@ +#====================================================================== +# P L O T _ B I N _ R E S I D U A L S . P L +# doc: Tue Jul 28 13:21:09 2015 +# dlm: Thu Jul 1 13:23:10 2021 +# (c) 2015 A.M. Thurnherr +# uE-Info: 23 52 NIL 0 0 72 2 2 4 NIL ofnI +#====================================================================== + +# HISTORY: +# Jul 28, 2015: - created from [LWplot_BR] +# Jul 29, 2015: - finished +# Jul 30, 2015: - added bin_tics +# - added outGrid_* support +# Jan 22, 2015: - many changes +# - added quality assessment label +# Jan 25, 2016: - added return on no data +# Mar 16, 2016: - adapted to gmt5 +# May 18, 2016: - added version +# May 15, 2020: - adapted to bin-residuals separate per beam pair +# - added orange range +# - slightly relaxed green range +# Jun 30, 2021: - renamed from plot_mean_residuals.pl +# Jul 1, 2021: - adapted to more standard %PARAMs + +require "$ANTS/libGMT.pl"; + +sub plot_bin_residuals($) +{ + my($pfn) = @_; + + return unless ($P{'BR_bin.max'}); + + my($xmin) = -0.05; + my($xmax) = 0.05; + my($ymin) = 0.5; + my($ymax) = $P{'BR_bin.max'} + 0.5; + + my($R) = "-R$xmin/$xmax/$ymin/$ymax"; + GMT_begin($pfn,'-JX10/-10',$R,'-P'); + + if ($outGrid_firstBin>$LADCP_firstBin || $outGrid_lastBin<$LADCP_lastBin) { # mark used bins + GMT_psxy('-G200 -L'); + printf(GMT ">\n%f %f\n%f %f\n%f %f\n%f %f\n", + $xmin,$LADCP_firstBin-0.5, + $xmax,$LADCP_firstBin-0.5, + $xmax,$outGrid_firstBin-0.5, + $xmin,$outGrid_firstBin-0.5) + if ($outGrid_firstBin>$LADCP_firstBin); + printf(GMT ">\n%f %f\n%f %f\n%f %f\n%f %f\n", + $xmin,$LADCP_lastBin+0.5, + $xmax,$LADCP_lastBin+0.5, + $xmax,$outGrid_lastBin+0.5, + $xmin,$outGrid_lastBin+0.5) + if ($outGrid_lastBin<$LADCP_lastBin); + } + + GMT_psxy('-W1'); # plot zero line + printf(GMT "0 $ymin\n0 $ymax\n"); + + GMT_psxy('-W2,coral,8_2:0'); + for (my($bin)=$LADCP_firstBin; $bin<@dc_bres12; $bin++) { + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); + next unless ($dc_bres12_nsamp[$bin] >= $dc_bres12_max_nsamp/3); + printf(GMT "%f %d\n",$dc_avg_bres12[$bin],$bin+1); + } + GMT_psxy('-W2,coral,1_1:0'); + for (my($bin)=$LADCP_firstBin; $bin<@dc_bres34; $bin++) { + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); + next unless ($dc_bres34_nsamp[$bin] >= $dc_bres34_max_nsamp/3); + printf(GMT "%f %d\n",$dc_avg_bres34[$bin],$bin+1); + } + GMT_psxy('-Ex0.2/2,coral'); + for (my($bin)=$LADCP_firstBin-1; $bin<@dc_bres12; $bin++) { + printf(GMT "%f %d %f\n", + $dc_avg_bres12[$bin], + $bin+1, + ($dc_bres12_nsamp[$bin] > 1) ? + $dc_sig_bres12[$bin]/sqrt($dc_bres12_nsamp[$bin]-1) : 0); + } + for (my($bin)=$LADCP_firstBin-1; $bin<@dc_bres34; $bin++) { + printf(GMT "%f %d %f\n", + $dc_avg_bres34[$bin], + $bin+1, + ($dc_bres34_nsamp[$bin] > 1) ? + $dc_sig_bres34[$bin]/sqrt($dc_bres34_nsamp[$bin]-1) : 0); + } + GMT_psxy('-W2,SeaGreen,8_2:0'); + for (my($bin)=$LADCP_firstBin; $bin<@uc_bres12; $bin++) { + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); + next unless ($uc_bres12_nsamp[$bin] >= $uc_bres12_max_nsamp/3); + printf(GMT "%f %d\n",$uc_avg_bres12[$bin],$bin+1); + } + GMT_psxy('-W2,SeaGreen,1_1:0'); + for (my($bin)=$LADCP_firstBin; $bin<@uc_bres34; $bin++) { + next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); + next unless ($uc_bres34_nsamp[$bin] >= $uc_bres34_max_nsamp/3); + printf(GMT "%f %d\n",$uc_avg_bres34[$bin],$bin+1); + } + GMT_psxy('-Ex0.2/2,SeaGreen'); + for (my($bin)=$LADCP_firstBin-1; $bin<@uc_bres12; $bin++) { + printf(GMT "%f %d %f\n", + $uc_avg_bres12[$bin], + $bin+1, + ($uc_bres12_nsamp[$bin] > 1) ? + $uc_sig_bres12[$bin]/sqrt($uc_bres12_nsamp[$bin]-1) : 0); + } + for (my($bin)=$LADCP_firstBin-1; $bin<@uc_bres34; $bin++) { + printf(GMT "%f %d %f\n", + $uc_avg_bres34[$bin], + $bin+1, + ($uc_bres34_nsamp[$bin] > 1) ? + $uc_sig_bres34[$bin]/sqrt($uc_bres34_nsamp[$bin]-1) : 0); + } + + GMT_unitcoords(); # LABELS + GMT_pstext('-F+f9,Helvetica,orange+jTR -N -Gwhite'); + print(GMT "0.99 0.01 V$VERSION\n"); + + GMT_pstext('-F+f14,Helvetica,blue+jBL -N'); # profile id + print(GMT "0.0 -0.03 $P{out_basename} $P{run_label}\n"); + + GMT_pstext('-F+f12,Helvetica-Bold,black+jBL -Gwhite'); # rms residuals + print(GMT "0.1 0.88 beams <1,2>\n"); + GMT_pstext('-F+f12,Helvetica-Bold,black+jBL -Gwhite'); + print(GMT "0.7 0.88 beams <3,4>\n"); + + GMT_pstext('-F+f12,Helvetica,coral+jBL'); # rms residuals + print(GMT "0.01 0.93 dc\n"); + if ($dc_bres12_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } + elsif ($dc_bres12_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } + elsif ($dc_bres12_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } + else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } + printf(GMT "0.10 0.93 %.1f mm/s rms\n",1000*$dc_bres12_rms); + + if ($dc_bres34_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } + elsif ($dc_bres34_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } + elsif ($dc_bres34_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } + else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } + printf(GMT "0.70 0.93 %.1f mm/s rms\n",1000*$dc_bres34_rms); + + GMT_pstext('-F+f12,Helvetica,SeaGreen+jBL'); + print(GMT "0.01 0.98 uc\n"); + if ($uc_bres12_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } + elsif ($uc_bres12_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } + elsif ($uc_bres12_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } + else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } + printf(GMT "0.10 0.98 %.1f mm/s rms\n",1000*$uc_bres12_rms); + if ($uc_bres34_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } + elsif ($uc_bres34_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } + elsif ($uc_bres34_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } + else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } + printf(GMT "0.70 0.98 %.1f mm/s rms\n",1000*$uc_bres34_rms); + + my($bin_tics) = ($ymax <= 20) ? 'f1a1' : 'f1a2'; + GMT_setR($R); # FINISH PLOT + GMT_end("-Bf0.005a0.02:'Residual Vertical Velocity [m/s]':/$bin_tics:'Bin [#]':WeSn"); +} + +1; # return true on require diff -r 2d8e1139acd5 -r 8f120b9f795a plot_correlation.pl --- a/plot_correlation.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_correlation.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ C O R R E L A T I O N . P L # doc: Tue Jul 28 13:21:09 2015 -# dlm: Tue Oct 29 13:13:52 2019 +# dlm: Thu Jul 1 13:24:42 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 17 53 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 18 47 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -15,6 +15,7 @@ # May 24, 2016: - calc_binDepths() -> binDepths() # - fixed for partial-depth casts # Oct 29, 2019: - updated psscale -B to gmt5 syntax +# Jul 1, 2021: - adapted to more std %PARAMs require "$ANTS/libGMT.pl"; @@ -22,18 +23,18 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_mean_residuals.pl --- a/plot_mean_residuals.pl Sat Apr 10 06:00:45 2021 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -#====================================================================== -# P L O T _ M E A N _ R E S I D U A L S . P L -# doc: Tue Jul 28 13:21:09 2015 -# dlm: Fri May 15 19:06:51 2020 -# (c) 2015 A.M. Thurnherr -# uE-Info: 122 47 NIL 0 0 72 2 2 4 NIL ofnI -#====================================================================== - -# HISTORY: -# Jul 28, 2015: - created from [LWplot_BR] -# Jul 29, 2015: - finished -# Jul 30, 2015: - added bin_tics -# - added outGrid_* support -# Jan 22, 2015: - many changes -# - added quality assessment label -# Jan 25, 2016: - added return on no data -# Mar 16, 2016: - adapted to gmt5 -# May 18, 2016: - added version -# May 15, 2020: - adapted to bin-residuals separate per beam pair -# - added orange range -# - slightly relaxed green range - -require "$ANTS/libGMT.pl"; - -sub plot_mean_residuals($) -{ - my($pfn) = @_; - - return unless ($P{BR_max_bin}); - - my($xmin) = -0.05; - my($xmax) = 0.05; - my($ymin) = 0.5; - my($ymax) = $P{BR_max_bin} + 0.5; - - my($R) = "-R$xmin/$xmax/$ymin/$ymax"; - GMT_begin($pfn,'-JX10/-10',$R,'-P'); - - if ($outGrid_firstBin>$LADCP_firstBin || $outGrid_lastBin<$LADCP_lastBin) { # mark used bins - GMT_psxy('-G200 -L'); - printf(GMT ">\n%f %f\n%f %f\n%f %f\n%f %f\n", - $xmin,$LADCP_firstBin-0.5, - $xmax,$LADCP_firstBin-0.5, - $xmax,$outGrid_firstBin-0.5, - $xmin,$outGrid_firstBin-0.5) - if ($outGrid_firstBin>$LADCP_firstBin); - printf(GMT ">\n%f %f\n%f %f\n%f %f\n%f %f\n", - $xmin,$LADCP_lastBin+0.5, - $xmax,$LADCP_lastBin+0.5, - $xmax,$outGrid_lastBin+0.5, - $xmin,$outGrid_lastBin+0.5) - if ($outGrid_lastBin<$LADCP_lastBin); - } - - GMT_psxy('-W1'); # plot zero line - printf(GMT "0 $ymin\n0 $ymax\n"); - - GMT_psxy('-W2,coral,8_2:0'); - for (my($bin)=$LADCP_firstBin; $bin<@dc_bres12; $bin++) { - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); - next unless ($dc_bres12_nsamp[$bin] >= $dc_bres12_max_nsamp/3); - printf(GMT "%f %d\n",$dc_avg_bres12[$bin],$bin+1); - } - GMT_psxy('-W2,coral,1_1:0'); - for (my($bin)=$LADCP_firstBin; $bin<@dc_bres34; $bin++) { - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); - next unless ($dc_bres34_nsamp[$bin] >= $dc_bres34_max_nsamp/3); - printf(GMT "%f %d\n",$dc_avg_bres34[$bin],$bin+1); - } - GMT_psxy('-Ex0.2/2,coral'); - for (my($bin)=$LADCP_firstBin-1; $bin<@dc_bres12; $bin++) { - printf(GMT "%f %d %f\n", - $dc_avg_bres12[$bin], - $bin+1, - ($dc_bres12_nsamp[$bin] > 1) ? - $dc_sig_bres12[$bin]/sqrt($dc_bres12_nsamp[$bin]-1) : 0); - } - for (my($bin)=$LADCP_firstBin-1; $bin<@dc_bres34; $bin++) { - printf(GMT "%f %d %f\n", - $dc_avg_bres34[$bin], - $bin+1, - ($dc_bres34_nsamp[$bin] > 1) ? - $dc_sig_bres34[$bin]/sqrt($dc_bres34_nsamp[$bin]-1) : 0); - } - GMT_psxy('-W2,SeaGreen,8_2:0'); - for (my($bin)=$LADCP_firstBin; $bin<@uc_bres12; $bin++) { - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); - next unless ($uc_bres12_nsamp[$bin] >= $uc_bres12_max_nsamp/3); - printf(GMT "%f %d\n",$uc_avg_bres12[$bin],$bin+1); - } - GMT_psxy('-W2,SeaGreen,1_1:0'); - for (my($bin)=$LADCP_firstBin; $bin<@uc_bres34; $bin++) { - next if ($bin+1<$outGrid_firstBin || $bin+1>$outGrid_lastBin); - next unless ($uc_bres34_nsamp[$bin] >= $uc_bres34_max_nsamp/3); - printf(GMT "%f %d\n",$uc_avg_bres34[$bin],$bin+1); - } - GMT_psxy('-Ex0.2/2,SeaGreen'); - for (my($bin)=$LADCP_firstBin-1; $bin<@uc_bres12; $bin++) { - printf(GMT "%f %d %f\n", - $uc_avg_bres12[$bin], - $bin+1, - ($uc_bres12_nsamp[$bin] > 1) ? - $uc_sig_bres12[$bin]/sqrt($uc_bres12_nsamp[$bin]-1) : 0); - } - for (my($bin)=$LADCP_firstBin-1; $bin<@uc_bres34; $bin++) { - printf(GMT "%f %d %f\n", - $uc_avg_bres34[$bin], - $bin+1, - ($uc_bres34_nsamp[$bin] > 1) ? - $uc_sig_bres34[$bin]/sqrt($uc_bres34_nsamp[$bin]-1) : 0); - } - - GMT_unitcoords(); # LABELS - GMT_pstext('-F+f9,Helvetica,orange+jTR -N -Gwhite'); - print(GMT "0.99 0.01 V$VERSION\n"); - - GMT_pstext('-F+f14,Helvetica,blue+jBL -N'); # profile id - print(GMT "0.0 -0.03 $P{out_basename} $P{run_label}\n"); - - GMT_pstext('-F+f12,Helvetica-Bold,black+jBL -Gwhite'); # rms residuals - print(GMT "0.1 0.88 beams <1,2>\n"); - GMT_pstext('-F+f12,Helvetica-Bold,black+jBL -Gwhite'); - print(GMT "0.7 0.88 beams <3,4>\n"); - - GMT_pstext('-F+f12,Helvetica,coral+jBL'); # rms residuals - print(GMT "0.01 0.93 dc\n"); - if ($dc_bres12_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } - elsif ($dc_bres12_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } - elsif ($dc_bres12_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } - printf(GMT "0.10 0.93 %.1f mm/s rms\n",1000*$dc_bres12_rms); - - if ($dc_bres34_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } - elsif ($dc_bres34_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } - elsif ($dc_bres34_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } - printf(GMT "0.70 0.93 %.1f mm/s rms\n",1000*$dc_bres34_rms); - - GMT_pstext('-F+f12,Helvetica,SeaGreen+jBL'); - print(GMT "0.01 0.98 uc\n"); - if ($uc_bres12_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } - elsif ($uc_bres12_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } - elsif ($uc_bres12_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } - printf(GMT "0.10 0.98 %.1f mm/s rms\n",1000*$uc_bres12_rms); - if ($uc_bres34_rms >= 0.005) { GMT_pstext('-F+f12,Helvetica,white+jBL -Gred'); } - elsif ($uc_bres34_rms >= 0.003) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gorange'); } - elsif ($uc_bres34_rms >= 0.0015) { GMT_pstext('-F+f12,Helvetica,black+jBL -Gyellow'); } - else { GMT_pstext('-F+f12,Helvetica,black+jBL -Ggreen'); } - printf(GMT "0.70 0.98 %.1f mm/s rms\n",1000*$uc_bres34_rms); - - my($bin_tics) = ($ymax <= 20) ? 'f1a1' : 'f1a2'; - GMT_setR($R); # FINISH PLOT - GMT_end("-Bf0.005a0.02:'Residual Vertical Velocity [m/s]':/$bin_tics:'Bin [#]':WeSn"); -} - -1; # return true on require diff -r 2d8e1139acd5 -r 8f120b9f795a plot_residual_profs.pl --- a/plot_residual_profs.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_residual_profs.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ R E S I D U A L _ P R O F S . P L # doc: Wed May 18 18:43:33 2016 -# dlm: Tue May 24 22:02:28 2016 +# dlm: Thu Jul 1 13:25:20 2021 # (c) 2016 A.M. Thurnherr -# uE-Info: 77 0 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 54 42 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -51,10 +51,10 @@ my($xmin) = -0.05; my($xmax) = 0.05; - my($ymin) = round(antsParam('min_depth')-25,50); + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; my($depth_tics) = ($ymax < 1000 ) ? 'f10a100g100' : 'f100a500g500'; @@ -75,17 +75,23 @@ print(GMT "0.0 -0.03 $P{out_basename} $P{run_label}\n"); GMT_pstext('-F+f12,Helvetica-Bold,black+jBL -Gwhite'); # rms residuals - print(GMT "0.01 0.89 beams <1,2>\n"); + print(GMT "0.1 0.89 beams <1,2>\n"); + GMT_pstext('-F+f12,Helvetica-Bold,black+jBR -Gwhite'); + print(GMT "0.99 0.89 beams <3,4>\n"); + GMT_pstext('-F+f12,Helvetica,coral+jBL -Gwhite'); # rms residuals + print(GMT "0.01 0.93 dc\n"); + GMT_pstext('-F+f12,Helvetica,SeaGreen+jBL -Gwhite'); + print(GMT "0.01 0.98 uc\n"); + if ($r12DC >= $red_light) { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBL -Gred'); } elsif ($r12DC >= $yellow_light) { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBL -Gyellow'); } else { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBL -Gwhite'); } - printf(GMT "0.01 0.935 %.1f mm/s rms\n",1000*$r12DC); + printf(GMT "0.1 0.935 %.1f mm/s rms\n",1000*$r12DC); if ($r12UC >= $red_light) { GMT_pstext('-F+f12,Helvetica-Bold,SeaGreen+jBL -Gred'); } elsif ($r12UC >= $yellow_light) { GMT_pstext('-F+f12,Helvetica-Bold,SeaGreen+jBL -Gyellow'); } else { GMT_pstext('-F+f12,Helvetica-Bold,SeaGreen+jBL -Gwhite'); } - printf(GMT "0.01 0.98 %.1f mm/s rms\n",1000*$r12UC); - GMT_pstext('-F+f12,Helvetica-Bold,black+jBR -Gwhite'); - print(GMT "0.99 0.89 beams <3,4>\n"); + printf(GMT "0.1 0.98 %.1f mm/s rms\n",1000*$r12UC); + if ($r34DC >= $red_light) { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBR -Gred'); } elsif ($r34DC >= $yellow_light) { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBR -Gyellow'); } else { GMT_pstext('-F+f12,Helvetica-Bold,coral+jBR -Gwhite'); } diff -r 2d8e1139acd5 -r 8f120b9f795a plot_residuals.pl --- a/plot_residuals.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_residuals.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ R E S I D U A L S . P L # doc: Tue Jul 28 13:21:09 2015 -# dlm: Tue Oct 29 13:14:19 2019 +# dlm: Thu Jul 1 13:26:39 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 20 0 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 81 0 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -24,18 +24,18 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_residuals12.pl --- a/plot_residuals12.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_residuals12.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,14 +1,15 @@ #====================================================================== # P L O T _ R E S I D U A L S 1 2 . P L # doc: Wed Jun 1 19:05:22 2016 -# dlm: Tue Oct 29 13:14:53 2019 +# dlm: Thu Jul 1 13:28:07 2021 # (c) 2016 A.M. Thurnherr -# uE-Info: 84 46 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 12 47 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: # Jun 1, 2016: - created from [plot_residuals.pl] # Oct 29, 2019: - updated psscale -B to gmt5 syntax +# Jul 1, 2021: - adapted to more std %PARAMs require "$ANTS/libGMT.pl"; @@ -16,18 +17,18 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_residuals34.pl --- a/plot_residuals34.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_residuals34.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,14 +1,15 @@ #====================================================================== # P L O T _ R E S I D U A L S 3 4 . P L # doc: Wed Jun 1 19:05:22 2016 -# dlm: Tue Oct 29 13:15:21 2019 +# dlm: Thu Jul 1 13:29:22 2021 # (c) 2016 A.M. Thurnherr -# uE-Info: 84 68 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 12 47 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: # Jun 1, 2016: - created from [plot_residuals.pl] # Oct 29, 2019: - updated psscale -B to gmt5 syntax +# Jul 1, 2021: - adapted to more std %PARAMs require "$ANTS/libGMT.pl"; @@ -16,18 +17,18 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_time_lags.pl --- a/plot_time_lags.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_time_lags.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ T I M E _ L A G S . P L # doc: Tue Jul 28 13:21:09 2015 -# dlm: Thu Mar 22 10:56:17 2018 +# dlm: Wed Jun 30 09:51:13 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 40 0 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 64 77 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -61,6 +61,9 @@ print(GMT "0.99 0.99 V$VERSION\n"); GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); print(GMT "0.01 1.06 $P{out_basename} $P{run_label}\n"); + GMT_pstext('-F+f14,Helvetica,coral+jBR -Gwhite'); print(GMT "0.98 0.07 downcast\n"); + GMT_pstext('-F+f14,Helvetica,SeaGreen+jBR -Gwhite'); print(GMT "0.98 0.02 upcast\n"); + GMT_setR($R); my($elapsed_tics) = ($xmax-$xmin < 45) ? 'f1a5' : 'f1a30'; diff -r 2d8e1139acd5 -r 8f120b9f795a plot_wprof.pl --- a/plot_wprof.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_wprof.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ W P R O F . P L # doc: Sun Jul 26 11:08:50 2015 -# dlm: Tue Mar 23 08:28:12 2021 +# dlm: Tue Jul 13 12:51:25 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 25 39 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 126 0 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -23,6 +23,11 @@ # May 16, 2020: - added residual profile data to background # May 23, 2020: - BUG: windows without samples made program bomb # Mar 23, 2021: - BUG: instrument frequency was rounded to 100kHz +# Jun 30, 2021: - improved quality semaphore +# Jul 1, 2021: - replaced bin setup by in legend +# Jul 7, 2021: - added colored background to +# Jul 9, 2021: - adapted to new residual editing (calculation in LADCP_w_ocean) +# HISTORY END # Tweakables: # @@ -73,7 +78,7 @@ } } -sub plotRes() +sub plotRes_V1() { my($last_depth,$dc_sumsq_res,$dc_n,$uc_sumsq_res,$uc_n); for (my($bi)=0; $bi<=$#{$DNCAST{MEDIAN_W}}; $bi++) { @@ -115,17 +120,37 @@ } } +sub plotRes() +{ + for (my($bi)=0; $bi<=$#{$DNCAST{MEDIAN_W}}; $bi++) { + if ($DNCAST{LR_RMS_BP_RESIDUAL}[$bi] > 0.002) { + my($sat) = round(100*max(0.01-max($DNCAST{LR_RMS_BP_RESIDUAL}[$bi]-0.002,0),0) * 255); + GMT_psxy("-Gp300/12:F255/$sat/${sat}B-"); + printf(GMT "%g %g\n%g %g\n%g %g\n%g %g\n", + -0.1,$bi*$opt_o,0,$bi*$opt_o, + 0,($bi+1)*$opt_o,-0.1,($bi+1)*$opt_o); + } + if ($UPCAST{LR_RMS_BP_RESIDUAL}[$bi] > 0.002) { + my($sat) = round(100*max(0.01-max($UPCAST{LR_RMS_BP_RESIDUAL}[$bi]-0.002,0),0) * 255); + GMT_psxy("-Gp300/9:F255/$sat/${sat}B-"); + printf(GMT "%g %g\n%g %g\n%g %g\n%g %g\n", + 0,$bi*$opt_o,0.07,$bi*$opt_o, + 0.07,($bi+1)*$opt_o,0,($bi+1)*$opt_o); + } + } +} + sub plot_wprof($) { my($pfn) = @_; $plot_wprof_xmin = -0.1 unless defined($plot_wprof_xmin); - $plot_wprof_ymin = round(antsParam('min_depth')-25,50) + $plot_wprof_ymin = round(antsParam('depth.min')-25,50) unless defined($plot_wprof_ymin); $plot_wprof_ymax = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+25,50) + round($P{'depth.max'}+25,50) unless defined($plot_wprof_ymax); $plot_wprof_xtics = "-0.05 0.05 0.15" unless defined($plot_wprof_xtics); @@ -169,48 +194,30 @@ GMT_unitcoords(); # QUALITY SEMAPHORE GMT_psxy('-Ggray90'); print(GMT "0.895 0.895\n0.985 0.895\n0.985 0.985\n0.895 0.985\n"); - if ($dc_bres12_rms >= 0.005) { GMT_psxy('-Gred -N'); } - elsif ($dc_bres12_rms >= 0.003) { GMT_psxy('-Gorange -N'); } - elsif ($dc_bres12_rms >= 0.0015) { GMT_psxy('-Gyellow -N'); } - else { GMT_psxy('-Ggreen -N'); } - print(GMT "0.90 0.90\n0.935 0.90\n0.935 0.935\n"); - if ($dc_bres34_rms >= 0.005) { GMT_psxy('-Gred -N'); } - elsif ($dc_bres34_rms >= 0.003) { GMT_psxy('-Gorange -N'); } - elsif ($dc_bres34_rms >= 0.0015) { GMT_psxy('-Gyellow -N'); } - else { GMT_psxy('-Ggreen -N'); } - print(GMT "0.945 0.90\n0.98 0.90\n0.945 0.935\n"); - if ($uc_bres12_rms >= 0.005) { GMT_psxy('-Gred -N'); } - elsif ($uc_bres12_rms >= 0.003) { GMT_psxy('-Gorange -N'); } - elsif ($uc_bres12_rms >= 0.0015) { GMT_psxy('-Gyellow -N'); } - else { GMT_psxy('-Ggreen -N'); } - print(GMT "0.90 0.98\n0.935 0.98\n0.935 0.945\n"); - if ($uc_bres34_rms >= 0.005) { GMT_psxy('-Gred -N'); } - elsif ($uc_bres34_rms >= 0.003) { GMT_psxy('-Gorange -N'); } - elsif ($uc_bres34_rms >= 0.0015) { GMT_psxy('-Gyellow -N'); } - else { GMT_psxy('-Ggreen -N'); } - print(GMT "0.945 0.98\n0.98 0.98\n0.945 0.945\n"); -if (0) { - if ($dc_bres12_rms >= 0.005) { GMT_psxy('-Gred -N -Sc0.3'); } - elsif ($dc_bres12_rms >= 0.003) { GMT_psxy('-Gorange -N -Sc0.3'); } - elsif ($dc_bres12_rms >= 0.0015) { GMT_psxy('-Gyellow -N -Sc0.3'); } - else { GMT_psxy('-Ggreen -N -Sc0.3'); } - print(GMT "0.92 0.96\n"); - if ($dc_bres34_rms >= 0.005) { GMT_psxy('-Gred -N -Sc0.3'); } - elsif ($dc_bres34_rms >= 0.003) { GMT_psxy('-Gorange -N -Sc0.3'); } - elsif ($dc_bres34_rms >= 0.0015) { GMT_psxy('-Gyellow -N -Sc0.3'); } - else { GMT_psxy('-Ggreen -N -Sc0.3'); } - print(GMT "0.96 0.96\n"); - if ($uc_bres12_rms >= 0.005) { GMT_psxy('-Gred -N -Sc0.3'); } - elsif ($uc_bres12_rms >= 0.003) { GMT_psxy('-Gorange -N -Sc0.3'); } - elsif ($uc_bres12_rms >= 0.0015) { GMT_psxy('-Gyellow -N -Sc0.3'); } - else { GMT_psxy('-Ggreen -N -Sc0.3'); } - print(GMT "0.92 0.92\n"); - if ($uc_bres34_rms >= 0.005) { GMT_psxy('-Gred -N -Sc0.3'); } - elsif ($uc_bres34_rms >= 0.003) { GMT_psxy('-Gorange -N -Sc0.3'); } - elsif ($uc_bres34_rms >= 0.0015) { GMT_psxy('-Gyellow -N -Sc0.3'); } - else { GMT_psxy('-Ggreen -N -Sc0.3'); } - print(GMT "0.96 0.92\n"); -} + if ($dc_bres12_rms >= 0.005) { GMT_psxy('-W1,coral,8_2:0 -Gred -N'); } + elsif ($dc_bres12_rms >= 0.003) { GMT_psxy('-W1,coral,8_2:0 -Gorange -N'); } + elsif ($dc_bres12_rms >= 0.0015) { GMT_psxy('-W1,coral,8_2:0 -Gyellow -N'); } + else { GMT_psxy('-W1,coral,8_2:0 -Ggreen -N'); } +# print(GMT "0.90 0.90\n0.935 0.90\n0.935 0.935\n"); + print(GMT "0.90 0.90\n0.935 0.90\n0.935 0.935\n0.90 0.935\n"); + if ($dc_bres34_rms >= 0.005) { GMT_psxy('-W1,coral,1_1:0 -Gred -N'); } + elsif ($dc_bres34_rms >= 0.003) { GMT_psxy('-W1,coral,1_1:0 -Gorange -N'); } + elsif ($dc_bres34_rms >= 0.0015) { GMT_psxy('-W1,coral,1_1:0 -Gyellow -N'); } + else { GMT_psxy('-W1,coral,1_1:0 -Ggreen -N'); } +# print(GMT "0.945 0.90\n0.98 0.90\n0.945 0.935\n"); + print(GMT "0.945 0.90\n0.98 0.90\n0.98 0.935\n0.945 0.935\n"); + if ($uc_bres12_rms >= 0.005) { GMT_psxy('-W1,SeaGreen,8_2:0 -Gred -N'); } + elsif ($uc_bres12_rms >= 0.003) { GMT_psxy('-W1,SeaGreen,8_2:0 -Gorange -N'); } + elsif ($uc_bres12_rms >= 0.0015) { GMT_psxy('-W1,SeaGreen,8_2:0 -Gyellow -N'); } + else { GMT_psxy('-W1,SeaGreen,8_2:0 -Ggreen -N'); } +# print(GMT "0.90 0.98\n0.935 0.98\n0.935 0.945\n"); + print(GMT "0.90 0.98\n0.935 0.98\n0.935 0.945\n0.90 0.945\n"); + if ($uc_bres34_rms >= 0.005) { GMT_psxy('-W1,SeaGreen,1_1:0 -Gred -N'); } + elsif ($uc_bres34_rms >= 0.003) { GMT_psxy('-W1,SeaGreen,1_1:0 -Gorange -N'); } + elsif ($uc_bres34_rms >= 0.0015) { GMT_psxy('-W1,SeaGreen,1_1:0 -Gyellow -N'); } + else { GMT_psxy('-W1,SeaGreen,1_1:0 -Ggreen -N'); } +# print(GMT "0.945 0.98\n0.98 0.98\n0.945 0.945\n"); + print(GMT "0.945 0.98\n0.98 0.98\n0.98 0.945\n0.945 0.945\n"); GMT_pstext('-F+f14,Helvetica,blue+jTL -N'); # LABELS print(GMT "0.01 -0.06 $P{out_basename} [$P{run_label}]\n"); @@ -230,49 +237,79 @@ print(GMT "0.02 0.98 b.track\n"); } +# The following values were established manually in July 2021 with +# a GMT version that does not seem to respect y, maybe because of +# super-/subscripts. +# my(@y) = (1.020,1.056,1.090,1.135); # 0.036, 0.034, 0.035 +# my(@y) = (1.020,1.056,1.088,1.131); + my(@y) = (1.020,1.060,1.088,1.127); + GMT_pstext('-F+f9,Helvetica,CornFlowerBlue+jTL -N'); - printf(GMT "0.64 1.020 %d kHz $LADCP{INSTRUMENT_TYPE} $P{ADCP_orientation}\n", - round($LADCP{BEAM_FREQUENCY},50)); - printf(GMT "0.64 1.055 %s [%.1fm/%1.fm/%1.fm]\n", - $LADCP{BEAM_COORDINATES} ? 'beam vels' : 'Earth vels', - $LADCP{BLANKING_DISTANCE},$LADCP{TRANSMITTED_PULSE_LENGTH},$LADCP{BIN_LENGTH}); - print(GMT "0.64 1.090 mean tilt\n 0.77 1.096 :\n"); - print(GMT "0.64 1.130 rms a\@-pkg\@-\n 0.77 1.1315 :\n"); + printf(GMT "0.64 $y[0] %d kHz $LADCP{INSTRUMENT_TYPE} $P{ADCP_orientation}\n", + round($LADCP{BEAM_FREQUENCY},50)); + +# printf(GMT "0.64 1.055 %s [%.1fm/%1.fm/%1.fm]\n", +# $LADCP{BEAM_COORDINATES} ? 'beam vels' : 'Earth vels', +# $LADCP{BLANKING_DISTANCE},$LADCP{TRANSMITTED_PULSE_LENGTH},$LADCP{BIN_LENGTH}); + + print( GMT "0.64 $y[1] mean w\n 0.77 $y[1] :\n"); + printf(GMT "0.64 $y[2] mean tilt\n 0.77 %f :\n",$y[2]+0.007); + print( GMT "0.64 $y[3] rms a\@-pkg\@-\n 0.77 $y[3] :\n"); - if ($P{dc_mean_tilt} < 4) { + if (abs($P{'dc_w.mu'} - $P{'uc_w.mu'}) < 0.005) { GMT_pstext('-F+f9,Helvetica,coral+jTL -N'); - } elsif ($P{dc_mean_tilt} < 8) { + } elsif (abs($P{'dc_w.mu'} - $P{'uc_w.mu'}) < 0.01) { + GMT_pstext('-F+f9,Helvetica,coral+jTL -Gyellow -N'); + } else { + GMT_pstext('-F+f9,Helvetica,coral+jTL -Gred -N'); + } + printf(GMT "0.78 %f %dmm/s\n",$y[1]-0.006,round($P{'dc_w.mu'}*1000)); + + if (abs($P{'dc_w.mu'} - $P{'uc_w.mu'}) < 0.005) { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -N'); + } elsif (abs($P{'dc_w.mu'} - $P{'uc_w.mu'}) < 0.01) { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gyellow -N'); + } else { + GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gred -N'); + } + printf(GMT "0.89 %f %dmm/s\n",$y[1]-0.006,round($P{'uc_w.mu'}*1000)); + + + if ($P{'dc_tilt.mu'} < 4) { + GMT_pstext('-F+f9,Helvetica,coral+jTL -N'); + } elsif ($P{'dc_tilt.mu'} < 8) { GMT_pstext('-F+f9,Helvetica,coral+jTL -Gyellow -N'); } else { GMT_pstext('-F+f9,Helvetica,coral+jTL -Gred -N'); } - printf(GMT "0.808 1.090 %.1f\\260\n",$P{dc_mean_tilt}); - if ($P{uc_mean_tilt} < 4) { + printf(GMT "0.808 $y[2] %.1f\\260\n",$P{'dc_tilt.mu'}); + + if ($P{'uc_tilt.mu'} < 4) { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -N'); - } elsif ($P{uc_mean_tilt} < 8) { + } elsif ($P{'uc_tilt.mu'} < 8) { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gyellow -N'); } else { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gred -N'); } - printf(GMT "0.91 1.090 %.1f\\260\n",$P{uc_mean_tilt}); + printf(GMT "0.91 $y[2] %.1f\\260\n",$P{'uc_tilt.mu'}); - if ($P{dc_rms_accel_pkg} < 0.1) { + if ($P{'dc_accel_pkg.rms'} < 0.1) { GMT_pstext('-F+f9,Helvetica,coral+jTL -Gblue -N'); - } elsif ($P{dc_rms_accel_pkg} < 0.7) { + } elsif ($P{'dc_accel_pkg.rms'} < 0.7) { GMT_pstext('-F+f9,Helvetica,coral+jTL -N'); } else { GMT_pstext('-F+f9,Helvetica,coral+jTL -Gyellow -N'); } - printf(GMT "0.78 1.125 %.1fm/s\@+2\@+\n",$P{dc_rms_accel_pkg}); + printf(GMT "0.78 %f %.1fm/s\@+2\@+\n",$y[3]-0.01,$P{'dc_accel_pkg.rms'}); - if ($P{uc_rms_accel_pkg} < 0.1) { + if ($P{'uc_accel_pkg.rms'} < 0.1) { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gblue -N'); - } elsif ($P{uc_rms_accel_pkg} < 0.7) { + } elsif ($P{'uc_accel_pkg.rms'} < 0.7) { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -N'); } else { GMT_pstext('-F+f9,Helvetica,SeaGreen+jTL -Gyellow -N'); } - printf(GMT "0.89 1.125 %.1fm/s\@+2\@+\n",$P{uc_rms_accel_pkg}); + printf(GMT "0.89 %f %.1fm/s\@+2\@+\n",$y[3]-0.01,$P{'uc_accel_pkg.rms'}); my($depth_tics) = ($plot_wprof_ymax-$plot_prof_ymin < 1000 ) ? 'f10a100' : 'f100a500'; # AXES setR1(); diff -r 2d8e1139acd5 -r 8f120b9f795a plot_wsamp.pl --- a/plot_wsamp.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/plot_wsamp.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # P L O T _ W S A M P . P L # doc: Tue Jul 28 13:21:09 2015 -# dlm: Tue Oct 29 13:15:41 2019 +# dlm: Thu Jul 1 13:31:53 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 17 0 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 21 47 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -18,6 +18,7 @@ # May 24, 2016: - calc_binDepths() -> binDepths() # - fixed for partial-depth profiles # Oct 29, 2019: - updated psscale -B to gmt5 syntax +# Jul 1, 2021: - adapted to more std %PARAMs require "$ANTS/libGMT.pl"; @@ -25,19 +26,19 @@ { my($pfn) = @_; - return unless ($P{max_depth}); + return unless ($P{'depth.max'}); - my($xmin) = $P{min_ens}-0.5; - my($xmax) = $P{max_ens}+0.5; - my($ymin) = round(antsParam('min_depth')-25,50); + my($xmin) = $P{'ens.min'}-0.5; + my($xmax) = $P{'ens.max'}+0.5; + my($ymin) = round(antsParam('depth.min')-25,50); my($ymax) = ($P{water_depth} > 0) ? round($P{water_depth}+25,50) : - round($P{max_depth}+$P{ADCP_bin_length}+25,50); + round($P{'depth.max'}+$P{ADCP_bin_length}+25,50); - my($ens_width) = 10 / ($P{max_ens} - $P{min_ens} + 1); + my($ens_width) = 10 / ($P{'ens.max'} - $P{'ens.min'} + 1); my($bin_length) = 10 * $P{ADCP_bin_length} / - ($P{max_depth}-$P{min_depth}+$P{ADCP_bin_length}); + ($P{'depth.max'}-$P{'depth.min'}+$P{ADCP_bin_length}); my($R) = "-R$xmin/$xmax/$ymin/$ymax"; GMT_begin($pfn,'-JX10/-10',$R,'-P'); diff -r 2d8e1139acd5 -r 8f120b9f795a time_lag.pl --- a/time_lag.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/time_lag.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # T I M E _ L A G . P L # doc: Fri Dec 17 21:59:07 2010 -# dlm: Tue Oct 16 16:26:06 2018 +# dlm: Thu Jul 1 09:39:53 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 80 38 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 81 46 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -78,6 +78,7 @@ # Solution: remove very unpopular lags first # Oct 4, 2018: - added timelagging debug code # Oct 16, 2018: - removed debug code +# Jul 1, 2021: - made %PARAMs more standard # DIFFICULT STATIONS: # NBP0901#131 this requires the search-radius doubling heuristic @@ -159,7 +160,7 @@ my($n_windows,$w_size,$scan_increment,$first_ens,$last_ens) = @_; my($search_radius) = $scan_increment==1 ? 3 : $w_size; - &antsAddParams('TL_max_allowed_three_lag_spread',$TL_max_allowed_three_lag_spread); + &antsAddParams('TL_allowed_three_lag_spread.max',$TL_max_allowed_three_lag_spread); my($ctmsg); if ($first_ens==$firstGoodEns && $last_ens==$lastGoodEns) { $ctmsg = "full-cast"; } diff -r 2d8e1139acd5 -r 8f120b9f795a time_series.pl --- a/time_series.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/time_series.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # T I M E _ S E R I E S . P L # doc: Sun May 23 16:40:53 2010 -# dlm: Sun Apr 21 14:13:05 2019 +# dlm: Sat Apr 24 11:19:07 2021 # (c) 2010 A.M. Thurnherr -# uE-Info: 25 56 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 26 27 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -23,6 +23,7 @@ # May 1, 2018: - added reflr u and v calculations # - BUG: reflr u and v calcs did not work # Apr 21, 2019: - improved surface gap warning message +# Apr 24, 2021: - output cosmetics # NOTES: # - resulting DEPTH field based on integrated w without any sound speed correction @@ -110,7 +111,7 @@ ($depth == $max_depth)) { # biased in-air data my($md) = defined($max_depth) ? sprintf('%d',$max_depth) : 'undefined'; warning(1,"long surface gap (%ds) --- restarting at ens#$dta->{ENSEMBLE}[$e]->{NUMBER} " . - "[depth = %d m; max_depth = $md]\n",$dt,$depth); + "[depth = %d m; max_depth = $md m]\n",$dt,$depth); $firstgood = $lastgood = $e; undef($atbottom); undef($max_depth); $depth = 0; diff -r 2d8e1139acd5 -r 8f120b9f795a version.pl --- a/version.pl Sat Apr 10 06:00:45 2021 -0400 +++ b/version.pl Sat Jul 24 10:35:41 2021 -0400 @@ -1,9 +1,9 @@ #====================================================================== # V E R S I O N . P L # doc: Tue Oct 13 10:40:57 2015 -# dlm: Tue Mar 23 09:15:39 2021 +# dlm: Sat Jul 24 09:55:02 2021 # (c) 2015 A.M. Thurnherr -# uE-Info: 29 46 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 32 68 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -27,6 +27,9 @@ # - updated ADCP tools to V2.2 # Sep 12, 2019: - updated to V1.5 because of CTD gap correction # Mar 23, 2021: - updated ADCP_tools to V2.4 +# Jun 29, 2021: - updated ANTSlib to V7.2 +# Jul 1, 2021: - updated ANTSlib to V7.3 +# Jul 24, 2021: - updated to V2.0 (major improvements) for release #$VERSION = '1.1'; # Jan 4, 2016 #$VERSION = '1.2'; # May 12, 2016 @@ -34,7 +37,7 @@ #$VERSION = '1.4'; # Nov 28, 2017 $VERSION = '1.5'; # Sep 12, 2018 -$antsMinLibVersion = 7.1; +$antsMinLibVersion = 7.3; $ADCP_tools_minVersion = 2.4; use lib '.';