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

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : mkubal 1.1 package Observation;
2 :    
3 :     require Exporter;
4 :     @EXPORT_OK = qw(get_objects);
5 :    
6 : arodri7 1.16 use FIG_Config;
7 : mkubal 1.1 use strict;
8 : arodri7 1.16 #use warnings;
9 : arodri7 1.9 use HTML;
10 : mkubal 1.1
11 :     1;
12 :    
13 : arodri7 1.18 # $Id: Observation.pm,v 1.17 2007/06/26 02:19:46 mkubal Exp $
14 : mkubal 1.1
15 :     =head1 NAME
16 :    
17 :     Observation -- A presentation layer for observations in SEED.
18 :    
19 :     =head1 DESCRIPTION
20 :    
21 :     The SEED environment contains various sources of information for sequence features. The purpose of this library is to provide a
22 :     single interface to this data.
23 :    
24 :     The data can be used to display information for a given sequence feature (protein or other, but primarily information is computed for proteins).
25 :    
26 :     Example:
27 :    
28 : arodri7 1.9
29 : mkubal 1.1 use FIG;
30 :     use Observation;
31 :    
32 : paczian 1.2 my $fig = new FIG;
33 :     my $fid = "fig|83333.1.peg.3";
34 :    
35 :     my $observations = Observation::get_objects($fid);
36 :     foreach my $observation (@$observations) {
37 :     print "ID: " . $fid . "\n";
38 :     print "Start: " . $observation->start() . "\n";
39 :     ...
40 :     }
41 : mkubal 1.1
42 :     B<return an array of objects>
43 :    
44 :    
45 :     print "$Observation->acc\n" prints the Accession number if present for the Observation
46 :    
47 :     =cut
48 :    
49 :     =head1 BACKGROUND
50 :    
51 :     =head2 Data incorporated in the Observations
52 :    
53 :     As the goal of this library is to provide an integrated view, we combine diverse sources of evidence.
54 :    
55 :     =head3 SEED core evidence
56 :    
57 :     The core SEED data structures provided by FIG.pm. These are Similarities, BBHs and PCHs.
58 :    
59 :     =head3 Attribute based Evidence
60 :    
61 :     We use the SEED attribute infrastructure to store information computed by a variety of computational procedures.
62 :    
63 :     These are e.g. InterPro hits via InterProScan (ipr), NCBI Conserved Domain Database Hits via PSSM(cdd),
64 :     PFAM hits via HMM(pfam), SignalP results(signalp), and various others.
65 :    
66 :     =head1 METHODS
67 :    
68 :     The public methods this package provides are listed below:
69 :    
70 :     =head3 acc()
71 :    
72 :     A valid accession or remote ID (in the style of a db_xref) or a valid local ID (FID) in case this is supported.
73 :    
74 :     =cut
75 :    
76 :     sub acc {
77 :     my ($self) = @_;
78 :    
79 :     return $self->{acc};
80 :     }
81 :    
82 :     =head3 description()
83 :    
84 :     The description of the hit. Taken from the data or from the our Ontology database for some cases e.g. IPR or PFAM.
85 :    
86 :     B<Please note:>
87 :     Either remoteid or description is required.
88 :    
89 :     =cut
90 :    
91 :     sub description {
92 :     my ($self) = @_;
93 :    
94 : arodri7 1.5 return $self->{description};
95 : mkubal 1.1 }
96 :    
97 :     =head3 class()
98 :    
99 :     The class of evidence (required). This is usually simply the name of the tool or the name of the SEED data structure.
100 :     B<Please note> the connection of class and display_method and URL.
101 : mkubal 1.7
102 : mkubal 1.1 Current valid classes are:
103 :    
104 :     =over 9
105 :    
106 : arodri7 1.9 =item IDENTICAL (seq)
107 :    
108 : mkubal 1.3 =item SIM (seq)
109 : mkubal 1.1
110 : mkubal 1.3 =item BBH (seq)
111 : mkubal 1.1
112 : mkubal 1.3 =item PCH (fc)
113 : mkubal 1.1
114 : mkubal 1.3 =item FIGFAM (seq)
115 : mkubal 1.1
116 : mkubal 1.3 =item IPR (dom)
117 : mkubal 1.1
118 : mkubal 1.3 =item CDD (dom)
119 : mkubal 1.1
120 : mkubal 1.3 =item PFAM (dom)
121 : mkubal 1.1
122 : mkubal 1.12 =item SIGNALP_CELLO_TMPRED (loc)
123 : mkubal 1.1
124 : mkubal 1.3 =item TMHMM (loc)
125 : mkubal 1.1
126 : mkubal 1.3 =item HMMTOP (loc)
127 : mkubal 1.1
128 :     =back
129 :    
130 :     =cut
131 :    
132 :     sub class {
133 :     my ($self) = @_;
134 :    
135 :     return $self->{class};
136 :     }
137 :    
138 :     =head3 type()
139 :    
140 :     The type of evidence (required).
141 :    
142 :     Where type is one of the following:
143 :    
144 :     =over 8
145 :    
146 :     =item seq=Sequence similarity
147 :    
148 :     =item dom=domain based match
149 :    
150 :     =item loc=Localization of the feature
151 :    
152 :     =item fc=Functional coupling.
153 :    
154 :     =back
155 :    
156 :     =cut
157 :    
158 :     sub type {
159 :     my ($self) = @_;
160 :    
161 :     return $self->{acc};
162 :     }
163 :    
164 :     =head3 start()
165 :    
166 :     Start of hit in query sequence.
167 :    
168 :     =cut
169 :    
170 :     sub start {
171 :     my ($self) = @_;
172 :    
173 :     return $self->{start};
174 :     }
175 :    
176 :     =head3 end()
177 :    
178 :     End of the hit in query sequence.
179 :    
180 :     =cut
181 :    
182 :     sub stop {
183 :     my ($self) = @_;
184 :    
185 :     return $self->{stop};
186 :     }
187 :    
188 : arodri7 1.11 =head3 start()
189 :    
190 :     Start of hit in query sequence.
191 :    
192 :     =cut
193 :    
194 :     sub qstart {
195 :     my ($self) = @_;
196 :    
197 :     return $self->{qstart};
198 :     }
199 :    
200 :     =head3 qstop()
201 :    
202 :     End of the hit in query sequence.
203 :    
204 :     =cut
205 :    
206 :     sub qstop {
207 :     my ($self) = @_;
208 :    
209 :     return $self->{qstop};
210 :     }
211 :    
212 :     =head3 hstart()
213 :    
214 :     Start of hit in hit sequence.
215 :    
216 :     =cut
217 :    
218 :     sub hstart {
219 :     my ($self) = @_;
220 :    
221 :     return $self->{hstart};
222 :     }
223 :    
224 :     =head3 end()
225 :    
226 :     End of the hit in hit sequence.
227 :    
228 :     =cut
229 :    
230 :     sub hstop {
231 :     my ($self) = @_;
232 :    
233 :     return $self->{hstop};
234 :     }
235 :    
236 :     =head3 qlength()
237 :    
238 :     length of the query sequence in similarities
239 :    
240 :     =cut
241 :    
242 :     sub qlength {
243 :     my ($self) = @_;
244 :    
245 :     return $self->{qlength};
246 :     }
247 :    
248 :     =head3 hlength()
249 :    
250 :     length of the hit sequence in similarities
251 :    
252 :     =cut
253 :    
254 :     sub hlength {
255 :     my ($self) = @_;
256 :    
257 :     return $self->{hlength};
258 :     }
259 :    
260 :    
261 :    
262 : mkubal 1.1 =head3 evalue()
263 :    
264 :     E-value or P-Value if present.
265 :    
266 :     =cut
267 :    
268 :     sub evalue {
269 :     my ($self) = @_;
270 :    
271 :     return $self->{evalue};
272 :     }
273 :    
274 :     =head3 score()
275 :    
276 :     Score if present.
277 :    
278 :     B<Please note: >
279 :     Either score or eval are required.
280 :    
281 :     =cut
282 :    
283 :     sub score {
284 :     my ($self) = @_;
285 :     return $self->{score};
286 :     }
287 :    
288 :    
289 : mkubal 1.12 =head3 display()
290 : mkubal 1.1
291 : mkubal 1.12 will be different for each type
292 : mkubal 1.1
293 :     =cut
294 :    
295 : mkubal 1.7 sub display {
296 : mkubal 1.1
297 : mkubal 1.7 die "Abstract Method Called\n";
298 : mkubal 1.1
299 :     }
300 :    
301 : mkubal 1.7
302 : mkubal 1.1 =head3 rank()
303 :    
304 :     Returns an integer from 1 - 10 indicating the importance of this observations.
305 :    
306 :     Currently always returns 1.
307 :    
308 :     =cut
309 :    
310 :     sub rank {
311 :     my ($self) = @_;
312 :    
313 :     # return $self->{rank};
314 :    
315 :     return 1;
316 :     }
317 :    
318 :     =head3 supports_annotation()
319 :    
320 :     Does a this observation support the annotation of its feature?
321 :    
322 :     Returns
323 :    
324 :     =over 3
325 :    
326 :     =item 10, if feature annotation is identical to $self->description
327 :    
328 :     =item 1, Feature annotation is similar to $self->annotation; this is computed using FIG::SameFunc()
329 :    
330 :     =item undef
331 :    
332 :     =back
333 :    
334 :     =cut
335 :    
336 :     sub supports_annotation {
337 :     my ($self) = @_;
338 :    
339 :     # no code here so far
340 :    
341 :     return $self->{supports_annotation};
342 :     }
343 :    
344 :     =head3 url()
345 :    
346 :     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.
347 :    
348 :     =cut
349 :    
350 :     sub url {
351 :     my ($self) = @_;
352 :    
353 :     my $url = get_url($self->type, $self->acc);
354 :    
355 :     return $url;
356 :     }
357 :    
358 :     =head3 get_objects()
359 :    
360 :     This is the B<REAL WORKHORSE> method of this Package.
361 :    
362 :     It will probably have to:
363 :    
364 :     - get all sims for the feature
365 :     - get all bbhs for the feature
366 :     - copy information from sim to bbh (bbh have no match location etc)
367 :     - get pchs (difficult)
368 :     - get attributes (there is code for this that in get_attribute_based_observations
369 :     - get_attributes_based_observations returns an array of arrays of hashes like this"
370 :    
371 : mkubal 1.7 my $dataset
372 : mkubal 1.1 [
373 :     [ { name => 'acc', value => '1234' },
374 :     { name => 'from', value => '4' },
375 :     { name => 'to', value => '400' },
376 :     ....
377 :     ],
378 :     [ { name => 'acc', value => '456' },
379 :     { name => 'from', value => '1' },
380 :     { name => 'to', value => '100' },
381 :     ....
382 :     ],
383 :     ...
384 :     ];
385 :     return $datasets;
386 :     }
387 :    
388 :     It will invoke the required calls to the SEED API to retrieve the information required.
389 :    
390 :     =cut
391 :    
392 :     sub get_objects {
393 : mkubal 1.7 my ($self,$fid,$classes) = @_;
394 :    
395 :    
396 :     my $objects = [];
397 :     my @matched_datasets=();
398 : mkubal 1.1
399 : mkubal 1.7 # call function that fetches attribute based observations
400 :     # returns an array of arrays of hashes
401 :    
402 :     if(scalar(@$classes) < 1){
403 :     get_attribute_based_observations($fid,\@matched_datasets);
404 :     get_sims_observations($fid,\@matched_datasets);
405 :     get_identical_proteins($fid,\@matched_datasets);
406 :     get_functional_coupling($fid,\@matched_datasets);
407 :     }
408 :     else{
409 :     my %domain_classes;
410 : arodri7 1.9 my $identical_flag=0;
411 :     my $pch_flag=0;
412 : mkubal 1.12 my $location_flag = 0;
413 : arodri7 1.10 my $sims_flag=0;
414 : arodri7 1.15 my $cluster_flag = 0;
415 : mkubal 1.7 foreach my $class (@$classes){
416 : arodri7 1.9 if($class =~ /(IPR|CDD|PFAM)/){
417 : mkubal 1.7 $domain_classes{$class} = 1;
418 : arodri7 1.9 }
419 :     elsif ($class eq "IDENTICAL")
420 :     {
421 :     $identical_flag = 1;
422 :     }
423 :     elsif ($class eq "PCH")
424 :     {
425 :     $pch_flag = 1;
426 : mkubal 1.7 }
427 : mkubal 1.12 elsif ($class =~/(SIGNALP_CELLO_TMPRED)/)
428 :     {
429 :     $location_flag = 1;
430 :     }
431 : arodri7 1.10 elsif ($class eq "SIM")
432 :     {
433 :     $sims_flag = 1;
434 :     }
435 : arodri7 1.15 elsif ($class eq "CLUSTER")
436 :     {
437 :     $cluster_flag = 1;
438 :     }
439 : mkubal 1.7 }
440 : arodri7 1.9
441 :     if ($identical_flag ==1)
442 :     {
443 :     get_identical_proteins($fid,\@matched_datasets);
444 :     }
445 :     if ( (defined($domain_classes{IPR})) || (defined($domain_classes{CDD})) || (defined($domain_classes{PFAM})) ) {
446 :     get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);
447 :     }
448 :     if ($pch_flag == 1)
449 :     {
450 :     get_functional_coupling($fid,\@matched_datasets);
451 :     }
452 : arodri7 1.10 if ($sims_flag == 1)
453 :     {
454 :     get_sims_observations($fid,\@matched_datasets);
455 :     }
456 : arodri7 1.5
457 : mkubal 1.12 if ($location_flag == 1)
458 :     {
459 :     get_attribute_based_location_observations($fid,\@matched_datasets);
460 :     }
461 : arodri7 1.15 if ($cluster_flag == 1)
462 :     {
463 :     get_cluster_observations($fid,\@matched_datasets);
464 :     }
465 : mkubal 1.12
466 : mkubal 1.1 }
467 : mkubal 1.7
468 :     foreach my $dataset (@matched_datasets) {
469 :     my $object;
470 :     if($dataset->{'type'} eq "dom"){
471 :     $object = Observation::Domain->new($dataset);
472 :     }
473 : arodri7 1.9 if($dataset->{'class'} eq "PCH"){
474 :     $object = Observation::FC->new($dataset);
475 :     }
476 :     if ($dataset->{'class'} eq "IDENTICAL"){
477 :     $object = Observation::Identical->new($dataset);
478 :     }
479 : mkubal 1.12 if ($dataset->{'class'} eq "SIGNALP_CELLO_TMPRED"){
480 :     $object = Observation::Location->new($dataset);
481 :     }
482 : arodri7 1.10 if ($dataset->{'class'} eq "SIM"){
483 :     $object = Observation::Sims->new($dataset);
484 :     }
485 : arodri7 1.15 if ($dataset->{'class'} eq "CLUSTER"){
486 :     $object = Observation::Cluster->new($dataset);
487 :     }
488 : mkubal 1.7 push (@$objects, $object);
489 : mkubal 1.1 }
490 : mkubal 1.7
491 :     return $objects;
492 : mkubal 1.1
493 :     }
494 :    
495 :     =head1 Internal Methods
496 :    
497 :     These methods are not meant to be used outside of this package.
498 :    
499 :     B<Please do not use them outside of this package!>
500 :    
501 :     =cut
502 :    
503 :    
504 :     =head3 get_url (internal)
505 :    
506 :     get_url() return a valid URL or undef for any observation.
507 :    
508 :     URLs are constructed by looking at the Accession acc() and name()
509 :    
510 :     Info from both attributes is combined with a table of base URLs stored in this function.
511 :    
512 :     =cut
513 :    
514 :     sub get_url {
515 :    
516 :     my ($self) = @_;
517 :     my $url='';
518 :    
519 :     # a hash with a URL for each observation; identified by name()
520 :     #my $URL => { 'PFAM' => "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?" ,\
521 :     # 'IPR' => "http://www.ebi.ac.uk/interpro/DisplayIproEntry?ac=" ,\
522 :     # 'CDD' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
523 :     # 'PIR' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
524 :     # 'FIGFAM' => '',\
525 :     # 'sim'=> "http://www.theseed.org/linkin.cgi?id=",\
526 :     # 'bbh'=> "http://www.theseed.org/linkin.cgi?id="
527 :     #};
528 :    
529 :     # if (defined $URL{$self->name}) {
530 :     # $url = $URL{$self->name}.$self->acc;
531 :     # return $url;
532 :     # }
533 :     # else
534 :     return undef;
535 :     }
536 :    
537 :     =head3 get_display_method (internal)
538 :    
539 :     get_display_method() return a valid URL or undef for any observation.
540 :    
541 :     URLs are constructed by looking at the Accession acc() and name()
542 :     and Info from both attributes is combined with a table of base URLs stored in this function.
543 :    
544 :     =cut
545 :    
546 :     sub get_display_method {
547 :    
548 :     my ($self) = @_;
549 :    
550 :     # a hash with a URL for each observation; identified by name()
551 :     #my $URL => { 'sim'=> "http://www.theseed.org/featalign.cgi?id1=",\
552 :     # 'bbh'=> "http://www.theseed.org/featalign.cgi?id1="
553 :     # };
554 :    
555 :     #if (defined $URL{$self->name}) {
556 :     # $url = $URL{$self->name}.$self->feature_id."&id2=".$self->acc;
557 :     # return $url;
558 :     # }
559 :     # else
560 :     return undef;
561 :     }
562 :    
563 : mkubal 1.7
564 :     sub get_attribute_based_domain_observations{
565 :    
566 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
567 :     my ($fid,$domain_classes,$datasets_ref) = (@_);
568 :    
569 :     my $fig = new FIG;
570 :    
571 :     foreach my $attr_ref ($fig->get_attributes($fid)) {
572 :     my $key = @$attr_ref[1];
573 :     my @parts = split("::",$key);
574 :     my $class = $parts[0];
575 :    
576 :     if($domain_classes->{$parts[0]}){
577 :     my $val = @$attr_ref[2];
578 : mkubal 1.8 if($val =~/^(\d+\.\d+|0\.0);(\d+)-(\d+)/){
579 : mkubal 1.7 my $raw_evalue = $1;
580 : mkubal 1.8 my $from = $2;
581 :     my $to = $3;
582 : mkubal 1.7 my $evalue;
583 :     if($raw_evalue =~/(\d+)\.(\d+)/){
584 :     my $part2 = 1000 - $1;
585 :     my $part1 = $2/100;
586 :     $evalue = $part1."e-".$part2;
587 :     }
588 :     else{
589 : mkubal 1.8 $evalue = "0.0";
590 : mkubal 1.7 }
591 :    
592 :     my $dataset = {'class' => $class,
593 :     'acc' => $key,
594 :     'type' => "dom" ,
595 :     'evalue' => $evalue,
596 :     'start' => $from,
597 :     'stop' => $to
598 :     };
599 :    
600 :     push (@{$datasets_ref} ,$dataset);
601 :     }
602 :     }
603 :     }
604 :     }
605 : mkubal 1.12
606 :     sub get_attribute_based_location_observations{
607 :    
608 :     my ($fid,$datasets_ref) = (@_);
609 :     my $fig = new FIG;
610 :    
611 :     my $location_attributes = ['SignalP','CELLO','TMPRED'];
612 :    
613 :     my $dataset = {'type' => "loc", 'class' => 'SIGNALP_CELLO_TMPRED'};
614 :     foreach my $attr_ref ($fig->get_attributes($fid,$location_attributes)) {
615 :     my $key = @$attr_ref[1];
616 :     my @parts = split("::",$key);
617 :     my $sub_class = $parts[0];
618 :     my $sub_key = $parts[1];
619 :     my $value = @$attr_ref[2];
620 :     if($sub_class eq "SignalP"){
621 :     if($sub_key eq "cleavage_site"){
622 :     my @value_parts = split(";",$value);
623 :     $dataset->{'cleavage_prob'} = $value_parts[0];
624 :     $dataset->{'cleavage_loc'} = $value_parts[1];
625 :     }
626 :     elsif($sub_key eq "signal_peptide"){
627 :     $dataset->{'signal_peptide_score'} = $value;
628 :     }
629 :     }
630 :     elsif($sub_class eq "CELLO"){
631 :     $dataset->{'cello_location'} = $sub_key;
632 :     $dataset->{'cello_score'} = $value;
633 :     }
634 :     elsif($sub_class eq "TMPRED"){
635 :     my @value_parts = split(";",$value);
636 :     $dataset->{'tmpred_score'} = $value_parts[0];
637 :     $dataset->{'tmpred_locations'} = $value_parts[1];
638 :     }
639 :     }
640 :    
641 :     push (@{$datasets_ref} ,$dataset);
642 :    
643 :     }
644 :    
645 : mkubal 1.7
646 : mkubal 1.1 =head3 get_attribute_based_evidence (internal)
647 :    
648 :     This method retrieves evidence from the attribute server
649 :    
650 :     =cut
651 :    
652 :     sub get_attribute_based_observations{
653 :    
654 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
655 :     my ($fid,$datasets_ref) = (@_);
656 :    
657 :     my $_myfig = new FIG;
658 :    
659 :     foreach my $attr_ref ($_myfig->get_attributes($fid)) {
660 :    
661 :     # convert the ref into a string for easier handling
662 :     my ($string) = "@$attr_ref";
663 :    
664 :     # print "S:$string\n";
665 :     my ($key,$val) = ( $string =~ /\S+\s(\S+)\s(\S+)/);
666 :    
667 :     # THIS SHOULD BE DONE ANOTHER WAY FM->TD
668 :     # we need to do the right thing for each type, ie no evalue for CELLO and no coordinates, but a score, etc
669 :     # as fas as possible this should be configured so that the type of observation and the regexp are
670 :     # stored somewhere for easy expansion
671 :     #
672 :    
673 :     if (($key =~ /PFAM::/) || ( $key =~ /IPR::/) || ( $key =~ /CDD::/) ) {
674 :    
675 :     # some keys are composite CDD::1233244 or PFAM:PF1233
676 :    
677 :     if ( $key =~ /::/ ) {
678 :     my ($firstkey,$restkey) = ( $key =~ /([a-zA-Z0-9]+)::(.*)/);
679 :     $val=$restkey.";".$val;
680 :     $key=$firstkey;
681 :     }
682 :    
683 :     my ($acc,$raw_evalue, $from,$to) = ($val =~ /(\S+);(\S+);(\d+)-(\d+)/ );
684 :    
685 :     my $evalue= 255;
686 :     if (defined $raw_evalue) { # some of the tool do not give us an evalue
687 :    
688 :     my ($k,$expo) = ( $raw_evalue =~ /(\d+).(\d+)/);
689 :     my ($new_k, $new_exp);
690 :    
691 :     #
692 :     # THIS DOES NOT WORK PROPERLY
693 :     #
694 :     if($raw_evalue =~/(\d+).(\d+)/){
695 :    
696 :     # $new_exp = (1000+$expo);
697 :     # $new_k = $k / 100;
698 :    
699 :     }
700 :     $evalue = "0.01"#new_k."e-".$new_exp;
701 :     }
702 :    
703 :     # unroll it all into an array of hashes
704 :     # this needs to be done differently for different types of observations
705 :     my $dataset = [ { name => 'class', value => $key },
706 :     { name => 'acc' , value => $acc},
707 :     { name => 'type', value => "dom"} , # this clearly needs to be done properly FM->TD
708 :     { name => 'evalue', value => $evalue },
709 :     { name => 'start', value => $from},
710 :     { name => 'stop' , value => $to}
711 :     ];
712 :    
713 :     push (@{$datasets_ref} ,$dataset);
714 :     }
715 :     }
716 :     }
717 :    
718 : arodri7 1.15 =head3 get_cluster_observations() (internal)
719 :    
720 :     This methods sets the type and class for cluster observations
721 :    
722 :     =cut
723 :    
724 :     sub get_cluster_observations{
725 :     my ($fid,$datasets_ref) = (@_);
726 :    
727 : arodri7 1.16 my $dataset = {'class' => 'CLUSTER',
728 :     'type' => 'fc'
729 :     };
730 : arodri7 1.15 push (@{$datasets_ref} ,$dataset);
731 :     }
732 :    
733 :    
734 : mkubal 1.3 =head3 get_sims_observations() (internal)
735 :    
736 :     This methods retrieves sims fills the internal data structures.
737 :    
738 :     =cut
739 :    
740 :     sub get_sims_observations{
741 :    
742 :     my ($fid,$datasets_ref) = (@_);
743 : mkubal 1.4 my $fig = new FIG;
744 : arodri7 1.11 # my @sims= $fig->nsims($fid,100,1e-20,"fig");
745 :     my @sims= $fig->nsims($fid,100,1e-20,"all");
746 : mkubal 1.4 my ($dataset);
747 : mkubal 1.3 foreach my $sim (@sims){
748 : mkubal 1.4 my $hit = $sim->[1];
749 : arodri7 1.11 my $percent = $sim->[2];
750 : mkubal 1.4 my $evalue = $sim->[10];
751 : arodri7 1.11 my $qfrom = $sim->[6];
752 :     my $qto = $sim->[7];
753 :     my $hfrom = $sim->[8];
754 :     my $hto = $sim->[9];
755 :     my $qlength = $sim->[12];
756 :     my $hlength = $sim->[13];
757 :     my $db = get_database($hit);
758 :     my $func = $fig->function_of($hit);
759 :     my $organism = $fig->org_of($hit);
760 :    
761 : arodri7 1.10 $dataset = {'class' => 'SIM',
762 :     'acc' => $hit,
763 : arodri7 1.11 'identity' => $percent,
764 : arodri7 1.10 'type' => 'seq',
765 :     'evalue' => $evalue,
766 : arodri7 1.11 'qstart' => $qfrom,
767 :     'qstop' => $qto,
768 :     'hstart' => $hfrom,
769 :     'hstop' => $hto,
770 :     'database' => $db,
771 :     'organism' => $organism,
772 :     'function' => $func,
773 :     'qlength' => $qlength,
774 :     'hlength' => $hlength
775 : arodri7 1.10 };
776 :    
777 :     push (@{$datasets_ref} ,$dataset);
778 : mkubal 1.3 }
779 :     }
780 :    
781 : arodri7 1.11 =head3 get_database (internal)
782 :     This method gets the database association from the sequence id
783 :    
784 :     =cut
785 :    
786 :     sub get_database{
787 :     my ($id) = (@_);
788 :    
789 :     my ($db);
790 :     if ($id =~ /^fig\|/) { $db = "FIG" }
791 :     elsif ($id =~ /^gi\|/) { $db = "NCBI" }
792 :     elsif ($id =~ /^^[NXYZA]P_/) { $db = "RefSeq" }
793 :     elsif ($id =~ /^sp\|/) { $db = "SwissProt" }
794 :     elsif ($id =~ /^uni\|/) { $db = "UniProt" }
795 :     elsif ($id =~ /^tigr\|/) { $db = "TIGR" }
796 :     elsif ($id =~ /^pir\|/) { $db = "PIR" }
797 :     elsif ($id =~ /^kegg\|/) { $db = "KEGG" }
798 :     elsif ($id =~ /^tr\|/) { $db = "TrEMBL" }
799 :     elsif ($id =~ /^eric\|/) { $db = "ASAP" }
800 :     elsif ($id =~ /^img\|/) { $db = "JGI" }
801 :    
802 :     return ($db);
803 :    
804 :     }
805 :    
806 : arodri7 1.5 =head3 get_identical_proteins() (internal)
807 :    
808 :     This methods retrieves sims fills the internal data structures.
809 :    
810 :     =cut
811 :    
812 :     sub get_identical_proteins{
813 :    
814 :     my ($fid,$datasets_ref) = (@_);
815 :     my $fig = new FIG;
816 :     my @funcs = ();
817 :    
818 :     my @maps_to = grep { $_ ne $fid and $_ !~ /^xxx/ } map { $_->[0] } $fig->mapped_prot_ids($fid);
819 :    
820 :     foreach my $id (@maps_to) {
821 :     my ($tmp, $who);
822 : arodri7 1.6 if (($id ne $fid) && ($tmp = $fig->function_of($id))) {
823 : arodri7 1.11 $who = &get_database($id);
824 : arodri7 1.5 push(@funcs, [$id,$who,$tmp]);
825 :     }
826 :     }
827 :    
828 :     my ($dataset);
829 :     foreach my $row (@funcs){
830 :     my $id = $row->[0];
831 :     my $organism = $fig->org_of($fid);
832 :     my $who = $row->[1];
833 :     my $assignment = $row->[2];
834 : arodri7 1.9
835 :     my $dataset = {'class' => 'IDENTICAL',
836 :     'id' => $id,
837 :     'organism' => $organism,
838 :     'type' => 'seq',
839 :     'database' => $who,
840 :     'function' => $assignment
841 :     };
842 :    
843 : arodri7 1.5 push (@{$datasets_ref} ,$dataset);
844 :     }
845 :    
846 :     }
847 :    
848 : arodri7 1.6 =head3 get_functional_coupling() (internal)
849 :    
850 :     This methods retrieves the functional coupling of a protein given a peg ID
851 :    
852 :     =cut
853 :    
854 :     sub get_functional_coupling{
855 :    
856 :     my ($fid,$datasets_ref) = (@_);
857 :     my $fig = new FIG;
858 :     my @funcs = ();
859 :    
860 :     # initialize some variables
861 :     my($sc,$neigh);
862 :    
863 :     # set default parameters for coupling and evidence
864 :     my ($bound,$sim_cutoff,$coupling_cutoff) = (5000, 1.0e-10, 4);
865 :    
866 :     # get the fc data
867 :     my @fc_data = $fig->coupling_and_evidence($fid,$bound,$sim_cutoff,$coupling_cutoff,1);
868 :    
869 :     # retrieve data
870 :     my @rows = map { ($sc,$neigh) = @$_;
871 :     [$sc,$neigh,scalar $fig->function_of($neigh)]
872 :     } @fc_data;
873 :    
874 :     my ($dataset);
875 :     foreach my $row (@rows){
876 :     my $id = $row->[1];
877 :     my $score = $row->[0];
878 :     my $description = $row->[2];
879 : arodri7 1.9 my $dataset = {'class' => 'PCH',
880 :     'score' => $score,
881 :     'id' => $id,
882 :     'type' => 'fc',
883 :     'function' => $description
884 :     };
885 :    
886 : arodri7 1.6 push (@{$datasets_ref} ,$dataset);
887 :     }
888 :     }
889 : arodri7 1.5
890 : mkubal 1.1 =head3 get_sims_and_bbhs() (internal)
891 :    
892 :     This methods retrieves sims and also BBHs and fills the internal data structures.
893 :    
894 :     =cut
895 :    
896 :     # sub get_sims_and_bbhs{
897 :    
898 :     # # blast m8 output format
899 :     # # id1, id2, %ident, align len, mismatches, gaps, q.start, q.stop, s. start, s.stop, eval, bit
900 :    
901 :     # my $Sims=();
902 :     # @sims_src = $fig->sims($fid,80,500,"fig",0);
903 :     # print "found $#sims_src SIMs\n";
904 :     # foreach $sims (@sims_src) {
905 :     # my ($sims_string) = "@$sims";
906 :     # # print "$sims_string\n";
907 :     # my ($rfid,$start,$stop,$eval) = ( $sims_string =~ /\S+\s+(\S+)\s+\S+\s\S+\s+(\S+)\s+(\S+)\s+
908 :     # \S+\s+\S+\s+\S+\s+\S+\s+(\S+)+.*/);
909 :     # # print "ID: $rfid, E:$eval, Start:$start stop:$stop\n";
910 :     # $Sims{$rfid}{'eval'}=$eval;
911 :     # $Sims{$rfid}{'start'}=$start;
912 :     # $Sims{$rfid}{'stop'}=$stop;
913 :     # print "$rfid $Sims{$rfid}{'eval'}\n";
914 :     # }
915 :    
916 :     # # BBHs
917 :     # my $BBHs=();
918 :    
919 :     # @bbhs_src = $fig->bbhs($fid,1.0e-10);
920 :     # print "found $#bbhs_src BBHs\n";
921 :     # foreach $bbh (@bbhs_src) {
922 :     # #print "@$bbh\n";
923 :     # my ($bbh_string) = "@$bbh";
924 :     # my ($rfid,$eval,$score) = ( $bbh_string =~ /(\S+)\s(\S+)\s(\S+)/);
925 :     # #print "ID: $rfid, E:$eval, S:$score\n";
926 :     # $BBHs{$rfid}{'eval'}=$eval;
927 :     # $BBHs{$rfid}{'score'}=$score;
928 :     # #print "$rfid $BBHs{$rfid}{'eval'}\n";
929 :     # }
930 :    
931 :     # }
932 :    
933 :    
934 :    
935 :     =head3 new (internal)
936 :    
937 :     Instantiate a new object.
938 :    
939 :     =cut
940 :    
941 :     sub new {
942 : mkubal 1.7 my ($class,$dataset) = @_;
943 :    
944 : mkubal 1.1
945 : mkubal 1.7 #$self = { acc => '',
946 :     # description => '',
947 :     # class => '',
948 :     # type => '',
949 :     # start => '',
950 :     # stop => '',
951 :     # evalue => '',
952 :     # score => '',
953 :     # display_method => '',
954 :     # feature_id => '',
955 :     # rank => '',
956 :     # supports_annotation => '',
957 :     # id => '',
958 :     # organism => '',
959 :     # who => ''
960 :     # };
961 : mkubal 1.1
962 : mkubal 1.7 my $self = { class => $dataset->{'class'},
963 :     type => $dataset->{'type'}
964 : arodri7 1.10 };
965 : mkubal 1.7
966 :     bless($self,$class);
967 : mkubal 1.1
968 :     return $self;
969 :     }
970 :    
971 : arodri7 1.11 =head3 identity (internal)
972 :    
973 :     Returns the % identity of the similar sequence
974 :    
975 :     =cut
976 :    
977 :     sub identity {
978 :     my ($self) = @_;
979 :    
980 :     return $self->{identity};
981 :     }
982 :    
983 : mkubal 1.1 =head3 feature_id (internal)
984 :    
985 :    
986 :     =cut
987 :    
988 :     sub feature_id {
989 :     my ($self) = @_;
990 :    
991 :     return $self->{feature_id};
992 :     }
993 : arodri7 1.5
994 :     =head3 id (internal)
995 :    
996 :     Returns the ID of the identical sequence
997 :    
998 :     =cut
999 :    
1000 :     sub id {
1001 :     my ($self) = @_;
1002 :    
1003 :     return $self->{id};
1004 :     }
1005 :    
1006 :     =head3 organism (internal)
1007 :    
1008 :     Returns the organism of the identical sequence
1009 :    
1010 :     =cut
1011 :    
1012 :     sub organism {
1013 :     my ($self) = @_;
1014 :    
1015 :     return $self->{organism};
1016 :     }
1017 :    
1018 : arodri7 1.9 =head3 function (internal)
1019 :    
1020 :     Returns the function of the identical sequence
1021 :    
1022 :     =cut
1023 :    
1024 :     sub function {
1025 :     my ($self) = @_;
1026 :    
1027 :     return $self->{function};
1028 :     }
1029 :    
1030 : arodri7 1.5 =head3 database (internal)
1031 :    
1032 :     Returns the database of the identical sequence
1033 :    
1034 :     =cut
1035 :    
1036 :     sub database {
1037 :     my ($self) = @_;
1038 :    
1039 :     return $self->{database};
1040 :     }
1041 :    
1042 : arodri7 1.6
1043 : arodri7 1.11
1044 : arodri7 1.9 ############################################################
1045 :     ############################################################
1046 :     package Observation::Identical;
1047 :    
1048 :     use base qw(Observation);
1049 :    
1050 :     sub new {
1051 :    
1052 :     my ($class,$dataset) = @_;
1053 :     my $self = $class->SUPER::new($dataset);
1054 :     $self->{id} = $dataset->{'id'};
1055 :     $self->{organism} = $dataset->{'organism'};
1056 :     $self->{function} = $dataset->{'function'};
1057 :     $self->{database} = $dataset->{'database'};
1058 :    
1059 :     bless($self,$class);
1060 :     return $self;
1061 :     }
1062 :    
1063 :     =head3 display()
1064 : arodri7 1.6
1065 :     If available use the function specified here to display the "raw" observation.
1066 :     This code will display a table for the identical protein
1067 :    
1068 :    
1069 : 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
1070 :     dence.
1071 : arodri7 1.6
1072 :     =cut
1073 :    
1074 : arodri7 1.9 sub display{
1075 :     my ($self, $cgi, $dataset) = @_;
1076 : arodri7 1.6
1077 :     my $all_domains = [];
1078 :     my $count_identical = 0;
1079 : arodri7 1.9 my $content;
1080 :     foreach my $thing (@$dataset) {
1081 : arodri7 1.6 next if ($thing->class ne "IDENTICAL");
1082 : arodri7 1.9 my $single_domain = [];
1083 :     push(@$single_domain,$thing->database);
1084 :     my $id = $thing->id;
1085 :     $count_identical++;
1086 :     push(@$single_domain,&HTML::set_prot_links($cgi,$id));
1087 :     push(@$single_domain,$thing->organism);
1088 :     #push(@$single_domain,$thing->type);
1089 :     push(@$single_domain,$thing->function);
1090 :     push(@$all_domains,$single_domain);
1091 : arodri7 1.6 }
1092 :    
1093 :     if ($count_identical >0){
1094 : arodri7 1.9 $content = $all_domains;
1095 : arodri7 1.6 }
1096 :     else{
1097 : arodri7 1.9 $content = "<p>This PEG does not have any essentially identical proteins</p>";
1098 : arodri7 1.6 }
1099 :     return ($content);
1100 :     }
1101 : mkubal 1.7
1102 : arodri7 1.9 1;
1103 :    
1104 :    
1105 :     #########################################
1106 :     #########################################
1107 :     package Observation::FC;
1108 :     1;
1109 :    
1110 :     use base qw(Observation);
1111 :    
1112 :     sub new {
1113 :    
1114 :     my ($class,$dataset) = @_;
1115 :     my $self = $class->SUPER::new($dataset);
1116 :     $self->{score} = $dataset->{'score'};
1117 :     $self->{id} = $dataset->{'id'};
1118 :     $self->{function} = $dataset->{'function'};
1119 :    
1120 :     bless($self,$class);
1121 :     return $self;
1122 :     }
1123 :    
1124 :     =head3 display()
1125 :    
1126 :     If available use the function specified here to display the "raw" observation.
1127 :     This code will display a table for the identical protein
1128 :    
1129 :    
1130 :     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
1131 :     dence.
1132 :    
1133 :     =cut
1134 :    
1135 :     sub display {
1136 :     my ($self,$cgi,$dataset, $fid) = @_;
1137 :    
1138 :     my $functional_data = [];
1139 :     my $count = 0;
1140 :     my $content;
1141 :    
1142 :     foreach my $thing (@$dataset) {
1143 :     my $single_domain = [];
1144 :     next if ($thing->class ne "PCH");
1145 :     $count++;
1146 :    
1147 :     # construct the score link
1148 :     my $score = $thing->score;
1149 :     my $toid = $thing->id;
1150 :     my $link = $cgi->url(-relative => 1) . "?user=master&request=show_coupling_evidence&prot=$fid&to=$toid&SPROUT=";
1151 :     my $sc_link = "<a href=$link>$score</a>";
1152 :    
1153 :     push(@$single_domain,$sc_link);
1154 :     push(@$single_domain,$thing->id);
1155 :     push(@$single_domain,$thing->function);
1156 :     push(@$functional_data,$single_domain);
1157 :     }
1158 :    
1159 :     if ($count >0){
1160 :     $content = $functional_data;
1161 :     }
1162 :     else
1163 :     {
1164 :     $content = "<p>This PEG does not have any functional coupling</p>";
1165 :     }
1166 :     return ($content);
1167 :     }
1168 :    
1169 :    
1170 :     #########################################
1171 :     #########################################
1172 : mkubal 1.7 package Observation::Domain;
1173 :    
1174 :     use base qw(Observation);
1175 :    
1176 :     sub new {
1177 :    
1178 :     my ($class,$dataset) = @_;
1179 :     my $self = $class->SUPER::new($dataset);
1180 :     $self->{evalue} = $dataset->{'evalue'};
1181 :     $self->{acc} = $dataset->{'acc'};
1182 :     $self->{start} = $dataset->{'start'};
1183 :     $self->{stop} = $dataset->{'stop'};
1184 :    
1185 :     bless($self,$class);
1186 :     return $self;
1187 :     }
1188 :    
1189 :     sub display {
1190 :     my ($thing,$gd) = @_;
1191 :     my $lines = [];
1192 :     my $line_config = { 'title' => $thing->acc,
1193 :     'short_title' => $thing->type,
1194 :     'basepair_offset' => '1' };
1195 :     my $color = "4";
1196 :    
1197 :     my $line_data = [];
1198 :     my $links_list = [];
1199 :     my $descriptions = [];
1200 :    
1201 :     my $description_function;
1202 :     $description_function = {"title" => $thing->class,
1203 :     "value" => $thing->acc};
1204 :    
1205 :     push(@$descriptions,$description_function);
1206 :    
1207 :     my $score;
1208 :     $score = {"title" => "score",
1209 :     "value" => $thing->evalue};
1210 :     push(@$descriptions,$score);
1211 :    
1212 :     my $link_id;
1213 : mkubal 1.12 if ($thing->acc =~/\w+::(\d+)/){
1214 : mkubal 1.7 $link_id = $1;
1215 :     }
1216 :    
1217 :     my $link;
1218 : mkubal 1.12 my $link_url;
1219 :     if ($thing->class eq "CDD"){$link_url = "http://0-www.ncbi.nlm.nih.gov.library.vu.edu.au:80/Structure/cdd/cddsrv.cgi?uid=$link_id"}
1220 :     elsif($thing->class eq "PFAM"){$link_url = "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?$link_id"}
1221 :     else{$link_url = "NO_URL"}
1222 :    
1223 : mkubal 1.7 $link = {"link_title" => $thing->acc,
1224 : mkubal 1.12 "link" => $link_url};
1225 : mkubal 1.7 push(@$links_list,$link);
1226 :    
1227 :     my $element_hash = {
1228 :     "title" => $thing->type,
1229 :     "start" => $thing->start,
1230 :     "end" => $thing->stop,
1231 :     "color"=> $color,
1232 :     "zlayer" => '2',
1233 :     "links_list" => $links_list,
1234 :     "description" => $descriptions};
1235 :    
1236 :     push(@$line_data,$element_hash);
1237 :     $gd->add_line($line_data, $line_config);
1238 :    
1239 :     return $gd;
1240 :    
1241 :     }
1242 :    
1243 : arodri7 1.10 #########################################
1244 :     #########################################
1245 : mkubal 1.12 package Observation::Location;
1246 :    
1247 :     use base qw(Observation);
1248 :    
1249 :     sub new {
1250 :    
1251 :     my ($class,$dataset) = @_;
1252 :     my $self = $class->SUPER::new($dataset);
1253 :     $self->{cleavage_prob} = $dataset->{'cleavage_prob'};
1254 :     $self->{cleavage_loc} = $dataset->{'cleavage_loc'};
1255 :     $self->{signal_peptide_score} = $dataset->{'signal_peptide_score'};
1256 :     $self->{cello_location} = $dataset->{'cello_location'};
1257 :     $self->{cello_score} = $dataset->{'cello_score'};
1258 :     $self->{tmpred_score} = $dataset->{'tmpred_score'};
1259 :     $self->{tmpred_locations} = $dataset->{'tmpred_locations'};
1260 :    
1261 :     bless($self,$class);
1262 :     return $self;
1263 :     }
1264 :    
1265 :     sub display {
1266 :     my ($thing,$gd,$fid) = @_;
1267 :    
1268 :     my $fig= new FIG;
1269 :     my $length = length($fig->get_translation($fid));
1270 :    
1271 :     my $cleavage_prob;
1272 :     if($thing->cleavage_prob){$cleavage_prob = $thing->cleavage_prob;}
1273 :     my ($cleavage_loc_begin,$cleavage_loc_end) = split("-",$thing->cleavage_loc);
1274 :     my $signal_peptide_score = $thing->signal_peptide_score;
1275 :     my $cello_location = $thing->cello_location;
1276 :     my $cello_score = $thing->cello_score;
1277 :     my $tmpred_score = $thing->tmpred_score;
1278 :     my @tmpred_locations = split(",",$thing->tmpred_locations);
1279 :    
1280 :     my $lines = [];
1281 :     my $line_config = { 'title' => 'Localization Evidence',
1282 :     'short_title' => 'Local',
1283 :     'basepair_offset' => '1' };
1284 :    
1285 :     #color is
1286 :     my $color = "5";
1287 :    
1288 :     my $line_data = [];
1289 :    
1290 :     if($cello_location){
1291 :     my $cello_descriptions = [];
1292 :     my $description_cello_location = {"title" => 'Best Cello Location',
1293 :     "value" => $cello_location};
1294 :    
1295 :     push(@$cello_descriptions,$description_cello_location);
1296 :    
1297 :     my $description_cello_score = {"title" => 'Cello Score',
1298 :     "value" => $cello_score};
1299 :    
1300 :     push(@$cello_descriptions,$description_cello_score);
1301 :    
1302 :     my $element_hash = {
1303 :     "title" => "CELLO",
1304 :     "start" => "1",
1305 :     "end" => $length + 1,
1306 :     "color"=> $color,
1307 :     "type" => 'box',
1308 :     "zlayer" => '2',
1309 :     "description" => $cello_descriptions};
1310 :    
1311 :     push(@$line_data,$element_hash);
1312 :     }
1313 :    
1314 :     my $color = "6";
1315 :     #if(0){
1316 :     if($tmpred_score){
1317 :     foreach my $tmpred (@tmpred_locations){
1318 :     my $descriptions = [];
1319 :     my ($begin,$end) =split("-",$tmpred);
1320 :     my $description_tmpred_score = {"title" => 'TMPRED score',
1321 :     "value" => $tmpred_score};
1322 :    
1323 :     push(@$descriptions,$description_tmpred_score);
1324 :    
1325 :     my $element_hash = {
1326 :     "title" => "transmembrane location",
1327 :     "start" => $begin + 1,
1328 :     "end" => $end + 1,
1329 :     "color"=> $color,
1330 :     "zlayer" => '5',
1331 :     "type" => 'smallbox',
1332 :     "description" => $descriptions};
1333 :    
1334 :     push(@$line_data,$element_hash);
1335 :     }
1336 :     }
1337 :    
1338 :     my $color = "1";
1339 :     if($signal_peptide_score){
1340 :     my $descriptions = [];
1341 :     my $description_signal_peptide_score = {"title" => 'signal peptide score',
1342 :     "value" => $signal_peptide_score};
1343 :    
1344 :     push(@$descriptions,$description_signal_peptide_score);
1345 :    
1346 :     my $description_cleavage_prob = {"title" => 'cleavage site probability',
1347 :     "value" => $cleavage_prob};
1348 :    
1349 :     push(@$descriptions,$description_cleavage_prob);
1350 :    
1351 :     my $element_hash = {
1352 :     "title" => "SignalP",
1353 :     "start" => $cleavage_loc_begin - 2,
1354 :     "end" => $cleavage_loc_end + 3,
1355 :     "type" => 'bigbox',
1356 :     "color"=> $color,
1357 :     "zlayer" => '10',
1358 :     "description" => $descriptions};
1359 :    
1360 :     push(@$line_data,$element_hash);
1361 :     }
1362 :    
1363 :     $gd->add_line($line_data, $line_config);
1364 :    
1365 :     return ($gd);
1366 :    
1367 :     }
1368 :    
1369 :     sub cleavage_loc {
1370 :     my ($self) = @_;
1371 :    
1372 :     return $self->{cleavage_loc};
1373 :     }
1374 :    
1375 :     sub cleavage_prob {
1376 :     my ($self) = @_;
1377 :    
1378 :     return $self->{cleavage_prob};
1379 :     }
1380 :    
1381 :     sub signal_peptide_score {
1382 :     my ($self) = @_;
1383 :    
1384 :     return $self->{signal_peptide_score};
1385 :     }
1386 :    
1387 :     sub tmpred_score {
1388 :     my ($self) = @_;
1389 :    
1390 :     return $self->{tmpred_score};
1391 :     }
1392 :    
1393 :     sub tmpred_locations {
1394 :     my ($self) = @_;
1395 :    
1396 :     return $self->{tmpred_locations};
1397 :     }
1398 :    
1399 :     sub cello_location {
1400 :     my ($self) = @_;
1401 :    
1402 :     return $self->{cello_location};
1403 :     }
1404 :    
1405 :     sub cello_score {
1406 :     my ($self) = @_;
1407 :    
1408 :     return $self->{cello_score};
1409 :     }
1410 :    
1411 :    
1412 :     #########################################
1413 :     #########################################
1414 : arodri7 1.10 package Observation::Sims;
1415 :    
1416 :     use base qw(Observation);
1417 :    
1418 :     sub new {
1419 :    
1420 :     my ($class,$dataset) = @_;
1421 :     my $self = $class->SUPER::new($dataset);
1422 : arodri7 1.11 $self->{identity} = $dataset->{'identity'};
1423 : arodri7 1.10 $self->{acc} = $dataset->{'acc'};
1424 :     $self->{evalue} = $dataset->{'evalue'};
1425 : arodri7 1.11 $self->{qstart} = $dataset->{'qstart'};
1426 :     $self->{qstop} = $dataset->{'qstop'};
1427 :     $self->{hstart} = $dataset->{'hstart'};
1428 :     $self->{hstop} = $dataset->{'hstop'};
1429 :     $self->{database} = $dataset->{'database'};
1430 :     $self->{organism} = $dataset->{'organism'};
1431 :     $self->{function} = $dataset->{'function'};
1432 :     $self->{qlength} = $dataset->{'qlength'};
1433 :     $self->{hlength} = $dataset->{'hlength'};
1434 : arodri7 1.10
1435 :     bless($self,$class);
1436 :     return $self;
1437 :     }
1438 :    
1439 :     =head3 display()
1440 :    
1441 :     If available use the function specified here to display the "raw" observation.
1442 :     This code will display a table for the similarities protein
1443 :    
1444 :     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.
1445 :    
1446 :     =cut
1447 :    
1448 :     sub display {
1449 :     my ($self,$cgi,$dataset) = @_;
1450 :    
1451 :     my $data = [];
1452 :     my $count = 0;
1453 :     my $content;
1454 : arodri7 1.11 my $fig = new FIG;
1455 : arodri7 1.10
1456 :     foreach my $thing (@$dataset) {
1457 :     my $single_domain = [];
1458 :     next if ($thing->class ne "SIM");
1459 :     $count++;
1460 :    
1461 : arodri7 1.11 my $id = $thing->acc;
1462 :    
1463 :     # add the subsystem information
1464 :     my @in_sub = $fig->peg_to_subsystems($id);
1465 :     my $in_sub;
1466 :    
1467 :     if (@in_sub > 0) {
1468 :     $in_sub = @in_sub;
1469 :    
1470 :     # RAE: add a javascript popup with all the subsystems
1471 :     my $ss_list=join "<br>", map { my $g = $_; $g =~ s/\_/ /g; $_ = $g } sort {$a cmp $b} @in_sub;
1472 :     $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);
1473 :     } else {
1474 :     $in_sub = "&nbsp;";
1475 :     }
1476 :    
1477 :     # add evidence code with tool tip
1478 :     my $ev_codes=" &nbsp; ";
1479 :     my @ev_codes = "";
1480 :     if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {
1481 :     my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes($id);
1482 :     @ev_codes = ();
1483 :     foreach my $code (@codes) {
1484 :     my $pretty_code = $code->[2];
1485 :     if ($pretty_code =~ /;/) {
1486 :     my ($cd, $ss) = split(";", $code->[2]);
1487 :     $ss =~ s/_/ /g;
1488 :     $pretty_code = $cd;# . " in " . $ss;
1489 :     }
1490 :     push(@ev_codes, $pretty_code);
1491 :     }
1492 :     }
1493 :    
1494 :     if (scalar(@ev_codes) && $ev_codes[0]) {
1495 :     my $ev_code_help=join("<br />", map {&HTML::evidence_codes_explain($_)} @ev_codes);
1496 :     $ev_codes = $cgi->a(
1497 :     {
1498 :     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));
1499 :     }
1500 :    
1501 :     # add the aliases
1502 :     my $aliases = undef;
1503 :     $aliases = &html_enc( join( ", ", $fig->feature_aliases($id) ) );
1504 :     $aliases = &HTML::set_prot_links( $cgi, $aliases );
1505 :     $aliases ||= "&nbsp;";
1506 :    
1507 :     my $iden = $thing->identity;
1508 :     my $ln1 = $thing->qlength;
1509 :     my $ln2 = $thing->hlength;
1510 :     my $b1 = $thing->qstart;
1511 :     my $e1 = $thing->qstop;
1512 :     my $b2 = $thing->hstart;
1513 :     my $e2 = $thing->hstop;
1514 :     my $d1 = abs($e1 - $b1) + 1;
1515 :     my $d2 = abs($e2 - $b2) + 1;
1516 :     my $reg1 = "$b1-$e1 (<b>$d1/$ln1</b>)";
1517 :     my $reg2 = "$b2-$e2 (<b>$d2/$ln2</b>)";
1518 :    
1519 :    
1520 :     push(@$single_domain,$thing->database);
1521 : arodri7 1.10 push(@$single_domain,&HTML::set_prot_links($cgi,$thing->acc));
1522 :     push(@$single_domain,$thing->evalue);
1523 : arodri7 1.11 push(@$single_domain,"$iden\%");
1524 :     push(@$single_domain,$reg1);
1525 :     push(@$single_domain,$reg2);
1526 :     push(@$single_domain,$in_sub);
1527 :     push(@$single_domain,$ev_codes);
1528 :     push(@$single_domain,$thing->organism);
1529 :     push(@$single_domain,$thing->function);
1530 :     push(@$single_domain,$aliases);
1531 : arodri7 1.10 push(@$data,$single_domain);
1532 :     }
1533 :    
1534 :     if ($count >0){
1535 :     $content = $data;
1536 :     }
1537 :     else
1538 :     {
1539 :     $content = "<p>This PEG does not have any similarities</p>";
1540 :     }
1541 :     return ($content);
1542 :     }
1543 : arodri7 1.11
1544 :     sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }
1545 : mkubal 1.12
1546 : arodri7 1.13
1547 :    
1548 :     ############################
1549 :     package Observation::Cluster;
1550 :    
1551 :     use base qw(Observation);
1552 :    
1553 :     sub new {
1554 :    
1555 :     my ($class,$dataset) = @_;
1556 :     my $self = $class->SUPER::new($dataset);
1557 :    
1558 :     bless($self,$class);
1559 :     return $self;
1560 :     }
1561 :    
1562 :     sub display {
1563 :     my ($self,$gd, $fid) = @_;
1564 : mkubal 1.17
1565 : arodri7 1.13 my $fig = new FIG;
1566 : mkubal 1.14 my $all_regions = [];
1567 : arodri7 1.13
1568 :     #get the organism genome
1569 : mkubal 1.14 my $target_genome = $fig->genome_of($fid);
1570 : arodri7 1.13
1571 :     # get location of the gene
1572 :     my $data = $fig->feature_location($fid);
1573 :     my ($contig, $beg, $end);
1574 :    
1575 :     if ($data =~ /(.*)_(\d+)_(\d+)$/){
1576 :     $contig = $1;
1577 :     $beg = $2;
1578 :     $end = $3;
1579 :     }
1580 :    
1581 :     my ($region_start, $region_end);
1582 :     if ($beg < $end)
1583 :     {
1584 :     $region_start = $beg - 4000;
1585 :     $region_end = $end+4000;
1586 :     }
1587 :     else
1588 :     {
1589 :     $region_end = $end+4000;
1590 :     $region_start = $beg-4000;
1591 :     }
1592 :    
1593 :     # call genes in region
1594 : arodri7 1.16 my ($target_gene_features, $reg_beg, $reg_end) = $fig->genes_in_region($target_genome, $contig, $region_start, $region_end);
1595 : mkubal 1.14 push(@$all_regions,$target_gene_features);
1596 : arodri7 1.16 my (@start_array_region);
1597 :     push (@start_array_region, $region_start);
1598 : mkubal 1.14
1599 :     my %all_genes;
1600 :     my %all_genomes;
1601 : mkubal 1.17 foreach my $feature (@$target_gene_features){ $all_genes{$feature} = 1;}
1602 : arodri7 1.16
1603 :     my @coup = grep { $_->[1]} $fig->coupling_and_evidence($fid,5000,1e-10,4,1);
1604 :    
1605 :     my $coup_count = 0;
1606 :    
1607 :     foreach my $pair (@{$coup[0]->[2]}) {
1608 :     last if ($coup_count > 10);
1609 : mkubal 1.14 my ($peg1,$peg2) = @$pair;
1610 : arodri7 1.16
1611 : mkubal 1.14 my $location = $fig->feature_location($peg1);
1612 :     my ($pair_contig,$pair_beg,$pair_end,$pair_region_start,$pair_region_stop,$pair_genome);
1613 :     if($location =~/(.*)_(\d+)_(\d+)$/){
1614 :     $pair_contig = $1;
1615 :     $pair_beg = $2;
1616 :     $pair_end = $3;
1617 :     if ($pair_beg < $pair_end)
1618 :     {
1619 :     $pair_region_start = $pair_beg - 4000;
1620 : arodri7 1.16 $pair_region_stop = $pair_end+4000;
1621 : mkubal 1.14 }
1622 :     else
1623 :     {
1624 : arodri7 1.16 $pair_region_stop = $pair_end+4000;
1625 : mkubal 1.14 $pair_region_start = $pair_beg-4000;
1626 :     }
1627 : arodri7 1.16
1628 :     push (@start_array_region, $pair_region_start);
1629 :    
1630 : mkubal 1.14 $pair_genome = $fig->genome_of($peg1);
1631 :     $all_genomes{$pair_genome} = 1;
1632 :     my ($pair_features) = $fig->genes_in_region($pair_genome, $pair_contig, $pair_region_start, $pair_region_stop);
1633 :     push(@$all_regions,$pair_features);
1634 : arodri7 1.16 foreach my $pair_feature (@$pair_features){ $all_genes{$pair_feature} = 1;}
1635 :     }
1636 :     $coup_count++;
1637 : mkubal 1.14 }
1638 :    
1639 :     my $bbh_sets = [];
1640 :     my %already;
1641 :     foreach my $gene_key (keys(%all_genes)){
1642 :     if($already{$gene_key}){next;}
1643 :     my $gene_set = [$gene_key];
1644 : arodri7 1.16
1645 :     my $gene_key_genome = $fig->genome_of($gene_key);
1646 :    
1647 : mkubal 1.14 foreach my $genome_key (keys(%all_genomes)){
1648 : mkubal 1.17 #next if ($gene_key_genome eq $genome_key);
1649 : mkubal 1.14 my $return = $fig->bbh_list($genome_key,[$gene_key]);
1650 : arodri7 1.16
1651 :     my $feature_list = $return->{$gene_key};
1652 : mkubal 1.14 foreach my $fl (@$feature_list){
1653 :     push(@$gene_set,$fl);
1654 :     }
1655 :     }
1656 :     $already{$gene_key} = 1;
1657 :     push(@$bbh_sets,$gene_set);
1658 :     }
1659 : arodri7 1.16
1660 :     my %bbh_set_rank;
1661 : mkubal 1.14 my $order = 0;
1662 :     foreach my $set (@$bbh_sets){
1663 :     my $count = scalar(@$set);
1664 : arodri7 1.16 $bbh_set_rank{$order} = $count;
1665 : mkubal 1.14 $order++;
1666 :     }
1667 :    
1668 :     my %peg_rank;
1669 :     my $counter = 1;
1670 :     foreach my $bbh_order (sort {$bbh_set_rank{$b} <=> $bbh_set_rank{$a}} keys %bbh_set_rank){
1671 :     my $good_set = @$bbh_sets[$bbh_order];
1672 : arodri7 1.18 my $flag_set = 0;
1673 :     if (scalar (@$good_set) > 1)
1674 :     {
1675 :     foreach my $peg (@$good_set){
1676 :     if ((!$peg_rank{$peg})){
1677 :     $peg_rank{$peg} = $counter;
1678 :     $flag_set = 1;
1679 :     }
1680 :     }
1681 :     $counter++ if ($flag_set == 1);
1682 :     }
1683 :     else
1684 :     {
1685 :     foreach my $peg (@$good_set){
1686 :     $peg_rank{$peg} = 100;
1687 : mkubal 1.17 }
1688 : mkubal 1.14 }
1689 :     }
1690 : arodri7 1.18
1691 :     open (FH, ">$FIG_Config::temp/good_sets.txt");
1692 :     foreach my $pr (sort {$peg_rank{$a} <=> $peg_rank{$b}} keys(%peg_rank)){ print FH "rank:$peg_rank{$pr}\tpr:$pr\n";}
1693 : arodri7 1.16 close (FH);
1694 : mkubal 1.14
1695 :     foreach my $region (@$all_regions){
1696 :     my $sample_peg = @$region[0];
1697 :     my $region_genome = $fig->genome_of($sample_peg);
1698 :     my $region_gs = $fig->genus_species($region_genome);
1699 : arodri7 1.18 my $abbrev_name = $fig->abbrev($region_gs);
1700 : arodri7 1.16 my $line_config = { 'title' => $region_gs,
1701 : arodri7 1.18 'short_title' => $abbrev_name,
1702 : arodri7 1.16 'basepair_offset' => '0'
1703 :     };
1704 :    
1705 :     my $offset = shift @start_array_region;
1706 :    
1707 : mkubal 1.14 my $line_data = [];
1708 : arodri7 1.16 foreach my $fid1 (@$region){
1709 : mkubal 1.14 my $element_hash;
1710 :     my $links_list = [];
1711 :     my $descriptions = [];
1712 :    
1713 : arodri7 1.16 my $color = $peg_rank{$fid1};
1714 :     if ($color == 1) {
1715 :     print STDERR "PEG: $fid1, RANK: $color";
1716 :     }
1717 : arodri7 1.18
1718 :     # get subsystem information
1719 :     my $function = $fig->function_of($fid1);
1720 :     my $url_link = "http://seed-viewer.theseed.org/index.cgi?action=ShowAnnotation&prot=".$fid1;
1721 :    
1722 :     my $link;
1723 :     $link = {"link_title" => $fid1,
1724 :     "link" => $url_link};
1725 :     push(@$links_list,$link);
1726 :    
1727 :     my @subsystems = $fig->peg_to_subsystems($fid1);
1728 :     foreach my $subsystem (@subsystems){
1729 :     my $link;
1730 :     $link = {"link" => "http://seed-viewer.theseed.org/index.cgi?action=ShowSubsystem&subsystem_name=$subsystem",
1731 :     "link_title" => $subsystem};
1732 :     push(@$links_list,$link);
1733 :     }
1734 :    
1735 :     my $description_function;
1736 :     $description_function = {"title" => "function",
1737 :     "value" => $function};
1738 :     push(@$descriptions,$description_function);
1739 :    
1740 :     my $description_ss;
1741 :     my $ss_string = join (",", @subsystems);
1742 :     $description_ss = {"title" => "subsystems",
1743 :     "value" => $ss_string};
1744 :     push(@$descriptions,$description_ss);
1745 :    
1746 : arodri7 1.16
1747 :     my $fid_location = $fig->feature_location($fid1);
1748 : mkubal 1.14 if($fid_location =~/(.*)_(\d+)_(\d+)$/){
1749 :     my($start,$stop);
1750 :     if ($2 < $3){$start = $2; $stop = $3;}
1751 :     else{$stop = $2; $start = $3;}
1752 : arodri7 1.16 $start = $start - $offset;
1753 :     $stop = $stop - $offset;
1754 : mkubal 1.14 $element_hash = {
1755 : arodri7 1.16 "title" => $fid1,
1756 : mkubal 1.14 "start" => $start,
1757 :     "end" => $stop,
1758 :     "type"=> 'arrow',
1759 :     "color"=> $color,
1760 : arodri7 1.18 "zlayer" => "2",
1761 :     "links_list" => $links_list,
1762 :     "description" => $descriptions
1763 : mkubal 1.14 };
1764 :     push(@$line_data,$element_hash);
1765 :     }
1766 :     }
1767 :     $gd->add_line($line_data, $line_config);
1768 :     }
1769 :     return $gd;
1770 :     }
1771 :    
1772 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3