0
|
1 |
#======================================================================
|
|
2 |
# M E R G E C T D + L A D C P . B E S T L A G
|
|
3 |
# doc: Sat May 22 21:30:18 2010
|
|
4 |
# dlm: Thu Dec 16 04:02:59 2010
|
|
5 |
# (c) 2010 A.M. Thurnherr
|
|
6 |
# uE-Info: 34 35 NIL 0 0 72 2 2 4 NIL ofnI
|
|
7 |
#======================================================================
|
|
8 |
|
|
9 |
# HISTORY:
|
|
10 |
# May 22, 2010: - exiled from [mergeCTD+LADCP]
|
|
11 |
# May 23, 2010: - BUG: undef'd LADCP ref vels had not been treated correctly
|
|
12 |
# Oct 30, 2010: - BUG: changed croak to next in rmsErr, to improve time matching
|
|
13 |
# Dec 16, 2010: - added special case (no search) on -s 0
|
|
14 |
# - added code to ignore points with discrepancies > $opt_m
|
|
15 |
|
|
16 |
#======================================================================
|
|
17 |
# Find Best Lag Subroutines
|
|
18 |
#======================================================================
|
|
19 |
|
|
20 |
sub Ce($) { return $ants_[$_[0]][$CTD_elapsed] + $CTD_timoff; } # CTD elapsed for given scan
|
|
21 |
sub Le($) { return $LADCP{ENSEMBLE}[$_[0]]->{ELAPSED_TIME}; } # LADCP elapsed for given ens
|
|
22 |
|
|
23 |
sub rmsErr($$$$)
|
|
24 |
{
|
|
25 |
my($Lsi,$Lei,$ens,$CTD_trg) = @_;
|
|
26 |
my($sumSq) = my($n) = 0;
|
|
27 |
|
|
28 |
for (my($Li)=$Lsi; $Li<=$Lei; $Li++) {
|
|
29 |
my($Ldt) = &Le($Li) - &Le($ens);
|
|
30 |
my($Cdi) = round($Ldt / $opt_z);
|
|
31 |
next unless ($CTD_trg+$Cdi>=0 && $CTD_trg+$Cdi<=$#ants_);
|
|
32 |
next unless defined($LADCP{ENSEMBLE}[$Li]->{REFLR_W});
|
|
33 |
my($err) = $LADCP{ENSEMBLE}[$Li]->{REFLR_W} - $ants_[$CTD_trg+$Cdi][$CTD_w];
|
|
34 |
next if (abs($err) > $opt_m);
|
|
35 |
$sumSq += &SQR($err);
|
|
36 |
$n++;
|
|
37 |
}
|
|
38 |
return ($n>0) ? sqrt($sumSq/$n) : 9e99;
|
|
39 |
}
|
|
40 |
|
|
41 |
sub bestLag($$$$) # LADCP start index, LADCP end index, LADCP target index, CTD target index
|
|
42 |
{
|
|
43 |
my($Lsi,$Lei,$ens,$CTD_trg) = @_;
|
|
44 |
|
|
45 |
my($cErr) = rmsErr($Lsi,$Lei,$ens,$CTD_trg);
|
|
46 |
return ($CTD_trg,$cErr) if ($opt_s == 0); # special case: disable search
|
|
47 |
|
|
48 |
if ($CTD_trg > 0) { # search backward
|
|
49 |
my($nErr) = rmsErr($Lsi,$Lei,$ens,$CTD_trg-1);
|
|
50 |
while ($nErr < $cErr && $CTD_trg > 1) {
|
|
51 |
$CTD_trg--;
|
|
52 |
$cErr = $nErr;
|
|
53 |
$nErr = rmsErr($Lsi,$Lei,$ens,$CTD_trg-1);
|
|
54 |
}
|
|
55 |
}
|
|
56 |
|
|
57 |
if ($CTD_trg < $#ants_) { # search forward
|
|
58 |
$nErr = rmsErr($Lsi,$Lei,$ens,$CTD_trg+1);
|
|
59 |
while ($nErr < $cErr && $CTD_trg < $#ants_-1) {
|
|
60 |
$CTD_trg++;
|
|
61 |
$cErr = $nErr;
|
|
62 |
$nErr = rmsErr($Lsi,$Lei,$ens,$CTD_trg+1);
|
|
63 |
}
|
|
64 |
}
|
|
65 |
return ($CTD_trg>0 && $CTD_trg<$#ants_) ? ($CTD_trg,$cErr) : (undef,undef);
|
|
66 |
}
|
|
67 |
|
|
68 |
1;
|