splitPD0
changeset 36 515b06dae59c
parent 23 fb0c269b1eaa
child 43 b63fa355644c
--- 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 <fmt[e.g. 017%02dDL000.000]>] " .
+	"[-o)ut-file <fmt[e.g. 017DL_%02d.000]>] " .
 	"[-f)irst <cast #>] " .
 	"[require -m)in <ens> to produce output] " .
 	"<RDI file> <ens> <ens[...]>\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;