Mercurial > repos > mini > strelka
comparison strelka2/lib/Utils.pm @ 0:7a9f20ca4ad5
Uploaded
author | mini |
---|---|
date | Thu, 25 Sep 2014 11:59:08 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7a9f20ca4ad5 |
---|---|
1 | |
2 =head1 LICENSE | |
3 | |
4 Strelka Workflow Software | |
5 Copyright (c) 2009-2013 Illumina, Inc. | |
6 | |
7 This software is provided under the terms and conditions of the | |
8 Illumina Open Source Software License 1. | |
9 | |
10 You should have received a copy of the Illumina Open Source | |
11 Software License 1 along with this program. If not, see | |
12 <https://github.com/downloads/sequencing/licenses/>. | |
13 | |
14 =cut | |
15 | |
16 | |
17 package Utils; | |
18 | |
19 use base 'Exporter'; | |
20 | |
21 our @EXPORT = qw( | |
22 errorX logX executeCmd checkFile checkDir checkMove | |
23 getAbsPath checkMakeDir getBinList | |
24 parseConfigIni writeConfigIni | |
25 ); | |
26 | |
27 use warnings FATAL => 'all'; | |
28 use strict; | |
29 | |
30 use Carp; | |
31 use Cwd qw(realpath); | |
32 use File::Copy qw(move); | |
33 use File::Path qw(mkpath); | |
34 | |
35 | |
36 sub errorX($) { | |
37 confess "\nERROR: " . $_[0] . "\n\n"; | |
38 } | |
39 | |
40 sub logX($) { | |
41 print STDERR "INFO: " . $_[0] . "\n"; | |
42 } | |
43 | |
44 | |
45 sub executeCmd($;$) { | |
46 my $cmd = shift; | |
47 my $isVerbose = shift; | |
48 | |
49 logX("Running: '$cmd'") if(defined($isVerbose) and $isVerbose); | |
50 system($cmd) == 0 | |
51 or errorX("Failed system call: '$cmd'"); | |
52 } | |
53 #return an error if file does not exist | |
54 sub checkFile($;$) { | |
55 my $file = shift; | |
56 return if(-f $file); | |
57 my $label = shift; | |
58 errorX("Can't find" . (defined($label) ? " $label" : "") . " file: '$file'"); | |
59 } | |
60 #return an error if file does not Exist | |
61 sub checkDir($;$) { | |
62 my $dir = shift; | |
63 return if(-d $dir); | |
64 my $label = shift; | |
65 errorX("Can't find" . (defined($label) ? " $label" : "") . " directory: '$dir'"); | |
66 } | |
67 | |
68 sub checkMove($$) { | |
69 my ($old,$new) = @_; | |
70 move($old,$new) || errorX("File move failed: $!\n\tAttempting to move '$old' to '$new'"); | |
71 } | |
72 | |
73 | |
74 | |
75 | |
76 =item getAbsPath($path) | |
77 | |
78 This procedure attempts to convert a path provided by the user on the | |
79 command line into an absolute path. It should be able to handle "~" | |
80 paths and conventional relative paths using ".." or ".". Resolution of | |
81 links should follow the convention of "Cwd::realpath". | |
82 | |
83 B<Parameters:> | |
84 | |
85 $dirRef - path (converted to absolute path in place) | |
86 | |
87 B<Returns:> | |
88 | |
89 returns zero if successful, non-zero otherwise. | |
90 | |
91 =cut | |
92 sub getAbsPath(\$) { | |
93 my ($dirRef) = @_; | |
94 my @tmp=glob($$dirRef); | |
95 return 1 if(scalar(@tmp) != 1); | |
96 my $ret = Cwd::realpath($tmp[0]); | |
97 return 1 if !$ret && !($ret = File::Spec->rel2abs($tmp[0])); | |
98 $$dirRef = $ret; | |
99 return 0; | |
100 } | |
101 | |
102 | |
103 #verify path is not a file, then create a directory with this name if does not exist | |
104 sub checkMakeDir($) { | |
105 my $dir = shift; | |
106 unless (-e $dir) { | |
107 File::Path::mkpath($dir) || errorX("Can't create directory '$dir'"); | |
108 } else { | |
109 errorX("Path is not a directory '$dir'\n") unless(-d $dir); | |
110 } | |
111 } | |
112 | |
113 | |
114 | |
115 sub getBinList($$) { | |
116 my ($chromSize,$binSize) = @_; | |
117 | |
118 my $nm1 = (($chromSize-1) / $binSize); | |
119 return [ map {sprintf("%04i",$_)} (0..$nm1) ]; | |
120 } | |
121 | |
122 | |
123 | |
124 sub parseConfigError($$) { | |
125 my ($file,$line) = @_; | |
126 errorX("Config file '$file' contains unexpected line '$line'\n"); | |
127 } | |
128 | |
129 #lis le fichier de config, si la ligne est de type : some space + [ some character ] + some space then register ther character in $section. ( [user] , then $section=user). | |
130 sub parseConfigIni($) { | |
131 my $file = shift; | |
132 my %config; | |
133 open(my $FH,"< $file") || errorX("Can't open config file '$file'"); | |
134 my $section = "noSection"; | |
135 while(<$FH>) { | |
136 next if(/^[;#]/); | |
137 next if(/^\s*$/); | |
138 chomp; | |
139 my $line=$_; | |
140 my @ncl = split(/[;#]/); | |
141 next unless(scalar(@ncl)); | |
142 my $nc = $ncl[0]; | |
143 if($nc =~ /^\s*\[([^\]]*)\]\s*$/) { | |
144 $section = $1; | |
145 next; | |
146 } | |
147 my ($key,$val) = map { s/^\s+//; s/\s+$//; $_ } split(/=/,$nc,2); | |
148 unless(defined($key) && defined($val) && ($key ne "")) { parseConfigError($file,$line); } | |
149 | |
150 $config{$section}{$key} = $val; | |
151 } | |
152 close($FH); | |
153 return \%config; | |
154 } | |
155 | |
156 | |
157 # minimal ini stringifier: | |
158 # | |
159 sub writeConfigIni($) { | |
160 my $config = shift; | |
161 my $val = ""; | |
162 for my $section (sort(keys(%$config))) { | |
163 $val .= "\n[$section]\n"; | |
164 for my $key (sort(keys(%{$config->{$section}}))) { | |
165 $val .= "$key = " . $config->{$section}{$key} . "\n"; | |
166 } | |
167 } | |
168 return $val; | |
169 } | |
170 | |
171 | |
172 1; |