annotate bin/make.circos.data @ 0:b77ab858eac1 draft

Uploaded
author morinlab
date Mon, 12 Sep 2016 16:23:26 -0400
parents
children d1917662231c
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
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
61 sub validateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
62
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
63 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
64
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
65 ################################################################
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
66 # get files
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
67 my $table = read_file();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
68
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
69 my $path = "$CONF{files}{root}/$CONF{files}{circos}";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
70 # karyotype
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
71 open(F,">$path/karyotype.txt");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
72 for my $chr (1..22,"X","Y") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
73 my $n = grep($_->{chr} eq $chr,@$table);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
74 next unless $n;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
75 printf F ("chr - hs%s %s 0 %d chr%s\n",$chr,$chr,$n,lc $chr);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
76 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
77 close(F);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
78
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
79 # number of CNV
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
80 open(F,">$path/mutations.txt");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
81 open(FSV,">$path/mutations.stacked.sv.txt");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
82 open(FCNV,">$path/mutations.stacked.cnv.txt");
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
83 for my $gene (@$table) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
84 my @sv;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
85 my @sv_vals;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
86 my @cnv;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
87 my @cnv_vals;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
88 # number of samples for each SV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
89 for my $type (sort { $CONF{sv}{types}{$b} <=> $CONF{sv}{types}{$a}} keys %{$CONF{sv}{types}}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
90 push @sv, sprintf("sv_%s=%d",lc $type,$gene->{sv}{$type}||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
91 push @sv_vals, $gene->{sv}{$type}||0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
92 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
93 # number of samples for each CNV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
94 for my $type (sort { $CONF{cnv}{types}{$b} <=> $CONF{cnv}{types}{$a}} keys %{$CONF{cnv}{types}}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
95 next unless $CONF{cnv}{types}{$type};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
96 push @cnv, sprintf("cnv_%s=%d",lc $type,$gene->{cnv}{$type}{n}||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
97 push @cnv_vals, $gene->{cnv}{$type}{n}||0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
98 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
99 my $cnv_plus = ($gene->{cnv}{amp}{n} ||0) + ($gene->{cnv}{gain}{n} ||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
100 my $cnv_minus = ($gene->{cnv}{homd}{n}||0) + ($gene->{cnv}{hetd}{n} ||0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
101 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\n",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
102 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
103 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
104 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
105 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
106 $gene->{size},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
107 keys %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
108 values %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
109 $gene->{sv}{"*"} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
110 (keys %{$gene->{svaa_top}})||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
111 (values %{$gene->{svaa_top}})||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
112 $gene->{cnv_top}{class} || "-",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
113 $gene->{cnv_top}{n} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
114 $gene->{cnv_top}{avg} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
115 $gene->{cnv_top}{med} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
116 $cnv_plus||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
117 $cnv_minus||0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
118 join(",",@sv),
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
119 join(",",@cnv));
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
120 # stacked histograms of number of samples with each SV type
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
121 printf FSV ("hs%s %d %d %s name=%s,sv_top_type=%s,sv_top_n=%d\n",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
122 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
123 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
124 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
125 join(",",@sv_vals),
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
126 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
127 keys %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
128 values %{$gene->{sv_top}},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
129 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
130 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
131 $gene->{chr},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
132 $gene->{pos},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
133 $gene->{pos}+1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
134 join(",",@cnv_vals),
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
135 $gene->{name},
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
136 $gene->{cnv_top}{class} || "-",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
137 $gene->{cnv_top}{n} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
138 $gene->{cnv_top}{avg} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
139 $gene->{cnv_top}{med} || 0,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
140
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
141 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
142 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
143 close(F);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
144 close(FSV);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
145 close(FCNV);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
146
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
147 sub read_file {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
148 my $fh = get_handle();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
149 my @data;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
150 my $chrpos;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
151 while(<$fh>) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
152 chomp;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
153 next if /^\#/;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
154 my @tok = split;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
155 my $gene = list2hash([qw(i id name chr start end size)],
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
156 [splice(@tok,0,7)]);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
157 $gene->{pos} = $chrpos->{ $gene->{chr} }++;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
158 # remaining tokens
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
159 for my $tok (@tok) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
160 my @subtok = split(":",$tok);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
161 my $event = lc shift @subtok;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
162 my $type = lc shift @subtok;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
163 if($event =~ /sv/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
164 $gene->{$event}{$type} = shift @subtok;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
165 } elsif($event =~ /cnv/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
166 my $h = { class=> $type,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
167 n=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
168 min=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
169 avg=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
170 med=> shift @subtok,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
171 max=> shift @subtok};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
172 if($event =~ /top/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
173 $gene->{$event} = $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
174 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
175 $gene->{$event}{$type} = $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
176 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
177 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
178 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
179 printdumper($gene);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
180 push @data, $gene;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
181 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
182 return \@data;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
183 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
184
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
185 sub list2hash {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
186 my ($names,$list) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
187 my $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
188 my $i = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
189 for my $name (@$names) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
190 $h->{$name} = $list->[$i++];
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
191 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
192 return $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
193 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
194
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
195 sub get_handle {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
196 my $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
197 if(my $file = $CONF{file}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
198 die "No such file [$file]" unless -e $file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
199 open(FILE,$file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
200 $h = \*FILE;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
201 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
202 $h = \*STDIN;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
203 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
204 return $h;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
205 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
206
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
207 # HOUSEKEEPING ###############################################################
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
208
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
209 sub dump_config {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
210 printdumper(\%OPT,\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
211 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
212
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
213 sub parse_config {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
214 my $dump_debug_level = 3;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
215 GetOptions(\%OPT,@COMMAND_LINE);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
216 pod2usage() if $OPT{help};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
217 pod2usage(-verbose=>2) if $OPT{man};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
218 loadconfiguration($OPT{configfile});
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
219 populateconfiguration(); # copy command line options to config hash
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
220 validateconfiguration();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
221 if ($CONF{cdump}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
222 $Data::Dumper::Indent = 2;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
223 $Data::Dumper::Quotekeys = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
224 $Data::Dumper::Terse = 0;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
225 $Data::Dumper::Sortkeys = 1;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
226 $Data::Dumper::Varname = "OPT";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
227 printdumper(\%OPT);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
228 $Data::Dumper::Varname = "CONF";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
229 printdumper(\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
230 exit;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
231 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
232 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
233
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
234 sub populateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
235 for my $var (keys %OPT) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
236 $CONF{$var} = $OPT{$var};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
237 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
238 repopulateconfiguration(\%CONF);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
239 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
240
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
241 sub repopulateconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
242 my ($node,$parent_node_name) = shift;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
243 return unless ref($node) eq "HASH";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
244 for my $key (keys %$node) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
245 my $value = $node->{$key};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
246 if (ref($value) eq "HASH") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
247 repopulateconfiguration($value,$key);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
248 } elsif (ref($value) eq "ARRAY") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
249 for my $item (@$value) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
250 repopulateconfiguration($item,$key);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
251 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
252 } elsif (defined $value) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
253 my $new_value = parse_field($value,$key,$parent_node_name,$node);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
254 $node->{$key} = $new_value;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
255 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
256 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
257 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
258
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
259 sub parse_field {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
260 my ($str,$key,$parent_node_name,$node) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
261 # replace configuration field
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
262 # conf(LEAF,LEAF,...)
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
263 while ( $str =~ /(conf\(\s*(.+?)\s*\))/g ) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
264 my ($template,$leaf) = ($1,$2);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
265 if (defined $template && defined $leaf) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
266 my @leaf = split(/\s*,\s*/,$leaf);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
267 my $new_template;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
268 if (@leaf == 2 && $leaf[0] eq ".") {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
269 $new_template = $node->{$leaf[1]};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
270 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
271 $new_template = fetch_conf(@leaf);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
272 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
273 $str =~ s/\Q$template\E/$new_template/g;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
274 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
275 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
276 if ($str =~ /\s*eval\s*\(\s*(.+)\s*\)/) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
277 my $fn = $1;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
278 $str = eval $fn;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
279 if ($@) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
280 die "could not parse configuration parameter [$@]";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
281 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
282 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
283 return $str;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
284 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
285
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
286 sub fetch_configuration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
287 my @config_path = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
288 my $node = \%CONF;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
289 if(! @config_path) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
290 return \%CONF;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
291 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
292 for my $path_element (@config_path) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
293 if (! exists $node->{$path_element}) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
294 return undef;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
295 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
296 $node = $node->{$path_element};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
297 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
298 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
299 return $node;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
300 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
301
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
302 sub fetch_conf {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
303 return fetch_configuration(@_);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
304 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
305
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
306 sub loadconfiguration {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
307 my $file = shift;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
308 if (defined $file) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
309 if (-e $file && -r _) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
310 # provided configuration file exists and can be read
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
311 $file = abs_path($file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
312 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
313 confess "The configuration file [$file] passed with -configfile does not exist or cannot be read.";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
314 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
315 } else {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
316 # otherwise, try to automatically find a configuration file
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
317 my ($scriptname,$path,$suffix) = fileparse($0);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
318 my $cwd = getcwd();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
319 my $bindir = $FindBin::RealBin;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
320 my $userdir = $ENV{HOME};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
321 my @candidate_files = (
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
322 "$cwd/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
323 "$cwd/etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
324 "$cwd/../etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
325 "$bindir/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
326 "$bindir/etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
327 "$bindir/../etc/$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
328 "$userdir/.$scriptname.conf",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
329 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
330 my @additional_files = ();
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
331 for my $candidate_file (@additional_files,@candidate_files) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
332 #printinfo("configsearch",$candidate_file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
333 if (-e $candidate_file && -r _) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
334 $file = $candidate_file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
335 #printinfo("configfound",$candidate_file);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
336 last;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
337 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
338 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
339 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
340 if (defined $file) {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
341 $OPT{configfile} = $file;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
342 $conf = new Config::General(
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
343 -ConfigFile=>$file,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
344 -IncludeRelative=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
345 -IncludeAgain=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
346 -ExtendedAccess=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
347 -AllowMultiOptions=>"yes",
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
348 #-LowerCaseNames=>1,
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
349 -AutoTrue=>1
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
350 );
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
351 %CONF = $conf->getall;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
352 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
353 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
354
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
355 sub printdebug {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
356 printinfo("debug",@_) if defined $CONF{debug};
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
357 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
358
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
359 sub printinfo {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
360 print join(" ",map { defined $_ ? $_ : "_undef_" } @_),"\n";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
361 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
362
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
363 sub printfinfo {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
364 my ($fmt,@args) = @_;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
365 @args = map { defined $_ ? $_ : "_undef_" } @args;
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
366 printf("$fmt\n",@args);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
367 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
368
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
369 sub printerr {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
370 print STDERR join(" ",map { defined $_ ? $_ : "_undef_" } @_),"\n";
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
371 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
372
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
373 sub printdumper {
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
374 print Dumper(@_);
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
375 }
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
376
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
377 =pod
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
378
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
379 =head1 HISTORY
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
380
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
381 =over
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
382
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
383 =item * 30 Nov 2015
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
384
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
385 Started.
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
386
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
387 =back
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
388
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
389 =head1 AUTHOR
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
390
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
391 Martin Krzywinski
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
392
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
393 =head1 CONTACT
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
394
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
395 Martin Krzywinski
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
396 Genome Sciences Center
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
397 BC Cancer Research Center
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
398 100-570 W 7th Ave
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
399 Vancouver BC V5Z 4S6
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
400
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
401 mkweb.bcgsc.ca
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
402 martink@bcgsc.ca
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
403
b77ab858eac1 Uploaded
morinlab
parents:
diff changeset
404 =cut