Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/EnsEMBL/Funcgen/Probe.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 # | |
2 # Ensembl module for Bio::EnsEMBL::Funcgen::Probe | |
3 # | |
4 | |
5 | |
6 =head1 LICENSE | |
7 | |
8 Copyright (c) 1999-2011 The European Bioinformatics Institute and | |
9 Genome Research Limited. All rights reserved. | |
10 | |
11 This software is distributed under a modified Apache license. | |
12 For license details, please see | |
13 | |
14 http://www.ensembl.org/info/about/code_licence.html | |
15 | |
16 =head1 CONTACT | |
17 | |
18 Please email comments or questions to the public Ensembl | |
19 developers list at <ensembl-dev@ebi.ac.uk>. | |
20 | |
21 Questions may also be sent to the Ensembl help desk at | |
22 <helpdesk@ensembl.org>. | |
23 | |
24 | |
25 =head1 NAME | |
26 | |
27 Bio::EnsEMBL::Funcgen::Probe - A module to represent a nucleotide probe. | |
28 | |
29 =head1 SYNOPSIS | |
30 | |
31 use Bio::EnsEMBL::Funcgen::Probe; | |
32 | |
33 # | |
34 | |
35 my $probe = Bio::EnsEMBL::Funcgen::Probe->new( | |
36 -PROBE_SET => $probe_set, | |
37 -NAME => 'Probe-1', | |
38 -ARRAY => $array, | |
39 -ARRAY_CHIP_ID => $ac_dbid, | |
40 -CLASS => "EXPERIMENTAL", | |
41 ); | |
42 | |
43 =head1 DESCRIPTION | |
44 | |
45 An Probe object represents an probe on a microarray. The data (currently the | |
46 name, probe_set_id, length, pair_index and class) are stored | |
47 in the oligo_probe table. | |
48 | |
49 For Affy arrays, a probe can be part of more than one array, but only part of | |
50 one probeset. On each Affy array the probe has a slightly different name. For | |
51 example, two different complete names for the same probe might be | |
52 DrosGenome1:AFFX-LysX-5_at:535:35; and Drosophila_2:AFFX-LysX-5_at:460:51;. In | |
53 the database, these two probes will have the same oligo_probe_id. Thus the same | |
54 Affy probe can have a number of different names and complete names depending on | |
55 which array it is on. | |
56 | |
57 =cut | |
58 | |
59 use strict; | |
60 use warnings; | |
61 | |
62 package Bio::EnsEMBL::Funcgen::Probe; | |
63 | |
64 use Bio::EnsEMBL::Utils::Argument qw( rearrange ) ; | |
65 use Bio::EnsEMBL::Utils::Exception qw( throw warning ); | |
66 use Bio::EnsEMBL::Funcgen::Storable; | |
67 | |
68 use vars qw(@ISA); | |
69 @ISA = qw(Bio::EnsEMBL::Funcgen::Storable); | |
70 | |
71 | |
72 =head2 new | |
73 | |
74 Arg [-NAME] : string - probe name | |
75 Used when the probe is on one array. | |
76 Arg [-NAMES] : Listref of strings - probe names | |
77 Used when the probe is on multiple arrays. | |
78 Arg [-ARRAY] : Bio::EnsEMBL::Funcgen::Array | |
79 Used when the probe is on one array. | |
80 Arg [-ARRAYS] : Listref of Bio::EnsEMBL::Funcgen::Array | |
81 Used when the probe is on multiple arrays. | |
82 Arg [-ARRAY_CHIP_ID] : int - array_chip db ID | |
83 Used when the probe is on one array. | |
84 Arg [-ARRAY_CHIP_IDS] : Listref of ints - array_chip dbIDs | |
85 Used when the probe is on multiple array chips | |
86 Arg [-NAMES] : Listref of ints - arary_chip db IDs | |
87 Used when the probe is on multiple arrays. | |
88 Arg [-PROBE_SET] : Bio::EnsEMBL::ProbeSet | |
89 Each probe is part of one(and only one) probeset, if not probe set | |
90 then probeset = probe i.e. probe_set size = 1 | |
91 Arg [-LENGTH] : int - probe length | |
92 Will obviously be the same for all probes if same probe | |
93 is on multiple arrays. | |
94 Arg [-CLASS] : string - probe class e.g. CONTROL, EXPERIMENTAL | |
95 Will be the same for all probes if same probe is on | |
96 multiple arrays. | |
97 Arg [-DESCRIPTION] : (optional) string - description | |
98 | |
99 | |
100 Example : my $probe = Bio::EnsEMBL::Probe->new( | |
101 -NAME => 'Probe-1', | |
102 -PROBE_SET => $probe_set, | |
103 -ARRAY => $array, | |
104 -ARRAY_CHIP_ID => $array_chip_id, | |
105 -LENGTH => 25, | |
106 -CLASS => 'EXPERIMENTAL', | |
107 -DESCRIPTION => 'Some useful description', | |
108 | |
109 ); | |
110 Description: Creates a new Bio::EnsEMBL::Probe object. | |
111 Returntype : Bio::EnsEMBL::Probe | |
112 Exceptions : Throws if not supplied with probe name(s) and array(s) | |
113 Caller : General | |
114 Status : Medium Risk | |
115 | |
116 =cut | |
117 | |
118 sub new { | |
119 my $caller = shift; | |
120 | |
121 my $class = ref($caller) || $caller; | |
122 | |
123 my $self = $class->SUPER::new(@_); | |
124 | |
125 my ( | |
126 $names, $name, | |
127 $array_chip_ids, $array_chip_id, | |
128 $arrays, $array, | |
129 $probeset, $aclass, | |
130 $length, $desc | |
131 ) = rearrange([ | |
132 'NAMES', 'NAME', | |
133 'ARRAY_CHIP_IDS', 'ARRAY_CHIP_ID', | |
134 'ARRAYS', 'ARRAY', | |
135 'PROBE_SET', 'CLASS', | |
136 'LENGTH', 'DESCRIPTION' | |
137 ], @_); | |
138 | |
139 | |
140 @$names = ($name) if(ref($names) ne "ARRAY"); | |
141 @$array_chip_ids = ($array_chip_id) if (ref($array_chip_ids) ne "ARRAY"); | |
142 @$arrays = ($array) if (ref($arrays) ne "ARRAY"); | |
143 | |
144 #We need to record duplicates for each probe_set i.e. each array. | |
145 #the relationship is really array_chip to name, as everything else stays the same | |
146 #can't have same probe_set_id as this wouldn't maintain relationship | |
147 #need unique ps id's or array_chip_id in probe table? | |
148 #Then we can miss probeset id's out totally if required | |
149 #or should we just duplicate everything with unique db IDs | |
150 | |
151 | |
152 if (defined $$names[0]) { | |
153 | |
154 if(scalar(@$names) != scalar(@$array_chip_ids)){ | |
155 throw("You have not specified valid name:array_chip_id pairs\nYou need a probe name for each Array"); | |
156 } | |
157 | |
158 if(defined $$arrays[0]){ | |
159 if(scalar(@$names) != scalar(@$arrays)){ | |
160 throw("You have not specified valid name:Array pairs\nYou need a probe name for each Array\n"); | |
161 } | |
162 } | |
163 else{ | |
164 warn("You have not specified and Array objects, this will result in multiple/redundant queries based on the array_chip_id\nYou should pass Array objects to speed up this process"); | |
165 #Is this true? We should cache this in the ArrayChip and make sure we're caching it in the caller. | |
166 } | |
167 | |
168 # Probe(s) have been specified | |
169 # Different names reflect different array | |
170 | |
171 for my $i(0..$#{$names}){ | |
172 $self->add_array_chip_probename($$array_chip_ids[$i], $$names[$i], $$arrays[$i]); | |
173 } | |
174 } else { | |
175 throw('You need to provide a probe name (or names) to create an Probe'); | |
176 } | |
177 | |
178 $self->probeset($probeset) if defined $probeset; | |
179 $self->class($aclass) if defined $aclass; | |
180 $self->length($length) if defined $length; | |
181 $self->description($desc) if defined $desc; | |
182 | |
183 return $self; | |
184 } | |
185 | |
186 #only takes single values for array and array_chip | |
187 #as we're shortcuting the constructor and simply blessing the hash | |
188 #therefore attr keys should not be lc and not prefix with '-' | |
189 | |
190 =head2 new_fast | |
191 | |
192 Args : Hashref with all internal attributes set | |
193 Example : none | |
194 Description: Quick and dirty version of new. Only works if the code is very | |
195 disciplined. Cannot add array chip probe names unless we recreate | |
196 the data structure in the caller. | |
197 Returntype : Bio::EnsEMBL::Funcgen::Probe | |
198 Exceptions : None | |
199 Caller : General | |
200 Status : At Risk | |
201 | |
202 =cut | |
203 | |
204 sub new_fast { | |
205 bless ($_[1], $_[0]); | |
206 } | |
207 | |
208 | |
209 | |
210 =head2 add_array_chip_probename | |
211 | |
212 Arg [1] : int - db ID of array_chip | |
213 Arg [2] : string - probe name | |
214 Arg [3] : Bio::EnsEMBL::Funcgen::Array | |
215 Example : $probe->add_array_chip_probename($ac_dbid, $probename, $array); | |
216 Description: Adds a probe name / array pair to a probe, allowing incremental | |
217 generation of a probe. | |
218 Returntype : None | |
219 Exceptions : None | |
220 Caller : General, | |
221 Probe->new(), | |
222 ProbeAdaptor->_obj_from_sth(), | |
223 AffyProbeAdaptor->_obj_from_sth() | |
224 Status : Medium Risk - Change to take ArrayChip object. | |
225 | |
226 =cut | |
227 | |
228 sub add_array_chip_probename { | |
229 my $self = shift; | |
230 my ($ac_dbid, $probename, $array) = @_; | |
231 $self->{ 'arrays' } ||= {}; | |
232 $self->{ 'probenames' } ||= {}; | |
233 | |
234 #mass redundancy here, possibility of fetching same array over and over!!!!!!!!!!!!!! | |
235 #Need to implement cache in caller i.e. adaptor | |
236 #Made mandatory to force creation of cache | |
237 #we need access to adaptor before we can test is valid and stored | |
238 #let's no test each time for adaptor as this would slow down | |
239 #Just test here instead. | |
240 | |
241 if(! (ref($array) && $array->isa('Bio::EnsEMBL::Funcgen::Array') && $array->dbID)){ | |
242 #$array = $self->adaptor()->db()->get_ArrayAdaptor()->fetch_by_array_chip_dbID($ac_dbid); | |
243 throw('You must pass a valid Bio::EnsEMBL::Funcgen::Array. Maybe you want to generate a cache in the caller?'); | |
244 } | |
245 | |
246 #mapping between probename and ac_dbid is conserved through array name between hashes | |
247 #only easily linked from arrays to probenames,as would have to do foreach on array name | |
248 | |
249 #Can we change the implementation of this so we're only storing the array once, reverse | |
250 #the cache? But we want access to the array and using an object reference as a key is ???? | |
251 #How would this impact on method functionality? | |
252 | |
253 #We now handle multiple names per probe/array | |
254 #This will not capture the relationship between | |
255 #probe name and position on array! | |
256 #Not a problem for affy as name is position | |
257 #Currently not a problem for nimblegen as probes never have more than 1 name??? | |
258 | |
259 $self->{ 'arrays' }->{$ac_dbid} = $array; | |
260 | |
261 $self->{ 'probenames' }->{$array->name()} ||= []; | |
262 push @{$self->{ 'probenames' }->{$array->name()}}, $probename; | |
263 | |
264 return; | |
265 } | |
266 | |
267 | |
268 =head2 get_all_ProbeFeatures | |
269 | |
270 Args : None | |
271 Example : my $features = $probe->get_all_ProbeFeatures(); | |
272 Description: Get all features produced by this probe. The probe needs to be | |
273 database persistent. | |
274 Returntype : Listref of Bio::EnsEMBL:Funcgen::ProbeFeature objects | |
275 Exceptions : None | |
276 Caller : General | |
277 Status : Medium Risk | |
278 | |
279 =cut | |
280 | |
281 sub get_all_ProbeFeatures { | |
282 my $self = shift; | |
283 if ( $self->adaptor() && $self->dbID() ) { | |
284 return $self->adaptor()->db()->get_ProbeFeatureAdaptor()->fetch_all_by_Probe($self); | |
285 } else { | |
286 warning('Need database connection to retrieve Features'); | |
287 return []; | |
288 } | |
289 } | |
290 | |
291 =head2 get_all_Arrays | |
292 | |
293 Args : None | |
294 Example : my $arrays = $probe->get_all_Arrays(); | |
295 Description: Returns all arrays that this probe is part of. Only works if the | |
296 probe was retrieved from the database or created using | |
297 add_Array_probename (rather than add_arrayname_probename). | |
298 Returntype : Listref of Bio::EnsEMBL::Funcgen::Array objects | |
299 Exceptions : None | |
300 Caller : General | |
301 Status : Medium Risk | |
302 | |
303 =cut | |
304 | |
305 sub get_all_Arrays { | |
306 my $self = shift; | |
307 | |
308 #Arrays are currently preloaded using a cache in _objs_from_sth | |
309 return [ values %{$self->{'arrays'}} ]; | |
310 } | |
311 | |
312 =head2 get_names_Arrays | |
313 | |
314 Args : None | |
315 Example : my %name_array_pairs = %{$probe->get_names_Arrays}; | |
316 Description: Returns Array name hash | |
317 Returntype : hashref of probe name Bio::EnsEMBL::Funcgen::Array pairs | |
318 Exceptions : None | |
319 Caller : General | |
320 Status : Medium Risk | |
321 | |
322 =cut | |
323 | |
324 sub get_names_Arrays { | |
325 my $self = shift; | |
326 | |
327 #Arrays are currently preloaded using a cache in _objs_from_sth | |
328 return $self->{'arrays'}; | |
329 } | |
330 | |
331 | |
332 | |
333 | |
334 | |
335 =head2 get_all_probenames | |
336 | |
337 Arg [1] : Optional - list of array names, defaults to all available | |
338 Example : my @probenames = @{$probe->get_all_probenames()}; | |
339 Description: Retrieves all names for this probe. Only makes sense for probes | |
340 that are part of a probeset (i.e. Affy probes), in which case | |
341 get_all_complete_names() would be more appropriate. | |
342 Returntype : Listref of strings | |
343 Exceptions : None | |
344 Caller : General | |
345 Status : Medium Risk | |
346 | |
347 =cut | |
348 | |
349 sub get_all_probenames { | |
350 my ($self, @array_names) = @_; | |
351 | |
352 my @names; | |
353 @array_names = keys %{$self->{'probenames'}} if ! @array_names; | |
354 | |
355 foreach my $array(@array_names){ | |
356 push @names, @{$self->{'probenames'}->{$array}}; | |
357 } | |
358 | |
359 return \@names; | |
360 } | |
361 | |
362 | |
363 | |
364 =head2 get_probename | |
365 | |
366 Arg [1] : string - array name | |
367 Example : my $probename = $probe->get_probename('Array-1'); | |
368 Description: For a given array, retrieve the name for this probe. | |
369 Returntype : string | |
370 Exceptions : Throws if the array name is required but not specified | |
371 Warns if probe has more than one name for the given array. | |
372 Caller : General | |
373 Status : Medium Risk | |
374 | |
375 =cut | |
376 | |
377 | |
378 #we can have dulplicate probes on same array for Nimblegen | |
379 #what defines and unique probe? | |
380 #If we have a duplicate on the same array or even on the same array_chip, then we can still return the same name | |
381 #Needs more work | |
382 | |
383 sub get_probename { | |
384 my ($self, $arrayname) = @_; | |
385 | |
386 | |
387 my $probename; | |
388 | |
389 if (! $arrayname){ | |
390 | |
391 #Sanity check that there is only one non-AFFY array | |
392 my @ac_ids = keys %{$self->{'arrays'}}; | |
393 | |
394 if((scalar @ac_ids == 1) && ($self->get_all_Arrays()->[0]->vendor() ne "AFFY")){ | |
395 $arrayname = $self->get_all_Arrays()->[0]->name(); | |
396 } | |
397 else{ | |
398 throw('Cannot retrieve name for Probe('.$self->dbID.") without arrayname if more than 1 array chip(@ac_ids) and not NIMBELGEN(".$self->get_all_Arrays()->[0]->vendor().")\n"); | |
399 } | |
400 } | |
401 | |
402 | |
403 #Need to check if this exists before derefing | |
404 #Warn here? | |
405 return if(! exists ${$self->{'probenames'}}{$arrayname}); | |
406 | |
407 | |
408 my @names = @{$self->{'probenames'}->{$arrayname}}; | |
409 | |
410 | |
411 if(scalar(@names) > 1){ | |
412 my $p_info = ''; | |
413 | |
414 if($self->probeset){ | |
415 $p_info = " probeset ".$self->probeset->name; | |
416 } | |
417 | |
418 warn("Found replicate probes with different names for array ${arrayname}${p_info}.Returning comma separated string list:\t".join(',', @names)."\n"); | |
419 return join(',', @names); | |
420 | |
421 } | |
422 else{ | |
423 ($probename) = @{$self->{'probenames'}->{$arrayname}}; | |
424 } | |
425 | |
426 return $probename; | |
427 } | |
428 | |
429 | |
430 | |
431 =head2 get_all_complete_names | |
432 | |
433 Args : None | |
434 Example : my @compnames = @{$probe->get_all_complete_names()}; | |
435 Description: Retrieves all complete names for this probe. The complete name | |
436 is a concatenation of the array name, the probeset name and the | |
437 probe name. | |
438 Returntype : Listref of strings | |
439 Exceptions : None | |
440 Caller : General | |
441 Status : Medium Risk | |
442 | |
443 =cut | |
444 | |
445 sub get_all_complete_names { | |
446 my $self = shift; | |
447 | |
448 my ($probeset, @result); | |
449 my $pset = $self->probeset; | |
450 | |
451 if($pset){ | |
452 $probeset = $pset->name; | |
453 } | |
454 | |
455 $probeset .= ':' if $probeset; | |
456 | |
457 | |
458 #warn "For Nimblegen this need to be Container:Seqid::probeid?"; | |
459 | |
460 while ( my (undef, $array) = each %{$self->{'arrays'}} ) { | |
461 #would have to put test in here for $self->arrays()->vendor() | |
462 #if($array->vendor() eq "AFFY"){ | |
463 | |
464 foreach my $name(@{$self->{'probenames'}{$array->name()}}){ | |
465 | |
466 push @result, $array->name().":$probeset".$name; | |
467 } | |
468 } | |
469 | |
470 return \@result; | |
471 } | |
472 | |
473 | |
474 | |
475 #For affy this matters as name will be different, but not for Nimblegen | |
476 #Need to consolidate this | |
477 #have get name method which throws if there is more than one array | |
478 #detects array vendor and does appropriate method | |
479 | |
480 =head2 get_complete_name | |
481 | |
482 Arg [1] : string - array name | |
483 Example : my $compname = $probe->get_complete_name('Array-1'); | |
484 Description: For a given array, retrieve the complete name for this probe. | |
485 Returntype : string | |
486 Exceptions : Throws if the array name not specified or not known for this probe | |
487 Caller : General | |
488 Status : Medium Risk | |
489 | |
490 =cut | |
491 | |
492 sub get_complete_name { | |
493 my $self = shift; | |
494 my $arrayname = shift; | |
495 | |
496 | |
497 throw('Must provide and array name argument to retreive the complete name') if ! defined $arrayname; | |
498 | |
499 my $probename = $self->get_probename($arrayname); | |
500 | |
501 if (!defined $probename) { | |
502 throw('Unknown array name'); | |
503 } | |
504 | |
505 my $probeset = $self->probeset()->name(); | |
506 $probeset .= ':' if $probeset; | |
507 | |
508 return "$arrayname:$probeset$probename"; | |
509 } | |
510 | |
511 =head2 probeset | |
512 | |
513 Arg [1] : (optional) Bio::EnsEMBL::Funcgen::ProbeSet | |
514 Example : my $probe_set = $probe->probeset(); | |
515 Description: Getter and setter of probe_set attribute for Probe objects. | |
516 Returntype : Bio::EnsEMBL::Funcgen::ProbeSet | |
517 Exceptions : None | |
518 Caller : General | |
519 Status : Medium Risk | |
520 | |
521 =cut | |
522 | |
523 sub probeset { | |
524 my $self = shift; | |
525 | |
526 $self->{'probe_set'} = shift if @_; | |
527 return $self->{'probe_set'}; | |
528 } | |
529 | |
530 =head2 class | |
531 | |
532 Arg [1] : (optional) string - class | |
533 Example : my $class = $probe->class(); | |
534 Description: Getter and setter of class attribute for Probe | |
535 objects e.g. CONTROL, EXPERIMENTAL | |
536 Returntype : string | |
537 Exceptions : None | |
538 Caller : General | |
539 Status : Medium Risk | |
540 | |
541 =cut | |
542 | |
543 sub class { | |
544 my $self = shift; | |
545 $self->{'class'} = shift if @_; | |
546 return $self->{'class'}; | |
547 } | |
548 | |
549 =head2 length | |
550 | |
551 Arg [1] : (optional) int - probe length | |
552 Example : my $probelength = $probe->length(); | |
553 Description: Getter and setter of length attribute for Probe | |
554 objects. | |
555 Returntype : int | |
556 Exceptions : None | |
557 Caller : General | |
558 Status : Medium Risk | |
559 | |
560 =cut | |
561 | |
562 sub length { | |
563 my $self = shift; | |
564 $self->{'length'} = shift if @_; | |
565 return $self->{'length'}; | |
566 } | |
567 | |
568 =head2 description | |
569 | |
570 Arg [1] : (optional) string - description | |
571 Example : my $pdesc = $probe->description(); | |
572 Description: Getter and setter of description attribute for Probe | |
573 objects. | |
574 Returntype : string | |
575 Exceptions : None | |
576 Caller : General | |
577 Status : At Risk | |
578 | |
579 =cut | |
580 | |
581 sub description { | |
582 my $self = shift; | |
583 $self->{'description'} = shift if @_; | |
584 return $self->{'description'}; | |
585 } | |
586 | |
587 | |
588 =head2 feature_count | |
589 | |
590 Arg[0] : recount flag | |
591 Example : my $num_features = $probe->feature_count(); | |
592 Description: Counts the number of ProbeFeatures associated with this Probe | |
593 Returntype : int | |
594 Exceptions : None | |
595 Caller : General | |
596 Status : Medium Risk | |
597 | |
598 =cut | |
599 | |
600 | |
601 sub feature_count{ | |
602 my ($self, $recount) = @_; | |
603 | |
604 if($recount || | |
605 (! $self->{feature_count})){ | |
606 $self->{feature_count} = $self->adaptor->db->get_ProbeFeatureAdaptor->count_probe_features_by_probe_id($self->dbID); | |
607 } | |
608 | |
609 return $self->{feature_count}; | |
610 } | |
611 | |
612 | |
613 | |
614 | |
615 ### ARRAY DESIGN SPECIFIC METHODS | |
616 | |
617 =head2 add_Analysis_score | |
618 | |
619 Arg [1] : Bio::EnsEMBL::Analysis | |
620 Arg [2] : string - analysis score (as string a precision may differ between analyses)?? | |
621 Example : $probe->add_Analysis_score($analysis, $score); | |
622 Description: Setter for probe analysis attributes from an array design | |
623 Returntype : None | |
624 Exceptions : throws if args are not met or valid | |
625 Caller : General | |
626 Status : at risk | |
627 | |
628 =cut | |
629 | |
630 sub add_Analysis_score{ | |
631 my ($self, $anal, $score) = @_; | |
632 | |
633 if(! ($anal && $anal->dbID() && $anal->isa("Bio::EnsEMBL::Analysis"))){ | |
634 throw("Must provide a valid stored Bio::EnsEMBL::Analysis"); | |
635 } | |
636 | |
637 throw("Must provide a score to add to the probe") if ! defined $score; | |
638 | |
639 $self->{'analysis'}{$anal->dbID()} = $score; | |
640 | |
641 return; | |
642 } | |
643 | |
644 =head2 add_Analysis_CoordSystem_score | |
645 | |
646 Arg [1] : Bio::EnsEMBL::Analysis | |
647 Arg [2] : Bio::EnsEMBL::CoordSystem | |
648 Arg [3] : string - analysis score (as string a precision may differ between analyses)?? | |
649 Example : $probe->add_Analysis_CoordSystem_score($analysis, $coord_sys, $score); | |
650 Description: Setter for coord system dependant probe analysis attributes from an array design | |
651 Returntype : None | |
652 Exceptions : throws if args are not met or valid | |
653 Caller : General | |
654 Status : at risk | |
655 | |
656 =cut | |
657 | |
658 sub add_Analysis_CoordSystem_score{ | |
659 my ($self, $anal, $cs, $score) = @_; | |
660 | |
661 if(! ($anal && $anal->dbID() && $anal->isa("Bio::EnsEMBL::Analysis"))){ | |
662 throw("Must provide a valid stored Bio::EnsEMBL::Analysis"); | |
663 } | |
664 | |
665 if(! ($cs && $cs->dbID() && $cs->isa("Bio::EnsEMBL::Funcgen::CoordSystem"))){ | |
666 throw("Must provide a valid stored Bio::EnsEMBL::Funcgen::CoordSystem"); | |
667 } | |
668 | |
669 throw("Must provide a score to add to the probe") if ! defined $score; | |
670 | |
671 $self->{'analysis_coord_system'}{$anal->dbID()}{$cs->dbID()} = $score; | |
672 | |
673 return; | |
674 } | |
675 | |
676 =head2 get_score_by_Analysis | |
677 | |
678 Arg [1] : Bio::EnsEMBL::Analysis | |
679 Example : my $anal_score = $probe->get_analysis_score($analysis); | |
680 Description: Setter for probe analysis attributes from an array design | |
681 Returntype : string | |
682 Exceptions : throws if args are not met or valid | |
683 Caller : General | |
684 Status : at risk | |
685 | |
686 =cut | |
687 | |
688 sub get_score_by_Analysis{ | |
689 my ($self, $anal) = @_; | |
690 | |
691 $self->get_all_design_scores() if ! defined $self->{'analysis'}; | |
692 | |
693 if(! ($anal && $anal->dbID() && $anal->isa("Bio::EnsEMBL::Analysis"))){ | |
694 throw("Must provide a valid stored Bio::EnsEMBL::Analysis"); | |
695 } | |
696 | |
697 | |
698 return (exists $self->{'analysis'}{$anal->dbID()}) ? $self->{'analysis'}{$anal->dbID()} : undef; | |
699 } | |
700 | |
701 =head2 get_score_by_Analysis_CoordSystem | |
702 | |
703 Arg [1] : Bio::EnsEMBL::Analysis | |
704 Arg [2] : Bio::EnsEMBL::CoordSystem | |
705 Arg [3] : string - analysis score (as string a precision may differ between analyses)?? | |
706 Example : $probe->add_analysis($analysis, $coord_sys, $score); | |
707 Description: Setter for coord system dependant probe analysis attributes from an array design | |
708 Returntype : None | |
709 Exceptions : throws if args are not met or valid | |
710 Caller : General | |
711 Status : at risk | |
712 | |
713 =cut | |
714 | |
715 sub get_score_by_Analysis_CoordSystem{ | |
716 my ($self, $anal, $cs) = @_; | |
717 | |
718 $self->get_all_design_scores() if ! defined $self->{'analysis_coord_system'}; | |
719 | |
720 if(! ($anal && $anal->dbID() && $anal->isa("Bio::EnsEMBL::Analysis"))){ | |
721 throw("Must provide a valid stored Bio::EnsEMBL::Analysis"); | |
722 } | |
723 | |
724 if(! ($cs && $cs->dbID() && $cs->isa("Bio::EnsEMBL::Funcgen::CoordSystem"))){ | |
725 throw("Must provide a valid stored Bio::EnsEMBL::Funcgen::CoordSystem"); | |
726 } | |
727 | |
728 my $score = undef; | |
729 | |
730 if(exists $self->{'analysis_coord_system'}{$anal->dbID()} && | |
731 exists $self->{'analysis_coord_system'}{$anal->dbID()}{$cs->dbID()}){ | |
732 $score = $self->{'analysis_coord_system'}{$anal->dbID()}{$cs->dbID()}; | |
733 } | |
734 | |
735 return $score; | |
736 } | |
737 | |
738 | |
739 =head2 get_all_design_scores | |
740 | |
741 Arg [1] : Boolean - No fetch flag, to fetch design scores from DB, used in adaptor | |
742 To avoid testing DB for each probe when no design scores have been added. | |
743 Example : my @anal_score_coordsets = @{$probe->get_all_design_scores()}; | |
744 Description: Gets all design scores as analysis_id, score and optionally coord_system_id | |
745 Returntype : ARRAYREF | |
746 Exceptions : throws if no fetch flag is not defined and adaptor or probe is not defined and or stored. | |
747 Caller : General | |
748 Status : at risk | |
749 | |
750 =cut | |
751 | |
752 #not named get_all_Analysis_scores as this would imply only non-cs dependent scores | |
753 #hence named after table, as this returns simple table records | |
754 | |
755 sub get_all_design_scores{ | |
756 my ($self, $no_fetch) = @_; | |
757 | |
758 my ($analysis_id, $cs_id, $score, @design_scores); | |
759 | |
760 if(! $no_fetch){#can assume we have none stored already due to implementation of add methods | |
761 | |
762 throw("Probe must have and adaptor to fetch design scores from the DB") if(! $self->adaptor()); | |
763 | |
764 foreach my $probe_analysis(@{$self->adaptor->fetch_all_design_records($self)}){ | |
765 #we can't use the add methods here as would be cyclical | |
766 #nor do we need extra validation | |
767 | |
768 ($analysis_id, $cs_id, $score) = @$probe_analysis; | |
769 | |
770 if($cs_id){ | |
771 $self->{'analysis_coord_system'}{$analysis_id}{$cs_id} = $score; | |
772 }else{ | |
773 $self->{'analysis'}{$analysis_id} = $score; | |
774 } | |
775 } | |
776 } | |
777 | |
778 #populate array from attrs | |
779 if(exists $self->{'analysis_coord_system'}){ | |
780 | |
781 foreach $analysis_id(keys %{$self->{'analysis_coord_system'}}){ | |
782 | |
783 foreach $cs_id(keys %{$self->{'analysis_coord_system'}{$analysis_id}}){ | |
784 push @design_scores, [$analysis_id, $self->{'analysis_coord_system'}{$analysis_id}{$cs_id}, $cs_id]; | |
785 } | |
786 } | |
787 } | |
788 | |
789 if(exists $self->{'analysis'}){ | |
790 | |
791 foreach $analysis_id(keys %{$self->{'analysis'}}){ | |
792 | |
793 push @design_scores, [$analysis_id, $self->{'analysis'}{$analysis_id}]; | |
794 } | |
795 } | |
796 | |
797 | |
798 return \@design_scores; | |
799 | |
800 } | |
801 | |
802 | |
803 #do we need get_all methods for Analysis and Analysis_CoordSystem? | |
804 #maybe if we split into another Class and Adaptor | |
805 | |
806 1; | |
807 |