LADCP_wspec
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 27 Nov 2018 16:59:05 -0500
changeset 49 5006e9158207
parent 48 d9309804b6cf
permissions -rwxr-xr-x
V1.4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#!/usr/bin/perl
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#======================================================================
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    L A D C P _ W S P E C 
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    doc: Thu Jun 11 12:02:49 2015
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
     5
#                    dlm: Thu Nov  1 10:09:48 2018
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 2012 A.M. Thurnherr
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
     7
#                    uE-Info: 39 29 NIL 0 0 72 10 2 4 NIL ofnI
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
#======================================================================
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
$antsSummary = 'calculate VKE window spectra from LADCP profiles';
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
# HISTORY:
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    13
#   Jun 11, 2015: - adapted from [binpgrams]
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    14
#   Jun 12, 2015: - renamed %PARAM prefixes
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    15
#   Jun 15, 2015: - BUG: de-meaning did not respect _gap variables
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    16
#                 - added %output_depth_resolution
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    17
#                 - reversed semantics of -d/-u
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    18
#   Jun 16, 2015: - reversed semantics of -t
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    19
#                 - re-added pwrdens.0 to make output consistent with [binpgrams]
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    20
#   Oct 12, 2015: - require ANTSlibs V6.2 for release
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    21
#   Oct 13, 2015: - adapted to [version.pl]
34
e550db661c17 pre-Tampa
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 33
diff changeset
    22
#   Jan 25, 2016: - added software version %PARAM
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    23
#   Mar  1, 2016: - made trailing message much less frequent
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    24
#                 - BUG: program croaked gracelessly or entered infinite loop
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    25
#                        when presented with insufficient (no valid) input
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    26
#                        data
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    27
#   Mar 27, 2016: - added -z)ap
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    28
#   Mar 28, 2016: - removed -z
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    29
#                 - renamed nsamp to nspec
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    30
#                 - added w.nsamp.avg
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    31
#   Mar 31, 2016: - changed version %PARAM
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    32
#				  - BUG: nspec was nan insted of 0
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    33
#				  - replaced wspec:: %PARAM-prefix with LADCP_wspec::
48
d9309804b6cf V1.3 release
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 43
diff changeset
    34
#	Mar 12, 2017: - removed ANTSBIN (which is not public)
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    35
#	Dec  9, 2017: - added $antsSuppressCommonOptions = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    36
#	Dec 14, 2017: - added w.rms to output
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    37
#	May 13, 2018: - BUG: Removal of higher order polynomials (-o > 0) did not work
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    38
#	May 16, 2018: - modified depth.{min,max} to respect input resolution
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    39
#	Nov  1, 2018: - cosmetics
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
($ANTSLIB) = (`which ANTSlib` =~ m{^(.*)/[^/]*$});
33
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
    42
($WCALC)   = ($0              =~ m{^(.*)/[^/]*$});
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
    43
$WCALC = '.' if ($WCALC eq '');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
33
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 32
diff changeset
    45
require "$WCALC/version.pl";
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
require "$ANTSLIB/ants.pl";
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
require "$ANTSLIB/antsfilters.pl";
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
require "$ANTSLIB/libstats.pl";
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
require "$ANTSLIB/fft.pl";
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
require "$ANTSLIB/lfit.pl";
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
require "$ANTSLIB/nrutil.pl";
48
d9309804b6cf V1.3 release
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 43
diff changeset
    52
require "$ANTSLIB/.lsfit.poly";
d9309804b6cf V1.3 release
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 43
diff changeset
    53
require "$ANTSLIB/.nminterp.linear";
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    54
&antsAddParams('LADCP_wspec::version',$VERSION);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
# Usage
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    60
$antsSuppressCommonOptions = 1;
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
&antsUsage('bc:dg:o:s:tuw:',0,
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    62
            '[poly-o)rder <n[0]> to de-mean data; -1 to disable>] [suppress cosine-t)aper]',
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    63
            '[-d)own/-u)pcast-only] [exclude -b)ottom window]',
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    64
            '[shortwave -c)utoff <kz or lambda>]',
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    65
            '[-s)urface <layer depth to exclude[150m]>',
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    66
            '[-g)ap <max depth layer to fill with interpolation[40m]>]',
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
    67
            '[-w)indow <power-of-two input-records>]',
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    68
            '[LADCP-profile(s)]');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    70
&antsIntOpt(\$opt_o,0);                                     # polynomial order to remove
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    71
if ($opt_o >= 0) {                                              # init model
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    72
    &modelUsage();
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    73
    matrix(\@covar,1,$modelNFit,1,$modelNFit);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    74
    vector(\@afunc,1,$modelNFit);
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    75
    &antsAddParams('LADCP_wspec::demean_poly_order',$opt_o);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
croak("$0: cannot ignore both down- and upcast\n")
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    79
    unless ($opt_d+$opt_u < 2);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
if ($opt_d) {
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    81
    &antsAddParams('LADCP_wspec::input_data','dc');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
} elsif ($opt_u) {
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    83
    &antsAddParams('LADCP_wspec::input_data','uc');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
} else {
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    85
    &antsAddParams('LADCP_wspec::input_data','dc/uc');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
}
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    87
&antsAddParams('LADCP_wspec::cos_taper_applied',$opt_t ? 'no' : 'yes');
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    88
&antsAddParams('LADCP_wspec::btm_window_included',$opt_b ? 'no' : 'yes');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    90
if (defined($opt_c)) {                                          # shortwave cutoff
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    91
    $kzlim = ($opt_c < 1) ? $opt_c : 2*$PI/$opt_c;
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
    92
    &antsAddParams('LADCP_wspec::shortwave_cutoff',$kzlim);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
} else {
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    94
    $kzlim = 9e99;
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    97
&antsCardOpt($opt_w);                                           # window size
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
    99
&antsCardOpt(\$opt_g,40);                                       # gap length [m]
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   100
&antsAddParams('LADCP_wspec::min_gap_thickness',$opt_g);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   102
&antsCardOpt(\$opt_s,150);                                      # surface layer
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   103
&antsAddParams('LADCP_wspec::surface_layer',$opt_s);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   105
&ISUsage;                                                       # interpolation model
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
# Read Data & Define Layout
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
croak("LADCP_VKE: spectral-input mode must be selected manually (-f)\n")
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   112
    if defined(fnrNoErr('pwrdens.0')) && !defined(fnrNoErr('dc_w'));
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   114
$zfnr = fnr('depth');                                           # required fields
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   115
$dcwfnr = fnr('dc_w'); $dcsfnr = fnr('dc_w.nsamp');
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   116
$ucwfnr = fnr('uc_w'); $ucsfnr = fnr('uc_w.nsamp');
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   117
$habfnr = fnrNoErr('hab');                                      # optional fields
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   119
&antsInstallBufFull(0);                                         # read entire file
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
&antsIn();
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
35
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   122
while (@ants_ && $ants_[0][$zfnr] < $opt_s) {					# remove surface layer
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
	shift(@ants_);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
}
35
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   125
croak("$0: insufficient data (no valid records found)\n")
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   126
	unless (@ants_);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
35
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   128
for ($trimmed=0; @ants_ && !numberp($ants_[$#ants_][$dcwfnr]) && !numberp($ants_[$#ants_][$ucwfnr]); $trimmed++) {
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
	pop(@ants_);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
&antsInfo("$trimmed trailing non-numeric records trimmed")
35
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   132
	if ($trimmed > 1);											# 1 is very common
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   133
croak("$0: insufficient data (no valid records found)\n")
54b8bb450e5f Version 1.2 finished. Out for testing to Jay Hooper.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 34
diff changeset
   134
	unless (@ants_);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
$dz = &antsXCheck($zfnr,0,$#ants_,1.01);						# calc dT; 1% jitter
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   137
&antsAddParams("LADCP_wspec::input_depth_resolution",$dz);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
$opt_g = int(($opt_g - 1) / $dz);								# [m] -> [records]
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   141
unless (defined($opt_w)) {										# default window size: largest pwr-of-two <= 600m
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
	for ($opt_w=32; $opt_w*$dz>600; $opt_w/=2) {}
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   143
	&antsInfo("%d-m windows ($opt_w samples)",$opt_w*$dz);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
}
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   145
&antsAddParams('LADCP_wspec::window_size',$opt_w,'LADCP_wspec::output_depth_resolution',$dz*$opt_w);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
croak(sprintf("$0: insufficient data (%d records found, %d required)\n",scalar(@ants_),$opt_w))
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
	unless (@ants_ >= $opt_w);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
$zrange = $opt_w * $dz;											# NB: not equal to max-min!!!
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
$resolution_bandwidth = 1 / $zrange;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
$resolution_bandwidth *= 2*$PI;
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   153
&antsAddParams('LADCP_wspec::resolution_bandwidth',$resolution_bandwidth);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   155
push(@antsNewLayout,'widx','depth','depth.min','depth.max','hab','w.rms','nspec','w.nsamp.avg');
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
for (my($i)=0; $i<$opt_w/2+1; $i++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
	my($kz) = 2*$PI*$i/$zrange;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
	last if ($kz > $kzlim);
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   159
	&antsAddParams(sprintf('LADCP_wspec::k.%d',$i),$kz);
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   160
	&antsAddParams(sprintf('LADCP_wspec::lambda.%d',$i),$i ? $zrange/$i : inf);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
	push(@antsNewLayout,sprintf('pwrdens.%d',$i));
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
push(@antsNewLayout,'pwr.tot');
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
&antsActivateOut();
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
# interpolate short gaps
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
&ISInit($dcwfnr,$zfnr);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
&ISInit($ucwfnr,$zfnr);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
my($dcLastValid,$ucLastValid,$interp);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
for (my($r)=0; $r<=$#ants_; $r++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
	if (numberp($ants_[$r][$dcwfnr])) {								# number => no interp.
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
		$dcLastValid = $r;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
	} elsif (defined($dcLastValid)) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
		$ants_[$r][$dcwfnr] = &interpolate($zfnr,$opt_g,$dcwfnr,$dcLastValid,$r);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
		$interp++ if numberp($ants_[$r][$dcwfnr]);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
	if (numberp($ants_[$r][$ucwfnr])) {								# number => no interp.
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
		$ucLastValid = $r;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
	} elsif (defined($ucLastValid)) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
		$ants_[$r][$ucwfnr] = &interpolate($zfnr,$opt_g,$ucwfnr,$ucLastValid,$r);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
		$interp++ if numberp($ants_[$r][$ucwfnr]);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
	
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
&antsInfo("$interp non-numeric values interpolated")
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
	if ($interp);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
# loop over windows
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
#----------------------------------------------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
sub avgF($$)														# average field over window
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
{
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
	my($f,$r) = @_;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
	my(@vals);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
	push(@vals,$ants_[$r++][$f])
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
		while (@vals < $opt_w);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
	return avg(@vals);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   207
sub medianF($$)														# average field over window
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   208
{
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   209
	my($f,$r) = @_;
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   210
	my(@vals);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   211
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   212
	push(@vals,$ants_[$r++][$f])
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   213
		while (@vals < $opt_w);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   214
	return median(@vals);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   215
}
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   216
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
unless ($opt_t) {													# compile taper function only if needed
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
	sub cosTaperWeight($)
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
	{
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
		my($z) = $_[0] - $ants_[$fromR][$zfnr];						# elapsed time
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
		return ($z<0.1*$zrange || $z>0.9*$zrange) ?
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
					0.5*(1+cos(10*$PI*$z/$zrange-$PI)) : 1;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
WINDOW: for (my($widx)=1; 1; $widx++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	undef(@out);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	$out[0] = $widx;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
	local($fromR) = round(($widx-1)*($opt_w/2));					# local, cuz it's used in cosTaperWeight
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	#----------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	# partial bottom window
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	#----------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	if ($fromR+$opt_w-1 > $#ants_) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
		last if ($opt_b);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
		$out[0] = -1;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
		$fromR = @ants_ - $opt_w;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
		$opt_b = 1;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   242
	#--------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   243
	# calculate rms w in window
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   244
	#	- also determines if there are missing y values
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   245
	#--------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   246
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   247
	my($dc_gap) = $opt_u;											# exclude dc with -d, uc with -u
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   248
	my($uc_gap) = $opt_d;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   249
	my($sumsq,$n) = (0,0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   250
	for (my($r)=$fromR; $r<$fromR+$opt_w; $r++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   251
		if (numberp($ants_[$r][$dcwfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   252
			$sumsq += $ants_[$r][$dcwfnr]**2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   253
			$n++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   254
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   255
			$dc_gap = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   256
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   257
		if (numberp($ants_[$r][$ucwfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   258
			$sumsq += $ants_[$r][$ucwfnr]**2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   259
			$n++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   260
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   261
			$uc_gap = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   262
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   263
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   264
	my($wrms) = ($n > 0) ? sqrt($sumsq/$n) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   265
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
	#-----------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
	# output nan on non-numeric y values
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
	#-----------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
	if ($dc_gap && $uc_gap) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
		push(@out,$ants_[$fromR+$opt_w/2][$zfnr]);		
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
		if ($ants_[0][$zfnr] > $ants_[1][$zfnr]) {		
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
			push(@out,$ants_[$fromR+$opt_w-1][$zfnr]);	
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
			push(@out,$ants_[$fromR][$zfnr]); 			
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
		} else {										
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
			push(@out,$ants_[$fromR][$zfnr]);			
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
			push(@out,$ants_[$fromR+$opt_w-1][$zfnr]);	
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
	    }
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   279
	    push(@out,defined($habfnr) ?								# hab
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
						avgF($habfnr,$fromR) : nan);
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   281
		push(@out,$wrms);											# rms w						
43
567b03b9ce8d V1.2beta7
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 42
diff changeset
   282
		push(@out,0);												# nspec
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   283
		push(@out,nan);												# w.nsamp.avg
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   284
		for ($i=0; $i<=$opt_w/2; $i++) {							# power
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
			push(@out,nan);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
		}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
		&antsOut(@out);												# output nan record and go to next window
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
		next WINDOW;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	#--------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
	# save current values
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
	#--------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
	for (my($i)=0; $i<$opt_w; $i++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
		$dcwbuf[$i] = $ants_[$fromR+$i][$dcwfnr];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		$ucwbuf[$i] = $ants_[$fromR+$i][$ucwfnr];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
	#------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
	# polynomial de-"mean"ing
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
	#------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
	if ($opt_o >= 0) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
		my($calc);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
		unless ($dc_gap) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
			&modelInit();												# dc
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
			for (my($a)=1; $a<=$modelNFit; $a++) { $iA[$a] = 1; }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
			&lfit($zfnr,$dcwfnr,-1,\@A,\@iA,\@covar,\&modelEvaluate,$fromR,$fromR+$opt_w-1);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
			&modelCleanup();
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
			for (my($i)=0; $i<$opt_w; $i++) {
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   312
				modelEvaluate($fromR+$i,$zfnr,\@afunc);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
				for ($calc=0,my($p)=1; $p<=$modelNFit; $p++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
					$calc += $A[$p] * $afunc[$p];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
				}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
				$ants_[$fromR+$i][$dcwfnr] -= $calc;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
	        }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
	    }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
	    unless ($uc_gap) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
			&modelInit();												# uc
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
			for (my($a)=1; $a<=$modelNFit; $a++) { $iA[$a] = 1; }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
			&lfit($zfnr,$ucwfnr,-1,\@A,\@iA,\@covar,\&modelEvaluate,$fromR,$fromR+$opt_w-1);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
			&modelCleanup();
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
			for (my($i)=0; $i<$opt_w; $i++) {
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   325
				modelEvaluate($fromR+$i,$zfnr,\@afunc);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
				for ($calc=0,my($p)=1; $p<=$modelNFit; $p++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
					$calc += $A[$p] * $afunc[$p];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
				}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
				$ants_[$fromR+$i][$ucwfnr] -= $calc;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
	        }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
	    }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
	#-----------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
	# taper data
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
	#-----------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	unless ($opt_t) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
		for (my($i)=0; $i<$opt_w; $i++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
			$ants_[$fromR+$i][$dcwfnr] *= &cosTaperWeight($ants_[$fromR+$i][$zfnr]);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
			$ants_[$fromR+$i][$ucwfnr] *= &cosTaperWeight($ants_[$fromR+$i][$zfnr]);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
		}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
		$taper_correction = 1/0.875;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
	} else {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
		$taper_correction = 1;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
	#-------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
	# PSD Estimate
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
	#-------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
			
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
#	for (my($r)=0; $r<$opt_w; $r++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
#		print(STDERR "$ants_[$fromR+$r][$dcwfnr], $ants_[$fromR+$r][$ucwfnr]\n");
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
#	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
	@dc_coeff = &cFFT($dcwfnr,nan,$opt_w,$fromR)				# FFT
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
		unless ($dc_gap);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
	@uc_coeff = &cFFT($ucwfnr,nan,$opt_w,$fromR)
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
		unless ($uc_gap);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
	croak("$0: -n $opt_w not a power-of-two\n")
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
		unless (@dc_coeff/2==$opt_w || @uc_coeff/2==$opt_w);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
	@dc_pwr = &pgram_onesided($opt_w,@dc_coeff)					# total power
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
		unless ($dc_gap);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
	@uc_pwr = &pgram_onesided($opt_w,@uc_coeff)
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
		unless ($uc_gap);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
	
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   368
#	push(@out,$ants_[$fromR+$opt_w/2][$zfnr]);					# middle z
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   369
	push(@out,avgF($zfnr,$fromR));								# average z
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
	if ($ants_[0][$zfnr] > $ants_[1][$zfnr]) {					# input descending
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   371
		push(@out,$ants_[$fromR+$opt_w-1][$zfnr]-$dz/2);		# z.min
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   372
		push(@out,$ants_[$fromR][$zfnr]+$dz/2);					# z.max
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
	} else {													# input ascending
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   374
		push(@out,$ants_[$fromR][$zfnr]-$dz/2);					# z.min
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   375
		push(@out,$ants_[$fromR+$opt_w-1][$zfnr]+$dz/2);		# z.max
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
    }
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
    push(@out,defined($habfnr) ?								# hab
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
					avgF($habfnr,$fromR) : nan);
49
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 48
diff changeset
   379
	push(@out,$wrms);											# w.rms					
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   380
	my($nspec) = !$dc_gap + !$uc_gap;							# nspec
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   381
	push(@out,$nspec);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   382
	my($nsamp_sum) = my($nsn) = 0;								# w.nsamp.avg
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   383
	$nsamp_sum+=medianF($dcsfnr,$fromR),$nsn++ unless ($dc_gap);	# median to avoid biasing by short bottle stops
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   384
	$nsamp_sum+=medianF($ucsfnr,$fromR),$nsn++ unless ($uc_gap);
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   385
	push(@out,$nsamp_sum/$nsn);
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
					
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	my($totP) = 0;												# power
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
	my($i);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
	for ($i=0; $i<$opt_w/2+1; $i++) {				
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
		my($sumP) = 0;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
		$sumP += $dc_pwr[$i] * $taper_correction unless ($dc_gap);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
		$sumP += $uc_pwr[$i] * $taper_correction unless ($uc_gap);
42
f7690c7b92e0 V1.2beta6
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 35
diff changeset
   393
		push(@out,$sumP/$nspec/$resolution_bandwidth)
29
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
			unless (antsParam("k.$i") > $kzlim);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
		$totP += $sumP;
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
	}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
	push(@out,$totP);											# total power
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
    
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
	&antsOut(@out);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
	#--------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
	# undo tapering and/or de-meaning
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
	#--------------------------------
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
	for ($i=0; $i<$opt_w; $i++) {
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
		$ants_[$fromR+$i][$dcwfnr] = $dcwbuf[$i];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
		$ants_[$fromR+$i][$ucwfnr] = $ucwbuf[$i];
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
    }	
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
}
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
&antsInfo("$skipped windows with non-numeric values skipped")
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
	if ($skipped);
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
c1ff35103176 a few days pre WHOI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
antsExit();