annotate bin/make.circos.data @ 7:d1917662231c draft

Uploaded
author morinlab
date Wed, 30 Nov 2016 13:37:20 -0500
parents b77ab858eac1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
1 #!/bin/env perl
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
2
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
3 =pod
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
4
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
5 =head1 NAME
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
6
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
7 make.circos.data - create Circos data files from summary tables of SV/CNV mutations
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
8
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
9 =head1 SYNOPSIS
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
10
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
11 bin/parse > table.txt
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
12
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
13 # uses same config file as parse
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
14 cat table.txt | bin/make.circos.data
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
15
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
16 =head1 DESCRIPTION
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
17
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
18 =head1 OPTIONS
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
19
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
20 =cut
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
21
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
22 use strict;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
23 use warnings FATAL=>"all";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
24
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
25 use Carp;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
26 use Config::General;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
27 use Cwd qw(getcwd abs_path);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
28 use Data::Dumper;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
29 use File::Basename;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
30 use FindBin;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
31 use Getopt::Long;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
32 use Math::Round qw(round nearest);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
33 use Math::VecStat qw(sum min max average);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
34 use Pod::Usage;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
35 use Time::HiRes qw(gettimeofday tv_interval);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
36 use Storable;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
37 use lib "$FindBin::RealBin";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
38 use lib "$FindBin::RealBin/../lib";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
39 use lib "$FindBin::RealBin/lib";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
40
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
41 our (%OPT,%CONF,$conf);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
42 our @COMMAND_LINE = ("file=s",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
43 "configfile=s",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
44 "help",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
45 "cdump",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
46 "man",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
47 "debug");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
48 our $VERSION = 0.02;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
49
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
50 # common and custom module imports below
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
51 #use Regexp::Common;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
52 #use IO::File;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
53 #use List::Util;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
54 #use List::MoreUtils;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
55 use Set::IntSpan;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
56 #use Statistics::Descriptive;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
57
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
58 # read and parse configuration file
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
59 parse_config();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
60
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
61
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
62
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
63 my %affected_genes;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
64 open(GENES, $CONF{files}{genes}) or die "#! $CONF{files}{genes}\n";
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
65 while(<GENES>){
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
66 chomp;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
67 $affected_genes{$_}++;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
68 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
69 close GENES;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
70 my %mask_genes;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
71 open(GENES, $CONF{files}{mask}) or die "#! $CONF{files}{mask}\n";
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
72 while(<GENES>){
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
73 chomp;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
74 $mask_genes{$_}++;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
75 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
76 close GENES;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
77
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
78 sub validateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
79
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
80 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
81
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
82 ################################################################
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
83 # get files
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
84 my $table = read_file();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
85
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
86 my $path = "$CONF{files}{root}/$CONF{files}{circos}";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
87 # karyotype
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
88 open(F,">$path/karyotype.txt");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
89 for my $chr (1..22,"X","Y") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
90 my $n = grep($_->{chr} eq $chr,@$table);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
91 next unless $n;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
92 printf F ("chr - hs%s %s 0 %d chr%s\n",$chr,$chr,$n,lc $chr);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
93 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
94 close(F);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
95
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
96 # large scale CNV
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
97 open(FCNVLG,">$path/cnv.tiles.txt");
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
98 # collect CNV region idx
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
99 my $cnvlg;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
100 for my $gene (@$table) {
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
101 next unless $gene->{cnvlg};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
102 for my $idx (keys %{$gene->{cnvlg}}) {
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
103 $cnvlg->{$idx} ||= { chr => $gene->{chr},
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
104 type => $gene->{cnvlg}{$idx}{type} };
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
105 push @{$cnvlg->{$idx}{pos}}, $gene->{pos};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
106 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
107 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
108 my $cnvlg_seen;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
109 for my $idx (sort {$a <=> $b} keys %{$cnvlg}) {
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
110 my $cnv = $cnvlg->{$idx};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
111 my $key = join(",",
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
112 scalar(min @{$cnv->{pos}}),
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
113 scalar(max @{$cnv->{pos}}),
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
114 $cnv->{type});
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
115 next if $cnvlg_seen->{$key}++;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
116 my $start = scalar(min @{$cnv->{pos}});
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
117 my $end = 1 + scalar(max @{$cnv->{pos}});
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
118 printf FCNVLG ("hs%s %d %d %s idx=%d\n",
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
119 $cnv->{chr},
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
120 $start,
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
121 $end,
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
122 $cnv->{type},
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
123 $idx);
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
124 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
125 close(FCNVLG);
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
126
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
127 # number of CNV
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
128 open(F, ">$path/mutations.txt");
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
129 open(FSV, ">$path/mutations.stacked.sv.txt");
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
130 open(FCNV, ">$path/mutations.stacked.cnv.txt");
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
131 for my $gene (@$table) {
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
132 my $name = $gene->{name};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
133 if(defined $mask_genes{$name}){
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
134 next;
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
135 }
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
136 my @sv;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
137 my @sv_vals;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
138 my @cnv;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
139 my @cnv_vals;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
140 # number of samples for each SV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
141 for my $type (sort { $CONF{sv}{types}{$b} <=> $CONF{sv}{types}{$a}} keys %{$CONF{sv}{types}}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
142 push @sv, sprintf("sv_%s=%d",lc $type,$gene->{sv}{$type}||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
143 push @sv_vals, $gene->{sv}{$type}||0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
144 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
145 # number of samples for each CNV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
146 for my $type (sort { $CONF{cnv}{types}{$b} <=> $CONF{cnv}{types}{$a}} keys %{$CONF{cnv}{types}}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
147 next unless $CONF{cnv}{types}{$type};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
148 push @cnv, sprintf("cnv_%s=%d",lc $type,$gene->{cnv}{$type}{n}||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
149 push @cnv_vals, $gene->{cnv}{$type}{n}||0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
150 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
151 my $cnv_plus = ($gene->{cnv}{amp}{n} ||0) + ($gene->{cnv}{gain}{n} ||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
152 my $cnv_minus = ($gene->{cnv}{homd}{n}||0) + ($gene->{cnv}{hetd}{n} ||0);
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
153 my $label_flag = "label_gene=0";
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
154
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
155
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
156 if(defined $affected_genes{$name}){
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
157 $label_flag = "label_gene=1";
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
158 print "will label $name\n";
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
159 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
160 unless(defined $gene->{sv_top}){
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
161 $gene->{sv_top} = {"missense_mutation"=>0};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
162 $gene->{sv} = {"missense_mutation"=>0};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
163 $gene->{svaa_top} = {"*"=>0};
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
164 }
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
165 printf F ("hs%s %d %d %s size=%d,sv_top_type=%s,sv_top_n=%d,sv_tot=%d,svaa_max_pos=%s,svaa_max_n=%d,cnv_top_type=%s,cnv_top_n=%d,cnv_top_avg=%f,cnv_top_med=%f,cnv_plus=%d,cnv_minus=%d,%s,%s",
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
166 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
167 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
168 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
169 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
170 $gene->{size},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
171 keys %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
172 values %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
173 $gene->{sv}{"*"} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
174 (keys %{$gene->{svaa_top}})||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
175 (values %{$gene->{svaa_top}})||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
176 $gene->{cnv_top}{class} || "-",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
177 $gene->{cnv_top}{n} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
178 $gene->{cnv_top}{avg} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
179 $gene->{cnv_top}{med} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
180 $cnv_plus||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
181 $cnv_minus||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
182 join(",",@sv),
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
183 join(",",@cnv));
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
184 print F ",$label_flag\n";
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
185 # stacked histograms of number of samples with each SV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
186 printf FSV ("hs%s %d %d %s name=%s,sv_top_type=%s,sv_top_n=%d\n",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
187 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
188 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
189 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
190 join(",",@sv_vals),
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
191 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
192 keys %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
193 values %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
194 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
195 printf FCNV ("hs%s %d %d %s name=%s,cnv_top_type=%s,cnv_top_n=%d,cnv_top_avg=%f,cnv_top_med=%f\n",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
196 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
197 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
198 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
199 join(",",@cnv_vals),
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
200 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
201 $gene->{cnv_top}{class} || "-",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
202 $gene->{cnv_top}{n} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
203 $gene->{cnv_top}{avg} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
204 $gene->{cnv_top}{med} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
205
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
206 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
207 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
208 close(F);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
209 close(FSV);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
210 close(FCNV);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
211
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
212 sub read_file {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
213 my $fh = get_handle();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
214 my @data;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
215 my $chrpos;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
216 while(<$fh>) {
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
217
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
218 chomp;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
219 next if /^\#/;
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
220
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
221 my @tok = split;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
222 my $gene = list2hash([qw(i id name chr start end size)],
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
223 [splice(@tok,0,7)]);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
224 $gene->{pos} = $chrpos->{ $gene->{chr} }++;
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
225
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
226 # remaining tokens
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
227 for my $tok (@tok) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
228 my @subtok = split(":",$tok);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
229 my $event = lc shift @subtok;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
230 my $type = lc shift @subtok;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
231 if($event =~ /sv/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
232 $gene->{$event}{$type} = shift @subtok;
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
233 } elsif($event =~ /cnvlg/) {
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
234 my $h = { idx => $type,
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
235 type => shift @subtok };
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
236 $gene->{$event}{$type} = $h;
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
237 } elsif($event =~ /cnv/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
238 my $h = { class=> $type,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
239 n=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
240 min=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
241 avg=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
242 med=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
243 max=> shift @subtok};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
244 if($event =~ /top/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
245 $gene->{$event} = $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
246 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
247 $gene->{$event}{$type} = $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
248 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
249 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
250 }
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
251 #printdumper($gene);
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
252 push @data, $gene;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
253 }
7
d1917662231c Uploaded
morinlab
parents: 0
diff changeset
254
0
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
255 return \@data;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
256 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
257
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
258 sub list2hash {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
259 my ($names,$list) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
260 my $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
261 my $i = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
262 for my $name (@$names) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
263 $h->{$name} = $list->[$i++];
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
264 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
265 return $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
266 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
267
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
268 sub get_handle {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
269 my $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
270 if(my $file = $CONF{file}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
271 die "No such file [$file]" unless -e $file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
272 open(FILE,$file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
273 $h = \*FILE;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
274 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
275 $h = \*STDIN;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
276 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
277 return $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
278 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
279
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
280 # HOUSEKEEPING ###############################################################
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
281
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
282 sub dump_config {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
283 printdumper(\%OPT,\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
284 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
285
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
286 sub parse_config {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
287 my $dump_debug_level = 3;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
288 GetOptions(\%OPT,@COMMAND_LINE);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
289 pod2usage() if $OPT{help};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
290 pod2usage(-verbose=>2) if $OPT{man};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
291 loadconfiguration($OPT{configfile});
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
292 populateconfiguration(); # copy command line options to config hash
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
293 validateconfiguration();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
294 if ($CONF{cdump}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
295 $Data::Dumper::Indent = 2;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
296 $Data::Dumper::Quotekeys = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
297 $Data::Dumper::Terse = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
298 $Data::Dumper::Sortkeys = 1;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
299 $Data::Dumper::Varname = "OPT";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
300 printdumper(\%OPT);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
301 $Data::Dumper::Varname = "CONF";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
302 printdumper(\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
303 exit;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
304 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
305 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
306
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
307 sub populateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
308 for my $var (keys %OPT) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
309 $CONF{$var} = $OPT{$var};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
310 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
311 repopulateconfiguration(\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
312 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
313
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
314 sub repopulateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
315 my ($node,$parent_node_name) = shift;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
316 return unless ref($node) eq "HASH";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
317 for my $key (keys %$node) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
318 my $value = $node->{$key};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
319 if (ref($value) eq "HASH") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
320 repopulateconfiguration($value,$key);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
321 } elsif (ref($value) eq "ARRAY") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
322 for my $item (@$value) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
323 repopulateconfiguration($item,$key);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
324 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
325 } elsif (defined $value) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
326 my $new_value = parse_field($value,$key,$parent_node_name,$node);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
327 $node->{$key} = $new_value;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
328 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
329 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
330 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
331
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
332 sub parse_field {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
333 my ($str,$key,$parent_node_name,$node) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
334 # replace configuration field
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
335 # conf(LEAF,LEAF,...)
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
336 while ( $str =~ /(conf\(\s*(.+?)\s*\))/g ) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
337 my ($template,$leaf) = ($1,$2);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
338 if (defined $template && defined $leaf) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
339 my @leaf = split(/\s*,\s*/,$leaf);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
340 my $new_template;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
341 if (@leaf == 2 && $leaf[0] eq ".") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
342 $new_template = $node->{$leaf[1]};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
343 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
344 $new_template = fetch_conf(@leaf);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
345 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
346 $str =~ s/\Q$template\E/$new_template/g;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
347 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
348 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
349 if ($str =~ /\s*eval\s*\(\s*(.+)\s*\)/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
350 my $fn = $1;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
351 $str = eval $fn;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
352 if ($@) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
353 die "could not parse configuration parameter [$@]";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
354 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
355 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
356 return $str;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
357 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
358
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
359 sub fetch_configuration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
360 my @config_path = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
361 my $node = \%CONF;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
362 if(! @config_path) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
363 return \%CONF;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
364 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
365 for my $path_element (@config_path) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
366 if (! exists $node->{$path_element}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
367 return undef;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
368 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
369 $node = $node->{$path_element};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
370 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
371 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
372 return $node;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
373 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
374
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
375 sub fetch_conf {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
376 return fetch_configuration(@_);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
377 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
378
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
379 sub loadconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
380 my $file = shift;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
381 if (defined $file) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
382 if (-e $file && -r _) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
383 # provided configuration file exists and can be read
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
384 $file = abs_path($file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
385 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
386 confess "The configuration file [$file] passed with -configfile does not exist or cannot be read.";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
387 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
388 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
389 # otherwise, try to automatically find a configuration file
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
390 my ($scriptname,$path,$suffix) = fileparse($0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
391 my $cwd = getcwd();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
392 my $bindir = $FindBin::RealBin;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
393 my $userdir = $ENV{HOME};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
394 my @candidate_files = (
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
395 "$cwd/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
396 "$cwd/etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
397 "$cwd/../etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
398 "$bindir/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
399 "$bindir/etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
400 "$bindir/../etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
401 "$userdir/.$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
402 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
403 my @additional_files = ();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
404 for my $candidate_file (@additional_files,@candidate_files) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
405 #printinfo("configsearch",$candidate_file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
406 if (-e $candidate_file && -r _) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
407 $file = $candidate_file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
408 #printinfo("configfound",$candidate_file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
409 last;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
410 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
411 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
412 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
413 if (defined $file) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
414 $OPT{configfile} = $file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
415 $conf = new Config::General(
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
416 -ConfigFile=>$file,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
417 -IncludeRelative=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
418 -IncludeAgain=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
419 -ExtendedAccess=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
420 -AllowMultiOptions=>"yes",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
421 #-LowerCaseNames=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
422 -AutoTrue=>1
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
423 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
424 %CONF = $conf->getall;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
425 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
426 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
427
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
428 sub printdebug {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
429 printinfo("debug",@_) if defined $CONF{debug};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
430 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
431
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
432 sub printinfo {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
433 print join(" ",map { defined $_ ? $_ : "_undef_" } @_),"\n";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
434 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
435
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
436 sub printfinfo {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
437 my ($fmt,@args) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
438 @args = map { defined $_ ? $_ : "_undef_" } @args;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
439 printf("$fmt\n",@args);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
440 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
441
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
442 sub printerr {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
443 print STDERR join(" ",map { defined $_ ? $_ : "_undef_" } @_),"\n";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
444 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
445
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
446 sub printdumper {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
447 print Dumper(@_);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
448 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
449
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
450 =pod
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
451
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
452 =head1 HISTORY
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
453
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
454 =over
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
455
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
456 =item * 30 Nov 2015
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
457
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
458 Started.
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
459
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
460 =back
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
461
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
462 =head1 AUTHOR
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
463
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
464 Martin Krzywinski
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
465
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
466 =head1 CONTACT
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
467
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
468 Martin Krzywinski
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
469 Genome Sciences Center
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
470 BC Cancer Research Center
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
471 100-570 W 7th Ave
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
472 Vancouver BC V5Z 4S6
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
473
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
474 mkweb.bcgsc.ca
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
475 martink@bcgsc.ca
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
476
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
477 =cut