Index: /trunk/tools/czartool/DayMetrics.pm
===================================================================
--- /trunk/tools/czartool/DayMetrics.pm	(revision 29730)
+++ /trunk/tools/czartool/DayMetrics.pm	(revision 29730)
@@ -0,0 +1,324 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+
+use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
+use POSIX qw/strftime/;
+use CGI::Pretty qw[:standard];
+
+use czartool::CzarDb;
+use czartool::Gpc1Db;
+use czartool::Plotter;
+use czartool::StageMetrics;
+use czartool::Metrics;
+
+
+package czartool::DayMetrics;
+our @ISA = qw(czartool::Metrics);    # inherits from Metrics class
+
+###########################################################################
+#
+# Constructor (overrides superclass)
+#
+###########################################################################
+sub new {
+    my ($class) = @_;
+
+    # Call the constructor of the parent class
+    my $self = $class->SUPER::new(
+            $_[1],  # gpc1Db 
+            $_[2],  # czarDb
+            $_[3],  # baseDir
+            $_[4],  # verbose
+            $_[5]   # save_temps
+            ); 
+
+    $self->{day} = $_[6];
+
+    # sort out times
+    $self->{begin} =  "$self->{day} 06:00";
+    $self->{end} = $self->{czarDb}->addInterval($self->{begin}, "1 DAY");
+    $self->{burntoolEnd} = $self->{czarDb}->addInterval($self->{begin}, "12 HOUR");
+
+    # create path, dir and html file
+    $self->{dayDir} = "$self->{baseDir}/$self->{day}";
+    rmdir($self->{dayDir});
+    mkdir($self->{dayDir}, 0777);
+    $self->{plotter}->setOutputPath($self->{dayDir});
+
+    if ($self->{verbose}) {print "* Creating metrics for $self->{day}\n";}
+
+    bless $self, $class;
+
+    return $self;
+}
+
+###########################################################################
+#
+# Writes HTML document
+#
+###########################################################################
+sub writeHTML {
+    my ($self) = @_;
+
+    # create HTML file and write header stuff
+    open (HTMLDOC, ">$self->{dayDir}/index.html");
+    print HTMLDOC "<html>\n";
+    print HTMLDOC "<head>\n";
+    print HTMLDOC "<title>IPP Metrics for $self->{day}</title>\n";
+    print HTMLDOC "<a name=\"top\"></a>\n";
+    print HTMLDOC "<h1 align=\"middle\">IPP Metrics for $self->{day}</h1>\n";
+
+    # summit and burntool exposures
+    my $summitExposures = $self->{gpc1Db}->countScienceExposuresFromLastNight($self->{day});
+    my $burntoolMetrics = new czartool::StageMetrics("burntool", "all_stdscience_labels", $self->{begin}, $self->{burntoolEnd});
+    $self->{czarDb}->runAnalysis($burntoolMetrics);
+
+    my $previousDay = $self->{czarDb}->subtractInterval($self->{day}, "1 DAY");
+    my $nextDay = $self->{czarDb}->addInterval($self->{day}, "1 DAY");
+
+    print HTMLDOC "<h5  align=\"middle\">";
+    print HTMLDOC "<a href=\"../$previousDay/index.html\"> \< previous day</a> | <a href=\"../$nextDay/index.html\">next day \></a><br>\n";
+    print HTMLDOC "Measured from $self->{begin} to $self->{end} HST<br>\n";
+    printf (HTMLDOC "%d exposures taken on summit last night, %d through burntool today</h5>\n", 
+            $summitExposures, $burntoolMetrics->getProcessed() ? $burntoolMetrics->getProcessed() : 0 );
+    print HTMLDOC "</head>\n";
+    print HTMLDOC "<body>\n";
+
+
+
+    my $labels = undef;
+    my $label;
+    if (!$self->{czarDb}->getStdscienceLabelsInTimePeriod($self->{begin}, $self->{end}, \$labels)) {next;}
+
+    my $size = @{$labels};
+    my $table;
+    my $haveLabelData;
+    my %initialPendingTotals;
+    my %processedTotals;
+    my %finalPendingTotals;
+    my %faultTotals;
+    my %labelTables;
+
+    my @stages = ("burntool", "chip", "cam", "fake", "warp", "stack", "diff", "magic", "magicDS", "dist");
+
+
+# loop through all labels and create tables for each that have content
+    foreach my $row ( @{$labels} ) {
+        my ($label) = @{$row};
+
+
+        $table = "<table border='1'>";
+        $table .= "  <tr>\n";
+        $table .= "    <th>Stage</th>\n";
+        $table .= "    <th>Initial Pending</th>\n";
+        $table .= "    <th>Started</th>\n";
+        $table .= "    <th>25% complete</th>\n";
+        $table .= "    <th>50% complete</th>\n";
+        $table .= "    <th>75% complete</th>\n";
+        $table .= "    <th>90% complete</th>\n";
+        $table .= "    <th>95% complete</th>\n";
+        $table .= "    <th>Finished</th>\n";
+        $table .= "    <th>Time taken</th>\n";
+        $table .= "    <th>Processed</th>\n";
+        $table .= "    <th>Exp per hour</th>\n";
+        $table .= "    <th>Final Pending</th>\n";
+        $table .= "  </tr>\n";
+
+        $haveLabelData = 0;
+        foreach my $stage ( @stages ){
+
+            my $stageMetrics = new czartool::StageMetrics($stage, $label, $self->{begin}, ($stage eq "burntool") ? $self->{burntoolEnd} : $self->{end});
+            if (!$self->{czarDb}->runAnalysis($stageMetrics)) {next;}
+
+            if (!$stageMetrics->anythingProcessed()) {next;}
+
+            if ($stageMetrics->getProcessed() > 0) {$haveLabelData = 1;};
+
+            $table .= "  <tr>\n";
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getStage() );
+            $table .= sprintf( "    <td>%d</td>\n", $stageMetrics->getInitialPending() ? $stageMetrics->getInitialPending() : "0" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getStarted() ? $stageMetrics->getStarted() : "");
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished25() ? $stageMetrics->getFinished25() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished50() ? $stageMetrics->getFinished50() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished75() ? $stageMetrics->getFinished75() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished90() ? $stageMetrics->getFinished90() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished95() ? $stageMetrics->getFinished95() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getFinished100() ? $stageMetrics->getFinished100() : "-" );
+            $table .= sprintf( "    <td>%s</td>\n", $stageMetrics->getTotalTime() ? $stageMetrics->getTotalTime() : "-" );
+            $table .= sprintf( "    <td>%d</td>\n", $stageMetrics->getProcessed() ? $stageMetrics->getProcessed() : "0" );
+            $table .= sprintf( "    <td>%.2f</td>\n", $stageMetrics->getRate() ? $stageMetrics->getRate() : "0" );
+            $table .= sprintf( "    <td>");
+            if ($stageMetrics->getFinalPending() > 0) {$table .= "<font color=\"red\">";}
+            $table .= sprintf( "%d\n", $stageMetrics->getFinalPending() );
+            if ($stageMetrics->getFinalPending() > 0) {$table .= "</font>\n";}
+            $table .= sprintf( "</td>");
+            $table .= "  </tr>\n";
+
+            if (!$initialPendingTotals{$stage}) {$initialPendingTotals{$stage} = 0;}
+            $initialPendingTotals{$stage} = $initialPendingTotals{$stage} + $stageMetrics->getInitialPending();
+            if (!$processedTotals{$stage}) {$processedTotals{$stage} = 0;}
+            $processedTotals{$stage} = $processedTotals{$stage} + $stageMetrics->getProcessed();
+            if (!$finalPendingTotals{$stage}) {$finalPendingTotals{$stage} = 0;}
+            $finalPendingTotals{$stage} = $finalPendingTotals{$stage} + $stageMetrics->getFinalPending();
+            if (!$faultTotals{$stage}) {$faultTotals{$stage} = 0;}
+            $faultTotals{$stage} = $faultTotals{$stage} + $stageMetrics->getFaults();
+        }
+
+        $table .= "</table>";
+        $table .= "<br>\n";
+
+        if ($haveLabelData) { 
+            $labelTables{$label} = $table; 
+            if ($self->{verbose}) {print "- $label\n";}
+        }
+    }
+
+    # create hyperlink list of list of active labels
+    print HTMLDOC "<h2>Active labels for this day</h1>\n";
+    foreach my $label (keys (%labelTables)) {
+
+        print HTMLDOC "<a href=\"#$label\">$label</a><br>\n";
+    }
+
+    # some plots
+    print HTMLDOC "<h1 align=\"middle\">Summary plots</h1>\n";
+    $self->{plotter}->createTimeSeries("all_stdscience_labels", undef, $self->{begin}, $self->{end}, 0, 0, 0);
+    print HTMLDOC "<img src=\"czarplot_linear_all_stdscience_labels_all_stages_t.png\" alt=\"All labels and all stages for $self->{day}\" />\n";
+    $self->{plotter}->createHistogram("all_stdscience_labels", $self->{begin}, $self->{end}, 0, 0, 0);
+    print HTMLDOC "<img src=\"czarplot_linear_all_stdscience_labels_all_stages_h.png\" alt=\"All stages for all_stdscience_labels for $self->{day}\" />\n";
+    $self->{plotter}->createRateTimeSeries("all_stdscience_labels", undef, $self->{begin}, $self->{end}, "1 HOUR", 0);
+    print HTMLDOC "<img src=\"czarplot_linear_all_stdscience_labels_all_stages_r.png\" alt=\"All stages for all_stdscience_labels for $self->{day}\" />\n";
+    $self->{plotter}->plotStorageTimeSeries($self->{begin}, $self->{end});
+    print HTMLDOC "<img src=\"czarplot_cluster.png\" alt=\"All stages for all_stdscience_labels for $self->{day}\" />\n";
+
+
+    # survey table
+    $self->printSurveyTable();
+
+    # table for stage totals
+    $table =  "<h2  align=\"middle\">Totals for all labels</h1>\n";
+    $table .= "<table border='1'>";
+    $table .= "  <tr>\n";
+    $table .= "    <th>Stage</th>\n";
+    $table .= "    <th>Initial Pending</th>\n";
+    $table .= "    <th>Processed</th>\n";
+    $table .= "    <th>Final Pending</th>\n";
+    $table .= "    <th>Remaining Faults</th>\n";
+    $table .= "  </tr>\n";
+    foreach my $stage ( @stages ){
+
+        $table .= "  <tr>\n";
+        $table .= sprintf( "    <td>%s</td>\n", $stage );
+        $table .= sprintf( "    <td>%d</td>\n", $initialPendingTotals{$stage} ? $initialPendingTotals{$stage} : 0);
+        $table .= sprintf( "    <td>%d</td>\n", $processedTotals{$stage} ? $processedTotals{$stage} : 0);
+        $table .= sprintf( "    <td>%d</td>\n", $finalPendingTotals{$stage} ? $finalPendingTotals{$stage} : 0);
+        $table .= sprintf( "    <td>%d</td>\n", $faultTotals{$stage} ? $faultTotals{$stage} : 0);
+        $table .= "  </tr>\n";
+    }
+    $table .= "</table>";
+    $table .= "<br>\n";
+
+    print HTMLDOC $table;
+
+    # print all label tables to page
+    foreach my $label (keys (%labelTables)) {
+
+        print HTMLDOC "<a name=\"$label\"></a>\n";
+        print HTMLDOC "<h2  align=\"middle\">$label <a href=\"#top\">(top)</a></h1>\n";
+        $self->{plotter}->createTimeSeries($label, undef, $self->{begin}, $self->{end}, 0, 0, 0);
+        print HTMLDOC "<img src=\"czarplot_linear_".$label."_all_stages_t.png\" alt=\"All stages for $label for $self->{day}\" />\n";
+        $self->{plotter}->createHistogram($label, $self->{begin}, $self->{end}, 0, 0, 0);
+        print HTMLDOC "<img src=\"czarplot_linear_".$label."_all_stages_h.png\" alt=\"All stages for $label for $self->{day}\" />\n";
+
+        print HTMLDOC $labelTables{$label};
+    }
+
+
+    print HTMLDOC "<br>\n";
+    print HTMLDOC "</body>\n";
+    print HTMLDOC "</html>\n";
+    close(HTMLDOC);
+}
+
+###########################################################################
+#
+# Creates a survey table
+#
+###########################################################################
+sub printSurveyTable() {
+    my ($self) = @_;
+
+    print HTMLDOC "<h2  align=\"middle\">Survey statistics</h1>\n";
+    print HTMLDOC "<table border='1'>";
+    print HTMLDOC "  <tr>\n";
+    print HTMLDOC "    <th>Survey</th>\n";
+    print HTMLDOC "    <th>Started burntool</th>\n";
+    print HTMLDOC "    <th>Finished distribution</th>\n";
+    print HTMLDOC "    <th>Time taken</th>\n";
+    print HTMLDOC "  </tr>\n";
+
+    # OSS survey
+    my ($started, $finished, $timeTaken) = undef;
+    $self->{czarDb}->getDayTimings("OSS.nightlyscience", "burntool", "diff", $self->{begin}, \$started, \$finished, \$timeTaken);
+    $self->printSurveyDetails("OSS", $started, $finished, $timeTaken);
+
+    # MDF surveys
+    my @mdfs = ("M31.nightlyscience",
+            "MD01.nightlyscience", 
+            "MD02.nightlyscience", 
+            "MD03.nightlyscience", 
+            "MD04.nightlyscience", 
+            "MD05.nightlyscience", 
+            "MD06.nightlyscience", 
+            "MD07.nightlyscience", 
+            "MD08.nightlyscience", 
+            "MD09.nightlyscience", 
+            "MD10.nightlyscience",
+            "MD11.nightlyscience");
+
+    my $earliest = "2099-01-01";
+    my $latest = "2001-01-01";
+
+    my $mdf;
+    my $haveStart = 0;
+    my $haveEnd = 0;
+    foreach $mdf (@mdfs) {
+
+        if ($self->{czarDb}->getDayTimings($mdf, "burntool", "dist", $self->{begin}, \$started, \$finished, \$timeTaken)) {
+
+            if ($started && $self->{czarDb}->isBefore($started, $earliest)) {$earliest = $started; $haveStart = 1;}
+            if ($finished && $self->{czarDb}->isBefore($latest, $finished)) {$latest = $finished; $haveEnd = 1;}
+        }
+    }
+
+    if (!$haveStart) {$earliest = undef;}
+    if (!$haveEnd) {$latest = undef;}
+    if (!$haveStart || !$haveEnd) {$timeTaken = undef;}
+
+    else {$timeTaken = $self->{czarDb}->diffTimes($latest, $earliest);}
+    $self->printSurveyDetails("MDF", $earliest, $latest, $timeTaken);
+
+    $self->{czarDb}->getDayTimings("all_stdscience_labels", "burntool", "dist", $self->{begin}, \$started, \$finished, \$timeTaken);
+    $self->printSurveyDetails("All", $started, $finished, $timeTaken);
+
+    print HTMLDOC "</table>\n";
+}
+
+###########################################################################
+#
+# Creates a row in the survey table
+#
+###########################################################################
+sub printSurveyDetails() {
+    my ($self, $survey, $started, $finished, $timeTaken, $processed, $pending) = @_;
+
+    print HTMLDOC "  <tr>\n";
+    print HTMLDOC "    <td>$survey</td>\n";
+    printf (HTMLDOC "    <td>%s</td>\n", $started ? $started : "no");
+    printf (HTMLDOC "    <td>%s</td>\n", $finished ? $finished : "no");
+    printf (HTMLDOC "    <td>%s</td>\n", $timeTaken ? $timeTaken : "na");
+    print HTMLDOC "  </tr>\n";
+}
+1;
Index: /trunk/tools/czartool/Metrics.pm
===================================================================
--- /trunk/tools/czartool/Metrics.pm	(revision 29730)
+++ /trunk/tools/czartool/Metrics.pm	(revision 29730)
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+
+use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
+use POSIX qw/strftime/;
+use CGI::Pretty qw[:standard];
+
+use czartool::CzarDb;
+use czartool::Gpc1Db;
+use czartool::Plotter;
+use czartool::StageMetrics;
+
+package czartool::Metrics;
+
+###########################################################################
+#
+# Constructor
+#
+###########################################################################
+sub new {
+
+    my $class = shift;
+    my $self = {
+        gpc1Db => shift,
+        czarDb => shift,
+        baseDir => shift,
+        verbose => shift,
+        save_temps => shift,
+    };
+
+    # create path, dir
+    mkdir($self->{baseDir}, 0777);
+
+    # instantiate a plotter object
+    $self->{plotter} = new czartool::Plotter(
+            $self->{czarDb},
+            "%Y%m%d-%H%M%S",
+            "png font \"/usr/share/fonts/corefonts/arial.ttf\" 8",
+            ".",
+            $self->{save_temps});
+
+    bless $self, $class;
+    return $self;
+}
+
+1;
Index: /trunk/tools/czartool/OCMetrics.pm
===================================================================
--- /trunk/tools/czartool/OCMetrics.pm	(revision 29730)
+++ /trunk/tools/czartool/OCMetrics.pm	(revision 29730)
@@ -0,0 +1,93 @@
+
+
+use DateTime;
+use IPC::Cmd 0.36 qw( can_run run);
+my $end = '2010-11-01';
+my $start = $czarDb->subtractInterval($end, "28 DAY");
+
+
+my $days;
+getDaysFromFullMoon($start, \$days);
+print "$start is $days from full moon\n";
+$start = $czarDb->addInterval($start, "$days DAY");
+print "=$start\n";
+getDaysFromFullMoon($end, \$days);
+print "$end is $days from full moon\n";
+$end = $czarDb->addInterval($end, "$days DAY");
+print "=$end\n";
+
+
+
+my ($beginl,$endl) = get_lunation_extent("2010-11-09");
+
+
+print "begin=$beginl end=$endl\n";
+exit;
+
+
+
+
+###########################################################################
+#
+# Calls 'moondata' program to get number of days since/to full moon for provided date
+#
+###########################################################################
+sub getDaysFromFullMoon() {
+    my ($date, $days) = @_;
+
+    my $cmd = "moondata $date 0 0";
+    my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) =
+        run ( command => $cmd, verbose => $verbose);
+    unless ($success) {print "* Can't run '$cmd'\n"; return 0;}
+
+    my @result = split /\s+/,(join "\n", @$stdout_buf);
+    ${$days} = $result[6];
+
+    return 1;
+}
+
+sub get_lunation_extent {
+    my $date = shift;
+    my ($year,$month,$day) = split /-/,$date;
+    my $dateobs_begin;
+    my $dateobs_end;
+
+    my $dt = DateTime->new(year => $year, month => $month, day => $day,
+            hour => 0, minute => 0, second => 0, nanosecond => 0,
+            time_zone => 'Pacific/Honolulu');
+    do {
+        $dt->subtract(days => 1);
+        my $ymd = $dt->ymd;
+
+
+        my $md_cmd = "moondata $ymd 0 0";
+        my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+            run ( command => $md_cmd, verbose => $verbose);
+        unless ($success) {
+            print "can;t run '$md_cmd'\n"
+        }
+        my @result = split /\s+/,(join "\n", @$stdout_buf);
+        if (abs($result[6]) <= 0.5) {
+            $dateobs_end = $ymd;
+        }
+    } while (!defined($dateobs_end));
+
+    do {
+        $dt->subtract(days => 1);
+        my $ymd = $dt->ymd;
+        my $md_cmd = "moondata $ymd 0 0";
+        my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+            run ( command => $md_cmd, verbose => $verbose);
+        unless ($success) {
+            print "can;t run '$md_cmd'\n"
+        }
+        my @result = split /\s+/,(join "", @$stdout_buf);
+        if (abs($result[6]) <= 0.5) {
+            $dateobs_begin = $ymd;
+        }
+    } while (!defined($dateobs_begin));
+
+    return($dateobs_begin,$dateobs_end);
+}
+
+
