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

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : mkubal 1.1 package Observation;
2 :    
3 : mkubal 1.19 use lib '/vol/ontologies';
4 :     use DBMaster;
5 :    
6 : mkubal 1.1 require Exporter;
7 :     @EXPORT_OK = qw(get_objects);
8 :    
9 : arodri7 1.16 use FIG_Config;
10 : mkubal 1.30 #use strict;
11 : arodri7 1.16 #use warnings;
12 : arodri7 1.9 use HTML;
13 : mkubal 1.1
14 :     1;
15 :    
16 : arodri7 1.31 # $Id: Observation.pm,v 1.30 2007/08/21 17:05:00 mkubal Exp $
17 : mkubal 1.1
18 :     =head1 NAME
19 :    
20 :     Observation -- A presentation layer for observations in SEED.
21 :    
22 :     =head1 DESCRIPTION
23 :    
24 :     The SEED environment contains various sources of information for sequence features. The purpose of this library is to provide a
25 :     single interface to this data.
26 :    
27 :     The data can be used to display information for a given sequence feature (protein or other, but primarily information is computed for proteins).
28 :    
29 :     =cut
30 :    
31 :     =head1 BACKGROUND
32 :    
33 :     =head2 Data incorporated in the Observations
34 :    
35 :     As the goal of this library is to provide an integrated view, we combine diverse sources of evidence.
36 :    
37 :     =head3 SEED core evidence
38 :    
39 :     The core SEED data structures provided by FIG.pm. These are Similarities, BBHs and PCHs.
40 :    
41 :     =head3 Attribute based Evidence
42 :    
43 :     We use the SEED attribute infrastructure to store information computed by a variety of computational procedures.
44 :    
45 :     These are e.g. InterPro hits via InterProScan (ipr), NCBI Conserved Domain Database Hits via PSSM(cdd),
46 :     PFAM hits via HMM(pfam), SignalP results(signalp), and various others.
47 :    
48 :     =head1 METHODS
49 :    
50 :     The public methods this package provides are listed below:
51 :    
52 :    
53 : mkubal 1.24 =head3 context()
54 :    
55 :     Returns close or diverse for purposes of displaying genomic context
56 : mkubal 1.1
57 :     =cut
58 :    
59 : mkubal 1.24 sub context {
60 : mkubal 1.1 my ($self) = @_;
61 :    
62 : mkubal 1.24 return $self->{context};
63 : mkubal 1.1 }
64 :    
65 : mkubal 1.24 =head3 rows()
66 : mkubal 1.1
67 : mkubal 1.24 each row in a displayed table
68 : mkubal 1.1
69 : mkubal 1.24 =cut
70 :    
71 :     sub rows {
72 :     my ($self) = @_;
73 :    
74 :     return $self->{rows};
75 :     }
76 :    
77 :     =head3 acc()
78 :    
79 :     A valid accession or remote ID (in the style of a db_xref) or a valid local ID (FID) in case this is supported.
80 : mkubal 1.1
81 :     =cut
82 :    
83 : mkubal 1.24 sub acc {
84 : mkubal 1.1 my ($self) = @_;
85 : mkubal 1.24 return $self->{acc};
86 : mkubal 1.1 }
87 :    
88 :     =head3 class()
89 :    
90 :     The class of evidence (required). This is usually simply the name of the tool or the name of the SEED data structure.
91 :     B<Please note> the connection of class and display_method and URL.
92 : mkubal 1.7
93 : mkubal 1.1 Current valid classes are:
94 :    
95 :     =over 9
96 :    
97 : arodri7 1.9 =item IDENTICAL (seq)
98 :    
99 : mkubal 1.3 =item SIM (seq)
100 : mkubal 1.1
101 : mkubal 1.3 =item BBH (seq)
102 : mkubal 1.1
103 : mkubal 1.3 =item PCH (fc)
104 : mkubal 1.1
105 : mkubal 1.3 =item FIGFAM (seq)
106 : mkubal 1.1
107 : mkubal 1.3 =item IPR (dom)
108 : mkubal 1.1
109 : mkubal 1.3 =item CDD (dom)
110 : mkubal 1.1
111 : mkubal 1.3 =item PFAM (dom)
112 : mkubal 1.1
113 : mkubal 1.12 =item SIGNALP_CELLO_TMPRED (loc)
114 : mkubal 1.1
115 : mkubal 1.20 =item PDB (seq)
116 :    
117 : mkubal 1.3 =item TMHMM (loc)
118 : mkubal 1.1
119 : mkubal 1.3 =item HMMTOP (loc)
120 : mkubal 1.1
121 :     =back
122 :    
123 :     =cut
124 :    
125 :     sub class {
126 :     my ($self) = @_;
127 :    
128 :     return $self->{class};
129 :     }
130 :    
131 :     =head3 type()
132 :    
133 :     The type of evidence (required).
134 :    
135 :     Where type is one of the following:
136 :    
137 :     =over 8
138 :    
139 :     =item seq=Sequence similarity
140 :    
141 :     =item dom=domain based match
142 :    
143 :     =item loc=Localization of the feature
144 :    
145 :     =item fc=Functional coupling.
146 :    
147 :     =back
148 :    
149 :     =cut
150 :    
151 :     sub type {
152 :     my ($self) = @_;
153 :    
154 : arodri7 1.26 return $self->{type};
155 : mkubal 1.1 }
156 :    
157 :     =head3 start()
158 :    
159 :     Start of hit in query sequence.
160 :    
161 :     =cut
162 :    
163 :     sub start {
164 :     my ($self) = @_;
165 :    
166 :     return $self->{start};
167 :     }
168 :    
169 :     =head3 end()
170 :    
171 :     End of the hit in query sequence.
172 :    
173 :     =cut
174 :    
175 :     sub stop {
176 :     my ($self) = @_;
177 :    
178 :     return $self->{stop};
179 :     }
180 :    
181 : arodri7 1.11 =head3 start()
182 :    
183 :     Start of hit in query sequence.
184 :    
185 :     =cut
186 :    
187 :     sub qstart {
188 :     my ($self) = @_;
189 :    
190 :     return $self->{qstart};
191 :     }
192 :    
193 :     =head3 qstop()
194 :    
195 :     End of the hit in query sequence.
196 :    
197 :     =cut
198 :    
199 :     sub qstop {
200 :     my ($self) = @_;
201 :    
202 :     return $self->{qstop};
203 :     }
204 :    
205 :     =head3 hstart()
206 :    
207 :     Start of hit in hit sequence.
208 :    
209 :     =cut
210 :    
211 :     sub hstart {
212 :     my ($self) = @_;
213 :    
214 :     return $self->{hstart};
215 :     }
216 :    
217 :     =head3 end()
218 :    
219 :     End of the hit in hit sequence.
220 :    
221 :     =cut
222 :    
223 :     sub hstop {
224 :     my ($self) = @_;
225 :    
226 :     return $self->{hstop};
227 :     }
228 :    
229 :     =head3 qlength()
230 :    
231 :     length of the query sequence in similarities
232 :    
233 :     =cut
234 :    
235 :     sub qlength {
236 :     my ($self) = @_;
237 :    
238 :     return $self->{qlength};
239 :     }
240 :    
241 :     =head3 hlength()
242 :    
243 :     length of the hit sequence in similarities
244 :    
245 :     =cut
246 :    
247 :     sub hlength {
248 :     my ($self) = @_;
249 :    
250 :     return $self->{hlength};
251 :     }
252 :    
253 : mkubal 1.1 =head3 evalue()
254 :    
255 :     E-value or P-Value if present.
256 :    
257 :     =cut
258 :    
259 :     sub evalue {
260 :     my ($self) = @_;
261 :    
262 :     return $self->{evalue};
263 :     }
264 :    
265 :     =head3 score()
266 :    
267 :     Score if present.
268 :    
269 :     =cut
270 :    
271 :     sub score {
272 :     my ($self) = @_;
273 :     return $self->{score};
274 :     }
275 :    
276 : mkubal 1.12 =head3 display()
277 : mkubal 1.1
278 : mkubal 1.12 will be different for each type
279 : mkubal 1.1
280 :     =cut
281 :    
282 : mkubal 1.7 sub display {
283 : mkubal 1.1
284 : mkubal 1.7 die "Abstract Method Called\n";
285 : mkubal 1.1
286 :     }
287 :    
288 : mkubal 1.24 =head3 display_table()
289 : mkubal 1.7
290 : mkubal 1.24 will be different for each type
291 : mkubal 1.1
292 : mkubal 1.24 =cut
293 : mkubal 1.1
294 : mkubal 1.24 sub display_table {
295 :    
296 :     die "Abstract Table Method Called\n";
297 : mkubal 1.1
298 :     }
299 :    
300 :     =head3 get_objects()
301 :    
302 :     This is the B<REAL WORKHORSE> method of this Package.
303 :    
304 :     =cut
305 :    
306 :     sub get_objects {
307 : mkubal 1.24 my ($self,$fid,$scope) = @_;
308 : mkubal 1.7
309 :     my $objects = [];
310 :     my @matched_datasets=();
311 : arodri7 1.28 my $fig = new FIG;
312 : mkubal 1.1
313 : mkubal 1.7 # call function that fetches attribute based observations
314 :     # returns an array of arrays of hashes
315 :    
316 : mkubal 1.24 if($scope){
317 :     get_cluster_observations($fid,\@matched_datasets,$scope);
318 : mkubal 1.7 }
319 :     else{
320 :     my %domain_classes;
321 : arodri7 1.28 my @attributes = $fig->get_attributes($fid);
322 : mkubal 1.24 $domain_classes{'CDD'} = 1;
323 : arodri7 1.31 #get_identical_proteins($fid,\@matched_datasets);
324 : arodri7 1.28 get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets,\@attributes);
325 : mkubal 1.24 get_sims_observations($fid,\@matched_datasets);
326 :     get_functional_coupling($fid,\@matched_datasets);
327 : arodri7 1.28 get_attribute_based_location_observations($fid,\@matched_datasets,\@attributes);
328 :     get_pdb_observations($fid,\@matched_datasets,\@attributes);
329 : mkubal 1.1 }
330 : mkubal 1.7
331 :     foreach my $dataset (@matched_datasets) {
332 :     my $object;
333 :     if($dataset->{'type'} eq "dom"){
334 :     $object = Observation::Domain->new($dataset);
335 :     }
336 : arodri7 1.9 if($dataset->{'class'} eq "PCH"){
337 :     $object = Observation::FC->new($dataset);
338 :     }
339 :     if ($dataset->{'class'} eq "IDENTICAL"){
340 :     $object = Observation::Identical->new($dataset);
341 :     }
342 : mkubal 1.12 if ($dataset->{'class'} eq "SIGNALP_CELLO_TMPRED"){
343 :     $object = Observation::Location->new($dataset);
344 :     }
345 : arodri7 1.10 if ($dataset->{'class'} eq "SIM"){
346 :     $object = Observation::Sims->new($dataset);
347 :     }
348 : arodri7 1.15 if ($dataset->{'class'} eq "CLUSTER"){
349 :     $object = Observation::Cluster->new($dataset);
350 :     }
351 : mkubal 1.20 if ($dataset->{'class'} eq "PDB"){
352 :     $object = Observation::PDB->new($dataset);
353 :     }
354 :    
355 : mkubal 1.7 push (@$objects, $object);
356 : mkubal 1.1 }
357 : mkubal 1.7
358 :     return $objects;
359 : mkubal 1.1
360 :     }
361 :    
362 : arodri7 1.28 =head3 display_housekeeping
363 :     This method returns the housekeeping data for a given peg in a table format
364 :    
365 :     =cut
366 :     sub display_housekeeping {
367 :     my ($self,$fid) = @_;
368 :     my $fig = new FIG;
369 :     my $content;
370 :    
371 :     my $org_name = $fig->org_of($fid);
372 :     my $org_id = $fig->orgid_of_orgname($org_name);
373 :     my $loc = $fig->feature_location($fid);
374 :     my($contig, $beg, $end) = $fig->boundaries_of($loc);
375 :     my $strand = ($beg <= $end)? '+' : '-';
376 :     my @subsystems = $fig->subsystems_for_peg($fid);
377 :     my $function = $fig->function_of($fid);
378 :     my @aliases = $fig->feature_aliases($fid);
379 :     my $taxonomy = $fig->taxonomy_of($org_id);
380 :     my @ecs = ($function =~ /\(EC\s(\d+\.[-\d+]+\.[-\d+]+\.[-\d+]+)\)/g);
381 :    
382 :     $content .= qq(<b>General Protein Data</b><br><br><br><table border="0">);
383 :     $content .= qq(<tr width=15%><td >FIG ID</td><td>$fid</td></tr>\n);
384 :     $content .= qq(<tr width=15%><td >Organism Name</td><td>$org_name,&nbsp;&nbsp;$org_id</td></tr>\n);
385 :     $content .= qq(<tr><td width=15%>Taxonomy</td><td>$taxonomy</td></tr>\n);
386 :     $content .= qq(<tr width=15%><td>FIG Organism ID</td><td>$org_id</td></tr>\n);
387 :     $content .= qq(<tr width=15%><td>Gene Location</td><td>Contig $contig [$beg,$end], Strand $strand</td></tr>\n);;
388 :     $content .= qq(<tr width=15%><td>Function</td><td>$function</td></tr>\n);
389 :     if ( @ecs ) {
390 :     $content .= qq(<tr><td>EC:</td><td>);
391 :     foreach my $ec ( @ecs ) {
392 :     my $ec_name = $fig->ec_name($ec);
393 :     $content .= join(" -- ", $ec, $ec_name) . "<br>\n";
394 :     }
395 :     $content .= qq(</td></tr>\n);
396 :     }
397 :    
398 :     if ( @subsystems ) {
399 :     $content .= qq(<tr><td>Subsystems</td><td>);
400 :     foreach my $subsystem ( @subsystems ) {
401 :     $content .= join(" -- ", @$subsystem) . "<br>\n";
402 :     }
403 :     }
404 :    
405 :     my %groups;
406 :     if ( @aliases ) {
407 :     # get the db for each alias
408 :     foreach my $alias (@aliases){
409 :     $groups{$alias} = &get_database($alias);
410 :     }
411 :    
412 :     # group ids by aliases
413 :     my %db_aliases;
414 :     foreach my $key (sort {$groups{$a} cmp $groups{$b}} keys %groups){
415 :     push (@{$db_aliases{$groups{$key}}}, $key);
416 :     }
417 :    
418 :    
419 :     $content .= qq(<tr><td>Aliases</td><td><table border="0">);
420 :     foreach my $key (sort keys %db_aliases){
421 :     $content .= qq(<tr><td>$key:</td><td>) . join(", ", @{$db_aliases{$key}}) . qq(</td></tr\n);
422 :     }
423 :     $content .= qq(</td></tr></table>\n);
424 :     }
425 :    
426 :     $content .= qq(</table><p>\n);
427 :    
428 :     return ($content);
429 :     }
430 :    
431 :     =head3 get_sims_summary
432 :     This method uses as input the similarities of a peg and creates a tree view of their taxonomy
433 :    
434 :     =cut
435 :    
436 :     sub get_sims_summary {
437 :     my ($observation, $fid) = @_;
438 :     my $fig = new FIG;
439 :     my %families;
440 :     my @sims= $fig->nsims($fid,20000,10,"all");
441 :    
442 :     foreach my $sim (@sims){
443 :     next if ($sim->[1] !~ /fig\|/);
444 :     my $genome = $fig->genome_of($sim->[1]);
445 :     my $taxonomy = $fig->taxonomy_of($fig->genome_of($sim->[1]));
446 :     my $parent_tax = "Root";
447 :     foreach my $tax (split(/\; /, $taxonomy)){
448 :     push (@{$families{children}{$parent_tax}}, $tax);
449 :     $families{parent}{$tax} = $parent_tax;
450 :     $parent_tax = $tax;
451 :     }
452 :     }
453 :    
454 :     foreach my $key (keys %{$families{children}}){
455 :     $families{count}{$key} = @{$families{children}{$key}};
456 :    
457 :     my %saw;
458 :     my @out = grep(!$saw{$_}++, @{$families{children}{$key}});
459 :     $families{children}{$key} = \@out;
460 :     }
461 :     return (\%families);
462 :     }
463 :    
464 : mkubal 1.1 =head1 Internal Methods
465 :    
466 :     These methods are not meant to be used outside of this package.
467 :    
468 :     B<Please do not use them outside of this package!>
469 :    
470 :     =cut
471 :    
472 : mkubal 1.7 sub get_attribute_based_domain_observations{
473 :    
474 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
475 : arodri7 1.28 my ($fid,$domain_classes,$datasets_ref,$attributes_ref) = (@_);
476 : mkubal 1.7
477 :     my $fig = new FIG;
478 : arodri7 1.28
479 :     foreach my $attr_ref (@$attributes_ref) {
480 :     # foreach my $attr_ref ($fig->get_attributes($fid)) {
481 : mkubal 1.7 my $key = @$attr_ref[1];
482 :     my @parts = split("::",$key);
483 :     my $class = $parts[0];
484 :    
485 :     if($domain_classes->{$parts[0]}){
486 :     my $val = @$attr_ref[2];
487 : mkubal 1.8 if($val =~/^(\d+\.\d+|0\.0);(\d+)-(\d+)/){
488 : mkubal 1.7 my $raw_evalue = $1;
489 : mkubal 1.8 my $from = $2;
490 :     my $to = $3;
491 : mkubal 1.7 my $evalue;
492 :     if($raw_evalue =~/(\d+)\.(\d+)/){
493 :     my $part2 = 1000 - $1;
494 :     my $part1 = $2/100;
495 :     $evalue = $part1."e-".$part2;
496 :     }
497 :     else{
498 : mkubal 1.8 $evalue = "0.0";
499 : mkubal 1.7 }
500 :    
501 :     my $dataset = {'class' => $class,
502 :     'acc' => $key,
503 :     'type' => "dom" ,
504 :     'evalue' => $evalue,
505 :     'start' => $from,
506 : mkubal 1.24 'stop' => $to,
507 :     'fig_id' => $fid,
508 :     'score' => $raw_evalue
509 : mkubal 1.7 };
510 :    
511 :     push (@{$datasets_ref} ,$dataset);
512 :     }
513 :     }
514 :     }
515 :     }
516 : mkubal 1.12
517 :     sub get_attribute_based_location_observations{
518 :    
519 : arodri7 1.28 my ($fid,$datasets_ref, $attributes_ref) = (@_);
520 : mkubal 1.12 my $fig = new FIG;
521 :    
522 : mkubal 1.30 my $location_attributes = ['SignalP','CELLO','TMPRED','Phobius'];
523 : mkubal 1.12
524 : arodri7 1.26 my $dataset = {'type' => "loc",
525 :     'class' => 'SIGNALP_CELLO_TMPRED',
526 :     'fig_id' => $fid
527 :     };
528 :    
529 : arodri7 1.28 foreach my $attr_ref (@$attributes_ref){
530 :     # foreach my $attr_ref ($fig->get_attributes($fid,$location_attributes)) {
531 : mkubal 1.12 my $key = @$attr_ref[1];
532 : mkubal 1.30 next if (($key !~ /SignalP/) && ($key !~ /CELLO/) && ($key !~ /TMPRED/) && ($key !~/Phobius/) );
533 : mkubal 1.12 my @parts = split("::",$key);
534 :     my $sub_class = $parts[0];
535 :     my $sub_key = $parts[1];
536 :     my $value = @$attr_ref[2];
537 :     if($sub_class eq "SignalP"){
538 :     if($sub_key eq "cleavage_site"){
539 :     my @value_parts = split(";",$value);
540 :     $dataset->{'cleavage_prob'} = $value_parts[0];
541 :     $dataset->{'cleavage_loc'} = $value_parts[1];
542 : arodri7 1.28 # print STDERR "LOC: $value_parts[1]";
543 : mkubal 1.12 }
544 :     elsif($sub_key eq "signal_peptide"){
545 :     $dataset->{'signal_peptide_score'} = $value;
546 :     }
547 :     }
548 : mkubal 1.30
549 : mkubal 1.12 elsif($sub_class eq "CELLO"){
550 :     $dataset->{'cello_location'} = $sub_key;
551 :     $dataset->{'cello_score'} = $value;
552 :     }
553 : mkubal 1.30
554 :     elsif($sub_class eq "Phobius"){
555 :     if($sub_key eq "transmembrane"){
556 :     $dataset->{'phobius_tm_locations'} = $value;
557 :     }
558 :     elsif($sub_key eq "signal"){
559 :     $dataset->{'phobius_signal_location'} = $value;
560 :     }
561 :     }
562 :    
563 : mkubal 1.12 elsif($sub_class eq "TMPRED"){
564 : arodri7 1.26 my @value_parts = split(/\;/,$value);
565 : mkubal 1.12 $dataset->{'tmpred_score'} = $value_parts[0];
566 :     $dataset->{'tmpred_locations'} = $value_parts[1];
567 :     }
568 :     }
569 :    
570 :     push (@{$datasets_ref} ,$dataset);
571 :    
572 :     }
573 :    
574 : mkubal 1.20 =head3 get_pdb_observations() (internal)
575 :    
576 :     This methods sets the type and class for pdb observations
577 :    
578 :     =cut
579 :    
580 :     sub get_pdb_observations{
581 : arodri7 1.28 my ($fid,$datasets_ref, $attributes_ref) = (@_);
582 : mkubal 1.20
583 :     my $fig = new FIG;
584 :    
585 : arodri7 1.28 foreach my $attr_ref (@$attributes_ref){
586 :     #foreach my $attr_ref ($fig->get_attributes($fid,'PDB')) {
587 : mkubal 1.20
588 :     my $key = @$attr_ref[1];
589 : arodri7 1.28 next if ( ($key !~ /PDB/));
590 : mkubal 1.20 my($key1,$key2) =split("::",$key);
591 :     my $value = @$attr_ref[2];
592 :     my ($evalue,$location) = split(";",$value);
593 :    
594 :     if($evalue =~/(\d+)\.(\d+)/){
595 :     my $part2 = 1000 - $1;
596 :     my $part1 = $2/100;
597 :     $evalue = $part1."e-".$part2;
598 :     }
599 :    
600 :     my($start,$stop) =split("-",$location);
601 :    
602 :     my $url = @$attr_ref[3];
603 :     my $dataset = {'class' => 'PDB',
604 :     'type' => 'seq' ,
605 :     'acc' => $key2,
606 :     'evalue' => $evalue,
607 :     'start' => $start,
608 : mkubal 1.24 'stop' => $stop,
609 :     'fig_id' => $fid
610 : mkubal 1.20 };
611 :    
612 :     push (@{$datasets_ref} ,$dataset);
613 :     }
614 :     }
615 :    
616 : arodri7 1.15 =head3 get_cluster_observations() (internal)
617 :    
618 :     This methods sets the type and class for cluster observations
619 :    
620 :     =cut
621 :    
622 :     sub get_cluster_observations{
623 : mkubal 1.24 my ($fid,$datasets_ref,$scope) = (@_);
624 : arodri7 1.15
625 : arodri7 1.16 my $dataset = {'class' => 'CLUSTER',
626 : mkubal 1.24 'type' => 'fc',
627 :     'context' => $scope,
628 :     'fig_id' => $fid
629 : arodri7 1.16 };
630 : arodri7 1.15 push (@{$datasets_ref} ,$dataset);
631 :     }
632 :    
633 :    
634 : mkubal 1.3 =head3 get_sims_observations() (internal)
635 :    
636 :     This methods retrieves sims fills the internal data structures.
637 :    
638 :     =cut
639 :    
640 :     sub get_sims_observations{
641 :    
642 :     my ($fid,$datasets_ref) = (@_);
643 : mkubal 1.4 my $fig = new FIG;
644 : arodri7 1.26 my @sims= $fig->nsims($fid,500,1e-20,"all");
645 : mkubal 1.4 my ($dataset);
646 : arodri7 1.26
647 :     my %id_list;
648 : mkubal 1.3 foreach my $sim (@sims){
649 : mkubal 1.4 my $hit = $sim->[1];
650 : arodri7 1.26
651 :     next if ($hit !~ /^fig\|/);
652 :     my @aliases = $fig->feature_aliases($hit);
653 :     foreach my $alias (@aliases){
654 :     $id_list{$alias} = 1;
655 :     }
656 :     }
657 :    
658 :     my %already;
659 :     my (@new_sims, @uniprot);
660 :     foreach my $sim (@sims){
661 :     my $hit = $sim->[1];
662 :     my ($id) = ($hit) =~ /\|(.*)/;
663 :     next if (defined($already{$id}));
664 :     next if (defined($id_list{$hit}));
665 :     push (@new_sims, $sim);
666 :     $already{$id} = 1;
667 :     }
668 :    
669 :     foreach my $sim (@new_sims){
670 :     my $hit = $sim->[1];
671 : arodri7 1.11 my $percent = $sim->[2];
672 : mkubal 1.4 my $evalue = $sim->[10];
673 : arodri7 1.11 my $qfrom = $sim->[6];
674 :     my $qto = $sim->[7];
675 :     my $hfrom = $sim->[8];
676 :     my $hto = $sim->[9];
677 :     my $qlength = $sim->[12];
678 :     my $hlength = $sim->[13];
679 :     my $db = get_database($hit);
680 :     my $func = $fig->function_of($hit);
681 :     my $organism = $fig->org_of($hit);
682 :    
683 : arodri7 1.10 $dataset = {'class' => 'SIM',
684 :     'acc' => $hit,
685 : arodri7 1.11 'identity' => $percent,
686 : arodri7 1.10 'type' => 'seq',
687 :     'evalue' => $evalue,
688 : arodri7 1.11 'qstart' => $qfrom,
689 :     'qstop' => $qto,
690 :     'hstart' => $hfrom,
691 :     'hstop' => $hto,
692 :     'database' => $db,
693 :     'organism' => $organism,
694 :     'function' => $func,
695 :     'qlength' => $qlength,
696 : mkubal 1.24 'hlength' => $hlength,
697 :     'fig_id' => $fid
698 : arodri7 1.10 };
699 :    
700 :     push (@{$datasets_ref} ,$dataset);
701 : mkubal 1.3 }
702 :     }
703 :    
704 : arodri7 1.11 =head3 get_database (internal)
705 :     This method gets the database association from the sequence id
706 :    
707 :     =cut
708 :    
709 :     sub get_database{
710 :     my ($id) = (@_);
711 :    
712 :     my ($db);
713 :     if ($id =~ /^fig\|/) { $db = "FIG" }
714 :     elsif ($id =~ /^gi\|/) { $db = "NCBI" }
715 :     elsif ($id =~ /^^[NXYZA]P_/) { $db = "RefSeq" }
716 :     elsif ($id =~ /^sp\|/) { $db = "SwissProt" }
717 :     elsif ($id =~ /^uni\|/) { $db = "UniProt" }
718 :     elsif ($id =~ /^tigr\|/) { $db = "TIGR" }
719 :     elsif ($id =~ /^pir\|/) { $db = "PIR" }
720 : arodri7 1.28 elsif (($id =~ /^kegg\|/) || ($id =~ /Spy/)) { $db = "KEGG" }
721 :     elsif ($id =~ /^tr\|/) { $db = "TrEMBL" }
722 : arodri7 1.11 elsif ($id =~ /^eric\|/) { $db = "ASAP" }
723 :     elsif ($id =~ /^img\|/) { $db = "JGI" }
724 :    
725 :     return ($db);
726 :    
727 :     }
728 :    
729 : mkubal 1.24
730 : arodri7 1.5 =head3 get_identical_proteins() (internal)
731 :    
732 :     This methods retrieves sims fills the internal data structures.
733 :    
734 :     =cut
735 :    
736 :     sub get_identical_proteins{
737 :    
738 :     my ($fid,$datasets_ref) = (@_);
739 :     my $fig = new FIG;
740 : mkubal 1.24 my $funcs_ref;
741 : arodri7 1.5
742 : arodri7 1.26 my %id_list;
743 : arodri7 1.5 my @maps_to = grep { $_ ne $fid and $_ !~ /^xxx/ } map { $_->[0] } $fig->mapped_prot_ids($fid);
744 : arodri7 1.26 my @aliases = $fig->feature_aliases($fid);
745 :     foreach my $alias (@aliases){
746 :     $id_list{$alias} = 1;
747 :     }
748 :    
749 : arodri7 1.5 foreach my $id (@maps_to) {
750 :     my ($tmp, $who);
751 : arodri7 1.26 if (($id ne $fid) && ($tmp = $fig->function_of($id)) && (! defined ($id_list{$id}))) {
752 : arodri7 1.11 $who = &get_database($id);
753 : mkubal 1.24 push(@$funcs_ref, [$id,$who,$tmp]);
754 : arodri7 1.5 }
755 :     }
756 :    
757 :     my ($dataset);
758 : mkubal 1.24 my $dataset = {'class' => 'IDENTICAL',
759 :     'type' => 'seq',
760 :     'fig_id' => $fid,
761 :     'rows' => $funcs_ref
762 :     };
763 :    
764 :     push (@{$datasets_ref} ,$dataset);
765 :    
766 : arodri7 1.5
767 :     }
768 :    
769 : arodri7 1.6 =head3 get_functional_coupling() (internal)
770 :    
771 :     This methods retrieves the functional coupling of a protein given a peg ID
772 :    
773 :     =cut
774 :    
775 :     sub get_functional_coupling{
776 :    
777 :     my ($fid,$datasets_ref) = (@_);
778 :     my $fig = new FIG;
779 :     my @funcs = ();
780 :    
781 :     # initialize some variables
782 :     my($sc,$neigh);
783 :    
784 :     # set default parameters for coupling and evidence
785 :     my ($bound,$sim_cutoff,$coupling_cutoff) = (5000, 1.0e-10, 4);
786 :    
787 :     # get the fc data
788 :     my @fc_data = $fig->coupling_and_evidence($fid,$bound,$sim_cutoff,$coupling_cutoff,1);
789 :    
790 :     # retrieve data
791 :     my @rows = map { ($sc,$neigh) = @$_;
792 :     [$sc,$neigh,scalar $fig->function_of($neigh)]
793 :     } @fc_data;
794 :    
795 :     my ($dataset);
796 : mkubal 1.24 my $dataset = {'class' => 'PCH',
797 :     'type' => 'fc',
798 :     'fig_id' => $fid,
799 :     'rows' => \@rows
800 :     };
801 :    
802 :     push (@{$datasets_ref} ,$dataset);
803 : arodri7 1.9
804 : arodri7 1.6 }
805 : arodri7 1.5
806 : mkubal 1.1 =head3 new (internal)
807 :    
808 :     Instantiate a new object.
809 :    
810 :     =cut
811 :    
812 :     sub new {
813 : mkubal 1.7 my ($class,$dataset) = @_;
814 :    
815 :     my $self = { class => $dataset->{'class'},
816 : mkubal 1.24 type => $dataset->{'type'},
817 :     fig_id => $dataset->{'fig_id'},
818 :     score => $dataset->{'score'},
819 : arodri7 1.10 };
820 : mkubal 1.7
821 :     bless($self,$class);
822 : mkubal 1.1
823 :     return $self;
824 :     }
825 :    
826 : arodri7 1.11 =head3 identity (internal)
827 :    
828 :     Returns the % identity of the similar sequence
829 :    
830 :     =cut
831 :    
832 :     sub identity {
833 :     my ($self) = @_;
834 :    
835 :     return $self->{identity};
836 :     }
837 :    
838 : mkubal 1.24 =head3 fig_id (internal)
839 :    
840 :     =cut
841 :    
842 :     sub fig_id {
843 :     my ($self) = @_;
844 :     return $self->{fig_id};
845 :     }
846 :    
847 : mkubal 1.1 =head3 feature_id (internal)
848 :    
849 :    
850 :     =cut
851 :    
852 :     sub feature_id {
853 :     my ($self) = @_;
854 :    
855 :     return $self->{feature_id};
856 :     }
857 : arodri7 1.5
858 :     =head3 id (internal)
859 :    
860 :     Returns the ID of the identical sequence
861 :    
862 :     =cut
863 :    
864 :     sub id {
865 :     my ($self) = @_;
866 :    
867 :     return $self->{id};
868 :     }
869 :    
870 :     =head3 organism (internal)
871 :    
872 :     Returns the organism of the identical sequence
873 :    
874 :     =cut
875 :    
876 :     sub organism {
877 :     my ($self) = @_;
878 :    
879 :     return $self->{organism};
880 :     }
881 :    
882 : arodri7 1.9 =head3 function (internal)
883 :    
884 :     Returns the function of the identical sequence
885 :    
886 :     =cut
887 :    
888 :     sub function {
889 :     my ($self) = @_;
890 :    
891 :     return $self->{function};
892 :     }
893 :    
894 : arodri7 1.5 =head3 database (internal)
895 :    
896 :     Returns the database of the identical sequence
897 :    
898 :     =cut
899 :    
900 :     sub database {
901 :     my ($self) = @_;
902 :    
903 :     return $self->{database};
904 :     }
905 :    
906 : mkubal 1.24 sub score {
907 :     my ($self) = @_;
908 :    
909 :     return $self->{score};
910 :     }
911 :    
912 : mkubal 1.20 ############################################################
913 :     ############################################################
914 :     package Observation::PDB;
915 :    
916 :     use base qw(Observation);
917 :    
918 :     sub new {
919 :    
920 :     my ($class,$dataset) = @_;
921 :     my $self = $class->SUPER::new($dataset);
922 :     $self->{acc} = $dataset->{'acc'};
923 :     $self->{evalue} = $dataset->{'evalue'};
924 :     $self->{start} = $dataset->{'start'};
925 :     $self->{stop} = $dataset->{'stop'};
926 :     bless($self,$class);
927 :     return $self;
928 :     }
929 :    
930 :     =head3 display()
931 :    
932 :     displays data stored in best_PDB attribute and in Ontology server for given PDB id
933 :    
934 :     =cut
935 :    
936 :     sub display{
937 : mkubal 1.24 my ($self,$gd) = @_;
938 : mkubal 1.20
939 : mkubal 1.24 my $fid = $self->fig_id;
940 : mkubal 1.20 my $dbmaster = DBMaster->new(-database =>'Ontology');
941 :    
942 :     my $acc = $self->acc;
943 :    
944 :     my ($pdb_description,$pdb_source,$pdb_ligand);
945 :     my $pdb_objs = $dbmaster->pdb->get_objects( { 'id' => $acc } );
946 :     if(!scalar(@$pdb_objs)){
947 :     $pdb_description = "not available";
948 :     $pdb_source = "not available";
949 :     $pdb_ligand = "not available";
950 :     }
951 :     else{
952 :     my $pdb_obj = $pdb_objs->[0];
953 :     $pdb_description = $pdb_obj->description;
954 :     $pdb_source = $pdb_obj->source;
955 :     $pdb_ligand = $pdb_obj->ligand;
956 :     }
957 : arodri7 1.6
958 : mkubal 1.20 my $lines = [];
959 :     my $line_data = [];
960 :     my $line_config = { 'title' => "PDB hit for $fid",
961 :     'short_title' => "best PDB",
962 :     'basepair_offset' => '1' };
963 :    
964 :     my $fig = new FIG;
965 :     my $seq = $fig->get_translation($fid);
966 :     my $fid_stop = length($seq);
967 :    
968 :     my $fid_element_hash = {
969 :     "title" => $fid,
970 :     "start" => '1',
971 :     "end" => $fid_stop,
972 :     "color"=> '1',
973 :     "zlayer" => '1'
974 :     };
975 :    
976 :     push(@$line_data,$fid_element_hash);
977 :    
978 :     my $links_list = [];
979 :     my $descriptions = [];
980 :    
981 :     my $name;
982 :     $name = {"title" => 'id',
983 :     "value" => $acc};
984 :     push(@$descriptions,$name);
985 :    
986 :     my $description;
987 :     $description = {"title" => 'pdb description',
988 :     "value" => $pdb_description};
989 :     push(@$descriptions,$description);
990 :    
991 :     my $score;
992 :     $score = {"title" => "score",
993 :     "value" => $self->evalue};
994 :     push(@$descriptions,$score);
995 :    
996 :     my $start_stop;
997 :     my $start_stop_value = $self->start."_".$self->stop;
998 :     $start_stop = {"title" => "start-stop",
999 :     "value" => $start_stop_value};
1000 :     push(@$descriptions,$start_stop);
1001 :    
1002 :     my $source;
1003 :     $source = {"title" => "source",
1004 :     "value" => $pdb_source};
1005 :     push(@$descriptions,$source);
1006 :    
1007 :     my $ligand;
1008 :     $ligand = {"title" => "pdb ligand",
1009 :     "value" => $pdb_ligand};
1010 :     push(@$descriptions,$ligand);
1011 :    
1012 :     my $link;
1013 :     my $link_url ="http://www.rcsb.org/pdb/explore/explore.do?structureId=".$acc;
1014 :    
1015 :     $link = {"link_title" => $acc,
1016 :     "link" => $link_url};
1017 :     push(@$links_list,$link);
1018 :    
1019 :     my $pdb_element_hash = {
1020 :     "title" => "PDB homology",
1021 :     "start" => $self->start,
1022 :     "end" => $self->stop,
1023 :     "color"=> '6',
1024 :     "zlayer" => '3',
1025 :     "links_list" => $links_list,
1026 :     "description" => $descriptions};
1027 :    
1028 :     push(@$line_data,$pdb_element_hash);
1029 :     $gd->add_line($line_data, $line_config);
1030 :    
1031 :     return $gd;
1032 :     }
1033 :    
1034 :     1;
1035 : arodri7 1.11
1036 : arodri7 1.9 ############################################################
1037 :     ############################################################
1038 :     package Observation::Identical;
1039 :    
1040 :     use base qw(Observation);
1041 :    
1042 :     sub new {
1043 :    
1044 :     my ($class,$dataset) = @_;
1045 :     my $self = $class->SUPER::new($dataset);
1046 : mkubal 1.24 $self->{rows} = $dataset->{'rows'};
1047 :    
1048 : arodri7 1.9 bless($self,$class);
1049 :     return $self;
1050 :     }
1051 :    
1052 : mkubal 1.24 =head3 display_table()
1053 : arodri7 1.6
1054 :     If available use the function specified here to display the "raw" observation.
1055 :     This code will display a table for the identical protein
1056 :    
1057 :    
1058 : 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
1059 :     dence.
1060 : arodri7 1.6
1061 :     =cut
1062 :    
1063 :    
1064 : mkubal 1.24 sub display_table{
1065 :     my ($self) = @_;
1066 :    
1067 :     my $fig = new FIG;
1068 :     my $fid = $self->fig_id;
1069 :     my $rows = $self->rows;
1070 :     my $cgi = new CGI;
1071 : arodri7 1.6 my $all_domains = [];
1072 :     my $count_identical = 0;
1073 : arodri7 1.9 my $content;
1074 : mkubal 1.24 foreach my $row (@$rows) {
1075 :     my $id = $row->[0];
1076 :     my $who = $row->[1];
1077 :     my $assignment = $row->[2];
1078 : arodri7 1.26 my $organism = $fig->org_of($id);
1079 : arodri7 1.9 my $single_domain = [];
1080 : mkubal 1.24 push(@$single_domain,$who);
1081 :     push(@$single_domain,&HTML::set_prot_links($cgi,$id));
1082 :     push(@$single_domain,$organism);
1083 :     push(@$single_domain,$assignment);
1084 : arodri7 1.9 push(@$all_domains,$single_domain);
1085 : mkubal 1.24 $count_identical++;
1086 : arodri7 1.6 }
1087 :    
1088 :     if ($count_identical >0){
1089 : arodri7 1.9 $content = $all_domains;
1090 : arodri7 1.6 }
1091 :     else{
1092 : arodri7 1.9 $content = "<p>This PEG does not have any essentially identical proteins</p>";
1093 : arodri7 1.6 }
1094 :     return ($content);
1095 :     }
1096 : mkubal 1.7
1097 : arodri7 1.9 1;
1098 :    
1099 :     #########################################
1100 :     #########################################
1101 :     package Observation::FC;
1102 :     1;
1103 :    
1104 :     use base qw(Observation);
1105 :    
1106 :     sub new {
1107 :    
1108 :     my ($class,$dataset) = @_;
1109 :     my $self = $class->SUPER::new($dataset);
1110 : mkubal 1.24 $self->{rows} = $dataset->{'rows'};
1111 : arodri7 1.9
1112 :     bless($self,$class);
1113 :     return $self;
1114 :     }
1115 :    
1116 : mkubal 1.24 =head3 display_table()
1117 : arodri7 1.9
1118 :     If available use the function specified here to display the "raw" observation.
1119 :     This code will display a table for the identical protein
1120 :    
1121 :    
1122 :     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
1123 :     dence.
1124 :    
1125 :     =cut
1126 :    
1127 : mkubal 1.24 sub display_table {
1128 : arodri7 1.9
1129 : mkubal 1.24 my ($self,$dataset) = @_;
1130 :     my $fid = $self->fig_id;
1131 :     my $rows = $self->rows;
1132 :     my $cgi = new CGI;
1133 : arodri7 1.9 my $functional_data = [];
1134 :     my $count = 0;
1135 :     my $content;
1136 :    
1137 : mkubal 1.24 foreach my $row (@$rows) {
1138 : arodri7 1.9 my $single_domain = [];
1139 :     $count++;
1140 :    
1141 :     # construct the score link
1142 : mkubal 1.24 my $score = $row->[0];
1143 :     my $toid = $row->[1];
1144 : arodri7 1.9 my $link = $cgi->url(-relative => 1) . "?user=master&request=show_coupling_evidence&prot=$fid&to=$toid&SPROUT=";
1145 :     my $sc_link = "<a href=$link>$score</a>";
1146 :    
1147 :     push(@$single_domain,$sc_link);
1148 : mkubal 1.24 push(@$single_domain,$row->[1]);
1149 :     push(@$single_domain,$row->[2]);
1150 : arodri7 1.9 push(@$functional_data,$single_domain);
1151 :     }
1152 :    
1153 :     if ($count >0){
1154 :     $content = $functional_data;
1155 :     }
1156 :     else
1157 :     {
1158 :     $content = "<p>This PEG does not have any functional coupling</p>";
1159 :     }
1160 :     return ($content);
1161 :     }
1162 :    
1163 :    
1164 :     #########################################
1165 :     #########################################
1166 : mkubal 1.7 package Observation::Domain;
1167 :    
1168 :     use base qw(Observation);
1169 :    
1170 :     sub new {
1171 :    
1172 :     my ($class,$dataset) = @_;
1173 :     my $self = $class->SUPER::new($dataset);
1174 :     $self->{evalue} = $dataset->{'evalue'};
1175 :     $self->{acc} = $dataset->{'acc'};
1176 :     $self->{start} = $dataset->{'start'};
1177 :     $self->{stop} = $dataset->{'stop'};
1178 :    
1179 :     bless($self,$class);
1180 :     return $self;
1181 :     }
1182 :    
1183 :     sub display {
1184 :     my ($thing,$gd) = @_;
1185 :     my $lines = [];
1186 : arodri7 1.27 # my $line_config = { 'title' => $thing->acc,
1187 :     # 'short_title' => $thing->type,
1188 :     # 'basepair_offset' => '1' };
1189 : mkubal 1.7 my $color = "4";
1190 :    
1191 :     my $line_data = [];
1192 :     my $links_list = [];
1193 :     my $descriptions = [];
1194 : mkubal 1.19
1195 :     my $db_and_id = $thing->acc;
1196 :     my ($db,$id) = split("::",$db_and_id);
1197 :    
1198 :     my $dbmaster = DBMaster->new(-database =>'Ontology');
1199 : mkubal 1.7
1200 : mkubal 1.19 my ($name_title,$name_value,$description_title,$description_value);
1201 :     if($db eq "CDD"){
1202 :     my $cdd_objs = $dbmaster->cdd->get_objects( { 'id' => $id } );
1203 :     if(!scalar(@$cdd_objs)){
1204 :     $name_title = "name";
1205 :     $name_value = "not available";
1206 :     $description_title = "description";
1207 :     $description_value = "not available";
1208 :     }
1209 :     else{
1210 :     my $cdd_obj = $cdd_objs->[0];
1211 :     $name_title = "name";
1212 :     $name_value = $cdd_obj->term;
1213 :     $description_title = "description";
1214 :     $description_value = $cdd_obj->description;
1215 :     }
1216 :     }
1217 : arodri7 1.27
1218 :     my $line_config = { 'title' => $thing->acc,
1219 :     'short_title' => $name_value,
1220 :     'basepair_offset' => '1' };
1221 : mkubal 1.7
1222 : mkubal 1.19 my $name;
1223 :     $name = {"title" => $name_title,
1224 :     "value" => $name_value};
1225 :     push(@$descriptions,$name);
1226 :    
1227 :     my $description;
1228 :     $description = {"title" => $description_title,
1229 :     "value" => $description_value};
1230 :     push(@$descriptions,$description);
1231 : mkubal 1.7
1232 :     my $score;
1233 :     $score = {"title" => "score",
1234 :     "value" => $thing->evalue};
1235 :     push(@$descriptions,$score);
1236 :    
1237 :     my $link_id;
1238 : mkubal 1.12 if ($thing->acc =~/\w+::(\d+)/){
1239 : mkubal 1.7 $link_id = $1;
1240 :     }
1241 :    
1242 :     my $link;
1243 : mkubal 1.12 my $link_url;
1244 :     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"}
1245 :     elsif($thing->class eq "PFAM"){$link_url = "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?$link_id"}
1246 :     else{$link_url = "NO_URL"}
1247 :    
1248 : mkubal 1.7 $link = {"link_title" => $thing->acc,
1249 : mkubal 1.12 "link" => $link_url};
1250 : mkubal 1.7 push(@$links_list,$link);
1251 :    
1252 :     my $element_hash = {
1253 :     "title" => $thing->type,
1254 :     "start" => $thing->start,
1255 :     "end" => $thing->stop,
1256 :     "color"=> $color,
1257 :     "zlayer" => '2',
1258 :     "links_list" => $links_list,
1259 :     "description" => $descriptions};
1260 :    
1261 :     push(@$line_data,$element_hash);
1262 :     $gd->add_line($line_data, $line_config);
1263 :    
1264 :     return $gd;
1265 :    
1266 :     }
1267 : arodri7 1.28
1268 :     sub display_table {
1269 :     my ($self,$dataset) = @_;
1270 :     my $cgi = new CGI;
1271 :     my $data = [];
1272 :     my $count = 0;
1273 :     my $content;
1274 :    
1275 :     foreach my $thing (@$dataset) {
1276 :     next if ($thing->type !~ /dom/);
1277 :     my $single_domain = [];
1278 :     $count++;
1279 :    
1280 :     my $db_and_id = $thing->acc;
1281 :     my ($db,$id) = split("::",$db_and_id);
1282 :    
1283 :     my $dbmaster = DBMaster->new(-database =>'Ontology');
1284 :    
1285 :     my ($name_title,$name_value,$description_title,$description_value);
1286 :     if($db eq "CDD"){
1287 :     my $cdd_objs = $dbmaster->cdd->get_objects( { 'id' => $id } );
1288 :     if(!scalar(@$cdd_objs)){
1289 :     $name_title = "name";
1290 :     $name_value = "not available";
1291 :     $description_title = "description";
1292 :     $description_value = "not available";
1293 :     }
1294 :     else{
1295 :     my $cdd_obj = $cdd_objs->[0];
1296 :     $name_title = "name";
1297 :     $name_value = $cdd_obj->term;
1298 :     $description_title = "description";
1299 :     $description_value = $cdd_obj->description;
1300 :     }
1301 :     }
1302 :    
1303 :     my $location = $thing->start . " - " . $thing->stop;
1304 :    
1305 :     push(@$single_domain,$db);
1306 :     push(@$single_domain,$thing->acc);
1307 :     push(@$single_domain,$name_value);
1308 :     push(@$single_domain,$location);
1309 :     push(@$single_domain,$thing->evalue);
1310 :     push(@$single_domain,$description_value);
1311 :     push(@$data,$single_domain);
1312 :     }
1313 :    
1314 :     if ($count >0){
1315 :     $content = $data;
1316 :     }
1317 :     else
1318 :     {
1319 :     $content = "<p>This PEG does not have any similarities to domains</p>";
1320 :     }
1321 :     }
1322 :    
1323 : mkubal 1.7
1324 : arodri7 1.10 #########################################
1325 :     #########################################
1326 : mkubal 1.12 package Observation::Location;
1327 :    
1328 :     use base qw(Observation);
1329 :    
1330 :     sub new {
1331 :    
1332 :     my ($class,$dataset) = @_;
1333 :     my $self = $class->SUPER::new($dataset);
1334 :     $self->{cleavage_prob} = $dataset->{'cleavage_prob'};
1335 :     $self->{cleavage_loc} = $dataset->{'cleavage_loc'};
1336 :     $self->{signal_peptide_score} = $dataset->{'signal_peptide_score'};
1337 :     $self->{cello_location} = $dataset->{'cello_location'};
1338 :     $self->{cello_score} = $dataset->{'cello_score'};
1339 :     $self->{tmpred_score} = $dataset->{'tmpred_score'};
1340 :     $self->{tmpred_locations} = $dataset->{'tmpred_locations'};
1341 : mkubal 1.30 $self->{phobius_signal_location} = $dataset->{'phobius_signal_location'};
1342 :     $self->{phobius_tm_locations} = $dataset->{'phobius_tm_locations'};
1343 : mkubal 1.12
1344 :     bless($self,$class);
1345 :     return $self;
1346 :     }
1347 :    
1348 :     sub display {
1349 : mkubal 1.24 my ($thing,$gd) = @_;
1350 : mkubal 1.12
1351 : mkubal 1.24 my $fid = $thing->fig_id;
1352 : mkubal 1.12 my $fig= new FIG;
1353 :     my $length = length($fig->get_translation($fid));
1354 :    
1355 :     my $cleavage_prob;
1356 :     if($thing->cleavage_prob){$cleavage_prob = $thing->cleavage_prob;}
1357 :     my ($cleavage_loc_begin,$cleavage_loc_end) = split("-",$thing->cleavage_loc);
1358 :     my $signal_peptide_score = $thing->signal_peptide_score;
1359 :     my $cello_location = $thing->cello_location;
1360 :     my $cello_score = $thing->cello_score;
1361 :     my $tmpred_score = $thing->tmpred_score;
1362 :     my @tmpred_locations = split(",",$thing->tmpred_locations);
1363 :    
1364 : mkubal 1.30 my $phobius_signal_location = $thing->phobius_signal_location;
1365 :     my @phobius_tm_locations = split(",",$thing->phobius_tm_locations);
1366 :    
1367 : mkubal 1.12 my $lines = [];
1368 :    
1369 :     #color is
1370 : arodri7 1.28 my $color = "6";
1371 : mkubal 1.12
1372 :     if($cello_location){
1373 :     my $cello_descriptions = [];
1374 : arodri7 1.28 my $line_data =[];
1375 :    
1376 :     my $line_config = { 'title' => 'Localization Evidence',
1377 :     'short_title' => 'CELLO',
1378 :     'basepair_offset' => '1' };
1379 :    
1380 : mkubal 1.12 my $description_cello_location = {"title" => 'Best Cello Location',
1381 :     "value" => $cello_location};
1382 :    
1383 :     push(@$cello_descriptions,$description_cello_location);
1384 :    
1385 :     my $description_cello_score = {"title" => 'Cello Score',
1386 :     "value" => $cello_score};
1387 :    
1388 :     push(@$cello_descriptions,$description_cello_score);
1389 :    
1390 :     my $element_hash = {
1391 :     "title" => "CELLO",
1392 :     "start" => "1",
1393 :     "end" => $length + 1,
1394 :     "color"=> $color,
1395 :     "type" => 'box',
1396 : arodri7 1.28 "zlayer" => '1',
1397 : mkubal 1.12 "description" => $cello_descriptions};
1398 :    
1399 :     push(@$line_data,$element_hash);
1400 : arodri7 1.28 $gd->add_line($line_data, $line_config);
1401 : mkubal 1.12 }
1402 :    
1403 : arodri7 1.28
1404 :     $color = "2";
1405 : mkubal 1.12 if($tmpred_score){
1406 : arodri7 1.28 my $line_data =[];
1407 :     my $line_config = { 'title' => 'Localization Evidence',
1408 :     'short_title' => 'Transmembrane',
1409 :     'basepair_offset' => '1' };
1410 :    
1411 :    
1412 : mkubal 1.12 foreach my $tmpred (@tmpred_locations){
1413 :     my $descriptions = [];
1414 :     my ($begin,$end) =split("-",$tmpred);
1415 :     my $description_tmpred_score = {"title" => 'TMPRED score',
1416 :     "value" => $tmpred_score};
1417 :    
1418 :     push(@$descriptions,$description_tmpred_score);
1419 :    
1420 :     my $element_hash = {
1421 :     "title" => "transmembrane location",
1422 :     "start" => $begin + 1,
1423 :     "end" => $end + 1,
1424 :     "color"=> $color,
1425 :     "zlayer" => '5',
1426 :     "type" => 'smallbox',
1427 :     "description" => $descriptions};
1428 :    
1429 :     push(@$line_data,$element_hash);
1430 : arodri7 1.28
1431 : mkubal 1.12 }
1432 : arodri7 1.28 $gd->add_line($line_data, $line_config);
1433 : mkubal 1.12 }
1434 :    
1435 : mkubal 1.30 if((scalar(@phobius_tm_locations) > 0) || $phobius_signal_location){
1436 :     my $line_data =[];
1437 :     my $line_config = { 'title' => 'Localization Evidence',
1438 :     'short_title' => 'Phobius',
1439 :     'basepair_offset' => '1' };
1440 :    
1441 :     foreach my $tm_loc (@phobius_tm_locations){
1442 :     my $descriptions = [];
1443 :     my $description_phobius_tm_locations = {"title" => 'Phobius TM Location',
1444 :     "value" => $tm_loc};
1445 :     push(@$descriptions,$description_phobius_tm_locations);
1446 :    
1447 :     my ($begin,$end) =split("-",$tm_loc);
1448 :    
1449 :     my $element_hash = {
1450 :     "title" => "phobius transmembrane location",
1451 :     "start" => $begin + 1,
1452 :     "end" => $end + 1,
1453 :     "color"=> '6',
1454 :     "zlayer" => '4',
1455 :     "type" => 'bigbox',
1456 :     "description" => $descriptions};
1457 :    
1458 :     push(@$line_data,$element_hash);
1459 :    
1460 :     }
1461 :    
1462 :     if($phobius_signal_location){
1463 :     my $descriptions = [];
1464 :     my $description_phobius_signal_location = {"title" => 'Phobius Signal Location',
1465 :     "value" => $phobius_signal_location};
1466 :     push(@$descriptions,$description_phobius_signal_location);
1467 :    
1468 :    
1469 :     my ($begin,$end) =split("-",$phobius_signal_location);
1470 :     my $element_hash = {
1471 :     "title" => "phobius signal locations",
1472 :     "start" => $begin + 1,
1473 :     "end" => $end + 1,
1474 :     "color"=> '1',
1475 :     "zlayer" => '5',
1476 :     "type" => 'box',
1477 :     "description" => $descriptions};
1478 :     push(@$line_data,$element_hash);
1479 :     }
1480 :    
1481 :     $gd->add_line($line_data, $line_config);
1482 :     }
1483 :    
1484 :    
1485 : arodri7 1.28 $color = "1";
1486 : mkubal 1.12 if($signal_peptide_score){
1487 : arodri7 1.28 my $line_data = [];
1488 : mkubal 1.12 my $descriptions = [];
1489 : arodri7 1.28
1490 :     my $line_config = { 'title' => 'Localization Evidence',
1491 :     'short_title' => 'SignalP',
1492 :     'basepair_offset' => '1' };
1493 :    
1494 : mkubal 1.12 my $description_signal_peptide_score = {"title" => 'signal peptide score',
1495 :     "value" => $signal_peptide_score};
1496 :    
1497 :     push(@$descriptions,$description_signal_peptide_score);
1498 :    
1499 :     my $description_cleavage_prob = {"title" => 'cleavage site probability',
1500 :     "value" => $cleavage_prob};
1501 :    
1502 :     push(@$descriptions,$description_cleavage_prob);
1503 :    
1504 :     my $element_hash = {
1505 :     "title" => "SignalP",
1506 :     "start" => $cleavage_loc_begin - 2,
1507 : arodri7 1.28 "end" => $cleavage_loc_end + 1,
1508 : mkubal 1.12 "type" => 'bigbox',
1509 :     "color"=> $color,
1510 :     "zlayer" => '10',
1511 :     "description" => $descriptions};
1512 :    
1513 :     push(@$line_data,$element_hash);
1514 : arodri7 1.28 $gd->add_line($line_data, $line_config);
1515 : mkubal 1.12 }
1516 :    
1517 :     return ($gd);
1518 :    
1519 :     }
1520 :    
1521 :     sub cleavage_loc {
1522 :     my ($self) = @_;
1523 :    
1524 :     return $self->{cleavage_loc};
1525 :     }
1526 :    
1527 :     sub cleavage_prob {
1528 :     my ($self) = @_;
1529 :    
1530 :     return $self->{cleavage_prob};
1531 :     }
1532 :    
1533 :     sub signal_peptide_score {
1534 :     my ($self) = @_;
1535 :    
1536 :     return $self->{signal_peptide_score};
1537 :     }
1538 :    
1539 :     sub tmpred_score {
1540 :     my ($self) = @_;
1541 :    
1542 :     return $self->{tmpred_score};
1543 :     }
1544 :    
1545 :     sub tmpred_locations {
1546 :     my ($self) = @_;
1547 :    
1548 :     return $self->{tmpred_locations};
1549 :     }
1550 :    
1551 :     sub cello_location {
1552 :     my ($self) = @_;
1553 :    
1554 :     return $self->{cello_location};
1555 :     }
1556 :    
1557 :     sub cello_score {
1558 :     my ($self) = @_;
1559 :    
1560 :     return $self->{cello_score};
1561 :     }
1562 :    
1563 : mkubal 1.30 sub phobius_signal_location {
1564 :     my ($self) = @_;
1565 :     return $self->{phobius_signal_location};
1566 :     }
1567 :    
1568 :     sub phobius_tm_locations {
1569 :     my ($self) = @_;
1570 :     return $self->{phobius_tm_locations};
1571 :     }
1572 :    
1573 :    
1574 : mkubal 1.12
1575 :     #########################################
1576 :     #########################################
1577 : arodri7 1.10 package Observation::Sims;
1578 :    
1579 :     use base qw(Observation);
1580 :    
1581 :     sub new {
1582 :    
1583 :     my ($class,$dataset) = @_;
1584 :     my $self = $class->SUPER::new($dataset);
1585 : arodri7 1.11 $self->{identity} = $dataset->{'identity'};
1586 : arodri7 1.10 $self->{acc} = $dataset->{'acc'};
1587 :     $self->{evalue} = $dataset->{'evalue'};
1588 : arodri7 1.11 $self->{qstart} = $dataset->{'qstart'};
1589 :     $self->{qstop} = $dataset->{'qstop'};
1590 :     $self->{hstart} = $dataset->{'hstart'};
1591 :     $self->{hstop} = $dataset->{'hstop'};
1592 :     $self->{database} = $dataset->{'database'};
1593 :     $self->{organism} = $dataset->{'organism'};
1594 :     $self->{function} = $dataset->{'function'};
1595 :     $self->{qlength} = $dataset->{'qlength'};
1596 :     $self->{hlength} = $dataset->{'hlength'};
1597 : arodri7 1.10
1598 :     bless($self,$class);
1599 :     return $self;
1600 :     }
1601 :    
1602 : arodri7 1.25 =head3 display()
1603 :    
1604 :     If available use the function specified here to display a graphical observation.
1605 :     This code will display a graphical view of the similarities using the genome drawer object
1606 :    
1607 :     =cut
1608 :    
1609 :     sub display {
1610 :     my ($self,$gd) = @_;
1611 :    
1612 :     my $fig = new FIG;
1613 :     my $peg = $self->acc;
1614 :    
1615 :     my $organism = $self->organism;
1616 : arodri7 1.28 my $genome = $fig->genome_of($peg);
1617 :     my ($org_tax) = ($genome) =~ /(.*)\./;
1618 : arodri7 1.25 my $function = $self->function;
1619 :     my $abbrev_name = $fig->abbrev($organism);
1620 :     my $align_start = $self->qstart;
1621 :     my $align_stop = $self->qstop;
1622 :     my $hit_start = $self->hstart;
1623 :     my $hit_stop = $self->hstop;
1624 :    
1625 : arodri7 1.28 my $tax_link = "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=" . $org_tax;
1626 :    
1627 :     my $line_config = { 'title' => "$organism [$org_tax]",
1628 : arodri7 1.25 'short_title' => "$abbrev_name",
1629 : arodri7 1.28 'title_link' => '$tax_link',
1630 : arodri7 1.25 'basepair_offset' => '0'
1631 :     };
1632 :    
1633 :     my $line_data = [];
1634 :    
1635 :     my $element_hash;
1636 :     my $links_list = [];
1637 :     my $descriptions = [];
1638 :    
1639 :     # get subsystem information
1640 :     my $url_link = "http://seed-viewer.theseed.org/index.cgi?action=ShowAnnotation&prot=".$peg;
1641 :    
1642 :     my $link;
1643 :     $link = {"link_title" => $peg,
1644 :     "link" => $url_link};
1645 :     push(@$links_list,$link);
1646 :    
1647 :     my @subsystems = $fig->peg_to_subsystems($peg);
1648 :     foreach my $subsystem (@subsystems){
1649 :     my $link;
1650 :     $link = {"link" => "http://seed-viewer.theseed.org/index.cgi?action=ShowSubsystem&subsystem_name=$subsystem",
1651 :     "link_title" => $subsystem};
1652 :     push(@$links_list,$link);
1653 :     }
1654 :    
1655 :     my $description_function;
1656 :     $description_function = {"title" => "function",
1657 :     "value" => $function};
1658 :     push(@$descriptions,$description_function);
1659 :    
1660 : arodri7 1.26 my ($description_ss, $ss_string);
1661 :     $ss_string = join (",", @subsystems);
1662 : arodri7 1.25 $description_ss = {"title" => "subsystems",
1663 :     "value" => $ss_string};
1664 :     push(@$descriptions,$description_ss);
1665 :    
1666 :     my $description_loc;
1667 :     $description_loc = {"title" => "location start",
1668 :     "value" => $hit_start};
1669 :     push(@$descriptions, $description_loc);
1670 :    
1671 :     $description_loc = {"title" => "location stop",
1672 :     "value" => $hit_stop};
1673 :     push(@$descriptions, $description_loc);
1674 :    
1675 :     my $evalue = $self->evalue;
1676 :     while ($evalue =~ /-0/)
1677 :     {
1678 :     my ($chunk1, $chunk2) = split(/-/, $evalue);
1679 :     $chunk2 = substr($chunk2,1);
1680 :     $evalue = $chunk1 . "-" . $chunk2;
1681 :     }
1682 :    
1683 : arodri7 1.26 my $color = &color($evalue);
1684 : arodri7 1.25
1685 :     my $description_eval = {"title" => "E-Value",
1686 :     "value" => $evalue};
1687 :     push(@$descriptions, $description_eval);
1688 :    
1689 :     my $identity = $self->identity;
1690 :     my $description_identity = {"title" => "Identity",
1691 :     "value" => $identity};
1692 :     push(@$descriptions, $description_identity);
1693 :    
1694 :     $element_hash = {
1695 :     "title" => $peg,
1696 :     "start" => $align_start,
1697 :     "end" => $align_stop,
1698 :     "type"=> 'box',
1699 :     "color"=> $color,
1700 :     "zlayer" => "2",
1701 :     "links_list" => $links_list,
1702 :     "description" => $descriptions
1703 :     };
1704 :     push(@$line_data,$element_hash);
1705 :     $gd->add_line($line_data, $line_config);
1706 :    
1707 :     return ($gd);
1708 :    
1709 :     }
1710 :    
1711 : mkubal 1.24 =head3 display_table()
1712 : arodri7 1.10
1713 :     If available use the function specified here to display the "raw" observation.
1714 :     This code will display a table for the similarities protein
1715 :    
1716 :     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.
1717 :    
1718 :     =cut
1719 :    
1720 : mkubal 1.24 sub display_table {
1721 : arodri7 1.31 my ($self,$dataset, $columns, $query_fid) = @_;
1722 : mkubal 1.24
1723 : arodri7 1.10 my $data = [];
1724 :     my $count = 0;
1725 :     my $content;
1726 : arodri7 1.11 my $fig = new FIG;
1727 : mkubal 1.24 my $cgi = new CGI;
1728 : arodri7 1.28 my @ids;
1729 : arodri7 1.10 foreach my $thing (@$dataset) {
1730 : arodri7 1.28 next if ($thing->class ne "SIM");
1731 :     push (@ids, $thing->acc);
1732 :     }
1733 :    
1734 : arodri7 1.31 my (%box_column, %subsystems_column, %evidence_column, %e_identical);
1735 : arodri7 1.29 foreach my $col (@$columns){
1736 :     # get the column for the subsystems
1737 :     if ($col eq "subsystem"){
1738 :     %subsystems_column = &get_subsystems_column(\@ids);
1739 :     }
1740 :     # get the column for the evidence codes
1741 :     elsif ($col eq "evidence"){
1742 :     %evidence_column = &get_evidence_column(\@ids);
1743 :     }
1744 : arodri7 1.28 }
1745 :    
1746 : arodri7 1.31 my %e_identical = &get_essentially_identical($query_fid);
1747 :    
1748 : arodri7 1.28 foreach my $thing (@$dataset) {
1749 :     next if ($thing->class ne "SIM");
1750 : arodri7 1.10 my $single_domain = [];
1751 :     $count++;
1752 :    
1753 : arodri7 1.11 my $id = $thing->acc;
1754 :    
1755 :     my $iden = $thing->identity;
1756 :     my $ln1 = $thing->qlength;
1757 :     my $ln2 = $thing->hlength;
1758 :     my $b1 = $thing->qstart;
1759 :     my $e1 = $thing->qstop;
1760 :     my $b2 = $thing->hstart;
1761 :     my $e2 = $thing->hstop;
1762 :     my $d1 = abs($e1 - $b1) + 1;
1763 :     my $d2 = abs($e2 - $b2) + 1;
1764 :     my $reg1 = "$b1-$e1 (<b>$d1/$ln1</b>)";
1765 :     my $reg2 = "$b2-$e2 (<b>$d2/$ln2</b>)";
1766 :    
1767 : arodri7 1.29 # checkbox column
1768 :     my $field_name = "tables_" . $id;
1769 :     my $pair_name = "visual_" . $id;
1770 :     my $box_col = qq(<input type=checkbox name=seq value="$id" id="$field_name" onClick="VisualCheckPair('$field_name', '$pair_name');">);
1771 : arodri7 1.31
1772 :     # get the linked fig id
1773 :     my $fig_col;
1774 :     if (defined ($e_identical{$id})){
1775 :     $fig_col = &HTML::set_prot_links($cgi,$id) . "*";
1776 :     }
1777 :     else{
1778 :     $fig_col = &HTML::set_prot_links($cgi,$id);
1779 : arodri7 1.28 }
1780 :    
1781 : arodri7 1.29 push(@$single_domain,$box_col); # permanent column
1782 : arodri7 1.31 push(@$single_domain,$fig_col); # permanent column
1783 : arodri7 1.29 push(@$single_domain,$thing->evalue); # permanent column
1784 :     push(@$single_domain,"$iden\%"); # permanent column
1785 :     push(@$single_domain,$reg1); # permanent column
1786 :     push(@$single_domain,$reg2); # permanent column
1787 :     push(@$single_domain,$thing->organism); # permanent column
1788 :     push(@$single_domain,$thing->function); # permanent column
1789 :     push(@$single_domain,$subsystems_column{$id}) if (grep (/subsystem/, @$columns));
1790 :     push(@$single_domain,$evidence_column{$id}) if (grep (/evidence/, @$columns));
1791 : arodri7 1.31 push(@$single_domain,&get_prefer($thing->acc, 'NCBI')) if (grep (/ncbi_id/, @$columns));
1792 :     push(@$single_domain,&get_prefer($thing->acc, 'RefSeq')) if (grep (/refseq_id/, @$columns));
1793 :     push(@$single_domain,&get_prefer($thing->acc, 'SwissProt')) if (grep (/swissprot_id/, @$columns));
1794 :     push(@$single_domain,&get_prefer($thing->acc, 'UniProt')) if (grep (/uniprot_id/, @$columns));
1795 :     push(@$single_domain,&get_prefer($thing->acc, 'TIGR')) if (grep (/tigr_id/, @$columns));
1796 :     push(@$single_domain,&get_prefer($thing->acc, 'PIR')) if (grep (/pir_id/, @$columns));
1797 :     push(@$single_domain,&get_prefer($thing->acc, 'KEGG')) if (grep (/kegg_id/, @$columns));
1798 :     push(@$single_domain,&get_prefer($thing->acc, 'TrEMBL')) if (grep (/trembl_id/, @$columns));
1799 :     push(@$single_domain,&get_prefer($thing->acc, 'ASAP')) if (grep (/asap_id/, @$columns));
1800 :     push(@$single_domain,&get_prefer($thing->acc, 'JGI')) if (grep (/jgi_id/, @$columns));
1801 : arodri7 1.10 push(@$data,$single_domain);
1802 :     }
1803 :    
1804 : arodri7 1.26 if ($count >0 ){
1805 :     $content = $data;
1806 : arodri7 1.10 }
1807 : arodri7 1.26 else{
1808 : arodri7 1.10 $content = "<p>This PEG does not have any similarities</p>";
1809 :     }
1810 :     return ($content);
1811 :     }
1812 : arodri7 1.11
1813 : arodri7 1.29 sub get_box_column{
1814 :     my ($ids) = @_;
1815 :     my %column;
1816 :     foreach my $id (@$ids){
1817 :     my $field_name = "tables_" . $id;
1818 :     my $pair_name = "visual_" . $id;
1819 :     $column{$id} = qq(<input type=checkbox name=seq value="$id" id="$field_name" onClick="VisualCheckPair('$field_name', '$pair_name');">);
1820 :     }
1821 :     return (%column);
1822 :     }
1823 :    
1824 :     sub get_subsystems_column{
1825 :     my ($ids) = @_;
1826 :    
1827 :     my $fig = new FIG;
1828 :     my $cgi = new CGI;
1829 :     my %in_subs = $fig->subsystems_for_pegs($ids);
1830 :     my %column;
1831 :     foreach my $id (@$ids){
1832 :     my @in_sub = $in_subs{$id} if (defined $in_subs{$id});
1833 :     my $in_sub;
1834 :    
1835 :     if (@in_sub > 0) {
1836 :     $in_sub = @in_sub;
1837 :    
1838 :     # RAE: add a javascript popup with all the subsystems
1839 :     my $ss_list=join "<br>", map { my $g = $_; $g =~ s/\_/ /g; $_ = $g } sort {$a cmp $b} @in_sub;
1840 :     $column{$id} = $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);
1841 :     } else {
1842 :     $column{$id} = "&nbsp;";
1843 :     }
1844 :     }
1845 :     return (%column);
1846 :     }
1847 :    
1848 : arodri7 1.31 sub get_essentially_identical{
1849 :     my ($fid) = @_;
1850 :     my $fig = new FIG;
1851 :    
1852 :     my %id_list;
1853 :     my @maps_to = grep { $_ ne $fid and $_ !~ /^xxx/ } map { $_->[0] } $fig->mapped_prot_ids($fid);
1854 :    
1855 :     foreach my $id (@maps_to) {
1856 :     if (($id ne $fid) && ($fig->function_of($id))) {
1857 :     $id_list{$id} = 1;
1858 :     }
1859 :     }
1860 :     return(%id_list);
1861 :     }
1862 :    
1863 :    
1864 : arodri7 1.29 sub get_evidence_column{
1865 :     my ($ids) = @_;
1866 :     my $fig = new FIG;
1867 :     my $cgi = new CGI;
1868 :     my (%column, %code_attributes);
1869 :    
1870 :     my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes($ids);
1871 :     foreach my $key (@codes){
1872 :     push (@{$code_attributes{$$key[0]}}, $key);
1873 :     }
1874 :    
1875 :     foreach my $id (@$ids){
1876 :     # add evidence code with tool tip
1877 :     my $ev_codes=" &nbsp; ";
1878 :     my @ev_codes = "";
1879 :    
1880 :     if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {
1881 :     my @codes;
1882 :     @codes = @{$code_attributes{$id}} if (defined @{$code_attributes{$id}});
1883 :     @ev_codes = ();
1884 :     foreach my $code (@codes) {
1885 :     my $pretty_code = $code->[2];
1886 :     if ($pretty_code =~ /;/) {
1887 :     my ($cd, $ss) = split(";", $code->[2]);
1888 :     $ss =~ s/_/ /g;
1889 :     $pretty_code = $cd;# . " in " . $ss;
1890 :     }
1891 :     push(@ev_codes, $pretty_code);
1892 :     }
1893 :     }
1894 :    
1895 :     if (scalar(@ev_codes) && $ev_codes[0]) {
1896 :     my $ev_code_help=join("<br />", map {&HTML::evidence_codes_explain($_)} @ev_codes);
1897 :     $ev_codes = $cgi->a(
1898 :     {
1899 :     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));
1900 :     }
1901 :     $column{$id}=$ev_codes;
1902 :     }
1903 :     return (%column);
1904 :     }
1905 :    
1906 : arodri7 1.11 sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }
1907 : mkubal 1.12
1908 : arodri7 1.28 sub get_prefer {
1909 :     my ($fid, $db) = @_;
1910 :     my $fig = new FIG;
1911 : arodri7 1.31 my $cgi = new CGI;
1912 :    
1913 : arodri7 1.28 my @aliases = $fig->feature_aliases($fid);
1914 :    
1915 :     foreach my $alias (@aliases){
1916 :     my $id_db = &Observation::get_database($alias);
1917 :     if ($id_db eq $db){
1918 : arodri7 1.31 my $acc_col .= &HTML::set_prot_links($cgi,$alias);
1919 :     return ($acc_col);
1920 : arodri7 1.28 }
1921 :     }
1922 : arodri7 1.31 return (" ");
1923 : arodri7 1.28 }
1924 :    
1925 : arodri7 1.26 sub color {
1926 :     my ($evalue) = @_;
1927 :    
1928 :     my $color;
1929 : arodri7 1.28 if ($evalue <= 1e-170){
1930 :     $color = 51;
1931 :     }
1932 :     elsif (($evalue <= 1e-120) && ($evalue > 1e-170)){
1933 :     $color = 52;
1934 :     }
1935 :     elsif (($evalue <= 1e-90) && ($evalue > 1e-120)){
1936 :     $color = 53;
1937 :     }
1938 :     elsif (($evalue <= 1e-70) && ($evalue > 1e-90)){
1939 :     $color = 54;
1940 : arodri7 1.26 }
1941 : arodri7 1.28 elsif (($evalue <= 1e-40) && ($evalue > 1e-70)){
1942 :     $color = 55;
1943 : arodri7 1.26 }
1944 : arodri7 1.28 elsif (($evalue <= 1e-20) && ($evalue > 1e-40)){
1945 :     $color = 56;
1946 : arodri7 1.26 }
1947 : arodri7 1.28 elsif (($evalue <= 1e-5) && ($evalue > 1e-20)){
1948 :     $color = 57;
1949 : arodri7 1.26 }
1950 : arodri7 1.28 elsif (($evalue <= 1) && ($evalue > 1e-5)){
1951 :     $color = 58;
1952 :     }
1953 :     elsif (($evalue <= 10) && ($evalue > 1)){
1954 :     $color = 59;
1955 : arodri7 1.26 }
1956 :     else{
1957 : arodri7 1.28 $color = 60;
1958 : arodri7 1.26 }
1959 : arodri7 1.28
1960 :    
1961 : arodri7 1.26 return ($color);
1962 :     }
1963 : arodri7 1.13
1964 :    
1965 :     ############################
1966 :     package Observation::Cluster;
1967 :    
1968 :     use base qw(Observation);
1969 :    
1970 :     sub new {
1971 :    
1972 :     my ($class,$dataset) = @_;
1973 :     my $self = $class->SUPER::new($dataset);
1974 : mkubal 1.24 $self->{context} = $dataset->{'context'};
1975 : arodri7 1.13 bless($self,$class);
1976 :     return $self;
1977 :     }
1978 :    
1979 :     sub display {
1980 : mkubal 1.24 my ($self,$gd) = @_;
1981 :    
1982 :     my $fid = $self->fig_id;
1983 :     my $compare_or_coupling = $self->context;
1984 :     my $gd_window_size = $gd->window_size;
1985 : arodri7 1.13 my $fig = new FIG;
1986 : mkubal 1.14 my $all_regions = [];
1987 : arodri7 1.13
1988 :     #get the organism genome
1989 : mkubal 1.14 my $target_genome = $fig->genome_of($fid);
1990 : arodri7 1.13
1991 :     # get location of the gene
1992 :     my $data = $fig->feature_location($fid);
1993 :     my ($contig, $beg, $end);
1994 : arodri7 1.22 my %reverse_flag;
1995 : arodri7 1.13
1996 :     if ($data =~ /(.*)_(\d+)_(\d+)$/){
1997 :     $contig = $1;
1998 :     $beg = $2;
1999 :     $end = $3;
2000 :     }
2001 :    
2002 : arodri7 1.22 my $offset;
2003 : arodri7 1.13 my ($region_start, $region_end);
2004 :     if ($beg < $end)
2005 :     {
2006 :     $region_start = $beg - 4000;
2007 :     $region_end = $end+4000;
2008 : arodri7 1.22 $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
2009 : arodri7 1.13 }
2010 :     else
2011 :     {
2012 : arodri7 1.21 $region_start = $end-4000;
2013 :     $region_end = $beg+4000;
2014 : arodri7 1.22 $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
2015 : arodri7 1.25 $reverse_flag{$target_genome} = $fid;
2016 : arodri7 1.21 }
2017 : arodri7 1.13
2018 :     # call genes in region
2019 : arodri7 1.16 my ($target_gene_features, $reg_beg, $reg_end) = $fig->genes_in_region($target_genome, $contig, $region_start, $region_end);
2020 : mkubal 1.14 push(@$all_regions,$target_gene_features);
2021 : arodri7 1.16 my (@start_array_region);
2022 : arodri7 1.22 push (@start_array_region, $offset);
2023 : mkubal 1.14
2024 :     my %all_genes;
2025 :     my %all_genomes;
2026 : arodri7 1.25 foreach my $feature (@$target_gene_features){ $all_genes{$feature} = $fid;}
2027 : arodri7 1.16
2028 : mkubal 1.24 if ($compare_or_coupling eq "diverse")
2029 : arodri7 1.25 {
2030 : arodri7 1.21 my @coup = grep { $_->[1]} $fig->coupling_and_evidence($fid,5000,1e-10,4,1);
2031 :    
2032 :     my $coup_count = 0;
2033 :    
2034 :     foreach my $pair (@{$coup[0]->[2]}) {
2035 :     # last if ($coup_count > 10);
2036 :     my ($peg1,$peg2) = @$pair;
2037 : arodri7 1.22
2038 :     my ($pair_contig,$pair_beg,$pair_end,$pair_region_start,$pair_region_stop,$pair_genome);
2039 :     $pair_genome = $fig->genome_of($peg1);
2040 : arodri7 1.21
2041 :     my $location = $fig->feature_location($peg1);
2042 :     if($location =~/(.*)_(\d+)_(\d+)$/){
2043 :     $pair_contig = $1;
2044 :     $pair_beg = $2;
2045 :     $pair_end = $3;
2046 :     if ($pair_beg < $pair_end)
2047 :     {
2048 :     $pair_region_start = $pair_beg - 4000;
2049 :     $pair_region_stop = $pair_end+4000;
2050 : arodri7 1.22 $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
2051 : arodri7 1.21 }
2052 :     else
2053 :     {
2054 :     $pair_region_start = $pair_end-4000;
2055 :     $pair_region_stop = $pair_beg+4000;
2056 : arodri7 1.22 $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
2057 : arodri7 1.25 $reverse_flag{$pair_genome} = $peg1;
2058 : arodri7 1.21 }
2059 :    
2060 : arodri7 1.22 push (@start_array_region, $offset);
2061 : arodri7 1.21
2062 :     $all_genomes{$pair_genome} = 1;
2063 :     my ($pair_features) = $fig->genes_in_region($pair_genome, $pair_contig, $pair_region_start, $pair_region_stop);
2064 :     push(@$all_regions,$pair_features);
2065 : arodri7 1.25 foreach my $pair_feature (@$pair_features){ $all_genes{$pair_feature} = $peg1;}
2066 : arodri7 1.21 }
2067 :     $coup_count++;
2068 :     }
2069 :     }
2070 : arodri7 1.16
2071 : mkubal 1.24 elsif ($compare_or_coupling eq "close")
2072 : arodri7 1.21 {
2073 :     # make a hash of genomes that are phylogenetically close
2074 :     #my $close_threshold = ".26";
2075 :     #my @genomes = $fig->genomes('complete');
2076 :     #my %close_genomes = ();
2077 :     #foreach my $compared_genome (@genomes)
2078 :     #{
2079 :     # my $dist = $fig->crude_estimate_of_distance($target_genome,$compared_genome);
2080 :     # #$close_genomes{$compared_genome} = $dist;
2081 :     # if ($dist <= $close_threshold)
2082 :     # {
2083 :     # $all_genomes{$compared_genome} = 1;
2084 :     # }
2085 :     #}
2086 :     $all_genomes{"216592.1"} = 1;
2087 :     $all_genomes{"79967.1"} = 1;
2088 :     $all_genomes{"199310.1"} = 1;
2089 :     $all_genomes{"216593.1"} = 1;
2090 :     $all_genomes{"155864.1"} = 1;
2091 :     $all_genomes{"83334.1"} = 1;
2092 :     $all_genomes{"316407.3"} = 1;
2093 :    
2094 :     foreach my $comp_genome (keys %all_genomes){
2095 :     my $return = $fig->bbh_list($comp_genome,[$fid]);
2096 :     my $feature_list = $return->{$fid};
2097 :     foreach my $peg1 (@$feature_list){
2098 :     my $location = $fig->feature_location($peg1);
2099 :     my ($pair_contig,$pair_beg,$pair_end,$pair_region_start,$pair_region_stop,$pair_genome);
2100 : arodri7 1.22 $pair_genome = $fig->genome_of($peg1);
2101 :    
2102 : arodri7 1.21 if($location =~/(.*)_(\d+)_(\d+)$/){
2103 :     $pair_contig = $1;
2104 :     $pair_beg = $2;
2105 :     $pair_end = $3;
2106 :     if ($pair_beg < $pair_end)
2107 :     {
2108 :     $pair_region_start = $pair_beg - 4000;
2109 :     $pair_region_stop = $pair_end + 4000;
2110 : arodri7 1.22 $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
2111 : arodri7 1.21 }
2112 :     else
2113 :     {
2114 :     $pair_region_start = $pair_end-4000;
2115 :     $pair_region_stop = $pair_beg+4000;
2116 : arodri7 1.22 $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
2117 : arodri7 1.25 $reverse_flag{$pair_genome} = $peg1;
2118 : arodri7 1.21 }
2119 :    
2120 : arodri7 1.22 push (@start_array_region, $offset);
2121 : arodri7 1.21 $all_genomes{$pair_genome} = 1;
2122 :     my ($pair_features) = $fig->genes_in_region($pair_genome, $pair_contig, $pair_region_start, $pair_region_stop);
2123 :     push(@$all_regions,$pair_features);
2124 : arodri7 1.25 foreach my $pair_feature (@$pair_features){ $all_genes{$pair_feature} = $peg1;}
2125 : arodri7 1.21 }
2126 : mkubal 1.14 }
2127 : arodri7 1.16 }
2128 : mkubal 1.14 }
2129 :    
2130 : arodri7 1.21 # get the PCH to each of the genes
2131 :     my $pch_sets = [];
2132 :     my %pch_already;
2133 :     foreach my $gene_peg (keys %all_genes)
2134 :     {
2135 :     if ($pch_already{$gene_peg}){next;};
2136 :     my $gene_set = [$gene_peg];
2137 :     foreach my $pch_peg ($fig->in_pch_pin_with($gene_peg)) {
2138 :     $pch_peg =~ s/,.*$//;
2139 :     my $pch_genome = $fig->genome_of($pch_peg);
2140 :     if ( ($gene_peg ne $pch_peg) && ($all_genomes{$pch_genome})) {
2141 :     push(@$gene_set,$pch_peg);
2142 :     $pch_already{$pch_peg}=1;
2143 : mkubal 1.14 }
2144 : arodri7 1.21 $pch_already{$gene_peg}=1;
2145 : mkubal 1.14 }
2146 : arodri7 1.21 push(@$pch_sets,$gene_set);
2147 : mkubal 1.14 }
2148 : arodri7 1.21
2149 :     #create a rank of the pch's
2150 :     my %pch_set_rank;
2151 : mkubal 1.14 my $order = 0;
2152 : arodri7 1.21 foreach my $set (@$pch_sets){
2153 : mkubal 1.14 my $count = scalar(@$set);
2154 : arodri7 1.21 $pch_set_rank{$order} = $count;
2155 : mkubal 1.14 $order++;
2156 :     }
2157 : arodri7 1.21
2158 : mkubal 1.14 my %peg_rank;
2159 :     my $counter = 1;
2160 : arodri7 1.21 foreach my $pch_order (sort {$pch_set_rank{$b} <=> $pch_set_rank{$a}} keys %pch_set_rank){
2161 :     my $good_set = @$pch_sets[$pch_order];
2162 : arodri7 1.18 my $flag_set = 0;
2163 :     if (scalar (@$good_set) > 1)
2164 :     {
2165 :     foreach my $peg (@$good_set){
2166 :     if ((!$peg_rank{$peg})){
2167 :     $peg_rank{$peg} = $counter;
2168 :     $flag_set = 1;
2169 :     }
2170 :     }
2171 :     $counter++ if ($flag_set == 1);
2172 :     }
2173 :     else
2174 :     {
2175 :     foreach my $peg (@$good_set){
2176 : arodri7 1.26 $peg_rank{$peg} = "20";
2177 : mkubal 1.17 }
2178 : mkubal 1.14 }
2179 :     }
2180 : arodri7 1.21
2181 :    
2182 :     # my $bbh_sets = [];
2183 :     # my %already;
2184 :     # foreach my $gene_key (keys(%all_genes)){
2185 :     # if($already{$gene_key}){next;}
2186 :     # my $gene_set = [$gene_key];
2187 :     #
2188 :     # my $gene_key_genome = $fig->genome_of($gene_key);
2189 :     #
2190 :     # foreach my $genome_key (keys(%all_genomes)){
2191 :     # #next if ($gene_key_genome eq $genome_key);
2192 :     # my $return = $fig->bbh_list($genome_key,[$gene_key]);
2193 :     #
2194 :     # my $feature_list = $return->{$gene_key};
2195 :     # foreach my $fl (@$feature_list){
2196 :     # push(@$gene_set,$fl);
2197 :     # }
2198 :     # }
2199 :     # $already{$gene_key} = 1;
2200 :     # push(@$bbh_sets,$gene_set);
2201 :     # }
2202 :     #
2203 :     # my %bbh_set_rank;
2204 :     # my $order = 0;
2205 :     # foreach my $set (@$bbh_sets){
2206 :     # my $count = scalar(@$set);
2207 :     # $bbh_set_rank{$order} = $count;
2208 :     # $order++;
2209 :     # }
2210 :     #
2211 :     # my %peg_rank;
2212 :     # my $counter = 1;
2213 :     # foreach my $bbh_order (sort {$bbh_set_rank{$b} <=> $bbh_set_rank{$a}} keys %bbh_set_rank){
2214 :     # my $good_set = @$bbh_sets[$bbh_order];
2215 :     # my $flag_set = 0;
2216 :     # if (scalar (@$good_set) > 1)
2217 :     # {
2218 :     # foreach my $peg (@$good_set){
2219 :     # if ((!$peg_rank{$peg})){
2220 :     # $peg_rank{$peg} = $counter;
2221 :     # $flag_set = 1;
2222 :     # }
2223 :     # }
2224 :     # $counter++ if ($flag_set == 1);
2225 :     # }
2226 :     # else
2227 :     # {
2228 :     # foreach my $peg (@$good_set){
2229 : arodri7 1.26 # $peg_rank{$peg} = "20";
2230 : arodri7 1.21 # }
2231 :     # }
2232 :     # }
2233 : arodri7 1.18
2234 : mkubal 1.14 foreach my $region (@$all_regions){
2235 :     my $sample_peg = @$region[0];
2236 :     my $region_genome = $fig->genome_of($sample_peg);
2237 :     my $region_gs = $fig->genus_species($region_genome);
2238 : arodri7 1.18 my $abbrev_name = $fig->abbrev($region_gs);
2239 : arodri7 1.16 my $line_config = { 'title' => $region_gs,
2240 : arodri7 1.18 'short_title' => $abbrev_name,
2241 : arodri7 1.16 'basepair_offset' => '0'
2242 :     };
2243 :    
2244 : arodri7 1.22 my $offsetting = shift @start_array_region;
2245 : arodri7 1.16
2246 : arodri7 1.25 my $second_line_config = { 'title' => "$region_gs",
2247 :     'short_title' => "",
2248 :     'basepair_offset' => '0'
2249 :     };
2250 :    
2251 : mkubal 1.14 my $line_data = [];
2252 : arodri7 1.25 my $second_line_data = [];
2253 :    
2254 :     # initialize variables to check for overlap in genes
2255 :     my ($prev_start, $prev_stop, $prev_fig, $second_line_flag);
2256 :     my $major_line_flag = 0;
2257 :     my $prev_second_flag = 0;
2258 :    
2259 : arodri7 1.16 foreach my $fid1 (@$region){
2260 : arodri7 1.25 $second_line_flag = 0;
2261 : mkubal 1.14 my $element_hash;
2262 :     my $links_list = [];
2263 :     my $descriptions = [];
2264 :    
2265 : arodri7 1.16 my $color = $peg_rank{$fid1};
2266 : arodri7 1.26
2267 : arodri7 1.18 # get subsystem information
2268 :     my $function = $fig->function_of($fid1);
2269 :     my $url_link = "http://seed-viewer.theseed.org/index.cgi?action=ShowAnnotation&prot=".$fid1;
2270 :    
2271 :     my $link;
2272 :     $link = {"link_title" => $fid1,
2273 :     "link" => $url_link};
2274 :     push(@$links_list,$link);
2275 :    
2276 :     my @subsystems = $fig->peg_to_subsystems($fid1);
2277 :     foreach my $subsystem (@subsystems){
2278 :     my $link;
2279 :     $link = {"link" => "http://seed-viewer.theseed.org/index.cgi?action=ShowSubsystem&subsystem_name=$subsystem",
2280 :     "link_title" => $subsystem};
2281 :     push(@$links_list,$link);
2282 :     }
2283 :    
2284 :     my $description_function;
2285 :     $description_function = {"title" => "function",
2286 :     "value" => $function};
2287 :     push(@$descriptions,$description_function);
2288 :    
2289 :     my $description_ss;
2290 :     my $ss_string = join (",", @subsystems);
2291 :     $description_ss = {"title" => "subsystems",
2292 :     "value" => $ss_string};
2293 :     push(@$descriptions,$description_ss);
2294 :    
2295 : arodri7 1.16
2296 :     my $fid_location = $fig->feature_location($fid1);
2297 : mkubal 1.14 if($fid_location =~/(.*)_(\d+)_(\d+)$/){
2298 :     my($start,$stop);
2299 : arodri7 1.22 $start = $2 - $offsetting;
2300 :     $stop = $3 - $offsetting;
2301 : arodri7 1.25
2302 :     if ( (($prev_start) && ($prev_stop) ) &&
2303 :     ( ($start < $prev_start) || ($start < $prev_stop) ||
2304 :     ($stop < $prev_start) || ($stop < $prev_stop) )){
2305 :     if (($second_line_flag == 0) && ($prev_second_flag == 0)) {
2306 :     $second_line_flag = 1;
2307 :     $major_line_flag = 1;
2308 :     }
2309 :     }
2310 :     $prev_start = $start;
2311 :     $prev_stop = $stop;
2312 :     $prev_fig = $fid1;
2313 :    
2314 :     if ((defined($reverse_flag{$region_genome})) && ($reverse_flag{$region_genome} eq $all_genes{$fid1})){
2315 : arodri7 1.22 $start = $gd_window_size - $start;
2316 :     $stop = $gd_window_size - $stop;
2317 :     }
2318 :    
2319 : mkubal 1.14 $element_hash = {
2320 : arodri7 1.16 "title" => $fid1,
2321 : mkubal 1.14 "start" => $start,
2322 :     "end" => $stop,
2323 :     "type"=> 'arrow',
2324 :     "color"=> $color,
2325 : arodri7 1.18 "zlayer" => "2",
2326 :     "links_list" => $links_list,
2327 :     "description" => $descriptions
2328 : mkubal 1.14 };
2329 : arodri7 1.25
2330 :     # if there is an overlap, put into second line
2331 :     if ($second_line_flag == 1){ push(@$second_line_data,$element_hash); $prev_second_flag = 1;}
2332 :     else{ push(@$line_data,$element_hash); $prev_second_flag = 0;}
2333 :    
2334 : mkubal 1.14 }
2335 :     }
2336 :     $gd->add_line($line_data, $line_config);
2337 : arodri7 1.25 $gd->add_line($second_line_data, $second_line_config) if ($major_line_flag == 1);
2338 : mkubal 1.14 }
2339 :     return $gd;
2340 :     }
2341 :    
2342 :    

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3