[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.27, Wed Jul 25 17:06:40 2007 UTC revision 1.28, Tue Aug 14 21:32:57 2007 UTC
# Line 308  Line 308 
308    
309      my $objects = [];      my $objects = [];
310      my @matched_datasets=();      my @matched_datasets=();
311        my $fig = new FIG;
312    
313      # call function that fetches attribute based observations      # call function that fetches attribute based observations
314      # returns an array of arrays of hashes      # returns an array of arrays of hashes
# Line 317  Line 318 
318      }      }
319      else{      else{
320          my %domain_classes;          my %domain_classes;
321            my @attributes = $fig->get_attributes($fid);
322          $domain_classes{'CDD'} = 1;          $domain_classes{'CDD'} = 1;
323          get_identical_proteins($fid,\@matched_datasets);          get_identical_proteins($fid,\@matched_datasets);
324          get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);          get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets,\@attributes);
325          get_sims_observations($fid,\@matched_datasets);          get_sims_observations($fid,\@matched_datasets);
326          get_functional_coupling($fid,\@matched_datasets);          get_functional_coupling($fid,\@matched_datasets);
327          get_attribute_based_location_observations($fid,\@matched_datasets);          get_attribute_based_location_observations($fid,\@matched_datasets,\@attributes);
328          get_pdb_observations($fid,\@matched_datasets);          get_pdb_observations($fid,\@matched_datasets,\@attributes);
329      }      }
330    
331      foreach my $dataset (@matched_datasets) {      foreach my $dataset (@matched_datasets) {
# Line 357  Line 359 
359    
360  }  }
361    
362    =head3 display_housekeeping
363    This method returns the housekeeping data for a given peg in a table format
364    
365    =cut
366    sub display_housekeeping {
367        my ($self,$fid) = @_;
368        my $fig = new FIG;
369        my $content;
370    
371        my $org_name = $fig->org_of($fid);
372        my $org_id   = $fig->orgid_of_orgname($org_name);
373        my $loc      = $fig->feature_location($fid);
374        my($contig, $beg, $end) = $fig->boundaries_of($loc);
375        my $strand   = ($beg <= $end)? '+' : '-';
376        my @subsystems = $fig->subsystems_for_peg($fid);
377        my $function = $fig->function_of($fid);
378        my @aliases  = $fig->feature_aliases($fid);
379        my $taxonomy = $fig->taxonomy_of($org_id);
380        my @ecs = ($function =~ /\(EC\s(\d+\.[-\d+]+\.[-\d+]+\.[-\d+]+)\)/g);
381    
382        $content .= qq(<b>General Protein Data</b><br><br><br><table border="0">);
383        $content .= qq(<tr width=15%><td >FIG ID</td><td>$fid</td></tr>\n);
384        $content .= qq(<tr width=15%><td >Organism Name</td><td>$org_name,&nbsp;&nbsp;$org_id</td></tr>\n);
385        $content .= qq(<tr><td width=15%>Taxonomy</td><td>$taxonomy</td></tr>\n);
386        $content .= qq(<tr width=15%><td>FIG Organism ID</td><td>$org_id</td></tr>\n);
387        $content .= qq(<tr width=15%><td>Gene Location</td><td>Contig $contig [$beg,$end], Strand $strand</td></tr>\n);;
388        $content .= qq(<tr width=15%><td>Function</td><td>$function</td></tr>\n);
389        if ( @ecs ) {
390            $content .= qq(<tr><td>EC:</td><td>);
391            foreach my $ec ( @ecs ) {
392                my $ec_name = $fig->ec_name($ec);
393                $content .= join(" -- ", $ec, $ec_name) . "<br>\n";
394            }
395            $content .= qq(</td></tr>\n);
396        }
397    
398        if ( @subsystems ) {
399            $content .= qq(<tr><td>Subsystems</td><td>);
400            foreach my $subsystem ( @subsystems ) {
401                $content .= join(" -- ", @$subsystem) . "<br>\n";
402            }
403        }
404    
405        my %groups;
406        if ( @aliases ) {
407            # get the db for each alias
408            foreach my $alias (@aliases){
409                $groups{$alias} = &get_database($alias);
410            }
411    
412            # group ids by aliases
413            my %db_aliases;
414            foreach my $key (sort {$groups{$a} cmp $groups{$b}} keys %groups){
415                push (@{$db_aliases{$groups{$key}}}, $key);
416            }
417    
418    
419            $content .= qq(<tr><td>Aliases</td><td><table border="0">);
420            foreach my $key (sort keys %db_aliases){
421                $content .= qq(<tr><td>$key:</td><td>) . join(", ", @{$db_aliases{$key}}) . qq(</td></tr\n);
422            }
423            $content .= qq(</td></tr></table>\n);
424        }
425    
426        $content .= qq(</table><p>\n);
427    
428        return ($content);
429    }
430    
431    =head3 get_sims_summary
432    This method uses as input the similarities of a peg and creates a tree view of their taxonomy
433    
434    =cut
435    
436    sub get_sims_summary {
437        my ($observation, $fid) = @_;
438        my $fig = new FIG;
439        my %families;
440        my @sims= $fig->nsims($fid,20000,10,"all");
441    
442        foreach my $sim (@sims){
443            next if ($sim->[1] !~ /fig\|/);
444            my $genome = $fig->genome_of($sim->[1]);
445            my $taxonomy = $fig->taxonomy_of($fig->genome_of($sim->[1]));
446            my $parent_tax = "Root";
447            foreach my $tax (split(/\; /, $taxonomy)){
448                push (@{$families{children}{$parent_tax}}, $tax);
449                $families{parent}{$tax} = $parent_tax;
450                $parent_tax = $tax;
451            }
452        }
453    
454        foreach my $key (keys %{$families{children}}){
455            $families{count}{$key} = @{$families{children}{$key}};
456    
457            my %saw;
458            my @out = grep(!$saw{$_}++, @{$families{children}{$key}});
459            $families{children}{$key} = \@out;
460        }
461        return (\%families);
462    }
463    
464  =head1 Internal Methods  =head1 Internal Methods
465    
466  These methods are not meant to be used outside of this package.  These methods are not meant to be used outside of this package.
# Line 368  Line 472 
472  sub get_attribute_based_domain_observations{  sub get_attribute_based_domain_observations{
473    
474      # we read a FIG ID and a reference to an array (of arrays of hashes, see above)      # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
475      my ($fid,$domain_classes,$datasets_ref) = (@_);      my ($fid,$domain_classes,$datasets_ref,$attributes_ref) = (@_);
476    
477      my $fig = new FIG;      my $fig = new FIG;
478    
479      foreach my $attr_ref ($fig->get_attributes($fid)) {      foreach my $attr_ref (@$attributes_ref) {
480    #    foreach my $attr_ref ($fig->get_attributes($fid)) {
481          my $key = @$attr_ref[1];          my $key = @$attr_ref[1];
482          my @parts = split("::",$key);          my @parts = split("::",$key);
483          my $class = $parts[0];          my $class = $parts[0];
# Line 411  Line 516 
516    
517  sub get_attribute_based_location_observations{  sub get_attribute_based_location_observations{
518    
519      my ($fid,$datasets_ref) = (@_);      my ($fid,$datasets_ref, $attributes_ref) = (@_);
520      my $fig = new FIG;      my $fig = new FIG;
521    
522      my $location_attributes = ['SignalP','CELLO','TMPRED'];      my $location_attributes = ['SignalP','CELLO','TMPRED'];
# Line 421  Line 526 
526                     'fig_id' => $fid                     'fig_id' => $fid
527                     };                     };
528    
529      foreach my $attr_ref ($fig->get_attributes($fid,$location_attributes)) {      foreach my $attr_ref (@$attributes_ref){
530    #    foreach my $attr_ref ($fig->get_attributes($fid,$location_attributes)) {
531          my $key = @$attr_ref[1];          my $key = @$attr_ref[1];
532            next if (($key !~ /SignalP/) && ($key !~ /CELLO/) && ($key !~ /TMPRED/));
533          my @parts = split("::",$key);          my @parts = split("::",$key);
534          my $sub_class = $parts[0];          my $sub_class = $parts[0];
535          my $sub_key = $parts[1];          my $sub_key = $parts[1];
# Line 432  Line 539 
539                  my @value_parts = split(";",$value);                  my @value_parts = split(";",$value);
540                  $dataset->{'cleavage_prob'} = $value_parts[0];                  $dataset->{'cleavage_prob'} = $value_parts[0];
541                  $dataset->{'cleavage_loc'} = $value_parts[1];                  $dataset->{'cleavage_loc'} = $value_parts[1];
542    #               print STDERR "LOC: $value_parts[1]";
543              }              }
544              elsif($sub_key eq "signal_peptide"){              elsif($sub_key eq "signal_peptide"){
545                  $dataset->{'signal_peptide_score'} = $value;                  $dataset->{'signal_peptide_score'} = $value;
# Line 459  Line 567 
567  =cut  =cut
568    
569  sub get_pdb_observations{  sub get_pdb_observations{
570      my ($fid,$datasets_ref) = (@_);      my ($fid,$datasets_ref, $attributes_ref) = (@_);
571    
572      my $fig = new FIG;      my $fig = new FIG;
573    
574      foreach my $attr_ref ($fig->get_attributes($fid,'PDB')) {      foreach my $attr_ref (@$attributes_ref){
575        #foreach my $attr_ref ($fig->get_attributes($fid,'PDB')) {
576    
577          my $key = @$attr_ref[1];          my $key = @$attr_ref[1];
578            next if ( ($key !~ /PDB/));
579          my($key1,$key2) =split("::",$key);          my($key1,$key2) =split("::",$key);
580          my $value = @$attr_ref[2];          my $value = @$attr_ref[2];
581          my ($evalue,$location) = split(";",$value);          my ($evalue,$location) = split(";",$value);
# Line 596  Line 706 
706      elsif ($id =~ /^uni\|/)           { $db = "UniProt" }      elsif ($id =~ /^uni\|/)           { $db = "UniProt" }
707      elsif ($id =~ /^tigr\|/)          { $db = "TIGR" }      elsif ($id =~ /^tigr\|/)          { $db = "TIGR" }
708      elsif ($id =~ /^pir\|/)           { $db = "PIR" }      elsif ($id =~ /^pir\|/)           { $db = "PIR" }
709      elsif ($id =~ /^kegg\|/)          { $db = "KEGG" }      elsif (($id =~ /^kegg\|/) || ($id =~ /Spy/))    { $db = "KEGG" }
710      elsif ($id =~ /^tr\|/)            { $db = "TrEMBL" }      elsif ($id =~ /^tr\|/)            { $db = "TrEMBL" }
711      elsif ($id =~ /^eric\|/)          { $db = "ASAP" }      elsif ($id =~ /^eric\|/)          { $db = "ASAP" }
712      elsif ($id =~ /^img\|/)           { $db = "JGI" }      elsif ($id =~ /^img\|/)           { $db = "JGI" }
# Line 1144  Line 1254 
1254    
1255  }  }
1256    
1257    sub display_table {
1258        my ($self,$dataset) = @_;
1259        my $cgi = new CGI;
1260        my $data = [];
1261        my $count = 0;
1262        my $content;
1263    
1264        foreach my $thing (@$dataset) {
1265            next if ($thing->type !~ /dom/);
1266            my $single_domain = [];
1267            $count++;
1268    
1269            my $db_and_id = $thing->acc;
1270            my ($db,$id) = split("::",$db_and_id);
1271    
1272            my $dbmaster = DBMaster->new(-database =>'Ontology');
1273    
1274            my ($name_title,$name_value,$description_title,$description_value);
1275            if($db eq "CDD"){
1276                my $cdd_objs = $dbmaster->cdd->get_objects( { 'id' => $id } );
1277                if(!scalar(@$cdd_objs)){
1278                    $name_title = "name";
1279                    $name_value = "not available";
1280                    $description_title = "description";
1281                    $description_value = "not available";
1282                }
1283                else{
1284                    my $cdd_obj = $cdd_objs->[0];
1285                    $name_title = "name";
1286                    $name_value = $cdd_obj->term;
1287                    $description_title = "description";
1288                    $description_value = $cdd_obj->description;
1289                }
1290            }
1291    
1292            my $location =  $thing->start . " - " . $thing->stop;
1293    
1294            push(@$single_domain,$db);
1295            push(@$single_domain,$thing->acc);
1296            push(@$single_domain,$name_value);
1297            push(@$single_domain,$location);
1298            push(@$single_domain,$thing->evalue);
1299            push(@$single_domain,$description_value);
1300            push(@$data,$single_domain);
1301        }
1302    
1303        if ($count >0){
1304            $content = $data;
1305        }
1306        else
1307        {
1308            $content = "<p>This PEG does not have any similarities to domains</p>";
1309        }
1310    }
1311    
1312    
1313  #########################################  #########################################
1314  #########################################  #########################################
1315  package Observation::Location;  package Observation::Location;
# Line 1183  Line 1349 
1349      my @tmpred_locations = split(",",$thing->tmpred_locations);      my @tmpred_locations = split(",",$thing->tmpred_locations);
1350    
1351      my $lines = [];      my $lines = [];
     my $line_config = { 'title' => 'Localization Evidence',  
                         'short_title' => 'Local',  
                         'basepair_offset' => '1' };  
1352    
1353      #color is      #color is
1354      my $color = "5";      my $color = "6";
   
     my $line_data = [];  
1355    
1356      if($cello_location){      if($cello_location){
1357          my $cello_descriptions = [];          my $cello_descriptions = [];
1358            my $line_data =[];
1359    
1360            my $line_config = { 'title' => 'Localization Evidence',
1361                                'short_title' => 'CELLO',
1362                                'basepair_offset' => '1' };
1363    
1364          my $description_cello_location = {"title" => 'Best Cello Location',          my $description_cello_location = {"title" => 'Best Cello Location',
1365                                            "value" => $cello_location};                                            "value" => $cello_location};
1366    
# Line 1210  Line 1377 
1377              "end" =>  $length + 1,              "end" =>  $length + 1,
1378              "color"=> $color,              "color"=> $color,
1379              "type" => 'box',              "type" => 'box',
1380              "zlayer" => '2',              "zlayer" => '1',
1381              "description" => $cello_descriptions};              "description" => $cello_descriptions};
1382    
1383          push(@$line_data,$element_hash);          push(@$line_data,$element_hash);
1384            $gd->add_line($line_data, $line_config);
1385      }      }
1386    
1387      my $color = "6";  
1388        $color = "2";
1389      if($tmpred_score){      if($tmpred_score){
1390            my $line_data =[];
1391            my $line_config = { 'title' => 'Localization Evidence',
1392                                'short_title' => 'Transmembrane',
1393                                'basepair_offset' => '1' };
1394    
1395    
1396          foreach my $tmpred (@tmpred_locations){          foreach my $tmpred (@tmpred_locations){
1397              my $descriptions = [];              my $descriptions = [];
1398              my ($begin,$end) =split("-",$tmpred);              my ($begin,$end) =split("-",$tmpred);
# Line 1236  Line 1411 
1411              "description" => $descriptions};              "description" => $descriptions};
1412    
1413              push(@$line_data,$element_hash);              push(@$line_data,$element_hash);
1414    
1415          }          }
1416            $gd->add_line($line_data, $line_config);
1417      }      }
1418    
1419      my $color = "1";      $color = "1";
1420      if($signal_peptide_score){      if($signal_peptide_score){
1421            my $line_data = [];
1422          my $descriptions = [];          my $descriptions = [];
1423    
1424            my $line_config = { 'title' => 'Localization Evidence',
1425                                'short_title' => 'SignalP',
1426                                'basepair_offset' => '1' };
1427    
1428          my $description_signal_peptide_score = {"title" => 'signal peptide score',          my $description_signal_peptide_score = {"title" => 'signal peptide score',
1429                                                  "value" => $signal_peptide_score};                                                  "value" => $signal_peptide_score};
1430    
# Line 1255  Line 1438 
1438          my $element_hash = {          my $element_hash = {
1439              "title" => "SignalP",              "title" => "SignalP",
1440              "start" => $cleavage_loc_begin - 2,              "start" => $cleavage_loc_begin - 2,
1441              "end" =>  $cleavage_loc_end + 3,              "end" =>  $cleavage_loc_end + 1,
1442              "type" => 'bigbox',              "type" => 'bigbox',
1443              "color"=> $color,              "color"=> $color,
1444              "zlayer" => '10',              "zlayer" => '10',
1445              "description" => $descriptions};              "description" => $descriptions};
1446    
1447          push(@$line_data,$element_hash);          push(@$line_data,$element_hash);
     }  
   
1448      $gd->add_line($line_data, $line_config);      $gd->add_line($line_data, $line_config);
1449        }
1450    
1451      return ($gd);      return ($gd);
1452    
# Line 1354  Line 1536 
1536      my $peg = $self->acc;      my $peg = $self->acc;
1537    
1538      my $organism = $self->organism;      my $organism = $self->organism;
1539        my $genome = $fig->genome_of($peg);
1540        my ($org_tax) = ($genome) =~ /(.*)\./;
1541      my $function = $self->function;      my $function = $self->function;
1542      my $abbrev_name = $fig->abbrev($organism);      my $abbrev_name = $fig->abbrev($organism);
1543      my $align_start = $self->qstart;      my $align_start = $self->qstart;
# Line 1361  Line 1545 
1545      my $hit_start = $self->hstart;      my $hit_start = $self->hstart;
1546      my $hit_stop = $self->hstop;      my $hit_stop = $self->hstop;
1547    
1548      my $line_config = { 'title' => "$organism",      my $tax_link = "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=" . $org_tax;
1549    
1550        my $line_config = { 'title' => "$organism [$org_tax]",
1551                          'short_title' => "$abbrev_name",                          'short_title' => "$abbrev_name",
1552                            'title_link' => '$tax_link',
1553                          'basepair_offset' => '0'                          'basepair_offset' => '0'
1554                          };                          };
1555    
# Line 1454  Line 1641 
1641  =cut  =cut
1642    
1643  sub display_table {  sub display_table {
1644      my ($self,$dataset) = @_;      my ($self,$dataset, $preference) = @_;
1645    
1646      my $data = [];      my $data = [];
1647      my $count = 0;      my $count = 0;
1648      my $content;      my $content;
1649      my $fig = new FIG;      my $fig = new FIG;
1650      my $cgi = new CGI;      my $cgi = new CGI;
1651        my @ids;
1652      foreach my $thing (@$dataset) {      foreach my $thing (@$dataset) {
         my $single_domain = [];  
1653          next if ($thing->class ne "SIM");          next if ($thing->class ne "SIM");
1654            push (@ids, $thing->acc);
1655        }
1656    
1657        # get the subsystem information as a batch request
1658        my %in_subs  = $fig->subsystems_for_pegs(\@ids);
1659    
1660        # get the evidence information as a batch request
1661        my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes(\@ids);
1662        my %code_attributes;
1663        foreach my $key (@codes){
1664            push (@{$code_attributes{$$key[0]}}, $key);
1665        }
1666    
1667        foreach my $thing (@$dataset) {
1668            next if ($thing->class ne "SIM");
1669            my $single_domain = [];
1670          $count++;          $count++;
1671    
1672          my $id = $thing->acc;          my $id = $thing->acc;
1673    
1674          # add the subsystem information          # add the subsystem information
1675          my @in_sub  = $fig->peg_to_subsystems($id);          #my @in_sub  = $fig->peg_to_subsystems($id);
1676            my @in_sub = $in_subs{$id} if (defined $in_subs{$id});
1677          my $in_sub;          my $in_sub;
1678    
1679          if (@in_sub > 0) {          if (@in_sub > 0) {
# Line 1485  Line 1689 
1689          # add evidence code with tool tip          # add evidence code with tool tip
1690          my $ev_codes=" &nbsp; ";          my $ev_codes=" &nbsp; ";
1691          my @ev_codes = "";          my @ev_codes = "";
1692    
1693          if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {          if ($id =~ /^fig\|\d+\.\d+\.peg\.\d+$/) {
1694              my @codes = grep { $_->[1] =~ /^evidence_code/i } $fig->get_attributes($id);              my @codes;
1695                @codes = @{$code_attributes{$id}} if (defined @{$code_attributes{$id}});
1696              @ev_codes = ();              @ev_codes = ();
1697              foreach my $code (@codes) {              foreach my $code (@codes) {
1698                  my $pretty_code = $code->[2];                  my $pretty_code = $code->[2];
# Line 1523  Line 1729 
1729          my $pair_name = "visual_" . $name;          my $pair_name = "visual_" . $name;
1730    
1731          my $checkbox_col = qq(<input type=checkbox name=seq value="$name" id="$field_name" onClick="VisualCheckPair('$field_name', '$pair_name');">);          my $checkbox_col = qq(<input type=checkbox name=seq value="$name" id="$field_name" onClick="VisualCheckPair('$field_name', '$pair_name');">);
1732          my $acc_col .= &HTML::set_prot_links($cgi,$thing->acc);  
1733            my $prefer_id = &get_prefer($thing->acc, $preference);
1734            my $acc_col .= &HTML::set_prot_links($cgi,$prefer_id);
1735            my $db = $thing->database;
1736            if ($preference ne "FIG"){
1737                $db = &Observation::get_database($prefer_id);
1738            }
1739    
1740          push(@$single_domain,$checkbox_col);          push(@$single_domain,$checkbox_col);
1741          push(@$single_domain,$thing->database);          push(@$single_domain,$db);
1742          push(@$single_domain,$acc_col);          push(@$single_domain,$acc_col);
1743          push(@$single_domain,$thing->evalue);          push(@$single_domain,$thing->evalue);
1744          push(@$single_domain,"$iden\%");          push(@$single_domain,"$iden\%");
# Line 1551  Line 1763 
1763    
1764  sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }  sub html_enc { $_ = $_[0]; s/\&/&amp;/g; s/\>/&gt;/g; s/\</&lt;/g; $_ }
1765    
1766    sub get_prefer {
1767        my ($fid, $db) = @_;
1768        my $fig = new FIG;
1769    
1770        my @aliases = $fig->feature_aliases($fid);
1771    
1772        foreach my $alias (@aliases){
1773            my $id_db = &Observation::get_database($alias);
1774            if ($id_db eq $db){
1775                return ($alias);
1776            }
1777        }
1778        return ($fid);
1779    }
1780    
1781  sub color {  sub color {
1782      my ($evalue) = @_;      my ($evalue) = @_;
1783    
1784      my $color;      my $color;
1785      if ($evalue <= 1e-100){      if ($evalue <= 1e-170){
1786          $color = 1;          $color = 51;
1787        }
1788        elsif (($evalue <= 1e-120) && ($evalue > 1e-170)){
1789            $color = 52;
1790        }
1791        elsif (($evalue <= 1e-90) && ($evalue > 1e-120)){
1792            $color = 53;
1793      }      }
1794      elsif (($evalue <= 1e-70) && ($evalue > 1e-100)){      elsif (($evalue <= 1e-70) && ($evalue > 1e-90)){
1795          $color = 2;          $color = 54;
1796      }      }
1797      elsif (($evalue <= 1e-20) && ($evalue > 1e-70)){      elsif (($evalue <= 1e-40) && ($evalue > 1e-70)){
1798          $color = 3;          $color = 55;
1799      }      }
1800      elsif (($evalue <= 1e-10) && ($evalue > 1e-20)){      elsif (($evalue <= 1e-20) && ($evalue > 1e-40)){
1801          $color = 4;          $color = 56;
1802      }      }
1803      elsif (($evalue <= 1e-4) && ($evalue > 1e-1)){      elsif (($evalue <= 1e-5) && ($evalue > 1e-20)){
1804          $color = 5;          $color = 57;
1805        }
1806        elsif (($evalue <= 1) && ($evalue > 1e-5)){
1807            $color = 58;
1808        }
1809        elsif (($evalue <= 10) && ($evalue > 1)){
1810            $color = 59;
1811      }      }
1812      else{      else{
1813          $color = 6;          $color = 60;
1814      }      }
1815    
1816    
1817      return ($color);      return ($color);
1818  }  }
1819    

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.28

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3