comparison variant_effect_predictor/Bio/EnsEMBL/DataFile.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 package Bio::EnsEMBL::DataFile;
2
3 use strict;
4 use warnings;
5
6 use base qw/Bio::EnsEMBL::Storable/;
7
8 use Bio::EnsEMBL::ApiVersion;
9 use Bio::EnsEMBL::Utils::Argument qw/rearrange/;
10 use Bio::EnsEMBL::Utils::Exception qw/throw warning/;
11 use Bio::EnsEMBL::Utils::Scalar qw/:assert/;
12 use Bio::EnsEMBL::Utils::URI qw/is_uri/;
13 use File::Spec;
14 use Scalar::Util qw(weaken isweak);
15
16 =head2 new
17
18 Arg [-ADAPTOR] : Bio::EnsEMBL::DBSQL::DataFileAdaptor
19 Arg [-DBID] : Integer $dbID
20 Arg [-COORD_SYSTEM] : Bio::EnsEMBL::CoordSystem $coord_system
21 Arg [-ANALYSIS] : Bio::EnsEMBL::Analysis $analysis
22 Arg [-NAME] : String $name
23 Arg [-VERSION_LOCK] : Boolean $version_lock
24 Arg [-ABSOLUTE] : Boolean $absolute
25 Arg [-URL] : String $url
26 Arg [-FILE_TYPE] : String $file_type
27 Example : Bio::EnsEMBL::DataFile->new();
28 Description : Returns a new instance of this object
29 Returntype : Bio::EnsEMBL::DataFile
30 Exceptions : Thrown if data is not as expected
31
32 =cut
33
34 sub new {
35 my ($class, @args) = @_;
36 my $self = $class->SUPER::new(@args);
37 my ($coord_system, $analysis, $name, $version_lock, $absolute, $url, $file_type) =
38 rearrange([qw/coord_system analysis name version_lock absolute url file_type/], @args);
39
40 $self->coord_system($coord_system);
41 $self->analysis($analysis);
42 $self->name($name);
43 $self->version_lock($version_lock);
44 $self->absolute($absolute);
45 $self->url($url);
46 $self->file_type($file_type);
47
48 return $self;
49 }
50
51 =head2 new_fast
52
53 Arg [1] : hashref to be blessed
54 Description: Construct a new Bio::EnsEMBL::Feature using the hashref.
55 Exceptions : none
56 Returntype : Bio::EnsEMBL::Feature
57 Caller : general, subclass constructors
58 Status : Stable
59
60 =cut
61
62 sub new_fast {
63 my $class = shift;
64 my $hashref = shift;
65 my $self = bless $hashref, $class;
66 weaken($self->{adaptor}) if ( ! isweak($self->{adaptor}) );
67 return $self;
68 }
69
70 =head2 get_ExternalAdaptor
71
72 Arg[1] : Scalar; optional base path. Uses defaults if not given
73 Example : my $ea = $df->get_ExternalAdaptor('/base/path');
74 Description : Delegates to the parent adaptor to retrieve the external
75 adaptor for this data type
76 Returntype : Adaptor; will be an adaptor that can read the given data file
77 Exceptions : Thrown if there is no attached adaptor.
78
79 =cut
80
81 sub get_ExternalAdaptor {
82 my ($self, $base_path) = @_;
83 my $adaptor = $self->adaptor();
84 throw "No DataFileAdaptor found in this object. Cannot request ExternalAdaptor" if ! $adaptor;
85 return $adaptor->DataFile_to_adaptor($self, $base_path);
86 }
87
88 =head2 path
89
90 Arg[1] : Scalar base of the path to use. Can be ignored if the instance
91 already represents a canonical path
92 Example : my $f = $df->path();
93 Description : Used to generate the path to the file resource. Can return a
94 path to the file or a URL but it is up to the using code to
95 know how to interprate the different returned forms.
96
97 If the data file url is canonical then this is just returned.
98 If not then a path is generated of the form
99 B</base/path/production_name/coord_system_version/[software_version]/db_group/name.ext>
100
101 Returntype : Scalar the absolute path/url to the given resource
102 Exceptions : Thrown if the linked Coordinate System lacks a version and the
103 current database also lacks a default version
104 Caller : public
105
106 =cut
107
108
109 sub path {
110 my ($self, $base) = @_;
111 my $all_paths = $self->get_all_paths($base);
112 return $all_paths->[0];
113 }
114
115 sub get_all_paths {
116 my ($self, $base) = @_;
117
118 return [$self->url()] if $self->absolute();
119
120 my @all_paths;
121
122 $base = $self->adaptor()->get_base_path($base) if ! $base;
123
124 my $production_name = $self->adaptor()->db()->get_MetaContainer()->get_production_name();
125 my $cs_version = $self->coord_system()->version();
126 if(! $cs_version) {
127 my ($highest_cs) = @{$self->adaptor()->db()->get_CoordSystemAdaptor()->fetch_all()};
128 $cs_version = $highest_cs->version();
129 }
130 if(!$cs_version) {
131 my $name = $self->name();
132 throw "The file '${name}' in species '${$production_name} is attached to a CoordinateSystem lacking a version and has no default assembly. Please fix";
133 }
134
135 my @portions;
136 push(@portions, $production_name);
137 push(@portions, $cs_version);
138 push(@portions, software_version()) if $self->version_lock();
139 push(@portions, $self->adaptor()->db()->group());
140
141 #Targets are the files to generate
142 my @targets;
143 #If URL is populated we assume we need to add this onto the end but removing the /
144 if($self->url()) {
145 my @split = split(/\//, $self->url());
146 push(@targets, [@split]);
147 }
148 else {
149 my $extensions = $self->adaptor()->DataFile_to_extensions($self);
150 foreach my $ext (@{$extensions}) {
151 my $filename = sprintf(q{%s.%s}, $self->name(), $ext);
152 push(@targets, [$filename]);
153 }
154 }
155
156 my $is_uri = is_uri($base);
157 foreach my $t (@targets) {
158 my $path;
159 if($is_uri) {
160 $path = join(q{/}, $base, @portions, @{$t});
161 }
162 else {
163 $path = File::Spec->catfile($base, @portions, @{$t});
164 }
165 push(@all_paths, $path);
166 }
167 return \@all_paths;
168 }
169
170 =head2 coord_system
171
172 Arg[1] : Bio::EnsEMBL::CoordSystem Optional setter
173 Description : Mutator for the coord system field. All files are linked to one
174 Returntype : Bio::EnsEMBL::CoordSystem
175 Exceptions : Thrown if not of the expected type
176
177 =cut
178
179
180 sub coord_system {
181 my ($self, $coord_system) = @_;
182 if(defined $coord_system) {
183 assert_ref($coord_system, 'Bio::EnsEMBL::CoordSystem', 'coord_system');
184 $self->{'coord_system'} = $coord_system;
185 }
186 return $self->{'coord_system'};
187 }
188
189 =head2 analysis
190
191 Arg[1] : Bio::EnsEMBL::Analysis Optional setter
192 Description : Mutator for the analysis field. All files are linked to one
193 Returntype : Bio::EnsEMBL::Analysis
194 Exceptions : Thrown if not of the expected type
195
196 =cut
197
198 sub analysis {
199 my ($self, $analysis) = @_;
200 if(defined $analysis) {
201 assert_ref($analysis, 'Bio::EnsEMBL::Analysis', 'analysis');
202 $self->{'analysis'} = $analysis;
203 }
204 return $self->{'analysis'};
205 }
206
207 =head2 name
208
209 Arg[1] : String Optional setter
210 Description : Mutator for the name of the file. Can be used in file location
211 generation
212 Returntype : String
213
214 =cut
215
216 sub name {
217 my ($self, $name) = @_;
218 if(defined $name) {
219 $self->{'name'} = $name;
220 }
221 return $self->{'name'};
222 }
223
224 =head2 version_lock
225
226 Arg[1] : Boolean Optional setter
227 Description : Boolean indicating if the file is linked to the version of the
228 database it was found in.
229 Returntype : Boolean
230
231 =cut
232
233 sub version_lock {
234 my ($self, $version_lock) = @_;
235 if(defined $version_lock) {
236 assert_boolean($version_lock, 'version_lock');
237 $self->{'version_lock'} = $version_lock;
238 }
239 return $self->{'version_lock'};
240 }
241
242 =head2 absolute
243
244 Arg[1] : Boolean Optional setter
245 Description : Indicates if the URL of this file is an absolute one i.e.
246 should be used verbatim or not.
247 Returntype : Boolean
248
249 =cut
250
251 sub absolute {
252 my ($self, $absolute) = @_;
253 if(defined $absolute) {
254 assert_boolean($absolute, 'absolute');
255 $self->{'absolute'} = $absolute;
256 }
257 return $self->{'absolute'};
258 }
259
260 =head2 url
261
262 Arg[1] : String Optional setter
263 Description : Location of the file. Can be optional and if set means once
264 we are in an automatic location use this value to locate
265 the file.
266 Returntype : String
267
268 =cut
269
270 sub url {
271 my ($self, $url) = @_;
272 $self->{'url'} = $url if defined $url;
273 return $self->{'url'};
274 }
275
276 =head2 file_type
277
278 Arg[1] : String Optional setter
279 Description : The type of file we are working with. Can be used to generate
280 a file name.
281 Returntype : String
282
283 =cut
284
285 sub file_type {
286 my ($self, $file_type) = @_;
287 $self->{'file_type'} = $file_type if defined $file_type;
288 return $self->{'file_type'};
289 }
290
291 #=head2 files
292 #
293 # Args :
294 # Example : my $files = @{$df->files()};
295 # Description : Returns all the file names we expect to cover for a flat file
296 # Returntype : type return_description
297 # Exceptions :
298 # Caller : caller
299 # Status : status
300 #
301 #=cut
302 #
303 #
304 #sub files {
305 # my ($self) = @_;
306 #
307 #}
308
309 1;