diff --git a/splitPD0 b/splitPD0 --- a/splitPD0 +++ b/splitPD0 @@ -1,10 +1,10 @@ #!/usr/bin/perl #====================================================================== -# S P L I T R D I +# S P L I T P D 0 # doc: Sat Aug 21 22:20:27 2010 -# dlm: Sun Sep 14 17:47:48 2014 +# dlm: Sat Jul 30 18:50:43 2016 # (c) 2010 A.M. Thurnherr -# uE-Info: 54 0 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 69 60 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # split RDI files based on list of ensemble numbers (e.g. from yoyo -t) @@ -14,7 +14,11 @@ # Jun 24, 2011: - replaced -b, -n by -o # Feb 13, 2014: - updated doc # Mar 19, 2014: - added -s)kip small files -# Sep 14, 2014: - added -f)irst +# Sep 14, 2014: - added -f)irst +# Jul 26, 2016: - changed file numbering to 1-relative +# Jul 30, 2016: - modified -o default +# - added code to set DSID of first ensemble of each +# output file to 0x7f7f # NOTES: # - it is assumed that the input file begins with ensemble #1 @@ -23,7 +27,7 @@ # FILE NAME CONVENTION: # - in order to assign individual yoyo casts numerical station numbers, -# by default, the yoyo cast number is inserted after the station number +# by default, an underscore and the yoyo cast number is added to the basename # EXAMPLES: # splitRDI 017DL000.000 `mkProfile 017DL000.000 | yoyo -QFens -ut` @@ -33,41 +37,50 @@ use Getopt::Std; die("Usage: $0 " . - "[-o)ut-file ] " . + "[-o)ut-file ] " . "[-f)irst ] " . "[require -m)in to produce output] " . " \n") unless (&getopts('f:o:m:') && @ARGV>=3); -$opt_o = substr($ARGV[0],0,3) # default output filename format - . '%02d' - . substr($ARGV[0],-9) - unless defined($opt_o); +unless (defined($opt_o)) { + my($bn,$extn) = ($ARGV[0] =~ m{([^/]+)\.([^\.]+)$}); + $opt_o = "${bn}_%02d.$extn"; +} -$opt_m = 0 unless defined($opt_m); # default: produce tiny files as well +$opt_m = 0 unless defined($opt_m); # default: produce tiny files as well -readHeader($ARGV[0],\%hdr); shift; # get length of ensembles +readHeader($ARGV[0],\%hdr); shift; # get length of ensembles $ens_len = $hdr{ENSEMBLE_BYTES} + 2; -$first_ens = $ARGV[0]+1; shift; # initialize loop +$first_ens = $ARGV[0]+1; shift; # initialize loop $last_ens = $ARGV[0]; shift; -$cnr = 0; +$cnr = 1; -do { # split data - sysseek(WBRF,($first_ens-2)*$ens_len,0) || # read next block of data +do { # split data + sysseek(WBRF,($first_ens-2)*$ens_len,0) || # begin next block of ensembles die("$WBRcfn: $!"); $last_ens++ unless defined($ARGV[0]); - $nBytes = ($last_ens-$first_ens+1) * $ens_len; + + sysread(WBRF,$ids,2) || die("$WBRcfn: file truncated"); # read 1st ensemble & ensure DSID is 0x7f + $ids = pack('H4','7f7f'); # reset DSID + sysread(WBRF,$febuf,$ens_len-4) == $ens_len-4 || + die("$WBRcfn: file truncated"); + sysread(WBRF,$csum,2) || die("$WBRcfn: file truncated"); + $csum = pack('v',unpack('%16C*',$ids.$febuf)); # re-calculate checksum + + $nBytes = ($last_ens-$first_ens) * $ens_len; # read remaining ensembles in block sysread(WBRF,$buf,$nBytes) == $nBytes || die("$WBRcfn: file truncated"); - if ($last_ens-$first_ens+1 > $opt_m) { # produce file only if sufficient # of ensembles + if ($last_ens-$first_ens+1 >= $opt_m) { # write output only if sufficient # of ensembles $fn = sprintf($opt_o,$opt_f+$cnr++); open(F,">$fn") || die("$fn: $!\n"); - syswrite(F,$buf,$nBytes) == $nBytes || + syswrite(F,$ids.$febuf.$csum.$buf,$nBytes+$ens_len) == $nBytes+$ens_len || die("$fn: $!\n"); close(F); - printf(STDERR "$fn: %d ensembles ($nBytes bytes)\n",$last_ens-$first_ens+1); + printf(STDERR "$fn: %d ensembles (%d bytes)\n", + $last_ens-$first_ens+1,$nBytes+$ens_len); } $first_ens = $last_ens+1;