LADCPproc.backscatter
changeset 12 65582c172355
parent 8 88ba92d0e30c
child 28 79bf60e97208
--- a/LADCPproc.backscatter
+++ b/LADCPproc.backscatter
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L A D C P P R O C . B A C K S C A T T E R 
 #                    doc: Wed Oct 20 13:02:27 2010
-#                    dlm: Tue Apr 10 13:46:28 2012
+#                    dlm: Wed May 16 17:55:14 2012
 #                    (c) 2010 A.M. Thurnherr
-#                    uE-Info: 52 59 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 279 33 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -17,6 +17,10 @@
 #	Jul 14, 2011: - implemented Sv_V04
 #	Jul 15, 2011: - modified Sv_V04 to take noise levels into account (Sv_T11)
 #	Apr 10, 2012: - BUG: ensonified volume in Sv_T11 was wrong
+#	May 16, 2012: - BUG: find_backscatter_seabed() used wrong start depth for
+#						 search
+#				  - BUG: same used bins entirely below seabed (only possible
+#						 for shallow casts)
 
 my($BEAM1) = 0;
 my($BEAM2) = 1;
@@ -252,21 +256,30 @@
 
 sub find_backscatter_seabed($)
 {
-	my($search_below) = @_;
-	my($mdgi) = int($search_below/$GRID_DZ);					# grid index to begin search
+	my($water_depth) = @_;
 	my(@wdepth_gi);												# water_depth indices
 
-	print(STDERR "\n\tseabed-max grid indices:") if ($opt_d);
+	my($search_below) = max(0,$water_depth-$BT_begin_search_above);
+	my($mdgi) = int($search_below/$GRID_DZ);					# grid index to begin search
+	print(STDERR "\n\t\tlooking for seabed below $search_below m (gi >= $mdgi)") if ($opt_d);
+
+	print(STDERR "\n\t\tseabed-max grid indices:") if ($opt_d);
 	
 	for (my($bin)=0; $bin<$LADCP{N_BINS}; $bin++) { 			# find backscatter min/max below $search_below in each bin
-		my($min,$max,$gimax,$lastvalid) = (1e99,-1e99,-1,-1);
+		my($min,$max,$gimax,$firstvalid,$lastvalid) = (1e99,-1e99,-1,-1,-1);
 		for (my($gi)=$mdgi; $gi<@nSv; $gi++) {
 			next unless ($nSv[$gi][$bin] > 0);
+			$firstvalid = $gi if ($firstvalid < 0);
 			my($avg) = $sSv[$gi][$bin] / $nSv[$gi][$bin];
 			$lastvalid = $gi;
 			$min = $avg if ($avg < $min);
 			$max = $avg, $gimax = $gi if ($avg > $max);
 		}
+		if ($gimax == $firstvalid) {							# should be robust except maybe for huge bins
+			printf(STDERR "\n\t\tdata from below-seabed bins (%d-%d) discarded",
+				$bin+1,$LADCP{N_BINS}) if ($opt_d);
+			last;
+		}
 		if ($max-$min>10 && $gimax!=$lastvalid) { 				# ignore boundary maxima & scatter
 			printf(STDERR " %d",$gimax-$mdgi) if ($opt_d);
 			push(@wdepth_gi,$gimax);