Nortek files
authorAndreas Thurnherr <ant@ldeo.columbia.edu>
Sat, 10 Apr 2021 05:52:17 -0400
changeset 58 78607e2e8add
parent 57 5a59411306ba
child 59 4f4530fa35da
Nortek files
ADCP_tools_lib.pl
RDI_Coords.pl
RDI_PD0_IO.pl
listHdr
mkProfile
--- a/ADCP_tools_lib.pl
+++ b/ADCP_tools_lib.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    A D C P _ T O O L S _ L I B . P L 
 #                    doc: Tue Jan  5 10:45:47 2016
-#                    dlm: Mon Apr 20 15:47:30 2020
+#                    dlm: Tue Mar 23 09:15:16 2021
 #                    (c) 2016 A.M. Thurnherr
-#                    uE-Info: 19 25 NIL 0 0 72 0 2 4 NIL ofnI
+#                    uE-Info: 18 0 NIL 0 0 72 0 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -15,8 +15,9 @@
 #	Dec  7, 2017: - updated to V2.1 for improvements to listHdr
 #	Feb  6, 2018: - updated to V2.2 for changes to PD0_IO
 #	Apr 20, 2020: - updated to V2.3 after adaptating to work with IMPed moored ADCP data
+#	Mar 23, 2021: - updated to V2.4 after starting adaption to Nortek produced PD0 files
 
-$ADCP_tools_version = 2.3;
+$ADCP_tools_version = 2.4;
 
 die(sprintf("$0: obsolete ADCP_tools V%.1f; V%.1f required\n",
     $ADCP_tools_version,$ADCP_tools_minVersion))
--- a/RDI_Coords.pl
+++ b/RDI_Coords.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    R D I _ C O O R D S . P L 
 #                    doc: Sun Jan 19 17:57:53 2003
-#                    dlm: Mon Jun 29 10:59:01 2020
+#                    dlm: Wed Mar 17 23:20:13 2021
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 61 83 NIL 0 0 72 10 2 4 NIL ofnI
+#                    uE-Info: 66 9 NIL 0 0 72 10 2 4 NIL ofnI
 #======================================================================
 
 # RDI Workhorse Coordinate Transformations
@@ -59,6 +59,15 @@
 #	Mar 28, 2018: - added &loadInstrumentTransformation()
 #	Jun  5, 2020: - added sscorr_w & sscorr_w_mooring
 #   Jun 29, 2020: - added comments for sscorr_w, which conflicts with LADCP_w_ocean
+#	Mar 17, 2021: - adapted velBeamToInstrument() to Nortek (checked w only)
+#				  - adapted velInstrumentToEarth() to Nortek, assuming Nortek pitch is gimbal pitch
+# HISTORY END
+
+# NORTEK TODO:
+#	- check u, v sign convention for Nortek
+#	- verify that gimbal pitch for Nortek gives better results
+#		for A20 test profile 900, the differences in w have a stddev of 1.3e-5 m/s
+#	- update gimbal pitch for Nortek in other routines
 
 use strict;
 use POSIX;
@@ -135,7 +144,7 @@
 					   		 defined($v3) + defined($v4)
 								>= $RDI_Coords::minValidVels);
 
-		unless (@B2I) {
+		unless (@B2I) {															# nominal transformation matrix
 			my($a) = 1 / (2 * sin(rad($ADCP->{BEAM_ANGLE})));
 			my($b) = 1 / (4 * cos(rad($ADCP->{BEAM_ANGLE})));
 			my($c) = $ADCP->{CONVEX_BEAM_PATTERN} ? 1 : -1;
@@ -146,7 +155,14 @@
 				    [$d,	$d,		-$d,	-$d	 ]);
 		}
 
-		if (!defined($v1)) {					# 3-beam solutions
+		if ($ADCP->{PRODUCER} =~ '^Nortek') {									# Nortek ADCPs use different coord system
+			$v1 *= -1 if defined($v1);
+			$v2 *= -1 if defined($v2);
+			$v3 *= -1 if defined($v3);
+			$v4 *= -1 if defined($v4);
+		}
+
+		if (!defined($v1)) {													# 3-beam solutions
 			$RDI_Coords::threeBeamFlag = 1;
 			$RDI_Coords::threeBeam_1++;
 			$v1 = -($v2*$B2I[3][1]+$v3*$B2I[3][2]+$v4*$B2I[3][3])/$B2I[3][0];
@@ -211,7 +227,13 @@
 				if defined($ADCP->{ENSEMBLE}[$ens]->{HEADING});
 			$pitch = $ADCP->{ENSEMBLE}[$ens]->{PITCH};
 			$roll  = $ADCP->{ENSEMBLE}[$ens]->{ROLL};
-			my($rad_gimbal_pitch) = atan(tan(rad($pitch)) * cos(rad($roll)));
+			my($rad_gimbal_pitch);
+			if ($ADCP->{PRODUCER} =~ '^Nortek') {
+				$rad_gimbal_pitch = rad($pitch);									# I am assuming that this is correct
+			} else {
+				$rad_gimbal_pitch = atan(tan(rad($pitch)) * cos(rad($roll)));
+			}
+				
 			my($rad_calc_pitch) = ($RDI_Coords::beamTransformation eq 'RDI') ? $rad_gimbal_pitch : 
 								  asin(sin($rad_gimbal_pitch)*cos(rad($roll)) /
 									   sqrt(1-sin(rad($roll))**2*sin($rad_gimbal_pitch)**2));
--- a/RDI_PD0_IO.pl
+++ b/RDI_PD0_IO.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    R D I _ P D 0 _ I O . P L 
 #                    doc: Sat Jan 18 14:54:43 2003
-#                    dlm: Sat Mar  6 14:13:23 2021
+#                    dlm: Wed Mar 17 22:54:27 2021
 #                    (c) 2003 A.M. Thurnherr
-#					 uE-Info: 643 43 NIL 0 0 72 2 2 4 NIL ofnI
+#					 uE-Info: 129 35 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
     
 # Read RDI PD0 binary data files (*.[0-9][0-9][0-9])
@@ -125,6 +125,8 @@
 #					O(N^2) process
 #	Apr 14, 2020: - BUG: WBPens did not work for ens# > 65535 (high byte)
 #	Mar  3, 2021: - adapted to Nortek PD0 files
+#	Mar 13, 2021: - finished adaptation to Nortek files
+#	Mar 17, 2021: - updated HISTORY
 # END OF HISTORY
     
 # FIRMWARE VERSIONS:
@@ -983,59 +985,65 @@
 		my($ndata) = $nbins * 4;
 
 		my($vel_di) = WBRdtaIndex(0x0100);
-		die("no velocity data in ensemble #$ensNo\n")
-			unless defined($vel_di);
-	    
-		sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!");
-		sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!");
-		($id,@dta) = unpack("vv$ndata",$buf);
-
-		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
-			for ($beam=0; $beam<4; $beam++,$i++) {
-				${$E}[$ens]->{VELOCITY}[$bin][$beam] =
-					unpack('s',pack('S',$dta[$i])) / 1000
-						if ($dta[$i] != 0x8000);
-			}
-		}
+		if (defined($vel_di)) {
+			sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!");
+			sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!");
+			($id,@dta) = unpack("vv$ndata",$buf);
+	
+			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
+				for ($beam=0; $beam<4; $beam++,$i++) {
+					${$E}[$ens]->{VELOCITY}[$bin][$beam] =
+						unpack('s',pack('S',$dta[$i])) / 1000
+							if ($dta[$i] != 0x8000);
+				}
+	        }
+	    } else {
+#   		die("no velocity data in ensemble #$ensNo\n");
+			print(STDERR "WARNING: no velocity data in ensemble #$ensNo\n");
+        }	    
 
 		#--------------------
 		# Correlation Data
 		#--------------------
 
 		my($corr_di) = WBRdtaIndex(0x0200);
-		die("no correlation data in ensemble #$ensNo\n")
-			unless defined($corr_di);
-	    
-		sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!");
-		sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
-		($id,@dta) = unpack("vC$ndata",$buf);
-
-		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
-			for ($beam=0; $beam<4; $beam++,$i++) {
-				${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i]
-					if ($dta[$i]);
-			}
-		}
+		if (defined($corr_di)) {
+			sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!");
+			sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
+			($id,@dta) = unpack("vC$ndata",$buf);
+	
+			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
+				for ($beam=0; $beam<4; $beam++,$i++) {
+					${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i]
+						if ($dta[$i]);
+				}
+	        }
+	    } else {
+#  			die("no correlation data in ensemble #$ensNo\n")
+  			print(STDERR "WARNING: no correlation data in ensemble #$ensNo\n")
+  		}
 
 		#--------------------
 		# Echo Intensity Data
 		#--------------------
 
 		my($echo_di) = WBRdtaIndex(0x0300);
-		die("no echo intensity data in ensemble #$ensNo\n")
-			unless defined($echo_di);
-	    
-		sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!");
-		sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
-		($id,@dta) = unpack("vC$ndata",$buf);
-
-		$id == 0x0300 ||
-			die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo));
-
-		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
-			for ($beam=0; $beam<4; $beam++,$i++) {
-				${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i];
-			}
+		if (defined($echo_di)) {
+			sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!");
+			sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
+			($id,@dta) = unpack("vC$ndata",$buf);
+	
+			$id == 0x0300 ||
+				die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo));
+	
+			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
+				for ($beam=0; $beam<4; $beam++,$i++) {
+					${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i];
+				}
+	        }
+	    } else {
+#			die("no echo intensity data in ensemble #$ensNo\n");
+			print(STDERR "WARNING: no echo intensity data in ensemble #$ensNo\n");
 		}
 
 		#--------------------
@@ -1145,10 +1153,12 @@
 	my($trgid) = @_;
 	our($ndt,$buf,$id,$start_ens,@WBRofs);
 	
+#	printf(STDERR "WBRdtaIndex(%04X)\n",$trgid);
 	for (my($di)=2; $di<$ndt; $di++) {
 		sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!");
 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
 		$id = unpack('v',$buf);
+#		printf(STDERR "\tid = %04X\n",$id);
 		return $di if ($id == $trgid);
     }
     return undef;
--- a/listHdr
+++ b/listHdr
@@ -2,9 +2,9 @@
 #======================================================================
 #                    L I S T H D R 
 #                    doc: Sat Jan 18 18:41:49 2003
-#                    dlm: Sat Mar  6 14:19:53 2021
+#                    dlm: Wed Mar 17 22:53:25 2021
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 208 75 NIL 0 0 72 10 2 4 NIL ofnI
+#                    uE-Info: 50 35 NIL 0 0 72 10 2 4 NIL ofnI
 #======================================================================
 
 # Print useful info from the RDI BB header
@@ -46,6 +46,8 @@
 # 	Jun 13, 2019: - removed BT_PRESENT flag support
 #	Jun 26, 2019: - added comment to the effect that BT setup cannot be listed
 #					with this utility any more
+#	Mar  6, 2021: - adapted to Nortek Signature data files
+#	Mar 17, 2021: - updated HISTORY
 
 use Getopt::Std;
 
--- a/mkProfile
+++ b/mkProfile
@@ -2,9 +2,9 @@
 #======================================================================
 #                    M K P R O F I L E 
 #                    doc: Sun Jan 19 18:55:26 2003
-#                    dlm: Thu Apr 18 16:28:13 2019
+#                    dlm: Sat Apr 10 05:51:48 2021
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 98 54 NIL 0 0 72 0 2 4 NIL ofnI
+#                    uE-Info: 99 35 NIL 0 0 72 0 2 4 NIL ofnI
 #======================================================================
 
 # Make an LADCP Profile by Integrating W (similar to Firing's scan*).
@@ -96,6 +96,8 @@
 #	Apr  2, 2018: - BUG: velBeamToInstrument() used old usage
 #	Apr 24, 2018: - BUG: bin1 was used even with zero blanking
 #	Apr 18, 2019: - added coord-transformation %PARAMs
+#	Apr 10, 2021: - adapted to V2.4
+# HISTORY END
 
 # NOTES:
 #	- the battery values are based on transmission voltages (different
@@ -226,7 +228,7 @@
 	print(STDERR "WARNING: $0 WIDE BANDWIDTH!\n");
 }
 
-unless ($dta{TRANSMIT_POWER_HIGH}) {
+unless ($dta{TRANSMIT_POWER_MAX}) {
 	print(STDERR "WARNING: $0 LOW TRANSMIT POWER!\n");
 }