Index: /trunk/tools/czartool.pl
===================================================================
--- /trunk/tools/czartool.pl	(revision 27767)
+++ /trunk/tools/czartool.pl	(revision 27767)
@@ -0,0 +1,271 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use PS::IPP::Config 1.01 qw( :standard );
+use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
+use Pod::Usage qw( pod2usage );
+use IPC::Cmd 0.36 qw( can_run run );
+use DBI;
+use constant DB_SOCKET => '/var/run/mysqld/mysqld.sock';
+use File::Temp qw(tempfile);
+
+my $dbname = 'gpc1';
+my $dbserver = 'ippdb01';
+my $dbuser = 'ippuser';
+my $dbpass = 'ippuser';
+my $db = DBI->connect(
+        "DBI:mysql:database=${dbname};host=${dbserver};mysql_socket=" .
+        DB_SOCKET(),${dbuser},${dbpass},
+        {
+        RaiseError => 1, AutoCommit => 1}
+        ) or die "Unable to connect to database $DBI::errstr\n";
+
+# get current labels from pantasks
+my @cmdOut = `echo "show.labels;quit" | pantasks_client -c ~ipp/stdscience/ptolemy.rc`;
+my $line;
+my @labels;
+my $passedHeader=0;
+foreach $line (@cmdOut) {
+
+    chomp($line);
+    if ($line =~ m/pantasks: dummy/) {$passedHeader=1; next;}
+
+    if ($passedHeader){push(@labels, $line);}
+}
+
+# define set of states
+my @states = ("full", "new", "drop", "wait", "fault");
+
+checkAllLabels("new");
+printInstructions();
+
+my $key;
+system "stty cbreak < /dev/tty > /dev/tty 2>&1";
+while (($key=getc) ) {
+    last if $key eq "q";
+
+    if ($key eq "f") {checkAllLabels("full");}
+    elsif ($key eq "n") {checkAllLabels("new");}
+    elsif ($key eq "d") {checkAllLabels("drop");}
+    elsif ($key eq "w") {checkAllLabels("wait");}
+    elsif ($key eq "l") {labelDetails();}
+    elsif ($key =~ m/[0-9]/) {my $key2=getc; checkOneLabel($labels[$key.$key2]);}
+    printInstructions();
+
+};
+system "stty -cbreak < /dev/tty > /dev/tty 2>&1";
+$db->disconnect();
+
+##############
+#
+#
+###############
+sub printInstructions {
+
+    print "\n*** Enter: (f)ull (n)ew (d)rop (w)ait (q)uit (l)abel, or label number from table above: ";
+}
+
+##############
+#
+#
+###############
+sub labelDetails {
+
+    print "\nPlease enter the label name, or number from table above: ";
+    my $input = <STDIN>;
+    chomp($input);
+    if ($input =~ m/^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$/) {
+       return checkOneLabel($labels[$input]);
+    }
+
+    checkOneLabel($input);
+}
+
+##############
+#
+#
+###############
+sub checkOneLabel {
+    my ($label) = @_;
+
+    chomp($label);
+
+    printf("\n+-------------------------------------------------------------------------------------+\n");
+    printf("|                        %32s                             |\n", $label);
+    printf("+------------+-------+-------+-------+-------+-------+-------+-------+--------+-------+\n");
+    printf("|   state    |  chip |  cam  |  fake | warp  | stack |  diff | magic |destreak|  dist |\n");
+    printf("+------------+-------+-------+-------+-------+-------+-------+-------+--------+-------+\n");
+
+    my $state;
+    my $i=0;
+    foreach $state (@states) {
+
+        chomp($label);
+        printf("| %10s ", $state);
+        printf("| %5d ", checkLabel($label, "chipRun", $state, "chip"));
+        printf("| %5d ", checkLabel($label, "camRun", $state, "cam"));
+        printf("| %5d ", checkLabel($label, "fakeRun", $state, "fake"));
+        printf("| %5d ", checkLabel($label, "warpRun", $state, "warp"));
+        printf("| %5d ", checkLabel($label, "stackRun", $state, "stack"));
+        printf("| %5d ", checkLabel($label, "diffRun", $state, "diff"));
+        printf("| %5d ", checkLabel($label, "magicRun", $state, "magic"));
+        printf("| %6d ", checkLabel($label, "magicDSRun", $state, "magicDS"));
+        printf("| %5d ", checkLabel($label, "distRun", $state, "dist"));
+        printf("|\n");
+        $i++;
+    }
+
+    printf("+------------+-------+-------+-------+-------+-------+-------+-------+--------+-------+\n");
+
+    close(LOGFILE);
+}
+##############
+#
+#
+###############
+sub checkAllLabels {
+    my ($state) = @_;
+
+    printf("\n+------------------------------------------------------------------------------------------------------------------------------------------------------------+\n");
+    printf("|                                                                         %10s                                                                         |\n", $state);
+    printf("+------------------------------------------------------------------------------------------------------------------------------------------------------------+\n");
+    printf("| no  |              label               |    chip   |    cam     |    fake    |    warp    |   stack    |    diff    |   magic    |  destreak  |    dist    |\n");
+    printf("+-----+----------------------------------+-----------+------------+------------+------------+------------+------------+------------+------------+------------+\n");
+
+    my $label;
+    my $i=0;
+    foreach $label (@labels) {
+
+        chomp($label);
+        printf("| %3d ", $i);
+        printf("| %32s ", $label);
+        printf("| %10s", getStateAndFaults($label, "chipRun", $state, "chip"));
+        printf("| %10s ", getStateAndFaults($label, "camRun", $state, "cam"));
+        printf("| %10s ", getStateAndFaults($label, "fakeRun", $state, "fake"));
+        printf("| %10s ", getStateAndFaults($label, "warpRun", $state, "warp"));
+        printf("| %10s ", getStateAndFaults($label, "stackRun", $state, "stack"));
+        printf("| %10s ", getStateAndFaults($label, "diffRun", $state, "diff"));
+        printf("| %10s ", getStateAndFaults($label, "magicRun", $state, "magic"));
+        printf("| %10s ", getStateAndFaults($label, "magicDSRun", $state, "magicDS"));
+        printf("| %10s ", getStateAndFaults($label, "distRun", $state, "dist"));
+        printf("|\n");
+        $i++;
+    }
+
+    printf("+-----+----------------------------------+-----------+------------+------------+------------+------------+------------+------------+------------+------------+\n");
+
+    close(LOGFILE);
+}
+
+##############
+#
+#
+###############
+sub getStateAndFaults {
+    my ($label, $table, $state, $stage) = @_;
+
+    my $new = checkLabel($label, $table, $state, $stage);
+
+    if ($state ne "new") {return $new;}
+
+    my $faults = countFaults($label,$table,$stage);
+
+    if ($faults < 1) {return $new;}
+
+    return $new."(".$faults.")";
+}
+
+##############
+#
+#
+###############
+sub checkLabel {
+    my ($label, $table, $state, $stage) = @_;
+
+    if ($state eq "fault") {return countFaults($label, $table, $stage);}
+
+    my $query = $db->prepare(<<SQL);
+    SELECT count(state)  
+        FROM $table 
+        WHERE label LIKE '$label' 
+        AND state = '$state'
+
+SQL
+
+        $query->execute;
+    return scalar $query->fetchrow_array();
+}
+
+
+##############
+#
+#
+###############
+sub countFaults {
+    my ($label, $table, $stage) = @_;
+
+    my $joinTable;
+    my $id = $stage."_id";
+
+    if ($stage eq "chip") {$joinTable="chipProcessedImfile";}
+    elsif ($stage eq "cam") {$joinTable="camProcessedExp";}
+    elsif ($stage eq "fake") {$joinTable="fakeProcessedImfile";}
+    elsif ($stage eq "warp") {$joinTable="warpSkyfile";}
+    elsif ($stage eq "stack") {$joinTable="stackSumSkyfile";}
+    elsif ($stage eq "diff") {$joinTable="diffSkyfile";}
+    elsif ($stage eq "magic") {$joinTable="magicNodeResult";}
+    elsif ($stage eq "magicDS") {$id = "magic_ds_id"; $joinTable="magicDSFile";}
+    elsif ($stage eq "dist") {return countDistFaults($label);}
+    else {return -1;}
+
+    my $faultCol =  $joinTable.".fault";
+
+    my $query = $db->prepare(<<SQL);
+    SELECT COUNT(*) 
+        FROM $table
+        JOIN $joinTable USING ($id)
+        WHERE label LIKE '$label'
+        AND $faultCol != 0
+        AND state = 'new'
+
+SQL
+
+        $query->execute;
+    return scalar $query->fetchrow_array();
+}
+
+##############
+#
+#
+###############
+sub countDistFaults {
+    my ($label) = @_;
+
+    my $query = $db->prepare(<<SQL);
+    SELECT COUNT(*) 
+        FROM distRun 
+        JOIN distComponent USING(dist_id) 
+        WHERE label LIKE '$label' 
+        AND distComponent.fault > 0
+        AND distRun.state = 'new'
+
+SQL
+
+        $query->execute;
+    my $count = $query->fetchrow_array();
+
+    $query = $db->prepare(<<SQL);
+    SELECT COUNT(*) 
+        FROM distRun 
+        WHERE label LIKE '$label' 
+        AND fault > 0
+        AND distRun.state = 'new'
+
+SQL
+
+        $query->execute;
+
+    return $count + $query->fetchrow_array();
+}
+
