1 |
gpertea |
23 |
#!/usr/bin/perl |
2 |
|
|
use strict; |
3 |
|
|
my $usage=q/Usage: |
4 |
|
|
wigfix2bin.pl <wigFixstream> |
5 |
|
|
Converts wigFix to a fixed binary format: |
6 |
|
|
|
7 |
|
|
bytes 00-08 : 'WIGB'<32bit-start-offset> |
8 |
|
|
bytes 09... : 2-byte int = value*1000 for each base |
9 |
|
|
|
10 |
|
|
/; |
11 |
|
|
$_=<STDIN>; |
12 |
|
|
die("Error: wigFix header not recognized!\n") |
13 |
|
|
unless (m/^fixedStep\s/); |
14 |
|
|
my ($chr, $cpos)=(m/chrom=(\S+)\s+start=(\d+)/); |
15 |
|
|
die("Error: wigFix header not recognized!\n") unless $chr && $cpos; |
16 |
|
|
|
17 |
|
|
open(BIN, ">$chr.wigfixbin") || die("Error creating file $chr.wigfixbin!\n"); |
18 |
|
|
binmode(BIN); |
19 |
|
|
print STDERR "Writing $chr.wigfixbin ..\n"; |
20 |
|
|
print BIN "WIGB"; |
21 |
|
|
print BIN pack('I', $cpos); |
22 |
|
|
while (<STDIN>) { |
23 |
|
|
if (m/start=(\d+)/) { |
24 |
|
|
my $skipto=$1; |
25 |
|
|
my $skiplen=$skipto-$cpos; |
26 |
|
|
for (my $i=0;$i<$skiplen;$i++) { |
27 |
|
|
print BIN pack('s',0); |
28 |
|
|
} |
29 |
|
|
$cpos=$skipto; |
30 |
|
|
next; |
31 |
|
|
} |
32 |
|
|
my ($v)=(m/^([\d\.\-]+)$/); |
33 |
|
|
die("Error parsing value for line $. : $_\n") unless length($v)>0; |
34 |
|
|
my $n=int($v*1000); |
35 |
|
|
if ($n>32767 || $n<-32767) { |
36 |
|
|
die("Error: value out of range ($n)!\n"); |
37 |
|
|
} |
38 |
|
|
print BIN pack('s',$n); |
39 |
|
|
$cpos++; |
40 |
|
|
} |
41 |
|
|
close(BIN); |
42 |
|
|
print STDERR " ..done.\n"; |
43 |
|
|
#print STDERR "Waiting for 4s..\n"; |
44 |
|
|
#sleep(4); |
45 |
|
|
#print STDERR "Now reading data back..\n"; |
46 |
|
|
|
47 |
|
|
# read back (testing): |
48 |
|
|
# open(BIN, "$chr.wigfixbin"); |
49 |
|
|
# my ($tag, $r); |
50 |
|
|
# read(BIN, $tag, 4); |
51 |
|
|
# read(BIN, $r, 4); |
52 |
|
|
# my @v=unpack('I',$r); |
53 |
|
|
# print STDERR "Header tag=$tag, offset=$v[0]\n"; |
54 |
|
|
# while (read(BIN,$r,2)==2) { |
55 |
|
|
# @v=unpack('s',$r); |
56 |
|
|
# my $n=sprintf('%.3f', $v[0]/1000); |
57 |
|
|
# print STDERR "read value: $n\n"; |
58 |
|
|
# } |
59 |
|
|
# close(BIN); |