[Bio] / FigKernelPackages / Observation.pm Repository:
ViewVC logotype

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (view) (download) (as text)

1 : mkubal 1.1 package Observation;
2 :    
3 :     require Exporter;
4 :     @EXPORT_OK = qw(get_objects);
5 :    
6 :     use strict;
7 :     use warnings;
8 :    
9 :     1;
10 :    
11 :     # $Id: Observation.pm,v 1.6 2007/03/25 23:49:49 folker Exp folker $
12 :    
13 :     =head1 NAME
14 :    
15 :     Observation -- A presentation layer for observations in SEED.
16 :    
17 :     =head1 DESCRIPTION
18 :    
19 :     The SEED environment contains various sources of information for sequence features. The purpose of this library is to provide a
20 :     single interface to this data.
21 :    
22 :     The data can be used to display information for a given sequence feature (protein or other, but primarily information is computed for proteins).
23 :    
24 :     Example:
25 :    
26 :     use FIG;
27 :     use Observation;
28 :    
29 :     my $fig= new FIG;
30 :     my $fid="fig|83333.1.peg.3";
31 :    
32 :     $fig->get_evidence($fid);
33 :     B<return an array of objects>
34 :    
35 :    
36 :     print "$Observation->acc\n" prints the Accession number if present for the Observation
37 :    
38 :     =cut
39 :    
40 :     =head1 BACKGROUND
41 :    
42 :     =head2 Data incorporated in the Observations
43 :    
44 :     As the goal of this library is to provide an integrated view, we combine diverse sources of evidence.
45 :    
46 :     =head3 SEED core evidence
47 :    
48 :     The core SEED data structures provided by FIG.pm. These are Similarities, BBHs and PCHs.
49 :    
50 :     =head3 Attribute based Evidence
51 :    
52 :     We use the SEED attribute infrastructure to store information computed by a variety of computational procedures.
53 :    
54 :     These are e.g. InterPro hits via InterProScan (ipr), NCBI Conserved Domain Database Hits via PSSM(cdd),
55 :     PFAM hits via HMM(pfam), SignalP results(signalp), and various others.
56 :    
57 :     =head1 METHODS
58 :    
59 :     The public methods this package provides are listed below:
60 :    
61 :     =head3 acc()
62 :    
63 :     A valid accession or remote ID (in the style of a db_xref) or a valid local ID (FID) in case this is supported.
64 :    
65 :     =cut
66 :    
67 :     sub acc {
68 :     my ($self) = @_;
69 :    
70 :     return $self->{acc};
71 :     }
72 :    
73 :     =head3 description()
74 :    
75 :     The description of the hit. Taken from the data or from the our Ontology database for some cases e.g. IPR or PFAM.
76 :    
77 :     B<Please note:>
78 :     Either remoteid or description is required.
79 :    
80 :     =cut
81 :    
82 :     sub description {
83 :     my ($self) = @_;
84 :    
85 :     return $self->{acc};
86 :     }
87 :    
88 :     =head3 class()
89 :    
90 :     The class of evidence (required). This is usually simply the name of the tool or the name of the SEED data structure.
91 :     B<Please note> the connection of class and display_method and URL.
92 :    
93 :     Current valid classes are:
94 :    
95 :     =over 9
96 :    
97 :     =item sim (seq)
98 :    
99 :     =item bbh (seq)
100 :    
101 :     =item pch (fc)
102 :    
103 :     =item figfam (seq)
104 :    
105 :     =item ipr (dom)
106 :    
107 :     =item cdd (dom)
108 :    
109 :     =item pfam (dom)
110 :    
111 :     =item signalp (dom)
112 :    
113 :     =item cello (loc)
114 :    
115 :     =item tmhmm (loc)
116 :    
117 :     =item hmmtop (loc)
118 :    
119 :     =back
120 :    
121 :     =cut
122 :    
123 :     sub class {
124 :     my ($self) = @_;
125 :    
126 :     return $self->{class};
127 :     }
128 :    
129 :     =head3 type()
130 :    
131 :     The type of evidence (required).
132 :    
133 :     Where type is one of the following:
134 :    
135 :     =over 8
136 :    
137 :     =item seq=Sequence similarity
138 :    
139 :     =item dom=domain based match
140 :    
141 :     =item loc=Localization of the feature
142 :    
143 :     =item fc=Functional coupling.
144 :    
145 :     =back
146 :    
147 :     =cut
148 :    
149 :     sub type {
150 :     my ($self) = @_;
151 :    
152 :     return $self->{acc};
153 :     }
154 :    
155 :     =head3 start()
156 :    
157 :     Start of hit in query sequence.
158 :    
159 :     =cut
160 :    
161 :     sub start {
162 :     my ($self) = @_;
163 :    
164 :     return $self->{start};
165 :     }
166 :    
167 :     =head3 end()
168 :    
169 :     End of the hit in query sequence.
170 :    
171 :     =cut
172 :    
173 :     sub stop {
174 :     my ($self) = @_;
175 :    
176 :     return $self->{stop};
177 :     }
178 :    
179 :     =head3 evalue()
180 :    
181 :     E-value or P-Value if present.
182 :    
183 :     =cut
184 :    
185 :     sub evalue {
186 :     my ($self) = @_;
187 :    
188 :     return $self->{evalue};
189 :     }
190 :    
191 :     =head3 score()
192 :    
193 :     Score if present.
194 :    
195 :     B<Please note: >
196 :     Either score or eval are required.
197 :    
198 :     =cut
199 :    
200 :     sub score {
201 :     my ($self) = @_;
202 :    
203 :     return $self->{score};
204 :     }
205 :    
206 :    
207 :     =head3 display_method()
208 :    
209 :     If available use the function specified here to display the "raw" observation.
210 :     In the case of a BLAST alignment of fid1 and fid2 a cgi script
211 :     will be called to display the results of running the command "bl2seq fid1 fid2".
212 :    
213 :     B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evidence.
214 :    
215 :     =cut
216 :    
217 :     sub display_method {
218 :     my ($self) = @_;
219 :    
220 :     # add code here
221 :    
222 :     return $self->{display_method};
223 :     }
224 :    
225 :     =head3 rank()
226 :    
227 :     Returns an integer from 1 - 10 indicating the importance of this observations.
228 :    
229 :     Currently always returns 1.
230 :    
231 :     =cut
232 :    
233 :     sub rank {
234 :     my ($self) = @_;
235 :    
236 :     # return $self->{rank};
237 :    
238 :     return 1;
239 :     }
240 :    
241 :     =head3 supports_annotation()
242 :    
243 :     Does a this observation support the annotation of its feature?
244 :    
245 :     Returns
246 :    
247 :     =over 3
248 :    
249 :     =item 10, if feature annotation is identical to $self->description
250 :    
251 :     =item 1, Feature annotation is similar to $self->annotation; this is computed using FIG::SameFunc()
252 :    
253 :     =item undef
254 :    
255 :     =back
256 :    
257 :     =cut
258 :    
259 :     sub supports_annotation {
260 :     my ($self) = @_;
261 :    
262 :     # no code here so far
263 :    
264 :     return $self->{supports_annotation};
265 :     }
266 :    
267 :     =head3 url()
268 :    
269 :     URL describing the subject. In case of a BLAST hit against a sequence, this URL will lead to a page displaying the sequence record for the sequence. In case of an HMM hit, the URL will be to the URL description.
270 :    
271 :     =cut
272 :    
273 :     sub url {
274 :     my ($self) = @_;
275 :    
276 :     my $url = get_url($self->type, $self->acc);
277 :    
278 :     return $url;
279 :     }
280 :    
281 :     =head3 get_objects()
282 :    
283 :     This is the B<REAL WORKHORSE> method of this Package.
284 :    
285 :     It will probably have to:
286 :    
287 :     - get all sims for the feature
288 :     - get all bbhs for the feature
289 :     - copy information from sim to bbh (bbh have no match location etc)
290 :     - get pchs (difficult)
291 :     - get attributes (there is code for this that in get_attribute_based_observations
292 :     - get_attributes_based_observations returns an array of arrays of hashes like this"
293 :    
294 :     my $datasets =
295 :     [
296 :     [ { name => 'acc', value => '1234' },
297 :     { name => 'from', value => '4' },
298 :     { name => 'to', value => '400' },
299 :     ....
300 :     ],
301 :     [ { name => 'acc', value => '456' },
302 :     { name => 'from', value => '1' },
303 :     { name => 'to', value => '100' },
304 :     ....
305 :     ],
306 :     ...
307 :     ];
308 :     return $datasets;
309 :     }
310 :    
311 :     It will invoke the required calls to the SEED API to retrieve the information required.
312 :    
313 :     =cut
314 :    
315 :     sub get_objects {
316 :     my ($self,$fid) = @_;
317 :    
318 :     my $objects = [];
319 :     my @matched_datasets=();
320 :    
321 :     # call function that fetches attribut based observations
322 :     # returns an array of arrays of hashes
323 :     #
324 :     get_attribute_based_observations($fid,\@matched_datasets);
325 :    
326 :     # read sims + bbh (enrich BBHs with sims coordindates etc)
327 :     # read pchs
328 :     # read figfam match data from 48hr directory (BobO knows how do do this!)
329 :     # what sources of evidence did I miss?
330 :    
331 :     foreach my $dataset (@matched_datasets) {
332 :     my $object = $self->new();
333 :     foreach my $attribute (@$dataset) {
334 :     $object->{$attribute->{'name'}} = $attribute->{'value'};
335 :     }
336 :     # $object->{$attribute->{'feature_id'}} = $attribute->{$fid};
337 :     push (@$objects, $object);
338 :     }
339 :    
340 :    
341 :     return $objects;
342 :     }
343 :    
344 :     =head1 Internal Methods
345 :    
346 :     These methods are not meant to be used outside of this package.
347 :    
348 :     B<Please do not use them outside of this package!>
349 :    
350 :     =cut
351 :    
352 :    
353 :     =head3 get_url (internal)
354 :    
355 :     get_url() return a valid URL or undef for any observation.
356 :    
357 :     URLs are constructed by looking at the Accession acc() and name()
358 :    
359 :     Info from both attributes is combined with a table of base URLs stored in this function.
360 :    
361 :     =cut
362 :    
363 :     sub get_url {
364 :    
365 :     my ($self) = @_;
366 :     my $url='';
367 :    
368 :     # a hash with a URL for each observation; identified by name()
369 :     #my $URL => { 'PFAM' => "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?" ,\
370 :     # 'IPR' => "http://www.ebi.ac.uk/interpro/DisplayIproEntry?ac=" ,\
371 :     # 'CDD' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
372 :     # 'PIR' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
373 :     # 'FIGFAM' => '',\
374 :     # 'sim'=> "http://www.theseed.org/linkin.cgi?id=",\
375 :     # 'bbh'=> "http://www.theseed.org/linkin.cgi?id="
376 :     #};
377 :    
378 :     # if (defined $URL{$self->name}) {
379 :     # $url = $URL{$self->name}.$self->acc;
380 :     # return $url;
381 :     # }
382 :     # else
383 :     return undef;
384 :     }
385 :    
386 :     =head3 get_display_method (internal)
387 :    
388 :     get_display_method() return a valid URL or undef for any observation.
389 :    
390 :     URLs are constructed by looking at the Accession acc() and name()
391 :     and Info from both attributes is combined with a table of base URLs stored in this function.
392 :    
393 :     =cut
394 :    
395 :     sub get_display_method {
396 :    
397 :     my ($self) = @_;
398 :    
399 :     # a hash with a URL for each observation; identified by name()
400 :     #my $URL => { 'sim'=> "http://www.theseed.org/featalign.cgi?id1=",\
401 :     # 'bbh'=> "http://www.theseed.org/featalign.cgi?id1="
402 :     # };
403 :    
404 :     #if (defined $URL{$self->name}) {
405 :     # $url = $URL{$self->name}.$self->feature_id."&id2=".$self->acc;
406 :     # return $url;
407 :     # }
408 :     # else
409 :     return undef;
410 :     }
411 :    
412 :     =head3 get_attribute_based_evidence (internal)
413 :    
414 :     This method retrieves evidence from the attribute server
415 :    
416 :     =cut
417 :    
418 :     sub get_attribute_based_observations{
419 :    
420 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
421 :     my ($fid,$datasets_ref) = (@_);
422 :    
423 :     my $_myfig = new FIG;
424 :    
425 :     foreach my $attr_ref ($_myfig->get_attributes($fid)) {
426 :    
427 :     # convert the ref into a string for easier handling
428 :     my ($string) = "@$attr_ref";
429 :    
430 :     # print "S:$string\n";
431 :     my ($key,$val) = ( $string =~ /\S+\s(\S+)\s(\S+)/);
432 :    
433 :     # THIS SHOULD BE DONE ANOTHER WAY FM->TD
434 :     # we need to do the right thing for each type, ie no evalue for CELLO and no coordinates, but a score, etc
435 :     # as fas as possible this should be configured so that the type of observation and the regexp are
436 :     # stored somewhere for easy expansion
437 :     #
438 :    
439 :     if (($key =~ /PFAM::/) || ( $key =~ /IPR::/) || ( $key =~ /CDD::/) ) {
440 :    
441 :     # some keys are composite CDD::1233244 or PFAM:PF1233
442 :    
443 :     if ( $key =~ /::/ ) {
444 :     my ($firstkey,$restkey) = ( $key =~ /([a-zA-Z0-9]+)::(.*)/);
445 :     $val=$restkey.";".$val;
446 :     $key=$firstkey;
447 :     }
448 :    
449 :     my ($acc,$raw_evalue, $from,$to) = ($val =~ /(\S+);(\S+);(\d+)-(\d+)/ );
450 :    
451 :     my $evalue= 255;
452 :     if (defined $raw_evalue) { # some of the tool do not give us an evalue
453 :    
454 :     my ($k,$expo) = ( $raw_evalue =~ /(\d+).(\d+)/);
455 :     my ($new_k, $new_exp);
456 :    
457 :     #
458 :     # THIS DOES NOT WORK PROPERLY
459 :     #
460 :     if($raw_evalue =~/(\d+).(\d+)/){
461 :    
462 :     # $new_exp = (1000+$expo);
463 :     # $new_k = $k / 100;
464 :    
465 :     }
466 :     $evalue = "0.01"#new_k."e-".$new_exp;
467 :     }
468 :    
469 :     # unroll it all into an array of hashes
470 :     # this needs to be done differently for different types of observations
471 :     my $dataset = [ { name => 'class', value => $key },
472 :     { name => 'acc' , value => $acc},
473 :     { name => 'type', value => "dom"} , # this clearly needs to be done properly FM->TD
474 :     { name => 'evalue', value => $evalue },
475 :     { name => 'start', value => $from},
476 :     { name => 'stop' , value => $to}
477 :     ];
478 :    
479 :     push (@{$datasets_ref} ,$dataset);
480 :     }
481 :     }
482 :     }
483 :    
484 :     =head3 get_sims_and_bbhs() (internal)
485 :    
486 :     This methods retrieves sims and also BBHs and fills the internal data structures.
487 :    
488 :     =cut
489 :    
490 :     # sub get_sims_and_bbhs{
491 :    
492 :     # # blast m8 output format
493 :     # # id1, id2, %ident, align len, mismatches, gaps, q.start, q.stop, s. start, s.stop, eval, bit
494 :    
495 :     # my $Sims=();
496 :     # @sims_src = $fig->sims($fid,80,500,"fig",0);
497 :     # print "found $#sims_src SIMs\n";
498 :     # foreach $sims (@sims_src) {
499 :     # my ($sims_string) = "@$sims";
500 :     # # print "$sims_string\n";
501 :     # my ($rfid,$start,$stop,$eval) = ( $sims_string =~ /\S+\s+(\S+)\s+\S+\s\S+\s+(\S+)\s+(\S+)\s+
502 :     # \S+\s+\S+\s+\S+\s+\S+\s+(\S+)+.*/);
503 :     # # print "ID: $rfid, E:$eval, Start:$start stop:$stop\n";
504 :     # $Sims{$rfid}{'eval'}=$eval;
505 :     # $Sims{$rfid}{'start'}=$start;
506 :     # $Sims{$rfid}{'stop'}=$stop;
507 :     # print "$rfid $Sims{$rfid}{'eval'}\n";
508 :     # }
509 :    
510 :     # # BBHs
511 :     # my $BBHs=();
512 :    
513 :     # @bbhs_src = $fig->bbhs($fid,1.0e-10);
514 :     # print "found $#bbhs_src BBHs\n";
515 :     # foreach $bbh (@bbhs_src) {
516 :     # #print "@$bbh\n";
517 :     # my ($bbh_string) = "@$bbh";
518 :     # my ($rfid,$eval,$score) = ( $bbh_string =~ /(\S+)\s(\S+)\s(\S+)/);
519 :     # #print "ID: $rfid, E:$eval, S:$score\n";
520 :     # $BBHs{$rfid}{'eval'}=$eval;
521 :     # $BBHs{$rfid}{'score'}=$score;
522 :     # #print "$rfid $BBHs{$rfid}{'eval'}\n";
523 :     # }
524 :    
525 :     # }
526 :    
527 :    
528 :    
529 :     =head3 new (internal)
530 :    
531 :     Instantiate a new object.
532 :    
533 :     =cut
534 :    
535 :     sub new {
536 :     my ($self) = @_;
537 :    
538 :     $self = { acc => '',
539 :     description => '',
540 :     class => '',
541 :     type => '',
542 :     start => '',
543 :     stop => '',
544 :     evalue => '',
545 :     score => '',
546 :     display_method => '',
547 :     feature_id => '',
548 :     rank => '',
549 :     supports_annotation => ''
550 :     };
551 :    
552 :     bless($self, 'Observation');
553 :    
554 :     return $self;
555 :     }
556 :    
557 :     =head3 feature_id (internal)
558 :    
559 :     Returns the ID of the feature these Observations belong to.
560 :    
561 :     =cut
562 :    
563 :     sub feature_id {
564 :     my ($self) = @_;
565 :    
566 :     return $self->{feature_id};
567 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3