RDI_Coords.pl
changeset 18 bb7bb9f83db9
parent 16 68a9fc5e7d45
child 19 e23a5fd2923a
--- 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: Sat Feb 22 09:43:27 2014
+#                    dlm: Tue Mar  4 13:35:21 2014
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 37 0 NIL 0 0 72 0 2 4 NIL ofnI
+#                    uE-Info: 273 60 NIL 0 0 72 0 2 4 NIL ofnI
 #======================================================================
 
 # RDI Workhorse Coordinate Transformations
@@ -34,6 +34,7 @@
 #	Aug  7, 2013: - BUG: &velBeamToBPInstrument did not return any val unless
 #						 all beam velocities are defined
 #	Nov 27, 2013: - added &RDI_pitch(), &tilt_azimuth()
+#	Mar  4, 2014: - added support for missing PITCH/ROLL/HEADING
 
 use strict;
 use POSIX;
@@ -111,7 +112,10 @@
 	{
 		my($dta,$ens,$v1,$v2,$v3,$v4) = @_;
 		return undef unless (defined($v1) && defined($v2) &&
-					   		 defined($v3) && defined($v4));
+					   		 defined($v3) && defined($v4) &&
+							 defined($dta->{ENSEMBLE}[$ens]->{PITCH}) &&
+							 defined($dta->{ENSEMBLE}[$ens]->{ROLL}) &&
+							 defined($dta->{ENSEMBLE}[$ens]->{HEADING}));
 	
 		unless (@I2E &&
 				$hdg   == $dta->{ENSEMBLE}[$ens]->{HEADING}
@@ -162,6 +166,11 @@
 		my($dta,$ens,$b1,$b2,$b3,$b4) = @_;
 		my($v12,$w12,$v34,$w34);
 
+		return (undef,undef,undef,undef) 
+			unless (defined($dta->{ENSEMBLE}[$ens]->{PITCH}) &&
+                    defined($dta->{ENSEMBLE}[$ens]->{ROLL}) &&
+                    defined($dta->{ENSEMBLE}[$ens]->{HEADING}));
+
 		unless (defined($TwoCosBAngle)) {
 			$TwoCosBAngle = 2 * cos(rad($dta->{BEAM_ANGLE}));
 			$TwoSinBAngle = 2 * sin(rad($dta->{BEAM_ANGLE}));
@@ -216,6 +225,11 @@
 		my($dta,$ens,$b1,$b2,$b3,$b4) = @_;
 		my($v12,$w12,$v34,$w34);
 
+		return (undef,undef,undef,undef) 
+			unless (defined($dta->{ENSEMBLE}[$ens]->{PITCH}) &&
+                    defined($dta->{ENSEMBLE}[$ens]->{ROLL}) &&
+                    defined($dta->{ENSEMBLE}[$ens]->{HEADING}));
+
 		unless (defined($TwoCosBAngle)) {
 			$TwoCosBAngle = 2 * cos(rad($dta->{BEAM_ANGLE}));
 			$TwoSinBAngle = 2 * sin(rad($dta->{BEAM_ANGLE}));
@@ -254,7 +268,9 @@
 sub velApplyHdgBias(@)
 {
 	my($dta,$ens,$v1,$v2,$v3,$v4) = @_;
-	return undef unless (defined($v1) && defined($v2));
+	return (undef,undef,undef,undef) 
+		unless (defined($v1) && defined($v2) &&
+				defined($dta->{ENSEMBLE}[$ens]->{HEADING}));
 
 	my($sh) = sin(rad(-$dta->{HEADING_BIAS}));
 	my($ch) = cos(rad(-$dta->{HEADING_BIAS}));
@@ -272,22 +288,25 @@
 sub gimbal_pitch($$)	# RDI coord trans manual
 {
 	my($RDI_pitch,$RDI_roll) = @_;
+	return 'nan' unless defined($RDI_pitch) && defined($RDI_roll);
 	return deg(atan(tan(rad($RDI_pitch)) * cos(rad($RDI_roll))));
 }
 
 sub RDI_pitch($$)
 {
 	my($gimbal_pitch,$roll) = @_;
+	return 'nan' unless defined($gimbal_pitch) && defined($roll);
 	return deg(atan(tan(rad($gimbal_pitch))/cos(rad($roll))));
 }
 
 sub tilt_azimuth($$)
 {
 	my($gimbal_pitch,$roll) = @_;
+	return 'nan' unless defined($gimbal_pitch) && defined($roll);
 	return angle(deg(atan2(sin(rad($gimbal_pitch)),sin(rad($roll)))));
 }
 
-# - angle from vertical is home grown and should be treated with caution
+# - angle from vertical is home grown
 # - angle between two unit vectors given by acos(v1 dot v2)
 # - vertical unit vector v1 = (0 0 1) => dot product = z-component of v2
 # - when vertical unit vector is pitched in x direction, followed by
@@ -301,6 +320,7 @@
 sub angle_from_vertical($$)
 {
 	my($RDI_pitch,$RDI_roll) = @_;
+	return 'nan' unless defined($RDI_pitch) && defined($RDI_roll);
 	my($rad_pitch) = atan(tan(rad($RDI_pitch)) * cos(rad($RDI_roll)));
 	return deg(acos(cos($rad_pitch) * cos(rad($RDI_roll))));
 }