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

Diff of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8, Tue Jun 19 22:11:25 2007 UTC revision 1.23, Fri Jun 29 16:31:35 2007 UTC
# Line 1  Line 1 
1  package Observation;  package Observation;
2    
3    use lib '/vol/ontologies';
4    use DBMaster;
5    
6  require Exporter;  require Exporter;
7  @EXPORT_OK = qw(get_objects);  @EXPORT_OK = qw(get_objects);
8    
9    use FIG_Config;
10  use strict;  use strict;
11  use warnings;  #use warnings;
12  use Table;  use HTML;
13    
14  1;  1;
15    
# Line 24  Line 28 
28    
29  Example:  Example:
30    
31    
32  use FIG;  use FIG;
33  use Observation;  use Observation;
34    
# Line 101  Line 106 
106    
107  =over 9  =over 9
108    
109    =item IDENTICAL (seq)
110    
111  =item SIM (seq)  =item SIM (seq)
112    
113  =item BBH (seq)  =item BBH (seq)
# Line 115  Line 122 
122    
123  =item PFAM (dom)  =item PFAM (dom)
124    
125  =item SIGNALP (dom)  =item SIGNALP_CELLO_TMPRED (loc)
126    
127  =item  CELLO(loc)  =item PDB (seq)
128    
129  =item TMHMM (loc)  =item TMHMM (loc)
130    
# Line 183  Line 190 
190    return $self->{stop};    return $self->{stop};
191  }  }
192    
193    =head3 start()
194    
195    Start of hit in query sequence.
196    
197    =cut
198    
199    sub qstart {
200        my ($self) = @_;
201    
202        return $self->{qstart};
203    }
204    
205    =head3 qstop()
206    
207    End of the hit in query sequence.
208    
209    =cut
210    
211    sub qstop {
212        my ($self) = @_;
213    
214        return $self->{qstop};
215    }
216    
217    =head3 hstart()
218    
219    Start of hit in hit sequence.
220    
221    =cut
222    
223    sub hstart {
224        my ($self) = @_;
225    
226        return $self->{hstart};
227    }
228    
229    =head3 end()
230    
231    End of the hit in hit sequence.
232    
233    =cut
234    
235    sub hstop {
236        my ($self) = @_;
237    
238        return $self->{hstop};
239    }
240    
241    =head3 qlength()
242    
243    length of the query sequence in similarities
244    
245    =cut
246    
247    sub qlength {
248        my ($self) = @_;
249    
250        return $self->{qlength};
251    }
252    
253    =head3 hlength()
254    
255    length of the hit sequence in similarities
256    
257    =cut
258    
259    sub hlength {
260        my ($self) = @_;
261    
262        return $self->{hlength};
263    }
264    
265    
266    
267  =head3 evalue()  =head3 evalue()
268    
269  E-value or P-Value if present.  E-value or P-Value if present.
# Line 210  Line 291 
291  }  }
292    
293    
294  =head3 display_method()  =head3 display()
   
 If available use the function specified here to display the "raw" observation.  
 In the case of a BLAST alignment of fid1 and fid2 a cgi script  
 will be called to display the results of running the command "bl2seq fid1 fid2".  
295    
296  B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evidence.  will be different for each type
297    
298  =cut  =cut
299    
# Line 320  Line 397 
397  sub get_objects {  sub get_objects {
398      my ($self,$fid,$classes) = @_;      my ($self,$fid,$classes) = @_;
399    
   
400      my $objects = [];      my $objects = [];
401      my @matched_datasets=();      my @matched_datasets=();
402    
# Line 334  Line 410 
410          get_functional_coupling($fid,\@matched_datasets);          get_functional_coupling($fid,\@matched_datasets);
411      }      }
412      else{      else{
         #IPR,CDD,CELLO,PFAM,SIGNALP - attribute based  
413          my %domain_classes;          my %domain_classes;
414            my $identical_flag=0;
415            my $pch_flag=0;
416            my $location_flag = 0;
417            my $sims_flag=0;
418            my $cluster_flag = 0;
419            my $pdb_flag = 0;
420          foreach my $class (@$classes){          foreach my $class (@$classes){
421              if($class =~/(IPR|CDD|PFAM)/){              if($class =~/(IPR|CDD|PFAM)/){
422                  $domain_classes{$class} = 1;                  $domain_classes{$class} = 1;
423                }
424                elsif ($class eq "IDENTICAL")
425                {
426                    $identical_flag = 1;
427                }
428                elsif ($class eq "PCH")
429                {
430                    $pch_flag = 1;
431                }
432                elsif ($class =~/(SIGNALP_CELLO_TMPRED)/)
433                {
434                    $location_flag = 1;
435                }
436                elsif ($class eq "SIM")
437                {
438                    $sims_flag = 1;
439                }
440                elsif ($class eq "CLUSTER")
441                {
442                    $cluster_flag = 1;
443                }
444                elsif ($class eq "PDB")
445                {
446                    $pdb_flag = 1;
447                }
448    
449              }              }
450    
451            if ($identical_flag ==1)
452            {
453                get_identical_proteins($fid,\@matched_datasets);
454          }          }
455            if ( (defined($domain_classes{IPR})) || (defined($domain_classes{CDD})) || (defined($domain_classes{PFAM})) ) {
456          get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);          get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);
457            }
458            if ($pch_flag == 1)
459            {
460                get_functional_coupling($fid,\@matched_datasets);
461            }
462            if ($sims_flag == 1)
463            {
464                get_sims_observations($fid,\@matched_datasets);
465            }
466    
467            if ($location_flag == 1)
468            {
469                get_attribute_based_location_observations($fid,\@matched_datasets);
470            }
471            if ($cluster_flag == 1)
472            {
473                get_cluster_observations($fid,\@matched_datasets);
474            }
475            if ($pdb_flag == 1)
476            {
477                get_pdb_observations($fid,\@matched_datasets);
478            }
479    
480    
         #add CELLO and SignalP later  
481      }      }
482    
483      foreach my $dataset (@matched_datasets) {      foreach my $dataset (@matched_datasets) {
# Line 352  Line 485 
485          if($dataset->{'type'} eq "dom"){          if($dataset->{'type'} eq "dom"){
486              $object = Observation::Domain->new($dataset);              $object = Observation::Domain->new($dataset);
487          }          }
488            if($dataset->{'class'} eq "PCH"){
489                $object = Observation::FC->new($dataset);
490            }
491            if ($dataset->{'class'} eq "IDENTICAL"){
492                $object = Observation::Identical->new($dataset);
493            }
494            if ($dataset->{'class'} eq "SIGNALP_CELLO_TMPRED"){
495                $object = Observation::Location->new($dataset);
496            }
497            if ($dataset->{'class'} eq "SIM"){
498                $object = Observation::Sims->new($dataset);
499            }
500            if ($dataset->{'class'} eq "CLUSTER"){
501                $object = Observation::Cluster->new($dataset);
502            }
503            if ($dataset->{'class'} eq "PDB"){
504                $object = Observation::PDB->new($dataset);
505            }
506    
507          push (@$objects, $object);          push (@$objects, $object);
508      }      }
509    
# Line 470  Line 622 
622      }      }
623  }  }
624    
625    sub get_attribute_based_location_observations{
626    
627        my ($fid,$datasets_ref) = (@_);
628        my $fig = new FIG;
629    
630        my $location_attributes = ['SignalP','CELLO','TMPRED'];
631    
632        my $dataset = {'type' => "loc", 'class' => 'SIGNALP_CELLO_TMPRED'};
633        foreach my $attr_ref ($fig->get_attributes($fid,$location_attributes)) {
634            my $key = @$attr_ref[1];
635            my @parts = split("::",$key);
636            my $sub_class = $parts[0];
637            my $sub_key = $parts[1];
638            my $value = @$attr_ref[2];
639            if($sub_class eq "SignalP"){
640                if($sub_key eq "cleavage_site"){
641                    my @value_parts = split(";",$value);
642                    $dataset->{'cleavage_prob'} = $value_parts[0];
643                    $dataset->{'cleavage_loc'} = $value_parts[1];
644                }
645                elsif($sub_key eq "signal_peptide"){
646                    $dataset->{'signal_peptide_score'} = $value;
647                }
648            }
649            elsif($sub_class eq "CELLO"){
650                $dataset->{'cello_location'} = $sub_key;
651                $dataset->{'cello_score'} = $value;
652            }
653            elsif($sub_class eq "TMPRED"){
654                my @value_parts = split(";",$value);
655                $dataset->{'tmpred_score'} = $value_parts[0];
656                $dataset->{'tmpred_locations'} = $value_parts[1];
657            }
658        }
659    
660        push (@{$datasets_ref} ,$dataset);
661    
662    }
663    
664    
665  =head3 get_attribute_based_evidence (internal)  =head3 get_attribute_based_evidence (internal)
666    
667  This method retrieves evidence from the attribute server  This method retrieves evidence from the attribute server
# Line 542  Line 734 
734      }      }
735  }  }
736    
737    =head3 get_pdb_observations() (internal)
738    
739    This methods sets the type and class for pdb observations
740    
741    =cut
742    
743    sub get_pdb_observations{
744        my ($fid,$datasets_ref) = (@_);
745    
746        my $fig = new FIG;
747    
748        print STDERR "get pdb obs called\n";
749        foreach my $attr_ref ($fig->get_attributes($fid,'PDB')) {
750    
751            my $key = @$attr_ref[1];
752            my($key1,$key2) =split("::",$key);
753            my $value = @$attr_ref[2];
754            my ($evalue,$location) = split(";",$value);
755    
756            if($evalue =~/(\d+)\.(\d+)/){
757                my $part2 = 1000 - $1;
758                my $part1 = $2/100;
759                $evalue = $part1."e-".$part2;
760            }
761    
762            my($start,$stop) =split("-",$location);
763    
764            my $url = @$attr_ref[3];
765            my $dataset = {'class' => 'PDB',
766                           'type' => 'seq' ,
767                           'acc' => $key2,
768                           'evalue' => $evalue,
769                           'start' => $start,
770                           'stop' => $stop
771                           };
772    
773            push (@{$datasets_ref} ,$dataset);
774        }
775    
776    }
777    
778    
779    
780    
781    =head3 get_cluster_observations() (internal)
782    
783    This methods sets the type and class for cluster observations
784    
785    =cut
786    
787    sub get_cluster_observations{
788        my ($fid,$datasets_ref) = (@_);
789    
790        my $dataset = {'class' => 'CLUSTER',
791                       'type' => 'fc'
792                       };
793        push (@{$datasets_ref} ,$dataset);
794    }
795    
796    
797  =head3 get_sims_observations() (internal)  =head3 get_sims_observations() (internal)
798    
799  This methods retrieves sims fills the internal data structures.  This methods retrieves sims fills the internal data structures.
# Line 552  Line 804 
804    
805      my ($fid,$datasets_ref) = (@_);      my ($fid,$datasets_ref) = (@_);
806      my $fig = new FIG;      my $fig = new FIG;
807      my @sims= $fig->nsims($fid,100,1e-20,"fig");  #    my @sims= $fig->nsims($fid,100,1e-20,"fig");
808        my @sims= $fig->nsims($fid,100,1e-20,"all");
809      my ($dataset);      my ($dataset);
810      foreach my $sim (@sims){      foreach my $sim (@sims){
811          my $hit = $sim->[1];          my $hit = $sim->[1];
812            my $percent = $sim->[2];
813          my $evalue = $sim->[10];          my $evalue = $sim->[10];
814          my $from = $sim->[8];          my $qfrom = $sim->[6];
815          my $to = $sim->[9];          my $qto = $sim->[7];
816          $dataset = [ { name => 'class', value => "SIM" },          my $hfrom = $sim->[8];
817                          { name => 'acc' , value => $hit},          my $hto = $sim->[9];
818                          { name => 'type', value => "seq"} ,          my $qlength = $sim->[12];
819                          { name => 'evalue', value => $evalue },          my $hlength = $sim->[13];
820                          { name => 'start', value => $from},          my $db = get_database($hit);
821                          { name => 'stop' , value => $to}          my $func = $fig->function_of($hit);
822                          ];          my $organism = $fig->org_of($hit);
823    
824            $dataset = {'class' => 'SIM',
825                        'acc' => $hit,
826                        'identity' => $percent,
827                        'type' => 'seq',
828                        'evalue' => $evalue,
829                        'qstart' => $qfrom,
830                        'qstop' => $qto,
831                        'hstart' => $hfrom,
832                        'hstop' => $hto,
833                        'database' => $db,
834                        'organism' => $organism,
835                        'function' => $func,
836                        'qlength' => $qlength,
837                        'hlength' => $hlength
838                        };
839    
840      push (@{$datasets_ref} ,$dataset);      push (@{$datasets_ref} ,$dataset);
841      }      }
842  }  }
843    
844    =head3 get_database (internal)
845    This method gets the database association from the sequence id
846    
847    =cut
848    
849    sub get_database{
850        my ($id) = (@_);
851    
852        my ($db);
853        if ($id =~ /^fig\|/)              { $db = "FIG" }
854        elsif ($id =~ /^gi\|/)            { $db = "NCBI" }
855        elsif ($id =~ /^^[NXYZA]P_/)      { $db = "RefSeq" }
856        elsif ($id =~ /^sp\|/)            { $db = "SwissProt" }
857        elsif ($id =~ /^uni\|/)           { $db = "UniProt" }
858        elsif ($id =~ /^tigr\|/)          { $db = "TIGR" }
859        elsif ($id =~ /^pir\|/)           { $db = "PIR" }
860        elsif ($id =~ /^kegg\|/)          { $db = "KEGG" }
861        elsif ($id =~ /^tr\|/)            { $db = "TrEMBL" }
862        elsif ($id =~ /^eric\|/)          { $db = "ASAP" }
863        elsif ($id =~ /^img\|/)           { $db = "JGI" }
864    
865        return ($db);
866    
867    }
868    
869  =head3 get_identical_proteins() (internal)  =head3 get_identical_proteins() (internal)
870    
871  This methods retrieves sims fills the internal data structures.  This methods retrieves sims fills the internal data structures.
# Line 587  Line 883 
883      foreach my $id (@maps_to) {      foreach my $id (@maps_to) {
884          my ($tmp, $who);          my ($tmp, $who);
885          if (($id ne $fid) && ($tmp = $fig->function_of($id))) {          if (($id ne $fid) && ($tmp = $fig->function_of($id))) {
886              if ($id =~ /^fig\|/)           { $who = "FIG" }              $who = &get_database($id);
             elsif ($id =~ /^gi\|/)            { $who = "NCBI" }  
             elsif ($id =~ /^^[NXYZA]P_/)      { $who = "RefSeq" }  
             elsif ($id =~ /^sp\|/)            { $who = "SwissProt" }  
             elsif ($id =~ /^uni\|/)           { $who = "UniProt" }  
             elsif ($id =~ /^tigr\|/)          { $who = "TIGR" }  
             elsif ($id =~ /^pir\|/)           { $who = "PIR" }  
             elsif ($id =~ /^kegg\|/)          { $who = "KEGG" }  
             elsif ($id =~ /^tr\|/)            { $who = "TrEMBL" }  
             elsif ($id =~ /^eric\|/)          { $who = "ASAP" }  
   
887              push(@funcs, [$id,$who,$tmp]);              push(@funcs, [$id,$who,$tmp]);
888          }          }
889      }      }
# Line 608  Line 894 
894          my $organism = $fig->org_of($fid);          my $organism = $fig->org_of($fid);
895          my $who = $row->[1];          my $who = $row->[1];
896          my $assignment = $row->[2];          my $assignment = $row->[2];
897          $dataset = [ { name => 'class', value => "IDENTICAL" },  
898                       { name => 'id' , value => $id},          my $dataset = {'class' => 'IDENTICAL',
899                       { name => 'organism', value => "$organism"} ,                         'id' => $id,
900                       { name => 'database', value => $who },                         'organism' => $organism,
901                       { name => 'description' , value => $assignment}                         'type' => 'seq',
902                       ];                         'database' => $who,
903                           'function' => $assignment
904                           };
905    
906          push (@{$datasets_ref} ,$dataset);          push (@{$datasets_ref} ,$dataset);
907      }      }
908    
# Line 650  Line 939 
939          my $id = $row->[1];          my $id = $row->[1];
940          my $score = $row->[0];          my $score = $row->[0];
941          my $description = $row->[2];          my $description = $row->[2];
942          $dataset = [ { name => 'class', value => "FC" },          my $dataset = {'class' => 'PCH',
943                       { name => 'score' , value => $score},                         'score' => $score,
944                       { name => 'id', value => "$id"} ,                         'id' => $id,
945                       { name => 'description' , value => $description}                         'type' => 'fc',
946                       ];                         'function' => $description
947                           };
948    
949          push (@{$datasets_ref} ,$dataset);          push (@{$datasets_ref} ,$dataset);
950      }      }
951  }  }
# Line 740  Line 1031 
1031    return $self;    return $self;
1032  }  }
1033    
1034    =head3 identity (internal)
1035    
1036    Returns the % identity of the similar sequence
1037    
1038    =cut
1039    
1040    sub identity {
1041        my ($self) = @_;
1042    
1043        return $self->{identity};
1044    }
1045    
1046  =head3 feature_id (internal)  =head3 feature_id (internal)
1047    
1048    
# Line 775  Line 1078 
1078      return $self->{organism};      return $self->{organism};
1079  }  }
1080    
1081  =head3 database (internal)  =head3 function (internal)
1082    
1083  Returns the database of the identical sequence  Returns the function of the identical sequence
1084    
1085  =cut  =cut
1086    
1087  sub database {  sub function {
1088      my ($self) = @_;      my ($self) = @_;
1089    
1090      return $self->{database};      return $self->{function};
1091  }  }
1092    
1093  #package Observation::Identical;  =head3 database (internal)
 #1;  
 #  
 #our @ISA = qw(Observation);  # inherits all the methods from Observation  
   
 =head3 display_identical()  
   
 If available use the function specified here to display the "raw" observation.  
 This code will display a table for the identical protein  
   
1094    
1095  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.  Returns the database of the identical sequence
1096    
1097  =cut  =cut
1098    
1099  sub display_identical {  sub database {
1100      my ($self, $fid, $cgi) = @_;      my ($self) = @_;
   
     my $content;  
     my $array=Observation->get_objects($fid);  
   
     my $all_domains = [];  
     my $count_identical = 0;  
     foreach my $thing (@$array) {  
         next if ($thing->class ne "IDENTICAL");  
         my $single_domain = [];  
         push(@$single_domain,$thing->class);  
         my $id = $thing->id;  
         $count_identical++;  
         push(@$single_domain,&HTML::set_prot_links($cgi,$id));  
         push(@$single_domain,$thing->organism);  
         push(@$single_domain,$thing->database);  
         push(@$single_domain,$thing->description);  
         push(@$all_domains,$single_domain);  
     }  
   
     if ($count_identical >0){  
         my $table_component = $self->application->component('DomainTable');  
1101    
1102          $table_component->columns ([ { 'name' => 'Name', 'filter' => 1 },      return $self->{database};
                                      { 'name' => 'ID' },  
                                      { 'name' => 'Organism' },  
                                      { 'name' => 'Database' },  
                                      { 'name' => 'Assignment' }  
                                      ]);  
         $table_component->data($all_domains);  
         $table_component->show_top_browse(1);  
         $table_component->show_bottom_browse(1);  
         $table_component->items_per_page(50);  
         $table_component->show_select_items_per_page(1);  
         $content .= $table_component->output();  
     }  
     else{  
         $content = "<p>This PEG does not have any essentially identical proteins</p>";  
     }  
     return ($content);  
1103  }  }
1104    
1105  package Observation::Domain;  ############################################################
1106    ############################################################
1107    package Observation::PDB;
1108    
1109  use base qw(Observation);  use base qw(Observation);
1110    
# Line 853  Line 1112 
1112    
1113      my ($class,$dataset) = @_;      my ($class,$dataset) = @_;
1114      my $self = $class->SUPER::new($dataset);      my $self = $class->SUPER::new($dataset);
     $self->{evalue} = $dataset->{'evalue'};  
1115      $self->{acc} = $dataset->{'acc'};      $self->{acc} = $dataset->{'acc'};
1116        $self->{evalue} = $dataset->{'evalue'};
1117      $self->{start} = $dataset->{'start'};      $self->{start} = $dataset->{'start'};
1118      $self->{stop} = $dataset->{'stop'};      $self->{stop} = $dataset->{'stop'};
   
1119      bless($self,$class);      bless($self,$class);
1120      return $self;      return $self;
1121  }  }
1122    
1123    =head3 display()
1124    
1125    displays data stored in best_PDB attribute and in Ontology server for given PDB id
1126    
1127    =cut
1128    
1129  sub display {  sub display {
1130      my ($thing,$gd) = @_;      my ($self,$gd,$fid) = @_;
1131    
1132        my $dbmaster = DBMaster->new(-database =>'Ontology');
1133    
1134        print STDERR "PDB::display called\n";
1135    
1136        my $acc = $self->acc;
1137    
1138        print STDERR "acc:$acc\n";
1139        my ($pdb_description,$pdb_source,$pdb_ligand);
1140        my $pdb_objs = $dbmaster->pdb->get_objects( { 'id' => $acc } );
1141        if(!scalar(@$pdb_objs)){
1142            $pdb_description = "not available";
1143            $pdb_source = "not available";
1144            $pdb_ligand = "not available";
1145        }
1146        else{
1147            my $pdb_obj = $pdb_objs->[0];
1148            $pdb_description = $pdb_obj->description;
1149            $pdb_source = $pdb_obj->source;
1150            $pdb_ligand = $pdb_obj->ligand;
1151        }
1152    
1153      my $lines = [];      my $lines = [];
1154      my $line_config = { 'title' => $thing->acc,      my $line_data = [];
1155                          'short_title' => $thing->type,      my $line_config = { 'title' => "PDB hit for $fid",
1156                            'short_title' => "best PDB",
1157                          'basepair_offset' => '1' };                          'basepair_offset' => '1' };
     my $color = "4";  
1158    
1159      my $line_data = [];      my $fig = new FIG;
1160        my $seq = $fig->get_translation($fid);
1161        my $fid_stop = length($seq);
1162    
1163        my $fid_element_hash = {
1164            "title" => $fid,
1165            "start" => '1',
1166            "end" =>  $fid_stop,
1167            "color"=> '1',
1168            "zlayer" => '1'
1169            };
1170    
1171        push(@$line_data,$fid_element_hash);
1172    
1173      my $links_list = [];      my $links_list = [];
1174      my $descriptions = [];      my $descriptions = [];
1175    
1176      my $description_function;      my $name;
1177      $description_function = {"title" => $thing->class,      $name = {"title" => 'id',
1178                               "value" => $thing->acc};               "value" => $acc};
1179        push(@$descriptions,$name);
1180      push(@$descriptions,$description_function);  
1181        my $description;
1182        $description = {"title" => 'pdb description',
1183                        "value" => $pdb_description};
1184        push(@$descriptions,$description);
1185    
1186      my $score;      my $score;
1187      $score = {"title" => "score",      $score = {"title" => "score",
1188                "value" => $thing->evalue};                "value" => $self->evalue};
1189      push(@$descriptions,$score);      push(@$descriptions,$score);
1190    
1191      my $link_id;      my $start_stop;
1192      if ($thing->acc =~/CDD::(\d+)/){      my $start_stop_value = $self->start."_".$self->stop;
1193          $link_id = $1;      $start_stop = {"title" => "start-stop",
1194      }                     "value" => $start_stop_value};
1195        push(@$descriptions,$start_stop);
1196    
1197        my $source;
1198        $source = {"title" => "source",
1199                  "value" => $pdb_source};
1200        push(@$descriptions,$source);
1201    
1202        my $ligand;
1203        $ligand = {"title" => "pdb ligand",
1204                   "value" => $pdb_ligand};
1205        push(@$descriptions,$ligand);
1206    
1207      my $link;      my $link;
1208      $link = {"link_title" => $thing->acc,      my $link_url ="http://www.rcsb.org/pdb/explore/explore.do?structureId=".$acc;
1209               "link" => "http://0-www.ncbi.nlm.nih.gov.library.vu.edu.au:80/Structure/cdd/cddsrv.cgi?uid=$link_id"};  
1210        $link = {"link_title" => $acc,
1211                 "link" => $link_url};
1212      push(@$links_list,$link);      push(@$links_list,$link);
1213    
1214      my $element_hash = {      my $pdb_element_hash = {
1215          "title" => $thing->type,          "title" => "PDB homology",
1216          "start" => $thing->start,          "start" => $self->start,
1217          "end" =>  $thing->stop,          "end" =>  $self->stop,
1218          "color"=> $color,          "color"=> '6',
1219          "zlayer" => '2',          "zlayer" => '3',
1220          "links_list" => $links_list,          "links_list" => $links_list,
1221          "description" => $descriptions};          "description" => $descriptions};
1222    
1223      push(@$line_data,$element_hash);      push(@$line_data,$pdb_element_hash);
1224      $gd->add_line($line_data, $line_config);      $gd->add_line($line_data, $line_config);
1225    
1226      return $gd;      return $gd;
   
1227  }  }
1228    
1229    1;
1230    
1231    ############################################################
1232    ############################################################
1233    package Observation::Identical;
1234    
1235    use base qw(Observation);
1236    
1237    sub new {
1238    
1239        my ($class,$dataset) = @_;
1240        my $self = $class->SUPER::new($dataset);
1241        $self->{id} = $dataset->{'id'};
1242        $self->{organism} = $dataset->{'organism'};
1243        $self->{function} = $dataset->{'function'};
1244        $self->{database} = $dataset->{'database'};
1245    
1246        bless($self,$class);
1247        return $self;
1248    }
1249    
1250    =head3 display()
1251    
1252    If available use the function specified here to display the "raw" observation.
1253    This code will display a table for the identical protein
1254    
1255    
1256    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
1257    dence.
1258    
1259    =cut
1260    
1261    sub display{
1262        my ($self, $cgi, $dataset) = @_;
1263    
1264        my $all_domains = [];
1265        my $count_identical = 0;
1266        my $content;
1267        foreach my $thing (@$dataset) {
1268            next if ($thing->class ne "IDENTICAL");
1269            my $single_domain = [];
1270            push(@$single_domain,$thing->database);
1271            my $id = $thing->id;
1272            $count_identical++;
1273            push(@$single_domain,&HTML::set_prot_links($cgi,$id));
1274            push(@$single_domain,$thing->organism);
1275            #push(@$single_domain,$thing->type);
1276            push(@$single_domain,$thing->function);
1277            push(@$all_domains,$single_domain);
1278        }
1279    
1280        if ($count_identical >0){
1281            $content = $all_domains;
1282        }
1283        else{
1284            $content = "<p>This PEG does not have any essentially identical proteins</p>";
1285        }
1286        return ($content);
1287    }
1288    
1289    1;
1290    
1291    
1292    #########################################
1293    #########################################
1294    package Observation::FC;
1295    1;
1296    
1297    use base qw(Observation);
1298    
1299    sub new {
1300    
1301        my ($class,$dataset) = @_;
1302        my $self = $class->SUPER::new($dataset);
1303        $self->{score} = $dataset->{'score'};
1304        $self->{id} = $dataset->{'id'};
1305        $self->{function} = $dataset->{'function'};
1306    
1307        bless($self,$class);
1308        return $self;
1309    }
1310    
1311    =head3 display()
1312    
1313    If available use the function specified here to display the "raw" observation.
1314    This code will display a table for the identical protein
1315    
1316    
1317    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
1318    dence.
1319    
1320    =cut
1321    
1322    sub display {
1323        my ($self,$cgi,$dataset, $fid) = @_;
1324    
1325        my $functional_data = [];
1326        my $count = 0;
1327        my $content;
1328    
1329        foreach my $thing (@$dataset) {
1330            my $single_domain = [];
1331            next if ($thing->class ne "PCH");
1332            $count++;
1333    
1334            # construct the score link
1335            my $score = $thing->score;
1336            my $toid = $thing->id;
1337            my $link = $cgi->url(-relative => 1) . "?user=master&request=show_coupling_evidence&prot=$fid&to=$toid&SPROUT=";
1338            my $sc_link = "<a href=$link>$score</a>";
1339    
1340            push(@$single_domain,$sc_link);
1341            push(@$single_domain,$thing->id);
1342            push(@$single_domain,$thing->function);
1343            push(@$functional_data,$single_domain);
1344        }
1345    
1346        if ($count >0){
1347            $content = $functional_data;
1348        }
1349        else
1350        {
1351            $content = "<p>This PEG does not have any functional coupling</p>";
1352        }
1353        return ($content);
1354    }
1355    
1356    
1357    #########################################
1358    #########################################
1359    package Observation::Domain;
1360    
1361    use base qw(Observation);
1362    
1363    sub new {
1364    
1365        my ($class,$dataset) = @_;
1366        my $self = $class->SUPER::new($dataset);
1367        $self->{evalue} = $dataset->{'evalue'};
1368        $self->{acc} = $dataset->{'acc'};
1369        $self->{start} = $dataset->{'start'};
1370        $self->{stop} = $dataset->{'stop'};
1371    
1372        bless($self,$class);
1373        return $self;
1374    }
1375    
1376    sub display {
1377        my ($thing,$gd) = @_;
1378        my $lines = [];
1379        my $line_config = { 'title' => $thing->acc,
1380                            'short_title' => $thing->type,
1381                            'basepair_offset' => '1' };
1382        my $color = "4";
1383    
1384        my $line_data = [];
1385        my $links_list = [];
1386        my $descriptions = [];
1387    
1388        my $db_and_id = $thing->acc;
1389        my ($db,$id) = split("::",$db_and_id);
1390    
1391        my $dbmaster = DBMaster->new(-database =>'Ontology');
1392    
1393        my ($name_title,$name_value,$description_title,$description_value);
1394        if($db eq "CDD"){
1395            my $cdd_objs = $dbmaster->cdd->get_objects( { 'id' => $id } );
1396            if(!scalar(@$cdd_objs)){
1397                $name_title = "name";
1398                $name_value = "not available";
1399                $description_title = "description";
1400                $description_value = "not available";
1401            }
1402            else{
1403                my $cdd_obj = $cdd_objs->[0];
1404                $name_title = "name";
1405                $name_value = $cdd_obj->term;
1406                $description_title = "description";
1407                $description_value = $cdd_obj->description;
1408            }
1409        }
1410    
1411        my $name;
1412        $name = {"title" => $name_title,
1413                 "value" => $name_value};
1414        push(@$descriptions,$name);
1415    
1416        my $description;
1417        $description = {"title" => $description_title,
1418                                 "value" => $description_value};
1419        push(@$descriptions,$description);
1420    
1421        my $score;
1422        $score = {"title" => "score",
1423                  "value" => $thing->evalue};
1424        push(@$descriptions,$score);
1425    
1426        my $link_id;
1427        if ($thing->acc =~/\w+::(\d+)/){
1428            $link_id = $1;
1429        }
1430    
1431        my $link;
1432        my $link_url;
1433        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"}
1434        elsif($thing->class eq "PFAM"){$link_url = "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?$link_id"}
1435        else{$link_url = "NO_URL"}
1436    
1437        $link = {"link_title" => $thing->acc,
1438                 "link" => $link_url};
1439        push(@$links_list,$link);
1440    
1441        my $element_hash = {
1442            "title" => $thing->type,
1443            "start" => $thing->start,
1444            "end" =>  $thing->stop,
1445            "color"=> $color,
1446            "zlayer" => '2',
1447            "links_list" => $links_list,
1448            "description" => $descriptions};
1449    
1450        push(@$line_data,$element_hash);
1451        $gd->add_line($line_data, $line_config);
1452    
1453        return $gd;
1454    
1455    }
1456    
1457    #########################################
1458    #########################################
1459    package Observation::Location;
1460    
1461    use base qw(Observation);
1462    
1463    sub new {
1464    
1465        my ($class,$dataset) = @_;
1466        my $self = $class->SUPER::new($dataset);
1467        $self->{cleavage_prob} = $dataset->{'cleavage_prob'};
1468        $self->{cleavage_loc} = $dataset->{'cleavage_loc'};
1469        $self->{signal_peptide_score} = $dataset->{'signal_peptide_score'};
1470        $self->{cello_location} = $dataset->{'cello_location'};
1471        $self->{cello_score} = $dataset->{'cello_score'};
1472        $self->{tmpred_score} = $dataset->{'tmpred_score'};
1473        $self->{tmpred_locations} = $dataset->{'tmpred_locations'};
1474    
1475        bless($self,$class);
1476        return $self;
1477    }
1478    
1479    sub display {
1480        my ($thing,$gd,$fid) = @_;
1481    
1482        my $fig= new FIG;
1483        my $length = length($fig->get_translation($fid));
1484    
1485        my $cleavage_prob;
1486        if($thing->cleavage_prob){$cleavage_prob = $thing->cleavage_prob;}
1487        my ($cleavage_loc_begin,$cleavage_loc_end) = split("-",$thing->cleavage_loc);
1488        my $signal_peptide_score = $thing->signal_peptide_score;
1489        my $cello_location = $thing->cello_location;
1490        my $cello_score = $thing->cello_score;
1491        my $tmpred_score = $thing->tmpred_score;
1492        my @tmpred_locations = split(",",$thing->tmpred_locations);
1493    
1494        my $lines = [];
1495        my $line_config = { 'title' => 'Localization Evidence',
1496                            'short_title' => 'Local',
1497                            'basepair_offset' => '1' };
1498    
1499        #color is
1500        my $color = "5";
1501    
1502        my $line_data = [];
1503    
1504        if($cello_location){
1505            my $cello_descriptions = [];
1506            my $description_cello_location = {"title" => 'Best Cello Location',
1507                                              "value" => $cello_location};
1508    
1509            push(@$cello_descriptions,$description_cello_location);
1510    
1511            my $description_cello_score = {"title" => 'Cello Score',
1512                                           "value" => $cello_score};
1513    
1514            push(@$cello_descriptions,$description_cello_score);
1515    
1516            my $element_hash = {
1517                "title" => "CELLO",
1518                "start" => "1",
1519                "end" =>  $length + 1,
1520                "color"=> $color,
1521                "type" => 'box',
1522                "zlayer" => '2',
1523                "description" => $cello_descriptions};
1524    
1525            push(@$line_data,$element_hash);
1526        }
1527    
1528        my $color = "6";
1529        #if(0){
1530        if($tmpred_score){
1531            foreach my $tmpred (@tmpred_locations){
1532                my $descriptions = [];
1533                my ($begin,$end) =split("-",$tmpred);
1534                my $description_tmpred_score = {"title" => 'TMPRED score',
1535                                 "value" => $tmpred_score};
1536    
1537                push(@$descriptions,$description_tmpred_score);
1538    
1539                my $element_hash = {
1540                "title" => "transmembrane location",
1541                "start" => $begin + 1,
1542                "end" =>  $end + 1,
1543                "color"=> $color,
1544                "zlayer" => '5',
1545                "type" => 'smallbox',
1546                "description" => $descriptions};
1547    
1548                push(@$line_data,$element_hash);
1549            }
1550        }
1551    
1552        my $color = "1";
1553        if($signal_peptide_score){
1554            my $descriptions = [];
1555            my $description_signal_peptide_score = {"title" => 'signal peptide score',
1556                                                    "value" => $signal_peptide_score};
1557    
1558            push(@$descriptions,$description_signal_peptide_score);
1559    
1560            my $description_cleavage_prob = {"title" => 'cleavage site probability',
1561                                             "value" => $cleavage_prob};
1562    
1563            push(@$descriptions,$description_cleavage_prob);
1564    
1565            my $element_hash = {
1566                "title" => "SignalP",
1567                "start" => $cleavage_loc_begin - 2,
1568                "end" =>  $cleavage_loc_end + 3,
1569                "type" => 'bigbox',
1570                "color"=> $color,
1571                "zlayer" => '10',
1572                "description" => $descriptions};
1573    
1574            push(@$line_data,$element_hash);
1575        }
1576    
1577        $gd->add_line($line_data, $line_config);
1578    
1579        return ($gd);
1580    
1581    }
1582    
1583    sub cleavage_loc {
1584      my ($self) = @_;
1585    
1586      return $self->{cleavage_loc};
1587    }
1588    
1589    sub cleavage_prob {
1590      my ($self) = @_;
1591    
1592      return $self->{cleavage_prob};
1593    }
1594    
1595    sub signal_peptide_score {
1596      my ($self) = @_;
1597    
1598      return $self->{signal_peptide_score};
1599    }
1600    
1601    sub tmpred_score {
1602      my ($self) = @_;
1603    
1604      return $self->{tmpred_score};
1605    }
1606    
1607    sub tmpred_locations {
1608      my ($self) = @_;
1609    
1610      return $self->{tmpred_locations};
1611    }
1612    
1613    sub cello_location {
1614      my ($self) = @_;
1615    
1616      return $self->{cello_location};
1617    }
1618    
1619    sub cello_score {
1620      my ($self) = @_;
1621    
1622      return $self->{cello_score};
1623    }
1624    
1625    
1626    #########################################
1627    #########################################
1628    package Observation::Sims;
1629    
1630    use base qw(Observation);
1631    
1632    sub new {
1633    
1634        my ($class,$dataset) = @_;
1635        my $self = $class->SUPER::new($dataset);
1636        $self->{identity} = $dataset->{'identity'};
1637        $self->{acc} = $dataset->{'acc'};
1638        $self->{evalue} = $dataset->{'evalue'};
1639        $self->{qstart} = $dataset->{'qstart'};
1640        $self->{qstop} = $dataset->{'qstop'};
1641        $self->{hstart} = $dataset->{'hstart'};
1642        $self->{hstop} = $dataset->{'hstop'};
1643        $self->{database} = $dataset->{'database'};
1644        $self->{organism} = $dataset->{'organism'};
1645        $self->{function} = $dataset->{'function'};
1646        $self->{qlength} = $dataset->{'qlength'};
1647        $self->{hlength} = $dataset->{'hlength'};
1648    
1649        bless($self,$class);
1650        return $self;
1651    }
1652    
1653    =head3 display()
1654    
1655    If available use the function specified here to display the "raw" observation.
1656    This code will display a table for the similarities protein
1657    
1658    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.
1659    
1660    =cut
1661    
1662    sub display {
1663        my ($self,$cgi,$dataset) = @_;
1664    
1665        my $data = [];
1666        my $count = 0;
1667        my $content;
1668        my $fig = new FIG;
1669    
1670        foreach my $thing (@$dataset) {
1671            my $single_domain = [];
1672            next if ($thing->class ne "SIM");
1673            $count++;
1674    
1675            my $id = $thing->acc;
1676    
1677            # add the subsystem information
1678            my @in_sub  = $fig->peg_to_subsystems($id);
1679            my $in_sub;
1680    
1681            if (@in_sub > 0) {
1682                $in_sub = @in_sub;
1683    
1684                # RAE: add a javascript popup with all the subsystems
1685                my $ss_list=join "<br>", map { my $g = $_; $g =~ s/\_/ /g; $_ = $g } sort {$a cmp $b} @in_sub;
1686                $in_sub = $cgi->a( {id=>"subsystems", onMouseover=>"javascript:if(!this.tooltip) this.tooltip=new Popup_Tooltip(this, 'Subsystems', '$ss_list', ''); this.tooltip.addHandler(); return false;"}, $in_sub);
1687            } else {
1688                $in_sub = "&nbsp;";
1689            }
1690    
1691            # add evidence code with tool tip
1692            my $ev_codes=" &nbsp; ";
1693            my @ev_codes = "";
1694            if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {
1695                my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes($id);
1696                @ev_codes = ();
1697                foreach my $code (@codes) {
1698                    my $pretty_code = $code->[2];
1699                    if ($pretty_code =~ /;/) {
1700                        my ($cd, $ss) = split(";", $code->[2]);
1701                        $ss =~ s/_/ /g;
1702                        $pretty_code = $cd;# . " in " . $ss;
1703                    }
1704                    push(@ev_codes, $pretty_code);
1705                }
1706            }
1707    
1708            if (scalar(@ev_codes) && $ev_codes[0]) {
1709                my $ev_code_help=join("<br />", map {&HTML::evidence_codes_explain($_)} @ev_codes);
1710                $ev_codes = $cgi->a(
1711                                    {
1712                                        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));
1713            }
1714    
1715            # add the aliases
1716            my $aliases = undef;
1717            $aliases = &html_enc( join( ", ", $fig->feature_aliases($id) ) );
1718            $aliases = &HTML::set_prot_links( $cgi, $aliases );
1719            $aliases ||= "&nbsp;";
1720    
1721            my $iden    = $thing->identity;
1722            my $ln1     = $thing->qlength;
1723            my $ln2     = $thing->hlength;
1724            my $b1      = $thing->qstart;
1725            my $e1      = $thing->qstop;
1726            my $b2      = $thing->hstart;
1727            my $e2      = $thing->hstop;
1728            my $d1      = abs($e1 - $b1) + 1;
1729            my $d2      = abs($e2 - $b2) + 1;
1730            my $reg1    = "$b1-$e1 (<b>$d1/$ln1</b>)";
1731            my $reg2    = "$b2-$e2 (<b>$d2/$ln2</b>)";
1732    
1733    
1734            push(@$single_domain,$thing->database);
1735            push(@$single_domain,&HTML::set_prot_links($cgi,$thing->acc));
1736            push(@$single_domain,$thing->evalue);
1737            push(@$single_domain,"$iden\%");
1738            push(@$single_domain,$reg1);
1739            push(@$single_domain,$reg2);
1740            push(@$single_domain,$in_sub);
1741            push(@$single_domain,$ev_codes);
1742            push(@$single_domain,$thing->organism);
1743            push(@$single_domain,$thing->function);
1744            push(@$single_domain,$aliases);
1745            push(@$data,$single_domain);
1746        }
1747    
1748        if ($count >0){
1749            $content = $data;
1750        }
1751        else
1752        {
1753            $content = "<p>This PEG does not have any similarities</p>";
1754        }
1755        return ($content);
1756    }
1757    
1758    sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }
1759    
1760    
1761    
1762    ############################
1763    package Observation::Cluster;
1764    
1765    use base qw(Observation);
1766    
1767    sub new {
1768    
1769        my ($class,$dataset) = @_;
1770        my $self = $class->SUPER::new($dataset);
1771    
1772        bless($self,$class);
1773        return $self;
1774    }
1775    
1776    sub display {
1777        my ($self,$gd, $fid, $gd_window_size, $compare_or_coupling) = @_;
1778    
1779        my $fig = new FIG;
1780        my $all_regions = [];
1781    
1782        #get the organism genome
1783        my $target_genome = $fig->genome_of($fid);
1784    
1785        # get location of the gene
1786        my $data = $fig->feature_location($fid);
1787        my ($contig, $beg, $end);
1788        my %reverse_flag;
1789    
1790        if ($data =~ /(.*)_(\d+)_(\d+)$/){
1791            $contig = $1;
1792            $beg = $2;
1793            $end = $3;
1794        }
1795    
1796        my $offset;
1797        my ($region_start, $region_end);
1798        if ($beg < $end)
1799        {
1800            $region_start = $beg - 4000;
1801            $region_end = $end+4000;
1802            $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
1803        }
1804        else
1805        {
1806            $region_start = $end-4000;
1807            $region_end = $beg+4000;
1808            $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
1809            $reverse_flag{$target_genome} = 1;
1810        }
1811    
1812        # call genes in region
1813        my ($target_gene_features, $reg_beg, $reg_end) = $fig->genes_in_region($target_genome, $contig, $region_start, $region_end);
1814        push(@$all_regions,$target_gene_features);
1815        my (@start_array_region);
1816        push (@start_array_region, $offset);
1817    
1818        my %all_genes;
1819        my %all_genomes;
1820        foreach my $feature (@$target_gene_features){ $all_genes{$feature} = 1;}
1821    
1822        if ($compare_or_coupling == 0)
1823        {
1824            my @coup = grep { $_->[1]} $fig->coupling_and_evidence($fid,5000,1e-10,4,1);
1825    
1826            my $coup_count = 0;
1827    
1828            foreach my $pair (@{$coup[0]->[2]}) {
1829                #   last if ($coup_count > 10);
1830                my ($peg1,$peg2) = @$pair;
1831    
1832                my ($pair_contig,$pair_beg,$pair_end,$pair_region_start,$pair_region_stop,$pair_genome);
1833                $pair_genome = $fig->genome_of($peg1);
1834    
1835                my $location = $fig->feature_location($peg1);
1836                if($location =~/(.*)_(\d+)_(\d+)$/){
1837                    $pair_contig = $1;
1838                    $pair_beg = $2;
1839                    $pair_end = $3;
1840                    if ($pair_beg < $pair_end)
1841                    {
1842                        $pair_region_start = $pair_beg - 4000;
1843                        $pair_region_stop = $pair_end+4000;
1844                        $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
1845                    }
1846                    else
1847                    {
1848                        $pair_region_start = $pair_end-4000;
1849                        $pair_region_stop = $pair_beg+4000;
1850                        $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
1851                        $reverse_flag{$pair_genome} = 1;
1852                    }
1853    
1854                    push (@start_array_region, $offset);
1855    
1856                    $all_genomes{$pair_genome} = 1;
1857                    my ($pair_features) = $fig->genes_in_region($pair_genome, $pair_contig, $pair_region_start, $pair_region_stop);
1858                    push(@$all_regions,$pair_features);
1859                    foreach my $pair_feature (@$pair_features){ $all_genes{$pair_feature} = 1;}
1860                }
1861                $coup_count++;
1862            }
1863        }
1864    
1865        elsif ($compare_or_coupling == 1)
1866        {
1867            # make a hash of genomes that are phylogenetically close
1868            #my $close_threshold = ".26";
1869            #my @genomes = $fig->genomes('complete');
1870            #my %close_genomes = ();
1871            #foreach my $compared_genome (@genomes)
1872            #{
1873            #    my $dist = $fig->crude_estimate_of_distance($target_genome,$compared_genome);
1874            #    #$close_genomes{$compared_genome} = $dist;
1875            #    if ($dist <= $close_threshold)
1876            #    {
1877            #       $all_genomes{$compared_genome} = 1;
1878            #    }
1879            #}
1880            $all_genomes{"216592.1"} = 1;
1881            $all_genomes{"79967.1"} = 1;
1882            $all_genomes{"199310.1"} = 1;
1883            $all_genomes{"216593.1"} = 1;
1884            $all_genomes{"155864.1"} = 1;
1885            $all_genomes{"83334.1"} = 1;
1886            $all_genomes{"316407.3"} = 1;
1887    
1888            foreach my $comp_genome (keys %all_genomes){
1889                my $return = $fig->bbh_list($comp_genome,[$fid]);
1890                my $feature_list = $return->{$fid};
1891                foreach my $peg1 (@$feature_list){
1892                    my $location = $fig->feature_location($peg1);
1893                    my ($pair_contig,$pair_beg,$pair_end,$pair_region_start,$pair_region_stop,$pair_genome);
1894                    $pair_genome = $fig->genome_of($peg1);
1895    
1896                    if($location =~/(.*)_(\d+)_(\d+)$/){
1897                        $pair_contig = $1;
1898                        $pair_beg = $2;
1899                        $pair_end = $3;
1900                        if ($pair_beg < $pair_end)
1901                        {
1902                            $pair_region_start = $pair_beg - 4000;
1903                            $pair_region_stop = $pair_end + 4000;
1904                            $offset = ($2+(($3-$2)/2))-($gd_window_size/2);
1905                        }
1906                        else
1907                        {
1908                            $pair_region_start = $pair_end-4000;
1909                            $pair_region_stop = $pair_beg+4000;
1910                            $offset = ($3+(($2-$3)/2))-($gd_window_size/2);
1911                            $reverse_flag{$pair_genome} = 1;
1912                        }
1913    
1914                        push (@start_array_region, $offset);
1915                        $all_genomes{$pair_genome} = 1;
1916                        my ($pair_features) = $fig->genes_in_region($pair_genome, $pair_contig, $pair_region_start, $pair_region_stop);
1917                        push(@$all_regions,$pair_features);
1918                        foreach my $pair_feature (@$pair_features){ $all_genes{$pair_feature} = 1;}
1919                    }
1920                }
1921            }
1922        }
1923    
1924        # get the PCH to each of the genes
1925        my $pch_sets = [];
1926        my %pch_already;
1927        foreach my $gene_peg (keys %all_genes)
1928        {
1929            if ($pch_already{$gene_peg}){next;};
1930            my $gene_set = [$gene_peg];
1931            foreach my $pch_peg ($fig->in_pch_pin_with($gene_peg)) {
1932                $pch_peg =~ s/,.*$//;
1933                my $pch_genome = $fig->genome_of($pch_peg);
1934                if ( ($gene_peg ne $pch_peg) && ($all_genomes{$pch_genome})) {
1935                    push(@$gene_set,$pch_peg);
1936                    $pch_already{$pch_peg}=1;
1937                }
1938                $pch_already{$gene_peg}=1;
1939            }
1940            push(@$pch_sets,$gene_set);
1941        }
1942    
1943        #create a rank of the pch's
1944        my %pch_set_rank;
1945        my $order = 0;
1946        foreach my $set (@$pch_sets){
1947            my $count = scalar(@$set);
1948            $pch_set_rank{$order} = $count;
1949            $order++;
1950        }
1951    
1952        my %peg_rank;
1953        my $counter =  1;
1954        foreach my $pch_order (sort {$pch_set_rank{$b} <=> $pch_set_rank{$a}} keys %pch_set_rank){
1955            my $good_set = @$pch_sets[$pch_order];
1956            my $flag_set = 0;
1957            if (scalar (@$good_set) > 1)
1958            {
1959                foreach my $peg (@$good_set){
1960                    if ((!$peg_rank{$peg})){
1961                        $peg_rank{$peg} = $counter;
1962                        $flag_set = 1;
1963                    }
1964                }
1965                $counter++ if ($flag_set == 1);
1966            }
1967            else
1968            {
1969                foreach my $peg (@$good_set){
1970                    $peg_rank{$peg} = 100;
1971                }
1972            }
1973        }
1974    
1975    
1976    #    my $bbh_sets = [];
1977    #    my %already;
1978    #    foreach my $gene_key (keys(%all_genes)){
1979    #       if($already{$gene_key}){next;}
1980    #       my $gene_set = [$gene_key];
1981    #
1982    #       my $gene_key_genome = $fig->genome_of($gene_key);
1983    #
1984    #       foreach my $genome_key (keys(%all_genomes)){
1985    #           #next if ($gene_key_genome eq $genome_key);
1986    #           my $return = $fig->bbh_list($genome_key,[$gene_key]);
1987    #
1988    #           my $feature_list = $return->{$gene_key};
1989    #           foreach my $fl (@$feature_list){
1990    #               push(@$gene_set,$fl);
1991    #           }
1992    #       }
1993    #       $already{$gene_key} = 1;
1994    #       push(@$bbh_sets,$gene_set);
1995    #    }
1996    #
1997    #    my %bbh_set_rank;
1998    #    my $order = 0;
1999    #    foreach my $set (@$bbh_sets){
2000    #       my $count = scalar(@$set);
2001    #       $bbh_set_rank{$order} = $count;
2002    #       $order++;
2003    #    }
2004    #
2005    #    my %peg_rank;
2006    #    my $counter =  1;
2007    #    foreach my $bbh_order (sort {$bbh_set_rank{$b} <=> $bbh_set_rank{$a}} keys %bbh_set_rank){
2008    #       my $good_set = @$bbh_sets[$bbh_order];
2009    #       my $flag_set = 0;
2010    #       if (scalar (@$good_set) > 1)
2011    #       {
2012    #           foreach my $peg (@$good_set){
2013    #               if ((!$peg_rank{$peg})){
2014    #                   $peg_rank{$peg} = $counter;
2015    #                   $flag_set = 1;
2016    #               }
2017    #           }
2018    #           $counter++ if ($flag_set == 1);
2019    #       }
2020    #       else
2021    #       {
2022    #           foreach my $peg (@$good_set){
2023    #               $peg_rank{$peg} = 100;
2024    #           }
2025    #       }
2026    #    }
2027    
2028        foreach my $region (@$all_regions){
2029            my $sample_peg = @$region[0];
2030            my $region_genome = $fig->genome_of($sample_peg);
2031            my $region_gs = $fig->genus_species($region_genome);
2032            my $abbrev_name = $fig->abbrev($region_gs);
2033            my $line_config = { 'title' => $region_gs,
2034                                'short_title' => $abbrev_name,
2035                                'basepair_offset' => '0'
2036                                };
2037    
2038            my $offsetting = shift @start_array_region;
2039    
2040            my $line_data = [];
2041            foreach my $fid1 (@$region){
2042                my $element_hash;
2043                my $links_list = [];
2044                my $descriptions = [];
2045    
2046                my $color = $peg_rank{$fid1};
2047    
2048                # get subsystem information
2049                my $function = $fig->function_of($fid1);
2050                my $url_link = "http://seed-viewer.theseed.org/index.cgi?action=ShowAnnotation&prot=".$fid1;
2051    
2052                my $link;
2053                $link = {"link_title" => $fid1,
2054                         "link" => $url_link};
2055                push(@$links_list,$link);
2056    
2057                my @subsystems = $fig->peg_to_subsystems($fid1);
2058                foreach my $subsystem (@subsystems){
2059                    my $link;
2060                    $link = {"link" => "http://seed-viewer.theseed.org/index.cgi?action=ShowSubsystem&subsystem_name=$subsystem",
2061                             "link_title" => $subsystem};
2062                    push(@$links_list,$link);
2063                }
2064    
2065                my $description_function;
2066                $description_function = {"title" => "function",
2067                                         "value" => $function};
2068                push(@$descriptions,$description_function);
2069    
2070                my $description_ss;
2071                my $ss_string = join (",", @subsystems);
2072                $description_ss = {"title" => "subsystems",
2073                                   "value" => $ss_string};
2074                push(@$descriptions,$description_ss);
2075    
2076    
2077                my $fid_location = $fig->feature_location($fid1);
2078                if($fid_location =~/(.*)_(\d+)_(\d+)$/){
2079                    my($start,$stop);
2080                    $start = $2 - $offsetting;
2081                    $stop = $3 - $offsetting;
2082    
2083                    if (defined($reverse_flag{$region_genome})){
2084                        $start = $gd_window_size - $start;
2085                        $stop = $gd_window_size - $stop;
2086                    }
2087    
2088                    $element_hash = {
2089                        "title" => $fid1,
2090                        "start" => $start,
2091                        "end" =>  $stop,
2092                        "type"=> 'arrow',
2093                        "color"=> $color,
2094                        "zlayer" => "2",
2095                        "links_list" => $links_list,
2096                        "description" => $descriptions
2097                    };
2098                    push(@$line_data,$element_hash);
2099                }
2100            }
2101            $gd->add_line($line_data, $line_config);
2102        }
2103        return $gd;
2104    }
2105    
2106    

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.23

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3