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

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3