diff --git a/WorkhorseUtils.pl b/WorkhorseUtils.pl deleted file mode 100644 --- a/WorkhorseUtils.pl +++ /dev/null @@ -1,162 +0,0 @@ -#====================================================================== -# W O R K H O R S E U T I L S . P L -# doc: Wed Feb 12 10:21:32 2003 -# dlm: Sun May 23 16:32:37 2010 -# (c) 2003 A.M. Thurnherr -# uE-Info: 142 42 NIL 0 0 72 2 2 4 NIL ofnI -#====================================================================== - -# miscellaneous Workhorse-specific utilities - -# History: -# Feb 12, 2003: - created -# Feb 14, 2003: - added check for short (bad) data files -# Feb 26, 2004: - added Earth-coordinate support -# - added ensure_BT_RANGE() -# Mar 17, 2004: - set bad BT ranges to undef in ensure_BT_RANGE -# - calc mean/stddev in ensure_BT_RANGE -# Mar 20, 2004: - BUG: find_seabed() could bomb when not enough -# bottom guesses passed the mode_width test -# Mar 30, 2004: - added &soundSpeed() -# Nov 8, 2005: - WATER_DEPTH => Z_BT -# May 23, 2010: - Z* -> DEPTH* - -use strict; - -#====================================================================== -# fake_BT_RANGE(dta ptr) -#====================================================================== - -# During cruise NBP0204 it was found that one of Visbeck's RDIs consistently -# returns zero as the bottom-track range, even thought the BT velocities -# are good. This functions calculates the ranges if they are missing. - -sub cBTR($$$) -{ - my($d,$e,$b) = @_; - my($maxamp) = -9e99; - my($maxi); - - for (my($i)=0; $i<$d->{N_BINS}; $i++) { - next unless ($d->{ENSEMBLE}[$e]->{ECHO_AMPLITUDE}[$i][$b] > $maxamp); - $maxamp = $d->{ENSEMBLE}[$e]->{ECHO_AMPLITUDE}[$i][$b]; - $maxi = $i; - } - $d->{ENSEMBLE}[$e]->{BT_RANGE}[$b] = - $d->{DISTANCE_TO_BIN1_CENTER} + $maxi * $d->{BIN_LENGTH}; -} - -sub ensure_BT_RANGE($) -{ - my($d) = @_; - for (my($e)=0; $e<=$#{$d->{ENSEMBLE}}; $e++) { - my($sum) = my($n) = 0; - if (defined($d->{ENSEMBLE}[$e]->{BT_VELOCITY}[0])) { - for (my($b)=0; $b<4; $b++) { - cBTR($d,$e,$b) - unless defined($d->{ENSEMBLE}[$e]->{BT_RANGE}[$b]); - $sum += $d->{ENSEMBLE}[$e]->{BT_RANGE}[$b]; $n++; - } - } else { - for (my($b)=0; $b<4; $b++) { - $d->{ENSEMBLE}[$e]->{BT_RANGE}[$b] = undef; - } - } - $d->{ENSEMBLE}[$e]->{BT_MEAN_RANGE} = $sum/$n if ($n == 4); - } -} - -#====================================================================== -# (seabed depth, stddev) = find_seabed(dta ptr, btm ensno, coord flag) -#====================================================================== - -# NOTE FOR YOYOS: -# - this routine only detects the BT around the depeest depth! -# - this is on purpose, because it is used for [listBT] - -# This is a PAIN: -# if the instrument is too close to the bottom, the BT_RANGE -# readings are all out; the only solution is to have a sufficiently -# large search width (around the max(depth) ensemble) so that -# a part of the up (oops, I forgot to finish this comment one year -# ago during A0304 and now I don't understand it any more :-) - -my($search_width) = 200; # # of ensembles around bottom to search -my($mode_width) = 10; # max range of bottom around mode -my($z_offset) = 10000; # shift z to ensure +ve array indices - -sub find_seabed($$$) -{ - my($d,$be,$beamCoords) = @_; - my($i,$dd,$sd,$nd); - my(@guesses); - - return undef unless ($be-$search_width >= 0 && - $be+$search_width <= $#{$d->{ENSEMBLE}}); - for ($i=$be-$search_width; $i<=$be+$search_width; $i++) { - next unless (defined($d->{ENSEMBLE}[$i]->{BT_RANGE}[0]) && - defined($d->{ENSEMBLE}[$i]->{BT_RANGE}[1]) && - defined($d->{ENSEMBLE}[$i]->{BT_RANGE}[2]) && - defined($d->{ENSEMBLE}[$i]->{BT_RANGE}[3])); - my(@BT) = $beamCoords - ? velInstrumentToEarth($d,$i, - velBeamToInstrument($d, - @{$d->{ENSEMBLE}[$i]->{BT_VELOCITY}})) - : velApplyHdgBias($d,$i,@{$d->{ENSEMBLE}[$i]->{BT_VELOCITY}}); - next unless (abs($BT[3]) < 0.05); - $d->{ENSEMBLE}[$i]->{DEPTH_BT} = - $d->{ENSEMBLE}[$i]->{DEPTH_BT} = - $d->{ENSEMBLE}[$i]->{BT_RANGE}[0]/4 + - $d->{ENSEMBLE}[$i]->{BT_RANGE}[1]/4 + - $d->{ENSEMBLE}[$i]->{BT_RANGE}[2]/4 + - $d->{ENSEMBLE}[$i]->{BT_RANGE}[3]/4; - $d->{ENSEMBLE}[$i]->{DEPTH_BT} *= -1 - if ($d->{ENSEMBLE}[$i]->{XDUCER_FACING_UP}); - $d->{ENSEMBLE}[$i]->{DEPTH_BT} += $d->{ENSEMBLE}[$i]->{DEPTH}; - $guesses[int($d->{ENSEMBLE}[$i]->{DEPTH_BT})+$z_offset]++; - $nd++; - } - return undef unless ($nd>5); - - my($mode,$nmax); - for ($i=0; $i<=$#guesses; $i++) { # find mode - $nmax=$guesses[$i],$mode=$i-$z_offset - if ($guesses[$i] > $nmax); - } - - $nd = 0; - for ($i=$be-$search_width; $i<=$be+$search_width; $i++) { - next unless defined($d->{ENSEMBLE}[$i]->{DEPTH_BT}); - if (abs($d->{ENSEMBLE}[$i]->{DEPTH_BT}-$mode) <= $mode_width) { - $dd += $d->{ENSEMBLE}[$i]->{DEPTH_BT}; - $nd++; - } else { - $d->{ENSEMBLE}[$i]->{DEPTH_BT} = undef; - } - } - return undef unless ($nd >= 2); - - $dd /= $nd; - for ($i=$be-$search_width; $i<=$be+$search_width; $i++) { - next unless defined($d->{ENSEMBLE}[$i]->{DEPTH_BT}); - $sd += ($d->{ENSEMBLE}[$i]->{DEPTH_BT}-$dd)**2; - } - - return ($dd, sqrt($sd/($nd-1))); -} - -#====================================================================== -# c = soundSpeed() -#====================================================================== - -# Taken from the RDI BroadBand primer manual. The reference given there -# is Urick (1983). - -sub soundSpeed($$$) -{ - my($salin,$temp,$depth) = @_; - return 1449.2 + 4.6*$temp -0.055*$temp**2 + 0.00029*$temp**3 + - (1.34 - 0.01*$temp) * ($salin - 35) + 0.016*$depth; -} - -1;