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

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (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 : arodri7 1.9 use HTML;
9 : mkubal 1.1
10 :     1;
11 :    
12 : arodri7 1.11 # $Id: Observation.pm,v 1.10 2007/06/20 20:55:36 arodri7 Exp $
13 : mkubal 1.1
14 :     =head1 NAME
15 :    
16 :     Observation -- A presentation layer for observations in SEED.
17 :    
18 :     =head1 DESCRIPTION
19 :    
20 :     The SEED environment contains various sources of information for sequence features. The purpose of this library is to provide a
21 :     single interface to this data.
22 :    
23 :     The data can be used to display information for a given sequence feature (protein or other, but primarily information is computed for proteins).
24 :    
25 :     Example:
26 :    
27 : arodri7 1.9
28 : mkubal 1.1 use FIG;
29 :     use Observation;
30 :    
31 : paczian 1.2 my $fig = new FIG;
32 :     my $fid = "fig|83333.1.peg.3";
33 :    
34 :     my $observations = Observation::get_objects($fid);
35 :     foreach my $observation (@$observations) {
36 :     print "ID: " . $fid . "\n";
37 :     print "Start: " . $observation->start() . "\n";
38 :     ...
39 :     }
40 : mkubal 1.1
41 :     B<return an array of objects>
42 :    
43 :    
44 :     print "$Observation->acc\n" prints the Accession number if present for the Observation
45 :    
46 :     =cut
47 :    
48 :     =head1 BACKGROUND
49 :    
50 :     =head2 Data incorporated in the Observations
51 :    
52 :     As the goal of this library is to provide an integrated view, we combine diverse sources of evidence.
53 :    
54 :     =head3 SEED core evidence
55 :    
56 :     The core SEED data structures provided by FIG.pm. These are Similarities, BBHs and PCHs.
57 :    
58 :     =head3 Attribute based Evidence
59 :    
60 :     We use the SEED attribute infrastructure to store information computed by a variety of computational procedures.
61 :    
62 :     These are e.g. InterPro hits via InterProScan (ipr), NCBI Conserved Domain Database Hits via PSSM(cdd),
63 :     PFAM hits via HMM(pfam), SignalP results(signalp), and various others.
64 :    
65 :     =head1 METHODS
66 :    
67 :     The public methods this package provides are listed below:
68 :    
69 :     =head3 acc()
70 :    
71 :     A valid accession or remote ID (in the style of a db_xref) or a valid local ID (FID) in case this is supported.
72 :    
73 :     =cut
74 :    
75 :     sub acc {
76 :     my ($self) = @_;
77 :    
78 :     return $self->{acc};
79 :     }
80 :    
81 :     =head3 description()
82 :    
83 :     The description of the hit. Taken from the data or from the our Ontology database for some cases e.g. IPR or PFAM.
84 :    
85 :     B<Please note:>
86 :     Either remoteid or description is required.
87 :    
88 :     =cut
89 :    
90 :     sub description {
91 :     my ($self) = @_;
92 :    
93 : arodri7 1.5 return $self->{description};
94 : mkubal 1.1 }
95 :    
96 :     =head3 class()
97 :    
98 :     The class of evidence (required). This is usually simply the name of the tool or the name of the SEED data structure.
99 :     B<Please note> the connection of class and display_method and URL.
100 : mkubal 1.7
101 : mkubal 1.1 Current valid classes are:
102 :    
103 :     =over 9
104 :    
105 : arodri7 1.9 =item IDENTICAL (seq)
106 :    
107 : mkubal 1.3 =item SIM (seq)
108 : mkubal 1.1
109 : mkubal 1.3 =item BBH (seq)
110 : mkubal 1.1
111 : mkubal 1.3 =item PCH (fc)
112 : mkubal 1.1
113 : mkubal 1.3 =item FIGFAM (seq)
114 : mkubal 1.1
115 : mkubal 1.3 =item IPR (dom)
116 : mkubal 1.1
117 : mkubal 1.3 =item CDD (dom)
118 : mkubal 1.1
119 : mkubal 1.3 =item PFAM (dom)
120 : mkubal 1.1
121 : mkubal 1.3 =item SIGNALP (dom)
122 : mkubal 1.1
123 : mkubal 1.3 =item CELLO(loc)
124 : mkubal 1.1
125 : mkubal 1.3 =item TMHMM (loc)
126 : mkubal 1.1
127 : mkubal 1.3 =item HMMTOP (loc)
128 : mkubal 1.1
129 :     =back
130 :    
131 :     =cut
132 :    
133 :     sub class {
134 :     my ($self) = @_;
135 :    
136 :     return $self->{class};
137 :     }
138 :    
139 :     =head3 type()
140 :    
141 :     The type of evidence (required).
142 :    
143 :     Where type is one of the following:
144 :    
145 :     =over 8
146 :    
147 :     =item seq=Sequence similarity
148 :    
149 :     =item dom=domain based match
150 :    
151 :     =item loc=Localization of the feature
152 :    
153 :     =item fc=Functional coupling.
154 :    
155 :     =back
156 :    
157 :     =cut
158 :    
159 :     sub type {
160 :     my ($self) = @_;
161 :    
162 :     return $self->{acc};
163 :     }
164 :    
165 :     =head3 start()
166 :    
167 :     Start of hit in query sequence.
168 :    
169 :     =cut
170 :    
171 :     sub start {
172 :     my ($self) = @_;
173 :    
174 :     return $self->{start};
175 :     }
176 :    
177 :     =head3 end()
178 :    
179 :     End of the hit in query sequence.
180 :    
181 :     =cut
182 :    
183 :     sub stop {
184 :     my ($self) = @_;
185 :    
186 :     return $self->{stop};
187 :     }
188 :    
189 : arodri7 1.11 =head3 start()
190 :    
191 :     Start of hit in query sequence.
192 :    
193 :     =cut
194 :    
195 :     sub qstart {
196 :     my ($self) = @_;
197 :    
198 :     return $self->{qstart};
199 :     }
200 :    
201 :     =head3 qstop()
202 :    
203 :     End of the hit in query sequence.
204 :    
205 :     =cut
206 :    
207 :     sub qstop {
208 :     my ($self) = @_;
209 :    
210 :     return $self->{qstop};
211 :     }
212 :    
213 :     =head3 hstart()
214 :    
215 :     Start of hit in hit sequence.
216 :    
217 :     =cut
218 :    
219 :     sub hstart {
220 :     my ($self) = @_;
221 :    
222 :     return $self->{hstart};
223 :     }
224 :    
225 :     =head3 end()
226 :    
227 :     End of the hit in hit sequence.
228 :    
229 :     =cut
230 :    
231 :     sub hstop {
232 :     my ($self) = @_;
233 :    
234 :     return $self->{hstop};
235 :     }
236 :    
237 :     =head3 qlength()
238 :    
239 :     length of the query sequence in similarities
240 :    
241 :     =cut
242 :    
243 :     sub qlength {
244 :     my ($self) = @_;
245 :    
246 :     return $self->{qlength};
247 :     }
248 :    
249 :     =head3 hlength()
250 :    
251 :     length of the hit sequence in similarities
252 :    
253 :     =cut
254 :    
255 :     sub hlength {
256 :     my ($self) = @_;
257 :    
258 :     return $self->{hlength};
259 :     }
260 :    
261 :    
262 :    
263 : mkubal 1.1 =head3 evalue()
264 :    
265 :     E-value or P-Value if present.
266 :    
267 :     =cut
268 :    
269 :     sub evalue {
270 :     my ($self) = @_;
271 :    
272 :     return $self->{evalue};
273 :     }
274 :    
275 :     =head3 score()
276 :    
277 :     Score if present.
278 :    
279 :     B<Please note: >
280 :     Either score or eval are required.
281 :    
282 :     =cut
283 :    
284 :     sub score {
285 :     my ($self) = @_;
286 :     return $self->{score};
287 :     }
288 :    
289 :    
290 :     =head3 display_method()
291 :    
292 :     If available use the function specified here to display the "raw" observation.
293 :     In the case of a BLAST alignment of fid1 and fid2 a cgi script
294 :     will be called to display the results of running the command "bl2seq fid1 fid2".
295 :    
296 :     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.
297 :    
298 :     =cut
299 :    
300 : mkubal 1.7 sub display {
301 : mkubal 1.1
302 : mkubal 1.7 die "Abstract Method Called\n";
303 : mkubal 1.1
304 :     }
305 :    
306 : mkubal 1.7
307 : mkubal 1.1 =head3 rank()
308 :    
309 :     Returns an integer from 1 - 10 indicating the importance of this observations.
310 :    
311 :     Currently always returns 1.
312 :    
313 :     =cut
314 :    
315 :     sub rank {
316 :     my ($self) = @_;
317 :    
318 :     # return $self->{rank};
319 :    
320 :     return 1;
321 :     }
322 :    
323 :     =head3 supports_annotation()
324 :    
325 :     Does a this observation support the annotation of its feature?
326 :    
327 :     Returns
328 :    
329 :     =over 3
330 :    
331 :     =item 10, if feature annotation is identical to $self->description
332 :    
333 :     =item 1, Feature annotation is similar to $self->annotation; this is computed using FIG::SameFunc()
334 :    
335 :     =item undef
336 :    
337 :     =back
338 :    
339 :     =cut
340 :    
341 :     sub supports_annotation {
342 :     my ($self) = @_;
343 :    
344 :     # no code here so far
345 :    
346 :     return $self->{supports_annotation};
347 :     }
348 :    
349 :     =head3 url()
350 :    
351 :     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.
352 :    
353 :     =cut
354 :    
355 :     sub url {
356 :     my ($self) = @_;
357 :    
358 :     my $url = get_url($self->type, $self->acc);
359 :    
360 :     return $url;
361 :     }
362 :    
363 :     =head3 get_objects()
364 :    
365 :     This is the B<REAL WORKHORSE> method of this Package.
366 :    
367 :     It will probably have to:
368 :    
369 :     - get all sims for the feature
370 :     - get all bbhs for the feature
371 :     - copy information from sim to bbh (bbh have no match location etc)
372 :     - get pchs (difficult)
373 :     - get attributes (there is code for this that in get_attribute_based_observations
374 :     - get_attributes_based_observations returns an array of arrays of hashes like this"
375 :    
376 : mkubal 1.7 my $dataset
377 : mkubal 1.1 [
378 :     [ { name => 'acc', value => '1234' },
379 :     { name => 'from', value => '4' },
380 :     { name => 'to', value => '400' },
381 :     ....
382 :     ],
383 :     [ { name => 'acc', value => '456' },
384 :     { name => 'from', value => '1' },
385 :     { name => 'to', value => '100' },
386 :     ....
387 :     ],
388 :     ...
389 :     ];
390 :     return $datasets;
391 :     }
392 :    
393 :     It will invoke the required calls to the SEED API to retrieve the information required.
394 :    
395 :     =cut
396 :    
397 :     sub get_objects {
398 : mkubal 1.7 my ($self,$fid,$classes) = @_;
399 :    
400 :    
401 :     my $objects = [];
402 :     my @matched_datasets=();
403 : mkubal 1.1
404 : mkubal 1.7 # call function that fetches attribute based observations
405 :     # returns an array of arrays of hashes
406 :    
407 :     if(scalar(@$classes) < 1){
408 :     get_attribute_based_observations($fid,\@matched_datasets);
409 :     get_sims_observations($fid,\@matched_datasets);
410 :     get_identical_proteins($fid,\@matched_datasets);
411 :     get_functional_coupling($fid,\@matched_datasets);
412 :     }
413 :     else{
414 :     #IPR,CDD,CELLO,PFAM,SIGNALP - attribute based
415 :     my %domain_classes;
416 : arodri7 1.9 my $identical_flag=0;
417 :     my $pch_flag=0;
418 : arodri7 1.10 my $sims_flag=0;
419 : mkubal 1.7 foreach my $class (@$classes){
420 : arodri7 1.9 if($class =~ /(IPR|CDD|PFAM)/){
421 : mkubal 1.7 $domain_classes{$class} = 1;
422 : arodri7 1.9 }
423 :     elsif ($class eq "IDENTICAL")
424 :     {
425 :     $identical_flag = 1;
426 :     }
427 :     elsif ($class eq "PCH")
428 :     {
429 :     $pch_flag = 1;
430 : mkubal 1.7 }
431 : arodri7 1.10 elsif ($class eq "SIM")
432 :     {
433 :     $sims_flag = 1;
434 :     }
435 : mkubal 1.7 }
436 : arodri7 1.9
437 :     if ($identical_flag ==1)
438 :     {
439 :     get_identical_proteins($fid,\@matched_datasets);
440 :     }
441 :     if ( (defined($domain_classes{IPR})) || (defined($domain_classes{CDD})) || (defined($domain_classes{PFAM})) ) {
442 :     get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);
443 :     }
444 :     if ($pch_flag == 1)
445 :     {
446 :     get_functional_coupling($fid,\@matched_datasets);
447 :     }
448 : arodri7 1.10 if ($sims_flag == 1)
449 :     {
450 :     get_sims_observations($fid,\@matched_datasets);
451 :     }
452 : arodri7 1.5
453 : mkubal 1.7 #add CELLO and SignalP later
454 : mkubal 1.1 }
455 : mkubal 1.7
456 :     foreach my $dataset (@matched_datasets) {
457 :     my $object;
458 :     if($dataset->{'type'} eq "dom"){
459 :     $object = Observation::Domain->new($dataset);
460 :     }
461 : arodri7 1.9 if($dataset->{'class'} eq "PCH"){
462 :     $object = Observation::FC->new($dataset);
463 :     }
464 :     if ($dataset->{'class'} eq "IDENTICAL"){
465 :     $object = Observation::Identical->new($dataset);
466 :     }
467 : arodri7 1.10 if ($dataset->{'class'} eq "SIM"){
468 :     $object = Observation::Sims->new($dataset);
469 :     }
470 : mkubal 1.7 push (@$objects, $object);
471 : mkubal 1.1 }
472 : mkubal 1.7
473 :     return $objects;
474 : mkubal 1.1
475 :     }
476 :    
477 :     =head1 Internal Methods
478 :    
479 :     These methods are not meant to be used outside of this package.
480 :    
481 :     B<Please do not use them outside of this package!>
482 :    
483 :     =cut
484 :    
485 :    
486 :     =head3 get_url (internal)
487 :    
488 :     get_url() return a valid URL or undef for any observation.
489 :    
490 :     URLs are constructed by looking at the Accession acc() and name()
491 :    
492 :     Info from both attributes is combined with a table of base URLs stored in this function.
493 :    
494 :     =cut
495 :    
496 :     sub get_url {
497 :    
498 :     my ($self) = @_;
499 :     my $url='';
500 :    
501 :     # a hash with a URL for each observation; identified by name()
502 :     #my $URL => { 'PFAM' => "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?" ,\
503 :     # 'IPR' => "http://www.ebi.ac.uk/interpro/DisplayIproEntry?ac=" ,\
504 :     # 'CDD' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
505 :     # 'PIR' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
506 :     # 'FIGFAM' => '',\
507 :     # 'sim'=> "http://www.theseed.org/linkin.cgi?id=",\
508 :     # 'bbh'=> "http://www.theseed.org/linkin.cgi?id="
509 :     #};
510 :    
511 :     # if (defined $URL{$self->name}) {
512 :     # $url = $URL{$self->name}.$self->acc;
513 :     # return $url;
514 :     # }
515 :     # else
516 :     return undef;
517 :     }
518 :    
519 :     =head3 get_display_method (internal)
520 :    
521 :     get_display_method() return a valid URL or undef for any observation.
522 :    
523 :     URLs are constructed by looking at the Accession acc() and name()
524 :     and Info from both attributes is combined with a table of base URLs stored in this function.
525 :    
526 :     =cut
527 :    
528 :     sub get_display_method {
529 :    
530 :     my ($self) = @_;
531 :    
532 :     # a hash with a URL for each observation; identified by name()
533 :     #my $URL => { 'sim'=> "http://www.theseed.org/featalign.cgi?id1=",\
534 :     # 'bbh'=> "http://www.theseed.org/featalign.cgi?id1="
535 :     # };
536 :    
537 :     #if (defined $URL{$self->name}) {
538 :     # $url = $URL{$self->name}.$self->feature_id."&id2=".$self->acc;
539 :     # return $url;
540 :     # }
541 :     # else
542 :     return undef;
543 :     }
544 :    
545 : mkubal 1.7
546 :     sub get_attribute_based_domain_observations{
547 :    
548 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
549 :     my ($fid,$domain_classes,$datasets_ref) = (@_);
550 :    
551 :     my $fig = new FIG;
552 :    
553 :     foreach my $attr_ref ($fig->get_attributes($fid)) {
554 :     my $key = @$attr_ref[1];
555 :     my @parts = split("::",$key);
556 :     my $class = $parts[0];
557 :    
558 :     if($domain_classes->{$parts[0]}){
559 :     my $val = @$attr_ref[2];
560 : mkubal 1.8 if($val =~/^(\d+\.\d+|0\.0);(\d+)-(\d+)/){
561 : mkubal 1.7 my $raw_evalue = $1;
562 : mkubal 1.8 my $from = $2;
563 :     my $to = $3;
564 : mkubal 1.7 my $evalue;
565 :     if($raw_evalue =~/(\d+)\.(\d+)/){
566 :     my $part2 = 1000 - $1;
567 :     my $part1 = $2/100;
568 :     $evalue = $part1."e-".$part2;
569 :     }
570 :     else{
571 : mkubal 1.8 $evalue = "0.0";
572 : mkubal 1.7 }
573 :    
574 :     my $dataset = {'class' => $class,
575 :     'acc' => $key,
576 :     'type' => "dom" ,
577 :     'evalue' => $evalue,
578 :     'start' => $from,
579 :     'stop' => $to
580 :     };
581 :    
582 :     push (@{$datasets_ref} ,$dataset);
583 :     }
584 :     }
585 :     }
586 :     }
587 :    
588 : mkubal 1.1 =head3 get_attribute_based_evidence (internal)
589 :    
590 :     This method retrieves evidence from the attribute server
591 :    
592 :     =cut
593 :    
594 :     sub get_attribute_based_observations{
595 :    
596 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
597 :     my ($fid,$datasets_ref) = (@_);
598 :    
599 :     my $_myfig = new FIG;
600 :    
601 :     foreach my $attr_ref ($_myfig->get_attributes($fid)) {
602 :    
603 :     # convert the ref into a string for easier handling
604 :     my ($string) = "@$attr_ref";
605 :    
606 :     # print "S:$string\n";
607 :     my ($key,$val) = ( $string =~ /\S+\s(\S+)\s(\S+)/);
608 :    
609 :     # THIS SHOULD BE DONE ANOTHER WAY FM->TD
610 :     # we need to do the right thing for each type, ie no evalue for CELLO and no coordinates, but a score, etc
611 :     # as fas as possible this should be configured so that the type of observation and the regexp are
612 :     # stored somewhere for easy expansion
613 :     #
614 :    
615 :     if (($key =~ /PFAM::/) || ( $key =~ /IPR::/) || ( $key =~ /CDD::/) ) {
616 :    
617 :     # some keys are composite CDD::1233244 or PFAM:PF1233
618 :    
619 :     if ( $key =~ /::/ ) {
620 :     my ($firstkey,$restkey) = ( $key =~ /([a-zA-Z0-9]+)::(.*)/);
621 :     $val=$restkey.";".$val;
622 :     $key=$firstkey;
623 :     }
624 :    
625 :     my ($acc,$raw_evalue, $from,$to) = ($val =~ /(\S+);(\S+);(\d+)-(\d+)/ );
626 :    
627 :     my $evalue= 255;
628 :     if (defined $raw_evalue) { # some of the tool do not give us an evalue
629 :    
630 :     my ($k,$expo) = ( $raw_evalue =~ /(\d+).(\d+)/);
631 :     my ($new_k, $new_exp);
632 :    
633 :     #
634 :     # THIS DOES NOT WORK PROPERLY
635 :     #
636 :     if($raw_evalue =~/(\d+).(\d+)/){
637 :    
638 :     # $new_exp = (1000+$expo);
639 :     # $new_k = $k / 100;
640 :    
641 :     }
642 :     $evalue = "0.01"#new_k."e-".$new_exp;
643 :     }
644 :    
645 :     # unroll it all into an array of hashes
646 :     # this needs to be done differently for different types of observations
647 :     my $dataset = [ { name => 'class', value => $key },
648 :     { name => 'acc' , value => $acc},
649 :     { name => 'type', value => "dom"} , # this clearly needs to be done properly FM->TD
650 :     { name => 'evalue', value => $evalue },
651 :     { name => 'start', value => $from},
652 :     { name => 'stop' , value => $to}
653 :     ];
654 :    
655 :     push (@{$datasets_ref} ,$dataset);
656 :     }
657 :     }
658 :     }
659 :    
660 : mkubal 1.3 =head3 get_sims_observations() (internal)
661 :    
662 :     This methods retrieves sims fills the internal data structures.
663 :    
664 :     =cut
665 :    
666 :     sub get_sims_observations{
667 :    
668 :     my ($fid,$datasets_ref) = (@_);
669 : mkubal 1.4 my $fig = new FIG;
670 : arodri7 1.11 # my @sims= $fig->nsims($fid,100,1e-20,"fig");
671 :     my @sims= $fig->nsims($fid,100,1e-20,"all");
672 : mkubal 1.4 my ($dataset);
673 : mkubal 1.3 foreach my $sim (@sims){
674 : mkubal 1.4 my $hit = $sim->[1];
675 : arodri7 1.11 my $percent = $sim->[2];
676 : mkubal 1.4 my $evalue = $sim->[10];
677 : arodri7 1.11 my $qfrom = $sim->[6];
678 :     my $qto = $sim->[7];
679 :     my $hfrom = $sim->[8];
680 :     my $hto = $sim->[9];
681 :     my $qlength = $sim->[12];
682 :     my $hlength = $sim->[13];
683 :     my $db = get_database($hit);
684 :     my $func = $fig->function_of($hit);
685 :     my $organism = $fig->org_of($hit);
686 :    
687 : arodri7 1.10 $dataset = {'class' => 'SIM',
688 :     'acc' => $hit,
689 : arodri7 1.11 'identity' => $percent,
690 : arodri7 1.10 'type' => 'seq',
691 :     'evalue' => $evalue,
692 : arodri7 1.11 'qstart' => $qfrom,
693 :     'qstop' => $qto,
694 :     'hstart' => $hfrom,
695 :     'hstop' => $hto,
696 :     'database' => $db,
697 :     'organism' => $organism,
698 :     'function' => $func,
699 :     'qlength' => $qlength,
700 :     'hlength' => $hlength
701 : arodri7 1.10 };
702 :    
703 :     push (@{$datasets_ref} ,$dataset);
704 : mkubal 1.3 }
705 :     }
706 :    
707 : arodri7 1.11 =head3 get_database (internal)
708 :     This method gets the database association from the sequence id
709 :    
710 :     =cut
711 :    
712 :     sub get_database{
713 :     my ($id) = (@_);
714 :    
715 :     my ($db);
716 :     if ($id =~ /^fig\|/) { $db = "FIG" }
717 :     elsif ($id =~ /^gi\|/) { $db = "NCBI" }
718 :     elsif ($id =~ /^^[NXYZA]P_/) { $db = "RefSeq" }
719 :     elsif ($id =~ /^sp\|/) { $db = "SwissProt" }
720 :     elsif ($id =~ /^uni\|/) { $db = "UniProt" }
721 :     elsif ($id =~ /^tigr\|/) { $db = "TIGR" }
722 :     elsif ($id =~ /^pir\|/) { $db = "PIR" }
723 :     elsif ($id =~ /^kegg\|/) { $db = "KEGG" }
724 :     elsif ($id =~ /^tr\|/) { $db = "TrEMBL" }
725 :     elsif ($id =~ /^eric\|/) { $db = "ASAP" }
726 :     elsif ($id =~ /^img\|/) { $db = "JGI" }
727 :    
728 :     return ($db);
729 :    
730 :     }
731 :    
732 : arodri7 1.5 =head3 get_identical_proteins() (internal)
733 :    
734 :     This methods retrieves sims fills the internal data structures.
735 :    
736 :     =cut
737 :    
738 :     sub get_identical_proteins{
739 :    
740 :     my ($fid,$datasets_ref) = (@_);
741 :     my $fig = new FIG;
742 :     my @funcs = ();
743 :    
744 :     my @maps_to = grep { $_ ne $fid and $_ !~ /^xxx/ } map { $_->[0] } $fig->mapped_prot_ids($fid);
745 :    
746 :     foreach my $id (@maps_to) {
747 :     my ($tmp, $who);
748 : arodri7 1.6 if (($id ne $fid) && ($tmp = $fig->function_of($id))) {
749 : arodri7 1.11 $who = &get_database($id);
750 : arodri7 1.5 push(@funcs, [$id,$who,$tmp]);
751 :     }
752 :     }
753 :    
754 :     my ($dataset);
755 :     foreach my $row (@funcs){
756 :     my $id = $row->[0];
757 :     my $organism = $fig->org_of($fid);
758 :     my $who = $row->[1];
759 :     my $assignment = $row->[2];
760 : arodri7 1.9
761 :     my $dataset = {'class' => 'IDENTICAL',
762 :     'id' => $id,
763 :     'organism' => $organism,
764 :     'type' => 'seq',
765 :     'database' => $who,
766 :     'function' => $assignment
767 :     };
768 :    
769 : arodri7 1.5 push (@{$datasets_ref} ,$dataset);
770 :     }
771 :    
772 :     }
773 :    
774 : arodri7 1.6 =head3 get_functional_coupling() (internal)
775 :    
776 :     This methods retrieves the functional coupling of a protein given a peg ID
777 :    
778 :     =cut
779 :    
780 :     sub get_functional_coupling{
781 :    
782 :     my ($fid,$datasets_ref) = (@_);
783 :     my $fig = new FIG;
784 :     my @funcs = ();
785 :    
786 :     # initialize some variables
787 :     my($sc,$neigh);
788 :    
789 :     # set default parameters for coupling and evidence
790 :     my ($bound,$sim_cutoff,$coupling_cutoff) = (5000, 1.0e-10, 4);
791 :    
792 :     # get the fc data
793 :     my @fc_data = $fig->coupling_and_evidence($fid,$bound,$sim_cutoff,$coupling_cutoff,1);
794 :    
795 :     # retrieve data
796 :     my @rows = map { ($sc,$neigh) = @$_;
797 :     [$sc,$neigh,scalar $fig->function_of($neigh)]
798 :     } @fc_data;
799 :    
800 :     my ($dataset);
801 :     foreach my $row (@rows){
802 :     my $id = $row->[1];
803 :     my $score = $row->[0];
804 :     my $description = $row->[2];
805 : arodri7 1.9 my $dataset = {'class' => 'PCH',
806 :     'score' => $score,
807 :     'id' => $id,
808 :     'type' => 'fc',
809 :     'function' => $description
810 :     };
811 :    
812 : arodri7 1.6 push (@{$datasets_ref} ,$dataset);
813 :     }
814 :     }
815 : arodri7 1.5
816 : mkubal 1.1 =head3 get_sims_and_bbhs() (internal)
817 :    
818 :     This methods retrieves sims and also BBHs and fills the internal data structures.
819 :    
820 :     =cut
821 :    
822 :     # sub get_sims_and_bbhs{
823 :    
824 :     # # blast m8 output format
825 :     # # id1, id2, %ident, align len, mismatches, gaps, q.start, q.stop, s. start, s.stop, eval, bit
826 :    
827 :     # my $Sims=();
828 :     # @sims_src = $fig->sims($fid,80,500,"fig",0);
829 :     # print "found $#sims_src SIMs\n";
830 :     # foreach $sims (@sims_src) {
831 :     # my ($sims_string) = "@$sims";
832 :     # # print "$sims_string\n";
833 :     # my ($rfid,$start,$stop,$eval) = ( $sims_string =~ /\S+\s+(\S+)\s+\S+\s\S+\s+(\S+)\s+(\S+)\s+
834 :     # \S+\s+\S+\s+\S+\s+\S+\s+(\S+)+.*/);
835 :     # # print "ID: $rfid, E:$eval, Start:$start stop:$stop\n";
836 :     # $Sims{$rfid}{'eval'}=$eval;
837 :     # $Sims{$rfid}{'start'}=$start;
838 :     # $Sims{$rfid}{'stop'}=$stop;
839 :     # print "$rfid $Sims{$rfid}{'eval'}\n";
840 :     # }
841 :    
842 :     # # BBHs
843 :     # my $BBHs=();
844 :    
845 :     # @bbhs_src = $fig->bbhs($fid,1.0e-10);
846 :     # print "found $#bbhs_src BBHs\n";
847 :     # foreach $bbh (@bbhs_src) {
848 :     # #print "@$bbh\n";
849 :     # my ($bbh_string) = "@$bbh";
850 :     # my ($rfid,$eval,$score) = ( $bbh_string =~ /(\S+)\s(\S+)\s(\S+)/);
851 :     # #print "ID: $rfid, E:$eval, S:$score\n";
852 :     # $BBHs{$rfid}{'eval'}=$eval;
853 :     # $BBHs{$rfid}{'score'}=$score;
854 :     # #print "$rfid $BBHs{$rfid}{'eval'}\n";
855 :     # }
856 :    
857 :     # }
858 :    
859 :    
860 :    
861 :     =head3 new (internal)
862 :    
863 :     Instantiate a new object.
864 :    
865 :     =cut
866 :    
867 :     sub new {
868 : mkubal 1.7 my ($class,$dataset) = @_;
869 :    
870 : mkubal 1.1
871 : mkubal 1.7 #$self = { acc => '',
872 :     # description => '',
873 :     # class => '',
874 :     # type => '',
875 :     # start => '',
876 :     # stop => '',
877 :     # evalue => '',
878 :     # score => '',
879 :     # display_method => '',
880 :     # feature_id => '',
881 :     # rank => '',
882 :     # supports_annotation => '',
883 :     # id => '',
884 :     # organism => '',
885 :     # who => ''
886 :     # };
887 : mkubal 1.1
888 : mkubal 1.7 my $self = { class => $dataset->{'class'},
889 :     type => $dataset->{'type'}
890 : arodri7 1.10 };
891 : mkubal 1.7
892 :     bless($self,$class);
893 : mkubal 1.1
894 :     return $self;
895 :     }
896 :    
897 : arodri7 1.11 =head3 identity (internal)
898 :    
899 :     Returns the % identity of the similar sequence
900 :    
901 :     =cut
902 :    
903 :     sub identity {
904 :     my ($self) = @_;
905 :    
906 :     return $self->{identity};
907 :     }
908 :    
909 : mkubal 1.1 =head3 feature_id (internal)
910 :    
911 :    
912 :     =cut
913 :    
914 :     sub feature_id {
915 :     my ($self) = @_;
916 :    
917 :     return $self->{feature_id};
918 :     }
919 : arodri7 1.5
920 :     =head3 id (internal)
921 :    
922 :     Returns the ID of the identical sequence
923 :    
924 :     =cut
925 :    
926 :     sub id {
927 :     my ($self) = @_;
928 :    
929 :     return $self->{id};
930 :     }
931 :    
932 :     =head3 organism (internal)
933 :    
934 :     Returns the organism of the identical sequence
935 :    
936 :     =cut
937 :    
938 :     sub organism {
939 :     my ($self) = @_;
940 :    
941 :     return $self->{organism};
942 :     }
943 :    
944 : arodri7 1.9 =head3 function (internal)
945 :    
946 :     Returns the function of the identical sequence
947 :    
948 :     =cut
949 :    
950 :     sub function {
951 :     my ($self) = @_;
952 :    
953 :     return $self->{function};
954 :     }
955 :    
956 : arodri7 1.5 =head3 database (internal)
957 :    
958 :     Returns the database of the identical sequence
959 :    
960 :     =cut
961 :    
962 :     sub database {
963 :     my ($self) = @_;
964 :    
965 :     return $self->{database};
966 :     }
967 :    
968 : arodri7 1.6
969 : arodri7 1.11
970 : arodri7 1.9 ############################################################
971 :     ############################################################
972 :     package Observation::Identical;
973 :    
974 :     use base qw(Observation);
975 :    
976 :     sub new {
977 :    
978 :     my ($class,$dataset) = @_;
979 :     my $self = $class->SUPER::new($dataset);
980 :     $self->{id} = $dataset->{'id'};
981 :     $self->{organism} = $dataset->{'organism'};
982 :     $self->{function} = $dataset->{'function'};
983 :     $self->{database} = $dataset->{'database'};
984 :    
985 :     bless($self,$class);
986 :     return $self;
987 :     }
988 :    
989 :     =head3 display()
990 : arodri7 1.6
991 :     If available use the function specified here to display the "raw" observation.
992 :     This code will display a table for the identical protein
993 :    
994 :    
995 : arodri7 1.9 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 evi
996 :     dence.
997 : arodri7 1.6
998 :     =cut
999 :    
1000 : arodri7 1.9 sub display{
1001 :     my ($self, $cgi, $dataset) = @_;
1002 : arodri7 1.6
1003 :     my $all_domains = [];
1004 :     my $count_identical = 0;
1005 : arodri7 1.9 my $content;
1006 :     foreach my $thing (@$dataset) {
1007 : arodri7 1.6 next if ($thing->class ne "IDENTICAL");
1008 : arodri7 1.9 my $single_domain = [];
1009 :     push(@$single_domain,$thing->database);
1010 :     my $id = $thing->id;
1011 :     $count_identical++;
1012 :     push(@$single_domain,&HTML::set_prot_links($cgi,$id));
1013 :     push(@$single_domain,$thing->organism);
1014 :     #push(@$single_domain,$thing->type);
1015 :     push(@$single_domain,$thing->function);
1016 :     push(@$all_domains,$single_domain);
1017 : arodri7 1.6 }
1018 :    
1019 :     if ($count_identical >0){
1020 : arodri7 1.9 $content = $all_domains;
1021 : arodri7 1.6 }
1022 :     else{
1023 : arodri7 1.9 $content = "<p>This PEG does not have any essentially identical proteins</p>";
1024 : arodri7 1.6 }
1025 :     return ($content);
1026 :     }
1027 : mkubal 1.7
1028 : arodri7 1.9 1;
1029 :    
1030 :    
1031 :     #########################################
1032 :     #########################################
1033 :     package Observation::FC;
1034 :     1;
1035 :    
1036 :     use base qw(Observation);
1037 :    
1038 :     sub new {
1039 :    
1040 :     my ($class,$dataset) = @_;
1041 :     my $self = $class->SUPER::new($dataset);
1042 :     $self->{score} = $dataset->{'score'};
1043 :     $self->{id} = $dataset->{'id'};
1044 :     $self->{function} = $dataset->{'function'};
1045 :    
1046 :     bless($self,$class);
1047 :     return $self;
1048 :     }
1049 :    
1050 :     =head3 display()
1051 :    
1052 :     If available use the function specified here to display the "raw" observation.
1053 :     This code will display a table for the identical protein
1054 :    
1055 :    
1056 :     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 evi
1057 :     dence.
1058 :    
1059 :     =cut
1060 :    
1061 :     sub display {
1062 :     my ($self,$cgi,$dataset, $fid) = @_;
1063 :    
1064 :     my $functional_data = [];
1065 :     my $count = 0;
1066 :     my $content;
1067 :    
1068 :     foreach my $thing (@$dataset) {
1069 :     my $single_domain = [];
1070 :     next if ($thing->class ne "PCH");
1071 :     $count++;
1072 :    
1073 :     # construct the score link
1074 :     my $score = $thing->score;
1075 :     my $toid = $thing->id;
1076 :     my $link = $cgi->url(-relative => 1) . "?user=master&request=show_coupling_evidence&prot=$fid&to=$toid&SPROUT=";
1077 :     my $sc_link = "<a href=$link>$score</a>";
1078 :    
1079 :     push(@$single_domain,$sc_link);
1080 :     push(@$single_domain,$thing->id);
1081 :     push(@$single_domain,$thing->function);
1082 :     push(@$functional_data,$single_domain);
1083 :     }
1084 :    
1085 :     if ($count >0){
1086 :     $content = $functional_data;
1087 :     }
1088 :     else
1089 :     {
1090 :     $content = "<p>This PEG does not have any functional coupling</p>";
1091 :     }
1092 :     return ($content);
1093 :     }
1094 :    
1095 :    
1096 :     #########################################
1097 :     #########################################
1098 : mkubal 1.7 package Observation::Domain;
1099 :    
1100 :     use base qw(Observation);
1101 :    
1102 :     sub new {
1103 :    
1104 :     my ($class,$dataset) = @_;
1105 :     my $self = $class->SUPER::new($dataset);
1106 :     $self->{evalue} = $dataset->{'evalue'};
1107 :     $self->{acc} = $dataset->{'acc'};
1108 :     $self->{start} = $dataset->{'start'};
1109 :     $self->{stop} = $dataset->{'stop'};
1110 :    
1111 :     bless($self,$class);
1112 :     return $self;
1113 :     }
1114 :    
1115 :     sub display {
1116 :     my ($thing,$gd) = @_;
1117 :     my $lines = [];
1118 :     my $line_config = { 'title' => $thing->acc,
1119 :     'short_title' => $thing->type,
1120 :     'basepair_offset' => '1' };
1121 :     my $color = "4";
1122 :    
1123 :     my $line_data = [];
1124 :     my $links_list = [];
1125 :     my $descriptions = [];
1126 :    
1127 :     my $description_function;
1128 :     $description_function = {"title" => $thing->class,
1129 :     "value" => $thing->acc};
1130 :    
1131 :     push(@$descriptions,$description_function);
1132 :    
1133 :     my $score;
1134 :     $score = {"title" => "score",
1135 :     "value" => $thing->evalue};
1136 :     push(@$descriptions,$score);
1137 :    
1138 :     my $link_id;
1139 :     if ($thing->acc =~/CDD::(\d+)/){
1140 :     $link_id = $1;
1141 :     }
1142 :    
1143 :     my $link;
1144 :     $link = {"link_title" => $thing->acc,
1145 :     "link" => "http://0-www.ncbi.nlm.nih.gov.library.vu.edu.au:80/Structure/cdd/cddsrv.cgi?uid=$link_id"};
1146 :     push(@$links_list,$link);
1147 :    
1148 :     my $element_hash = {
1149 :     "title" => $thing->type,
1150 :     "start" => $thing->start,
1151 :     "end" => $thing->stop,
1152 :     "color"=> $color,
1153 :     "zlayer" => '2',
1154 :     "links_list" => $links_list,
1155 :     "description" => $descriptions};
1156 :    
1157 :     push(@$line_data,$element_hash);
1158 :     $gd->add_line($line_data, $line_config);
1159 :    
1160 :     return $gd;
1161 :    
1162 :     }
1163 :    
1164 : arodri7 1.10 #########################################
1165 :     #########################################
1166 :     package Observation::Sims;
1167 :    
1168 :     use base qw(Observation);
1169 :    
1170 :     sub new {
1171 :    
1172 :     my ($class,$dataset) = @_;
1173 :     my $self = $class->SUPER::new($dataset);
1174 : arodri7 1.11 $self->{identity} = $dataset->{'identity'};
1175 : arodri7 1.10 $self->{acc} = $dataset->{'acc'};
1176 :     $self->{evalue} = $dataset->{'evalue'};
1177 : arodri7 1.11 $self->{qstart} = $dataset->{'qstart'};
1178 :     $self->{qstop} = $dataset->{'qstop'};
1179 :     $self->{hstart} = $dataset->{'hstart'};
1180 :     $self->{hstop} = $dataset->{'hstop'};
1181 :     $self->{database} = $dataset->{'database'};
1182 :     $self->{organism} = $dataset->{'organism'};
1183 :     $self->{function} = $dataset->{'function'};
1184 :     $self->{qlength} = $dataset->{'qlength'};
1185 :     $self->{hlength} = $dataset->{'hlength'};
1186 : arodri7 1.10
1187 :     bless($self,$class);
1188 :     return $self;
1189 :     }
1190 :    
1191 :     =head3 display()
1192 :    
1193 :     If available use the function specified here to display the "raw" observation.
1194 :     This code will display a table for the similarities protein
1195 :    
1196 :     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.
1197 :    
1198 :     =cut
1199 :    
1200 :     sub display {
1201 :     my ($self,$cgi,$dataset) = @_;
1202 :    
1203 :     my $data = [];
1204 :     my $count = 0;
1205 :     my $content;
1206 : arodri7 1.11 my $fig = new FIG;
1207 : arodri7 1.10
1208 :     foreach my $thing (@$dataset) {
1209 :     my $single_domain = [];
1210 :     next if ($thing->class ne "SIM");
1211 :     $count++;
1212 :    
1213 : arodri7 1.11 my $id = $thing->acc;
1214 :    
1215 :     # add the subsystem information
1216 :     my @in_sub = $fig->peg_to_subsystems($id);
1217 :     my $in_sub;
1218 :    
1219 :     if (@in_sub > 0) {
1220 :     $in_sub = @in_sub;
1221 :    
1222 :     # RAE: add a javascript popup with all the subsystems
1223 :     my $ss_list=join "<br>", map { my $g = $_; $g =~ s/\_/ /g; $_ = $g } sort {$a cmp $b} @in_sub;
1224 :     $in_sub = $cgi->a( {id=>"subsystems", onMouseover=>"javascript:if(!this.tooltip) this.tooltip=new Popup_Tooltip(this, 'Subsystems', '$ss_list', ''); this.tooltip.addHandler(); return false;"}, $in_sub);
1225 :     } else {
1226 :     $in_sub = "&nbsp;";
1227 :     }
1228 :    
1229 :     # add evidence code with tool tip
1230 :     my $ev_codes=" &nbsp; ";
1231 :     my @ev_codes = "";
1232 :     if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {
1233 :     my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes($id);
1234 :     @ev_codes = ();
1235 :     foreach my $code (@codes) {
1236 :     my $pretty_code = $code->[2];
1237 :     if ($pretty_code =~ /;/) {
1238 :     my ($cd, $ss) = split(";", $code->[2]);
1239 :     $ss =~ s/_/ /g;
1240 :     $pretty_code = $cd;# . " in " . $ss;
1241 :     }
1242 :     push(@ev_codes, $pretty_code);
1243 :     }
1244 :     }
1245 :    
1246 :     if (scalar(@ev_codes) && $ev_codes[0]) {
1247 :     my $ev_code_help=join("<br />", map {&HTML::evidence_codes_explain($_)} @ev_codes);
1248 :     $ev_codes = $cgi->a(
1249 :     {
1250 :     id=>"evidence_codes", onMouseover=>"javascript:if(!this.tooltip) this.tooltip=new Popup_Tooltip(this, 'Evidence Codes', '$ev_code_help', ''); this.tooltip.addHandler(); return false;"}, join("<br />", @ev_codes));
1251 :     }
1252 :    
1253 :     # add the aliases
1254 :     my $aliases = undef;
1255 :     $aliases = &html_enc( join( ", ", $fig->feature_aliases($id) ) );
1256 :     $aliases = &HTML::set_prot_links( $cgi, $aliases );
1257 :     $aliases ||= "&nbsp;";
1258 :    
1259 :     my $iden = $thing->identity;
1260 :     my $ln1 = $thing->qlength;
1261 :     my $ln2 = $thing->hlength;
1262 :     my $b1 = $thing->qstart;
1263 :     my $e1 = $thing->qstop;
1264 :     my $b2 = $thing->hstart;
1265 :     my $e2 = $thing->hstop;
1266 :     my $d1 = abs($e1 - $b1) + 1;
1267 :     my $d2 = abs($e2 - $b2) + 1;
1268 :     my $reg1 = "$b1-$e1 (<b>$d1/$ln1</b>)";
1269 :     my $reg2 = "$b2-$e2 (<b>$d2/$ln2</b>)";
1270 :    
1271 :    
1272 :     push(@$single_domain,$thing->database);
1273 : arodri7 1.10 push(@$single_domain,&HTML::set_prot_links($cgi,$thing->acc));
1274 :     push(@$single_domain,$thing->evalue);
1275 : arodri7 1.11 push(@$single_domain,"$iden\%");
1276 :     push(@$single_domain,$reg1);
1277 :     push(@$single_domain,$reg2);
1278 :     push(@$single_domain,$in_sub);
1279 :     push(@$single_domain,$ev_codes);
1280 :     push(@$single_domain,$thing->organism);
1281 :     push(@$single_domain,$thing->function);
1282 :     push(@$single_domain,$aliases);
1283 : arodri7 1.10 push(@$data,$single_domain);
1284 :     }
1285 :    
1286 :     if ($count >0){
1287 :     $content = $data;
1288 :     }
1289 :     else
1290 :     {
1291 :     $content = "<p>This PEG does not have any similarities</p>";
1292 :     }
1293 :     return ($content);
1294 :     }
1295 : arodri7 1.11
1296 :     sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3