Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsdbh.pm
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsdbh.pm	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsdbh.pm	(revision 38253)
@@ -0,0 +1,20 @@
+# create a database handle based on the configuration given
+# in environment variables
+
+sub getDBHandle {
+    my $dbserver = $ENV{DBSERVER};
+    my $dbuser   = $ENV{DBUSER};
+    my $dbpass   = $ENV{DBPASSWORD};
+    my $dbname   = $ENV{DBNAME};
+
+    die "database enviornment not set up" unless defined($dbserver) and defined($dbuser)
+        and defined($dbpass) and defined($dbname);
+
+    my $dsn = "DBI:mysql:host=$dbserver;database=$dbname";
+
+    my $dbh = DBI->connect($dsn, $dbuser, $dbpass) or die "Cannot connect to server\n";
+
+    return $dbh;
+}
+
+return 1;
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsfsindex
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsfsindex	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsfsindex	(revision 38253)
@@ -0,0 +1,117 @@
+#!/usr/bin/env perl
+
+# list the filesets in a data store product
+# The only ipp specific code is the function that gets the database handle and the
+# exit status codes
+
+use strict;
+use warnings;
+
+use dsdbh;
+use DBI;
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+my $PS_EXIT_DATA_ERROR = 5;
+
+my $fileset = pop;
+die("must specify fileset to list") unless defined $fileset;
+
+my $product = pop;
+die("must specify product to list") unless defined $product;
+
+my $dbh = getDBHandle();
+
+# Look up the product id
+my $prod_stmt = $dbh->prepare("SELECT prod_id FROM dsProduct WHERE prod_name = '$product'");
+$prod_stmt->execute();
+my $prod = $prod_stmt->fetchrow_hashref();
+if (! defined $prod) {
+    print STDERR "failed to find $product in product list\n";
+    exit ($PS_EXIT_DATA_ERROR);
+}
+
+my $prod_id = $prod->{prod_id};
+
+my $stmt = $dbh->prepare("SELECT fileset_id FROM dsFileset WHERE fileset_name = \'$fileset\'" .
+                    " AND prod_id = $prod_id");
+$stmt->execute();
+my $fs = $stmt->fetchrow_hashref();
+if (!defined $fs) {
+    print STDERR "failed to find $fileset in $product\n";
+    exit ($PS_EXIT_DATA_ERROR);
+}
+
+my $fs_id = $fs->{fileset_id};
+
+
+# get the headers for all of the type specific columns
+# a fileset may contain files with multiple types. We print out a new
+# header each time the type in the list changes.
+# save the header
+
+$stmt = $dbh->prepare("SELECT * FROM dsFileType");
+$stmt->execute();
+my %fileTypes;
+while( my @row = $stmt->fetchrow_array()) {
+    my $type = $row[0];
+    $fileTypes{$type} = \@row;
+}
+
+my $header = "# fileID          |bytes   |md5sum                          |type        |";
+
+$stmt = $dbh->prepare("SELECT * from dsFile WHERE fileset_id = $fs_id ORDER BY file_id");
+$stmt->execute();
+
+my $print_header=1;
+my $last_type = "";
+my $last_header = "";
+while( my $row = $stmt->fetchrow_hashref()) {
+    my $type = $row->{type};
+
+    # if the type changes print out a new header
+    if ($type ne $last_type) {
+        $print_header = 1;
+        $last_type = $type;
+    }
+    if ($print_header) {
+        # add the type specific columns
+        my $typeheader = "";
+        my $fileTypeDef = $fileTypes{$type};
+        for (my $i= 1; $i <=4; $i++) {
+            if (!defined $fileTypeDef->[$i]) {
+                last;
+            }
+            $typeheader .= sprintf "%-8s|", $fileTypeDef->[$i];
+        }
+        my $newheader = "$header$typeheader";
+        # if the header actually changed (due to type specific columns) print it out
+        if ($newheader ne $last_header) {
+            print "$newheader\n";
+            $last_header = $newheader;
+        }
+        $print_header = 0;
+    }
+
+    my $line = sprintf "%-18s|%-8s|%-32s|%-12s|", 
+        $row->{file_name}, $row->{bytes}, $row->{md5sum}, $row->{type};
+
+    # now add any type specific columns that are defined (8 character minimum width is arbitrary)
+    if (defined $row->{type_col_0}) {
+        $line .= sprintf "%-8s|", $row->{type_col_0};
+        if (defined $row->{type_col_1}) {
+            $line .= sprintf "%-8s|", $row->{type_col_1};
+            if (defined $row->{type_col_2}) {
+                $line .= sprintf "%-8s|", $row->{type_col_2};
+                if (defined $row->{type_col_3}) {
+                    $line .= sprintf "%-8s|", $row->{type_col_3};
+                }
+            }
+        }
+    }
+
+    print "$line\n";
+}
+if ($print_header) {
+    # empty file set
+    print "$header\n";
+}
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex	(revision 38253)
@@ -0,0 +1,1 @@
+link dsgetindex.v1
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v0
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v0	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v0	(revision 38253)
@@ -0,0 +1,363 @@
+#!/usr/bin/env perl
+#
+# dsgetindex: Generate response to http GET for a DataStore index
+#
+# The only required argument is the REQUEST_URI.
+# The number of elements in the URI tell us whether we are listing
+# the data store root, a product, or a fileset.
+#
+# if a second argument -html is provided, the output is in HTML format
+# otherwise plain text is used
+#
+# The only thing specific to the ipp used here is the exit codes.
+
+use warnings;
+use strict;
+
+use CGI ':standard';
+use IPC::Cmd 0.36 qw( can_run run );
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+my $PS_EXIT_DATA_ERROR = 5;
+
+my $redirect_root_to_pstamp = 0;
+
+my $uri = shift;
+
+if (!$uri) {
+    warn("need uri");
+    exit ($PS_EXIT_CONFIG_ERROR);
+}
+
+my $TEST = 1;
+if ($TEST) {
+  print header('text/plain', '200 OK');
+  foreach my $key (keys %ENV) {
+      printf "%30s : %s\n", $key, $ENV{$key};
+  }
+  print "URI: $uri\n";
+}
+
+my $DS_ROOT = $ENV{DS_ROOT};
+
+die("DS_ROOT not found in the environment") unless defined($DS_ROOT);
+
+my @path;
+
+my $html_mode;
+my $arg = shift;
+if ($arg && ($arg eq "-html")) {
+    $html_mode = 1;
+}
+
+#
+# split up the uri into componnts.
+#
+# XXX: Find a simpler way to do this
+
+# collapse any multipe slashes in uri
+$uri = File::Spec->canonpath($uri);
+
+# split the directories from the file
+my $directories;
+my $file = "";
+my $query_str;
+
+if ($html_mode) {
+    # there is no file on the url
+    
+    # print STDERR "html mode\n";
+    
+    ($directories, $query_str) = split/\?/, $uri;
+
+    # used by the pretty printer
+    @path = split(/\//, $directories);
+    # shift off the empty bit
+    shift @path;
+
+} else {
+    my $volume;
+    ( $volume, $directories, $file) = File::Spec->splitpath($uri);
+
+    print "volume: $volume\n";
+    print "direct: $directories\n";
+    print "file:   $file\n";
+
+    # find the query string if any
+    # (This is only relevant for fileset queries but we follow conductor and do not enforse that restriction)
+    ($file, $query_str) = split/\?/, $file;
+
+    print "file:      $file\n";
+    # print "query_str: $query_str\n";
+
+    if ($file ne "index.txt") {
+        warn("unexepected index file name: $file");
+        exit ($PS_EXIT_CONFIG_ERROR);
+    }
+}
+
+if (!$query_str) {
+    $query_str = "";
+}
+
+my @dirs = split /\//, $directories;
+
+# shift out the empty string at left of the first /
+shift @dirs;
+# shift out 'ds'
+shift @dirs;
+
+# now we're left with either nothing, a product, or a product and a fileset
+my $product = shift @dirs;
+my $fileset = shift @dirs;
+
+if (@dirs) {
+    # XXX need to output an error page
+    warn("unexpected extra directories: @dirs in uri: $uri");
+    exit ($PS_EXIT_CONFIG_ERROR);
+}
+
+my $program;
+if ($fileset) {
+    $program = "dsfsindex";
+} elsif ($product) {
+    $program = "dsprodindex";
+    $fileset .= " $query_str";
+} else {
+    $program = "dsrootindex";
+    $fileset = "";
+    $product = "";
+}
+
+if ($TEST && $query_str) {
+
+    my $filename = "../htdocs/$product/$query_str.idx";
+
+    print header('text/plain', '200 OK');
+    print "PROGRAM: $program\n";
+    print "PRODUCT: $product\n";
+    print "test date file: $filename\n";
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+if ($product && ($query_str =~ m|\d\d\d\d\d\d\d\d|)) {
+
+    my $filename = "../htdocs/$product/$query_str.idx";
+
+    print header('text/plain', '200 OK');
+    # print "PROGRAM: $program\n";
+    # print "PRODUCT: $product\n";
+    # print "test date file: $filename\n";
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+my $missing_tools;
+my $index_program = can_run($program) or (warn "Can't find $program" and $missing_tools = 1);
+
+if ($missing_tools) {
+    #warn("Can't find required tools.");
+    exit ($PS_EXIT_CONFIG_ERROR);
+}
+
+{
+    my $command = "$index_program $product $fileset";
+
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 
+        run(command => $command, verbose => 0);
+
+    if ($success) {
+        if ($html_mode) {
+            html_index($stdout_buf);
+        } else {
+            print header('text/plain', '200 OK');
+            print @$stdout_buf;
+        }
+        $error_code = 0 if !defined $error_code;
+    } else {
+        if (0 && $html_mode) {
+            XXX: TODO
+
+        } else {
+            # since we're invoked as a redirect from a text file browsers are expecting
+            # 'text/plain' format
+            print header('text/plain', '404 ERROR');
+#           print header('text/plain', '410 GONE');
+#            print header('text/plain', '200 OK');
+            print @$stderr_buf;
+            print STDERR @$stderr_buf;
+#            exit 410;
+        }
+    }
+
+    exit $error_code >> 8;
+}
+
+sub html_index {
+
+    my $out_array_ref = shift;
+    my $outBuf = join( "", @$out_array_ref);
+
+    #print header('text/plain', '200 OK');
+
+    #print "outputting from html_index\n";
+    #print @$out_buf;
+    pprint_pre();
+    my @lines = split /^/, $outBuf;
+    foreach my $line (@lines) {
+        pprint($line);
+    }
+    pprint_post();
+}
+
+#
+# XXX:
+# quick hacky pretty printer
+# Adapted from Eric's Data Store mock up
+#
+
+#sub print_free_space {
+#    use Filesys::Df;
+#	# get free space
+#	my $ref = df($DS_ROOT);
+#	printf '<p>Free space: %.2f G (%.1f%%)</p>',
+#		$ref->{bfree}/(1024*1024),
+#		100.0*$ref->{bfree}/$ref->{blocks};
+#        print "\n";
+#}
+sub pprint_pre {
+
+    print header('text/html', '200 OK');
+    my $name;
+    # note $fileset is not so we look at the name of the index script to determine the level
+    if ($program eq "dsfsindex") {
+        $name = $fileset;
+    } elsif ($program eq "dsprodindex") {
+        $name = "$product";
+    } else {
+        $name = "";
+    }
+    print start_html("IPP Data Store $name");
+
+
+	# return link
+        if (!$redirect_root_to_pstamp || $program ne "dsrootindex") {
+            print a({-href=>"./index.txt"}, "Text Version");
+        }
+
+	if ($#path >= 1) {
+            # including the up links in the data store display causes 
+            # wget -r to follow them up which makes a mess
+            # Turn them off if the user agent looks like wget
+            my $display_up_links = (lc($ENV{HTTP_USER_AGENT}) =~ /wget/) ? 0 : 1;
+            if ($display_up_links) {
+                print "&nbsp&nbsp&nbsp&nbsp\n";
+                my $up = join('/', @path[0..$#path-1]);
+                if ($redirect_root_to_pstamp and $program eq "dsprodindex") {
+                    print a({-href=>"http://pstamp.ipp.ifa.hawaii.edu/dsroot.php"}, "Up to $up");
+                } elsif ($program eq 'dsrootindex') {
+                    # no up link in dsroot
+                } else {
+                    print a({-href=>".."}, "Up to $up");
+                }
+            }
+	}
+        print "</p>\n";
+
+
+    print '<table cellpadding="3">';
+}
+
+
+sub pprint_post {
+    print '</table>';
+    print p();
+
+#    print_free_space();
+    print end_html();
+}
+
+
+sub pprint {
+    my $line = shift;
+
+    my $nolink;
+    my $celltag = 'td';
+
+	# assume a comment line means its the header
+    if ($line =~ /^\s*#/) {
+        $celltag = 'th';
+        $nolink = 1;
+    }
+
+    my @toks = split(/\|/, $line);
+
+    print '<tr>';
+
+    print "<$celltag>";
+
+    if ($nolink) {
+       print $toks[0];
+    } else {
+         # First column is link to an entity down one level in data store (product, fileset, file)
+	 # assumes id is always first field
+	 my $wpath = "./$toks[0]";
+
+         # if this is a file request, use a download cgi
+         my $fits = 0;
+         if ($wpath =~ /\.fits\s*$/) {
+             # This doesn't work through the proxy
+             # The /ds-cgi gets tried on alala
+             #    $wpath = '/ds-cgi/dsfits.cgi?'.substr($wpath, 4); # strip' /ds/'
+             $fits = 1;
+         }
+
+        if ($fits) {
+            print a({-href=>$wpath, -type=>'image/x-fits'}, $toks[0]);
+        } else {
+            print a({-href=>$wpath}, $toks[0]);
+        }
+
+        if ($program eq 'dsrootindex') {
+            # for root listing make most recent fileset a link as well unless there are no filesets
+            my $fileset = $toks[1];
+            $fileset =~ s/^\s+//;
+            $fileset =~ s/\s+$//;
+            if ($fileset ne 'none') {
+                print "</$celltag>";
+                print "<$celltag>";
+                # drop the product from the list of tokens
+                my $product = shift @toks;
+                # elmiminate any whitesapace
+                $product =~ s/^\s+//;
+                $product =~ s/\s+$//;
+                print a({-href=>"./$product/$fileset"}, $fileset);
+            }
+        }
+    }
+    shift @toks;
+
+    print "</$celltag>";
+
+    # foreach my $val (@toks[1..$#toks]) {
+    foreach my $val (@toks) {
+		print "<$celltag>";
+		print $val;
+		print "</$celltag>";
+    }
+
+    print '</tr>';
+}
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1	(revision 38253)
@@ -0,0 +1,321 @@
+#!/usr/bin/env perl
+#
+# rework of dsgetindex to use PATH_INFO and QUERY_STRING, allowing for raw file and hdrview
+
+# possible values for PATH_INFO:
+
+# html mode:
+# /
+# /gpc2/
+# /gpc2/o7145h0307q/
+# /gpc2/o7145h0307q/o7145h0307q02.fits
+
+# text model
+# /index.txt
+# /gpc2/index.txt
+# /gpc2/o7145h0307q/index.txt
+
+# query_string options:
+# YYYYMMDD (date string)
+# hdrview
+
+use warnings;
+use strict;
+
+use CGI ':standard';
+use IPC::Cmd 0.36 qw( can_run run );
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+my $PS_EXIT_DATA_ERROR = 5;
+
+my $path_info    = $ENV{PATH_INFO};
+my $query_string = $ENV{QUERY_STRING};
+my $script_name  = $ENV{SCRIPT_NAME};
+
+my $TEST = 0;
+if ($TEST) {
+  print header('text/plain', '200 OK');
+  foreach my $key (keys %ENV) {
+     printf "%30s : %s\n", $key, $ENV{$key};
+  }  
+  print "PATH_INFO: $path_info\n" unless not defined($path_info);
+  print "QUERY_STRING: $query_string\n" unless not defined($query_string);
+}
+
+my $DS_ROOT = $ENV{DS_ROOT};
+die("DS_ROOT not found in the environment") unless defined($DS_ROOT);
+
+my @path;
+my @dirs;
+   
+# collapse any multipe slashes in uri
+$path_info = File::Spec->canonpath($path_info);
+
+if (not $path_info) { 
+    if ($TEST) { print "missing path_info\n"; }
+    $path_info = "/";
+}
+@path = split(/\//, $path_info);
+@dirs = @path;
+
+# check for index.txt as last element (defines text mode)
+my $html_mode = 0;
+my $file = pop @dirs;
+if ($file ne "index.txt") {
+    $html_mode = 1;
+    push @dirs, $file;
+}
+
+# shift out the empty string at left of the first /
+shift @dirs;
+
+# now we're left with either nothing, a product, or a product and a fileset
+my $product = shift @dirs;
+my $fileset = shift @dirs;
+   $file    = shift @dirs;
+
+my $program;
+if ($file) {
+    $program = "NONE";
+} elsif ($fileset) {
+    $program = "dsfsindex";
+} elsif ($product) {
+    $program = "dsprodindex";
+    $fileset = "";
+} else {
+    $program = "dsrootindex";
+    $fileset = "";
+    $product = "";
+}
+
+if ($product && ($query_string =~ m|\d\d\d\d\d\d\d\d|)) {
+
+    my $filename = "$DS_ROOT/$product/$query_string.idx";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+    }
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+if ($file && ($query_string eq "hdrview")) {
+
+    my $filename = "$DS_ROOT/$product/$fileset/$file";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+      print "run fhead\n";
+    }
+
+    my @list = `fhead $filename`;
+    if ($?) { die ("problem running fhead"); }
+    
+    print @list;
+
+    exit 0;
+}
+
+if ($file) {
+
+    my $filename = "$DS_ROOT/$product/$fileset/$file";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+    }
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+my $missing_tools;
+my $index_program = can_run($program) or (warn "Can't find $program" and $missing_tools = 1);
+
+if ($missing_tools) {
+    #warn("Can't find required tools.");
+    exit ($PS_EXIT_CONFIG_ERROR);
+}
+
+{
+    my $command = "$index_program $product $fileset";
+
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 
+        run(command => $command, verbose => 0);
+
+    if ($success) {
+        if ($html_mode) {
+            html_index($stdout_buf);
+        } else {
+            print header('text/plain', '200 OK');
+            print @$stdout_buf;
+        }
+        $error_code = 0 if !defined $error_code;
+    } else {
+        if (0 && $html_mode) {
+            XXX: TODO
+        } else {
+            # since we're invoked as a redirect from a text file browsers are expecting
+            # 'text/plain' format
+            print header('text/plain', '404 ERROR');
+            print @$stderr_buf;
+            print STDERR @$stderr_buf;
+        }
+    }
+
+    exit $error_code >> 8;
+}
+
+sub html_index {
+
+    my $out_array_ref = shift;
+    my $outBuf = join( "", @$out_array_ref);
+
+    pprint_pre();
+    my @lines = split /^/, $outBuf;
+    foreach my $line (@lines) {
+        pprint($line);
+    }
+    pprint_post();
+}
+
+# quick hacky pretty printer
+# Adapted from Eric's Data Store mock up
+
+sub pprint_pre {
+
+    print header('text/html', '200 OK');
+    my $name;
+    # note $fileset is not so we look at the name of the index script to determine the level
+    if ($program eq "dsfsindex") {
+        $name = $fileset;
+    } elsif ($program eq "dsprodindex") {
+        $name = "$product";
+    } else {
+        $name = "";
+    }
+    print start_html("IPP Data Store $name");
+
+	# return link
+        if ($program ne "dsrootindex") {
+            print a({-href=>"./index.txt"}, "Text Version");
+        }
+
+	if ($#path >= 1) {
+            # including the up links in the data store display causes 
+            # wget -r to follow them up which makes a mess
+            # Turn them off if the user agent looks like wget
+            my $display_up_links = (lc($ENV{HTTP_USER_AGENT}) =~ /wget/) ? 0 : 1;
+            if ($display_up_links) {
+                print "&nbsp&nbsp&nbsp&nbsp\n";
+                my $up = join('/', @path[0..$#path-1]);
+		if ($program eq 'dsrootindex') {
+                    # no up link in dsroot
+                } else {
+                    print a({-href=>".."}, "Up to $script_name/$up");
+                }
+            }
+	}
+        print "</p>\n";
+
+
+    print '<table cellpadding="3">';
+}
+
+
+sub pprint_post {
+    print '</table>';
+    print p();
+    print end_html();
+}
+
+
+sub pprint {
+    my $line = shift;
+
+    my $nolink;
+    my $celltag = 'td';
+
+	# assume a comment line means its the header
+    if ($line =~ /^\s*#/) {
+        $celltag = 'th';
+        $nolink = 1;
+    }
+
+    my @toks = split(/\|/, $line);
+
+    print '<tr>';
+
+    print "<$celltag>";
+
+    if ($nolink) {
+       print $toks[0];
+    } else {
+         # First column is link to an entity down one level in data store (product, fileset, file)
+	 # assumes id is always first field
+	 my $wpath = "./$toks[0]";
+
+         # if this is a file request, use a download cgi
+         my $fits = 0;
+         if ($wpath =~ /\.fits\s*$/) {
+             # This doesn't work through the proxy
+             # The /ds-cgi gets tried on alala
+             #    $wpath = '/ds-cgi/dsfits.cgi?'.substr($wpath, 4); # strip' /ds/'
+             $fits = 1;
+         }
+
+        if ($fits) {
+            print a({-href=>$wpath, -type=>'image/x-fits'}, $toks[0]);
+        } else {
+            print a({-href=>$wpath}, $toks[0]);
+        }
+
+        if ($program eq 'dsrootindex') {
+            # for root listing make most recent fileset a link as well unless there are no filesets
+            my $fileset = $toks[1];
+            $fileset =~ s/^\s+//;
+            $fileset =~ s/\s+$//;
+            if ($fileset ne 'none') {
+                print "</$celltag>";
+                print "<$celltag>";
+                # drop the product from the list of tokens
+                my $product = shift @toks;
+                # elmiminate any whitesapace
+                $product =~ s/^\s+//;
+                $product =~ s/\s+$//;
+                print a({-href=>"./$product/$fileset"}, $fileset);
+            }
+        }
+    }
+    shift @toks;
+
+    print "</$celltag>";
+
+    # foreach my $val (@toks[1..$#toks]) {
+    foreach my $val (@toks) {
+		print "<$celltag>";
+		print $val;
+		print "</$celltag>";
+    }
+
+    print '</tr>';
+}
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1.save
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1.save	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsgetindex.v1.save	(revision 38253)
@@ -0,0 +1,307 @@
+#!/usr/bin/env perl
+#
+# rework of dsgetindex to use PATH_INFO and QUERY_STRING, allowing for raw file and hdrview
+
+# possible values for PATH_INFO:
+
+# html mode:
+# /ps2-oof/
+# /ps2-oof/gpc2/
+# /ps2-oof/gpc2/o7145h0307q/
+# /ps2-oof/gpc2/o7145h0307q/o7145h0307q02.fits
+
+# text model
+# /ps2-oof/index.txt
+# /ps2-oof/gpc2/index.txt
+# /ps2-oof/gpc2/o7145h0307q/index.txt
+
+# query_string options:
+# YYYYMMDD (date string)
+# hdrview
+
+use warnings;
+use strict;
+
+use CGI ':standard';
+use IPC::Cmd 0.36 qw( can_run run );
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+my $PS_EXIT_DATA_ERROR = 5;
+
+my $path_info    = $ENV{PATH_INFO};
+my $query_string = $ENV{QUERY_STRING};
+
+my $TEST = 1;
+if ($TEST) {
+  print header('text/plain', '200 OK');
+  # foreach my $key (keys %ENV) {
+  #    printf "%30s : %s\n", $key, $ENV{$key};
+  #}
+  print "PATH_INFO: $path_info\n" unless not defined($path_info);
+  print "QUERY_STRING: $query_string\n" unless not defined($query_string);
+}
+
+my $DS_ROOT = $ENV{DS_ROOT};
+die("DS_ROOT not found in the environment") unless defined($DS_ROOT);
+
+my @path;
+   
+# collapse any multipe slashes in uri
+$path_info = File::Spec->canonpath($path_info);
+
+@path = split(/\//, $path_info);
+
+# check for index.txt as last element (defines text mode)
+my $html_mode = 0;
+my $file = pop @path;
+if ($file ne "index.txt") {
+    $html_mode = 1;
+    push @path, $file;
+}
+
+# shift out the empty string at left of the first /
+shift @path;
+# shift out 'ps2-oof'
+shift @path;
+
+# now we're left with either nothing, a product, or a product and a fileset
+my $product = shift @path;
+my $fileset = shift @path;
+   $file    = shift @path;
+
+my $program;
+if ($file) {
+    $program = "NONE";
+} elsif ($fileset) {
+    $program = "dsfsindex";
+} elsif ($product) {
+    $program = "dsprodindex";
+    $fileset = "";
+} else {
+    $program = "dsrootindex";
+    $fileset = "";
+    $product = "";
+}
+
+if ($product && ($query_string =~ m|\d\d\d\d\d\d\d\d|)) {
+
+    my $filename = "$DS_ROOT/$product/$query_string.idx";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+    }
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+if ($file && ($query_string eq "hdrview")) {
+
+    my $filename = "$DS_ROOT/$product/$fileset/$file";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+    }
+
+    my @list = `fhead $filename`;
+    print @list;
+
+    exit 0;
+}
+
+if ($file) {
+
+    my $filename = "$DS_ROOT/$product/$fileset/$file";
+
+    print header('text/plain', '200 OK');
+    if ($TEST) {
+      print "PROGRAM: $program\n";
+      print "PRODUCT: $product\n";
+      print "FILE:    $filename\n";
+    }
+
+    open (FILE, "$filename");
+    my @list = <FILE>;
+    close (FILE);
+
+    print @list;
+
+    exit 0;
+}
+
+my $missing_tools;
+my $index_program = can_run($program) or (warn "Can't find $program" and $missing_tools = 1);
+
+if ($missing_tools) {
+    #warn("Can't find required tools.");
+    exit ($PS_EXIT_CONFIG_ERROR);
+}
+
+{
+    my $command = "$index_program $product $fileset";
+
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 
+        run(command => $command, verbose => 0);
+
+    if ($success) {
+        if ($html_mode) {
+            html_index($stdout_buf);
+        } else {
+            print header('text/plain', '200 OK');
+            print @$stdout_buf;
+        }
+        $error_code = 0 if !defined $error_code;
+    } else {
+        if (0 && $html_mode) {
+            XXX: TODO
+        } else {
+            # since we're invoked as a redirect from a text file browsers are expecting
+            # 'text/plain' format
+            print header('text/plain', '404 ERROR');
+            print @$stderr_buf;
+            print STDERR @$stderr_buf;
+        }
+    }
+
+    exit $error_code >> 8;
+}
+
+sub html_index {
+
+    my $out_array_ref = shift;
+    my $outBuf = join( "", @$out_array_ref);
+
+    pprint_pre();
+    my @lines = split /^/, $outBuf;
+    foreach my $line (@lines) {
+        pprint($line);
+    }
+    pprint_post();
+}
+
+# quick hacky pretty printer
+# Adapted from Eric's Data Store mock up
+
+sub pprint_pre {
+
+    print header('text/html', '200 OK');
+    my $name;
+    # note $fileset is not so we look at the name of the index script to determine the level
+    if ($program eq "dsfsindex") {
+        $name = $fileset;
+    } elsif ($program eq "dsprodindex") {
+        $name = "$product";
+    } else {
+        $name = "";
+    }
+    print start_html("IPP Data Store $name");
+	if ($#path >= 1) {
+            # including the up links in the data store display causes 
+            # wget -r to follow them up which makes a mess
+            # Turn them off if the user agent looks like wget
+            my $display_up_links = (lc($ENV{HTTP_USER_AGENT}) =~ /wget/) ? 0 : 1;
+            if ($display_up_links) {
+                print "&nbsp&nbsp&nbsp&nbsp\n";
+                my $up = join('/', @path[0..$#path-1]);
+		if ($program eq 'dsrootindex') {
+                    # no up link in dsroot
+                } else {
+                    print a({-href=>".."}, "Up to $up");
+                }
+            }
+	}
+        print "</p>\n";
+
+
+    print '<table cellpadding="3">';
+}
+
+
+sub pprint_post {
+    print '</table>';
+    print p();
+    print end_html();
+}
+
+
+sub pprint {
+    my $line = shift;
+
+    my $nolink;
+    my $celltag = 'td';
+
+	# assume a comment line means its the header
+    if ($line =~ /^\s*#/) {
+        $celltag = 'th';
+        $nolink = 1;
+    }
+
+    my @toks = split(/\|/, $line);
+
+    print '<tr>';
+
+    print "<$celltag>";
+
+    if ($nolink) {
+       print $toks[0];
+    } else {
+         # First column is link to an entity down one level in data store (product, fileset, file)
+	 # assumes id is always first field
+	 my $wpath = "./$toks[0]";
+
+         # if this is a file request, use a download cgi
+         my $fits = 0;
+         if ($wpath =~ /\.fits\s*$/) {
+             # This doesn't work through the proxy
+             # The /ds-cgi gets tried on alala
+             #    $wpath = '/ds-cgi/dsfits.cgi?'.substr($wpath, 4); # strip' /ds/'
+             $fits = 1;
+         }
+
+        if ($fits) {
+            print a({-href=>$wpath, -type=>'image/x-fits'}, $toks[0]);
+        } else {
+            print a({-href=>$wpath}, $toks[0]);
+        }
+
+        if ($program eq 'dsrootindex') {
+            # for root listing make most recent fileset a link as well unless there are no filesets
+            my $fileset = $toks[1];
+            $fileset =~ s/^\s+//;
+            $fileset =~ s/\s+$//;
+            if ($fileset ne 'none') {
+                print "</$celltag>";
+                print "<$celltag>";
+                # drop the product from the list of tokens
+                my $product = shift @toks;
+                # elmiminate any whitesapace
+                $product =~ s/^\s+//;
+                $product =~ s/\s+$//;
+                print a({-href=>"./$product/$fileset"}, $fileset);
+            }
+        }
+    }
+    shift @toks;
+
+    print "</$celltag>";
+
+    # foreach my $val (@toks[1..$#toks]) {
+    foreach my $val (@toks) {
+		print "<$celltag>";
+		print $val;
+		print "</$celltag>";
+    }
+
+    print '</tr>';
+}
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsindex.cgi
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsindex.cgi	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsindex.cgi	(revision 38253)
@@ -0,0 +1,3 @@
+#!/bin/bash
+. ./dsshellconfig
+dsgetindex.v0 $REQUEST_URI -html
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsprodindex
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsprodindex	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsprodindex	(revision 38253)
@@ -0,0 +1,146 @@
+#!/usr/bin/env perl
+
+# list the filesets in a data store product
+
+use strict;
+use warnings;
+
+use DBI;
+use dsdbh;
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+my $PS_EXIT_DATA_ERROR = 5;
+my $product = shift;
+die("must specify product to list") unless defined $product;
+
+# optional fileset name. Ignore filesets up to and including $after_fileset
+my $after_fileset = shift;
+
+my $dbh = getDBHandle();
+
+my $prod_stmt = $dbh->prepare("SELECT * FROM dsProduct WHERE prod_name = '$product'");
+$prod_stmt->execute();
+my $prod = $prod_stmt->fetchrow_hashref();
+if (! defined $prod) {
+    print STDERR "failed to find $product in product list\n";
+    exit ($PS_EXIT_DATA_ERROR);
+}
+
+# first get the column names
+
+# we have at least 3 columns
+my @header_col = ("# filesetID", "time registered", "type");
+my $numCols = 3;
+
+# now add any product specific columns that are defined. Note if there is no header value
+# then any values in the rows will be ignored
+my $last_prod_col = -1;
+for (my $i = 0; $i < 8; $i++) {
+    my $col_key = "prod_col_$i";
+    my $col_name = $prod->{$col_key};
+
+    last if ! defined $col_name;
+
+    $header_col[$numCols++] = $col_name;
+    $last_prod_col = $i;
+}
+
+# now set up arrays for the values for each column. 
+my @column;
+for (my $i = 0; $i < $numCols; $i++) {
+
+    my @col = ($header_col[$i]);
+
+    $column[$i] = \@col;
+}
+    
+
+my $prod_id = $prod->{prod_id};
+
+my $stmt;
+my $after_clause = "";
+if ($after_fileset) {
+    # client wants only filesets registered after $after_fileset
+    # Since fileset_id is auto increment the desired filesets will have a larger fileset_id than
+    # the target. Look up it's fileset_id
+
+    $stmt = $dbh->prepare("SELECT fileset_id FROM dsFileset " .
+                            "WHERE prod_id = $prod_id AND fileset_name = \'$after_fileset\'");
+    $stmt->execute();
+    my $fs = $stmt->fetchrow_hashref();
+    if ($fs) {
+        $after_clause = " AND fileset_id > $fs->{fileset_id}";
+    } else {
+        # $after_fileset not found
+        #
+        # XXX: the spec doesn't say what should happen in this case.
+        # Here we follow the conductor implementation and return the whole list.
+        # This may not be the right thing to do. It might be better to throw an error
+        # This is definitely not the right thing to do. Exit with an error
+        exit 404;
+    }
+}
+        
+$stmt = $dbh->prepare("SELECT * FROM dsFileset WHERE prod_id = $prod_id AND hide = 0  $after_clause ORDER BY fileset_id");
+$stmt->execute();
+
+# we at least have the header row to output
+my $numRows = 1;
+while( my $row = $stmt->fetchrow_hashref()) {
+
+    $numRows++;
+    my $daytime = $row->{reg_time};
+    (my $date, my $time) = split " ", $daytime;
+
+    my $reg_time = $date . "T" . $time . "Z";
+
+    my $line = sprintf "%-11s|%-20s|%-9s|", $row->{fileset_name}, $reg_time, $row->{type};
+
+    # this probably would have been simpler had I used fetchrow array
+    push @{$column[0]}, $row->{fileset_name};
+    push @{$column[1]}, $reg_time;
+    push @{$column[2]}, $row->{type};
+    
+    for (my $i = 0; $i <= $last_prod_col; $i++) {
+        my $col_key = "prod_col_$i";
+        my $col_val = $row->{$col_key};
+
+        if (!defined($col_val)) {
+            $col_val = "null";
+        }
+        push @{$column[$i+3]}, $col_val;
+    }
+}
+
+# find the largest value width in each column
+my @col_widths;
+for (my $c = 0; $c < $numCols; $c++) {
+    $col_widths[$c] = 0;
+    my $col = $column[$c];
+    for (my $i = 0; $i < $numRows; $i++) {
+        my $val = $col->[$i];
+        if (!defined($val)) {
+            die "value for column $c in row $i is null";
+            next;
+        }
+        my $len = length($val);
+        if ($len > $col_widths[$c]) {
+            $col_widths[$c] = $len;
+        }
+    }
+}
+
+# print out the results
+for (my $r = 0; $r < $numRows; $r++) {
+    for (my $c = 0; $c < $numCols; $c++) {
+        my $val = $column[$c]->[$r];
+        my $width = $col_widths[$c];
+        if (defined($val)) {
+            printf "%-*s|", $width, $val;
+        } else {
+            die "value for column $c in row $r is null";
+        }
+    }
+    print "\n";
+}
+    
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsrootindex
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsrootindex	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsrootindex	(revision 38253)
@@ -0,0 +1,57 @@
+#!/usr/bin/env perl
+#
+# dsrootindex:  Extract the root data store index from the database.
+# The output is in DataStore index.txt format
+#
+
+use strict;
+use warnings;
+
+use dsdbh;
+
+use DBI;
+
+my $PS_EXIT_CONFIG_ERROR = 3;
+
+# set this variable to redirect listings of the root datastore directory
+# to the password protected php page on the postage stamp server web site.
+# Since the data store is restricted by IP address now this is no longer necessary
+my $redirect_root_to_pstamp = 0;
+if ($redirect_root_to_pstamp) {
+
+        print '
+        <html>
+        <head>
+        <meta HTTP-EQUIV="REFRESH" content="0; url=http://pstamp.ipp.ifa.hawaii.edu/dsroot.php">
+        </head>
+        </html>
+        ';
+
+        exit 0;
+}
+
+my $dbh = getDBHandle();
+
+my $stmt = $dbh->prepare("SELECT * FROM dsProduct ORDER BY type");
+$stmt->execute();
+
+print "# productID  |Most recent |Time registered     |type     |Description                     |\n";
+
+while( my $row = $stmt->fetchrow_hashref()) {
+    my $prod_id = $row->{prod_id};
+
+    my ($date, $time) = split / /, $row->{last_update};
+    my $datetime = $date . "T" . $time . "Z";
+
+    my $last_fs =  $row->{last_fs};
+    if (!$last_fs) {
+        # dsrootls is fussy when this field is blank
+        $last_fs = "none";
+    }
+
+    my $line = sprintf "%-13s|%-12s|%-20s|%-9s|%-32s|\n",  $row->{prod_name}, $last_fs, $datetime,
+        $row->{type}, $row->{description};
+
+    # XXX EAM : security by obfuscation
+    print $line;
+}
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dsshellconfig
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dsshellconfig	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dsshellconfig	(revision 38253)
@@ -0,0 +1,19 @@
+# set up some environment needed by the scripts
+
+# IPC::Cmd::can_run routine doesn't find programs in ds-cgi
+# unless . is in the path
+PATH=.:${PATH}:/home/panstarrs/ipp/psconfig/ipp-20130307.lin64/bin
+LIBRARY_PATH=${LIBRARY_PATH}:/home/panstarrs/ipp/psconfig/ipp-20130307.lin64/lib
+LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/panstarrs/ipp/psconfig/ipp-20130307.lin64/lib
+
+# setting these here allow the data store to run independnt of the ipp configuration
+export DBSERVER=ippc20
+export DBNAME=ps2oof
+export DBPASSWORD=ipp
+export DBUSER=ipp
+
+export LIBRARY_PATH
+export LD_LIBRARY_PATH
+
+export DS_ROOT=/export/ippc20.0/ps2-oof/htdocs
+export PERL5LIB=/home/panstarrs/ipp/psconfig/ipp-20130307.lin64/lib
Index: /branches/eam_branches/ipp-20150419/oofview/cgi/dstxtindex.cgi
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/cgi/dstxtindex.cgi	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/cgi/dstxtindex.cgi	(revision 38253)
@@ -0,0 +1,3 @@
+#!/bin/bash
+. ./dsshellconfig
+./dsgetindex $REQUEST_URI;
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/error410.html
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/error410.html	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/error410.html	(revision 38253)
@@ -0,0 +1,4 @@
+<HTML>
+<TITLE>File is gone</TITLE>
+Sorry. The requested file is no longer available.
+</HTML>
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150503.idx
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150503.idx	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150503.idx	(revision 38253)
@@ -0,0 +1,336 @@
+# filesetID|time registered     |type    |telescope pointing            |etime|f|airm|comments
+o7145h0001d|2015-05-03T02:43:06Z|    DARK|  105.019414    20.720544 2000|  0.1|CLEAR|-9999.990|Queue ( 1of11) Dark Sweep
+o7145h0002d|2015-05-03T02:43:26Z|    DARK|  105.098693    20.720669 2000|  0.1|CLEAR|-9999.990|Queue ( 2of11) Dark Sweep
+o7145h0003d|2015-05-03T02:43:46Z|    DARK|  105.182653    20.720788 2000|  0.1|CLEAR|-9999.990|Queue ( 3of11) Dark Sweep
+o7145h0004d|2015-05-03T02:44:06Z|    DARK|  105.265953    20.720900 2000|  0.1|CLEAR|-9999.990|Queue ( 4of11) Dark Sweep
+o7145h0005d|2015-05-03T02:44:26Z|    DARK|  105.349469    20.721016 2000|  0.1|CLEAR|-9999.990|Queue ( 5of11) Dark Sweep
+o7145h0006d|2015-05-03T02:44:46Z|    DARK|  105.432979    20.721144 2000|  0.1|CLEAR|-9999.990|Queue ( 6of11) Dark Sweep
+o7145h0007d|2015-05-03T02:45:06Z|    DARK|  105.516718    20.721251 2000|  0.1|CLEAR|-9999.990|Queue ( 7of11) Dark Sweep
+o7145h0008d|2015-05-03T02:45:26Z|    DARK|  105.600222    20.721371 2000|  0.1|CLEAR|-9999.990|Queue ( 8of11) Dark Sweep
+o7145h0009d|2015-05-03T02:45:46Z|    DARK|  105.683971    20.721481 2000|  0.1|CLEAR|-9999.990|Queue ( 9of11) Dark Sweep
+o7145h0010d|2015-05-03T02:46:06Z|    DARK|  105.767272    20.721599 2000|  0.1|CLEAR|-9999.990|Queue (10of11) Dark Sweep
+o7145h0011d|2015-05-03T02:46:26Z|    DARK|  105.850769    20.721733 2000|  0.1|CLEAR|-9999.990|Queue (11of11) Dark Sweep
+o7145h0012d|2015-05-03T04:32:27Z|    DARK|  125.848288    28.819912 2000|  1.0|CLEAR|-9999.990|test dark
+o7145h0013o|2015-05-03T06:06:53Z|  OBJECT|  155.918008     0.787958 2000| 15.0|i|-9999.990|test image for focus
+o7145h0014o|2015-05-03T06:15:02Z|  OBJECT|  157.685258     0.791320 2000| 20.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1705 Alt[70.0]
+o7145h0015o|2015-05-03T06:15:57Z|  OBJECT|  157.910784     0.791439 2000| 20.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1710 Alt[70.0]
+o7145h0016o|2015-05-03T06:16:52Z|  OBJECT|  158.140811     0.791558 2000| 20.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1715 Alt[70.0]
+o7145h0017o|2015-05-03T06:17:43Z|  OBJECT|  158.354024     0.791664 2000| 20.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1720 Alt[70.0]
+o7145h0018o|2015-05-03T06:18:39Z|  OBJECT|  158.583579     0.791782 2000| 20.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1725 Alt[70.0]
+o7145h0019o|2015-05-03T06:19:34Z|  OBJECT|  158.813060     0.791895 2000| 20.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1730 Alt[70.0]
+o7145h0020o|2015-05-03T06:20:28Z|  OBJECT|  159.043282     0.792009 2000| 20.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1735 Alt[70.0]
+o7145h0021o|2015-05-03T06:21:23Z|  OBJECT|  159.273268     0.792125 2000| 20.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1740 Alt[70.0]
+o7145h0022o|2015-05-03T06:22:18Z|  OBJECT|  159.502856     0.792232 2000| 20.0|i|-9999.990|Focus Sweep ( 9of13) M2Z: 1745 Alt[70.0]
+o7145h0023o|2015-05-03T06:23:12Z|  OBJECT|  159.732372     0.792344 2000| 20.0|i|-9999.990|Focus Sweep (10of13) M2Z: 1750 Alt[70.0]
+o7145h0024o|2015-05-03T06:24:07Z|  OBJECT|  159.958182     0.792446 2000| 20.0|i|-9999.990|Focus Sweep (11of13) M2Z: 1755 Alt[70.0]
+o7145h0025o|2015-05-03T06:24:59Z|  OBJECT|  160.175542     0.792549 2000| 20.0|i|-9999.990|Focus Sweep (12of13) M2Z: 1760 Alt[70.0]
+o7145h0026o|2015-05-03T06:25:53Z|  OBJECT|  160.400661     0.792652 2000| 20.0|i|-9999.990|Focus Sweep (13of13) M2Z: 1765 Alt[70.0]
+o7145h0027o|2015-05-03T06:35:46Z|  OBJECT|  145.457414    -3.858967 2000| 45.0|i|-9999.990|LSQ15abl_a150418_dither_1
+o7145h0028o|2015-05-03T06:36:55Z|  OBJECT|  145.457426    -4.525632 2000| 45.0|i|-9999.990|LSQ15abl_a150418_dither_2
+o7145h0029o|2015-05-03T06:38:04Z|  OBJECT|  144.789140    -3.858965 2000| 45.0|i|-9999.990|LSQ15abl_a150418_dither_3
+o7145h0030o|2015-05-03T06:39:13Z|  OBJECT|  144.788874    -4.525634 2000| 45.0|i|-9999.990|LSQ15abl_a150418_dither_4
+o7145h0031o|2015-05-03T06:40:40Z|  OBJECT|  145.457283    -3.858963 2000| 45.0|r|-9999.990|LSQ15abl_a150418_dither_1
+o7145h0032o|2015-05-03T06:41:49Z|  OBJECT|  145.457419    -4.525634 2000| 45.0|r|-9999.990|LSQ15abl_a150418_dither_2
+o7145h0033o|2015-05-03T06:42:58Z|  OBJECT|  144.789175    -3.858965 2000| 45.0|r|-9999.990|LSQ15abl_a150418_dither_3
+o7145h0034o|2015-05-03T06:44:08Z|  OBJECT|  144.789413    -4.525631 2000| 45.0|r|-9999.990|LSQ15abl_a150418_dither_4
+o7145h0035o|2015-05-03T06:45:33Z|  OBJECT|  145.457651    -3.858969 2000| 45.0|z|-9999.990|LSQ15abl_a150418_dither_1
+o7145h0036o|2015-05-03T06:46:43Z|  OBJECT|  145.457965    -4.525634 2000| 45.0|z|-9999.990|LSQ15abl_a150418_dither_2
+o7145h0037o|2015-05-03T06:47:52Z|  OBJECT|  144.788906    -3.858968 2000| 45.0|z|-9999.990|LSQ15abl_a150418_dither_3
+o7145h0038o|2015-05-03T06:49:01Z|  OBJECT|  144.789234    -4.525631 2000| 45.0|z|-9999.990|LSQ15abl_a150418_dither_4
+o7145h0039o|2015-05-03T06:50:23Z|  OBJECT|  145.457337    -3.858964 2000| 45.0|g|-9999.990|LSQ15abl_a150418_dither_1
+o7145h0040o|2015-05-03T06:51:31Z|  OBJECT|  145.457726    -4.525633 2000| 45.0|g|-9999.990|LSQ15abl_a150418_dither_2
+o7145h0041o|2015-05-03T06:52:40Z|  OBJECT|  144.788792    -3.858964 2000| 45.0|g|-9999.990|LSQ15abl_a150418_dither_3
+o7145h0042o|2015-05-03T06:53:49Z|  OBJECT|  144.789073    -4.525637 2000| 45.0|g|-9999.990|LSQ15abl_a150418_dither_4
+o7145h0043o|2015-05-03T06:55:47Z|  OBJECT|  148.790588     9.527166 2000| 45.0|i|-9999.990|ASASSN-15hg_m150501_dither_1
+o7145h0044o|2015-05-03T06:56:57Z|  OBJECT|  148.790747     8.860498 2000| 45.0|i|-9999.990|ASASSN-15hg_m150501_dither_2
+o7145h0045o|2015-05-03T06:58:05Z|  OBJECT|  148.115278     9.527167 2000| 45.0|i|-9999.990|ASASSN-15hg_m150501_dither_3
+o7145h0046o|2015-05-03T06:59:14Z|  OBJECT|  148.115191     8.860498 2000| 45.0|i|-9999.990|ASASSN-15hg_m150501_dither_4
+o7145h0047o|2015-05-03T07:00:40Z|  OBJECT|  148.790607     9.527165 2000| 45.0|r|-9999.990|ASASSN-15hg_m150501_dither_1
+o7145h0048o|2015-05-03T07:01:49Z|  OBJECT|  148.790309     8.860497 2000| 45.0|r|-9999.990|ASASSN-15hg_m150501_dither_2
+o7145h0049o|2015-05-03T07:02:58Z|  OBJECT|  148.115239     9.527164 2000| 45.0|r|-9999.990|ASASSN-15hg_m150501_dither_3
+o7145h0050o|2015-05-03T07:04:07Z|  OBJECT|  148.115488     8.860496 2000| 45.0|r|-9999.990|ASASSN-15hg_m150501_dither_4
+o7145h0051o|2015-05-03T07:05:32Z|  OBJECT|  148.790698     9.527162 2000| 45.0|z|-9999.990|ASASSN-15hg_m150501_dither_1
+o7145h0052o|2015-05-03T07:06:41Z|  OBJECT|  148.790484     8.860500 2000| 45.0|z|-9999.990|ASASSN-15hg_m150501_dither_2
+o7145h0053o|2015-05-03T07:07:50Z|  OBJECT|  148.115378     9.527167 2000| 45.0|z|-9999.990|ASASSN-15hg_m150501_dither_3
+o7145h0054o|2015-05-03T07:08:59Z|  OBJECT|  148.115315     8.860500 2000| 45.0|z|-9999.990|ASASSN-15hg_m150501_dither_4
+o7145h0055o|2015-05-03T07:10:21Z|  OBJECT|  148.790675     9.527165 2000| 45.0|g|-9999.990|ASASSN-15hg_m150501_dither_1
+o7145h0056o|2015-05-03T07:11:29Z|  OBJECT|  148.790603     8.860495 2000| 45.0|g|-9999.990|ASASSN-15hg_m150501_dither_2
+o7145h0057o|2015-05-03T07:12:38Z|  OBJECT|  148.115891     9.527165 2000| 45.0|g|-9999.990|ASASSN-15hg_m150501_dither_3
+o7145h0058o|2015-05-03T07:13:47Z|  OBJECT|  148.115202     8.860496 2000| 45.0|g|-9999.990|ASASSN-15hg_m150501_dither_4
+o7145h0059o|2015-05-03T07:16:27Z|  OBJECT|  162.810217    18.216642 2000| 45.0|i|-9999.990|PS15zn_m150501_dither_1
+o7145h0060o|2015-05-03T07:17:37Z|  OBJECT|  162.810069    17.549977 2000| 45.0|i|-9999.990|PS15zn_m150501_dither_2
+o7145h0061o|2015-05-03T07:18:47Z|  OBJECT|  162.109639    18.216642 2000| 45.0|i|-9999.990|PS15zn_m150501_dither_3
+o7145h0062o|2015-05-03T07:19:56Z|  OBJECT|  162.109639    17.549976 2000| 45.0|i|-9999.990|PS15zn_m150501_dither_4
+o7145h0063o|2015-05-03T07:21:23Z|  OBJECT|  162.810298    18.216642 2000| 45.0|r|-9999.990|PS15zn_m150501_dither_1
+o7145h0064o|2015-05-03T07:22:32Z|  OBJECT|  162.809842    17.549976 2000| 45.0|r|-9999.990|PS15zn_m150501_dither_2
+o7145h0065o|2015-05-03T07:23:41Z|  OBJECT|  162.109264    18.216640 2000| 45.0|r|-9999.990|PS15zn_m150501_dither_3
+o7145h0066o|2015-05-03T07:24:51Z|  OBJECT|  162.109438    17.549977 2000| 45.0|r|-9999.990|PS15zn_m150501_dither_4
+o7145h0067o|2015-05-03T07:26:17Z|  OBJECT|  162.809787    18.216641 2000| 45.0|z|-9999.990|PS15zn_m150501_dither_1
+o7145h0068o|2015-05-03T07:27:26Z|  OBJECT|  162.809875    17.549975 2000| 45.0|z|-9999.990|PS15zn_m150501_dither_2
+o7145h0069o|2015-05-03T07:28:36Z|  OBJECT|  162.109403    18.216642 2000| 45.0|z|-9999.990|PS15zn_m150501_dither_3
+o7145h0070o|2015-05-03T07:29:45Z|  OBJECT|  162.109723    17.549975 2000| 45.0|z|-9999.990|PS15zn_m150501_dither_4
+o7145h0071o|2015-05-03T07:31:08Z|  OBJECT|  162.809740    18.216641 2000| 45.0|g|-9999.990|PS15zn_m150501_dither_1
+o7145h0072o|2015-05-03T07:32:17Z|  OBJECT|  162.809957    17.549974 2000| 45.0|g|-9999.990|PS15zn_m150501_dither_2
+o7145h0073o|2015-05-03T07:33:26Z|  OBJECT|  162.109245    18.216640 2000| 45.0|g|-9999.990|PS15zn_m150501_dither_3
+o7145h0074o|2015-05-03T07:34:34Z|  OBJECT|  162.109331    17.549974 2000| 45.0|g|-9999.990|PS15zn_m150501_dither_4
+o7145h0075o|2015-05-03T07:38:25Z|  OBJECT|  162.109468    17.549974 2000| 10.0|g|-9999.990|test image for focus
+o7145h0076o|2015-05-03T07:41:17Z|  OBJECT|  158.897068    16.803801 2000| 15.0|g|-9999.990|test image for focus
+o7145h0077o|2015-05-03T07:45:53Z|  OBJECT|  158.896954    16.803799 2000| 15.0|i|-9999.990|test image for focus
+o7145h0078o|2015-05-03T07:48:40Z|  OBJECT|  158.896874    16.803802 2000| 45.0|i|-9999.990|test image for focus
+o7145h0079o|2015-05-03T07:49:24Z|  OBJECT|  158.897489    16.803802 2000| 15.0|i|-9999.990|test image for focus
+o7145h0080o|2015-05-03T07:51:13Z|  OBJECT|  158.896972    16.803798 2000| 15.0|i|-9999.990|test image for focus
+o7145h0081o|2015-05-03T07:56:13Z|  OBJECT|  173.756911     1.059309 2000| 45.0|i|-9999.990|PS15ae_a150418_dither_1
+o7145h0082o|2015-05-03T07:57:22Z|  OBJECT|  173.756585     0.392646 2000| 45.0|i|-9999.990|PS15ae_a150418_dither_2
+o7145h0083o|2015-05-03T07:58:42Z|  OBJECT|  173.090430     1.059310 2000| 45.0|i|-9999.990|PS15ae_a150418_dither_3
+o7145h0084o|2015-05-03T07:59:50Z|  OBJECT|  173.090057     0.392641 2000| 45.0|i|-9999.990|PS15ae_a150418_dither_4
+o7145h0085o|2015-05-03T08:01:17Z|  OBJECT|  173.756933     1.059310 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_1
+o7145h0086o|2015-05-03T08:02:25Z|  OBJECT|  173.756637     0.392647 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_2
+o7145h0087o|2015-05-03T08:03:34Z|  OBJECT|  173.090032     1.059312 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_3
+o7145h0088o|2015-05-03T08:04:43Z|  OBJECT|  173.089817     0.392648 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_4
+o7145h0089o|2015-05-03T08:06:08Z|  OBJECT|  173.756944     1.059315 2000| 45.0|z|-9999.990|PS15ae_a150418_dither_1
+o7145h0090o|2015-05-03T08:07:16Z|  OBJECT|  173.756811     0.392642 2000| 45.0|z|-9999.990|PS15ae_a150418_dither_2
+o7145h0091o|2015-05-03T08:08:25Z|  OBJECT|  173.090027     1.059315 2000| 45.0|z|-9999.990|PS15ae_a150418_dither_3
+o7145h0092o|2015-05-03T08:09:34Z|  OBJECT|  173.090094     0.392644 2000| 45.0|z|-9999.990|PS15ae_a150418_dither_4
+o7145h0093o|2015-05-03T08:10:56Z|  OBJECT|  173.756864     1.059309 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_1
+o7145h0094o|2015-05-03T08:12:05Z|  OBJECT|  173.756578     0.392644 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_2
+o7145h0095o|2015-05-03T08:13:13Z|  OBJECT|  173.090032     1.059314 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_3
+o7145h0096o|2015-05-03T08:14:22Z|  OBJECT|  173.090262     0.392646 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_4
+o7145h0097o|2015-05-03T08:18:25Z|  OBJECT|  171.667157     8.571838 2000| 90.0|i|-9999.990|PS15br_m150425_dither_1
+o7145h0098o|2015-05-03T08:20:20Z|  OBJECT|  171.667379     7.905170 2000| 90.0|i|-9999.990|PS15br_m150425_dither_2
+o7145h0099o|2015-05-03T08:22:14Z|  OBJECT|  170.993567     8.571840 2000| 90.0|i|-9999.990|PS15br_m150425_dither_3
+o7145h0100o|2015-05-03T08:24:08Z|  OBJECT|  170.993679     7.905173 2000| 90.0|i|-9999.990|PS15br_m150425_dither_4
+o7145h0101o|2015-05-03T08:26:20Z|  OBJECT|  171.666996     8.571841 2000| 90.0|r|-9999.990|PS15br_m150425_dither_1
+o7145h0102o|2015-05-03T08:28:14Z|  OBJECT|  171.667167     7.905172 2000| 90.0|r|-9999.990|PS15br_m150425_dither_2
+o7145h0103o|2015-05-03T08:30:09Z|  OBJECT|  170.993591     8.571840 2000| 90.0|r|-9999.990|PS15br_m150425_dither_3
+o7145h0104o|2015-05-03T08:32:03Z|  OBJECT|  170.993648     7.905171 2000| 90.0|r|-9999.990|PS15br_m150425_dither_4
+o7145h0105o|2015-05-03T08:34:13Z|  OBJECT|  171.667732     8.571838 2000| 90.0|z|-9999.990|PS15br_m150425_dither_1
+o7145h0106o|2015-05-03T08:36:07Z|  OBJECT|  171.667280     7.905173 2000| 90.0|z|-9999.990|PS15br_m150425_dither_2
+o7145h0107o|2015-05-03T08:38:01Z|  OBJECT|  170.993807     8.571838 2000| 90.0|z|-9999.990|PS15br_m150425_dither_3
+o7145h0108o|2015-05-03T08:39:55Z|  OBJECT|  170.993747     7.905172 2000| 90.0|z|-9999.990|PS15br_m150425_dither_4
+o7145h0109o|2015-05-03T08:42:02Z|  OBJECT|  171.667258     8.571840 2000| 90.0|g|-9999.990|PS15br_m150425_dither_1
+o7145h0110o|2015-05-03T08:43:57Z|  OBJECT|  171.667591     7.905172 2000| 90.0|g|-9999.990|PS15br_m150425_dither_2
+o7145h0111o|2015-05-03T08:45:51Z|  OBJECT|  170.994054     8.571841 2000| 90.0|g|-9999.990|PS15br_m150425_dither_3
+o7145h0112o|2015-05-03T08:47:45Z|  OBJECT|  170.993952     7.905170 2000| 90.0|g|-9999.990|PS15br_m150425_dither_4
+o7145h0113o|2015-05-03T08:53:39Z|  OBJECT|  185.315712    37.625329 2000| 15.0|g|-9999.990|test image for focus
+o7145h0114o|2015-05-03T09:00:51Z|  OBJECT|  186.051052    36.962942 2000| 20.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1710 Alt[70.0]
+o7145h0115o|2015-05-03T09:01:44Z|  OBJECT|  186.272533    36.962904 2000| 20.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1715 Alt[70.0]
+o7145h0116o|2015-05-03T09:02:40Z|  OBJECT|  186.502445    36.962867 2000| 20.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1720 Alt[70.0]
+o7145h0117o|2015-05-03T09:03:36Z|  OBJECT|  186.741339    36.962824 2000| 20.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1725 Alt[70.0]
+o7145h0118o|2015-05-03T09:04:32Z|  OBJECT|  186.975318    36.962783 2000| 20.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1730 Alt[70.0]
+o7145h0119o|2015-05-03T09:05:27Z|  OBJECT|  187.204972    36.962734 2000| 20.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1735 Alt[70.0]
+o7145h0120o|2015-05-03T09:06:22Z|  OBJECT|  187.435274    36.962694 2000| 20.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1740 Alt[70.0]
+o7145h0121o|2015-05-03T09:07:13Z|  OBJECT|  187.649015    36.962654 2000| 20.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1745 Alt[70.0]
+o7145h0122o|2015-05-03T09:08:08Z|  OBJECT|  187.878854    36.962607 2000| 20.0|i|-9999.990|Focus Sweep ( 9of13) M2Z: 1750 Alt[70.0]
+o7145h0123o|2015-05-03T09:09:04Z|  OBJECT|  188.112827    36.962558 2000| 20.0|i|-9999.990|Focus Sweep (10of13) M2Z: 1755 Alt[70.0]
+o7145h0124o|2015-05-03T09:09:59Z|  OBJECT|  188.343400    36.962506 2000| 20.0|i|-9999.990|Focus Sweep (11of13) M2Z: 1760 Alt[70.0]
+o7145h0125o|2015-05-03T09:10:55Z|  OBJECT|  188.577404    36.962457 2000| 20.0|i|-9999.990|Focus Sweep (12of13) M2Z: 1765 Alt[70.0]
+o7145h0126o|2015-05-03T09:11:51Z|  OBJECT|  188.807246    36.962409 2000| 20.0|i|-9999.990|Focus Sweep (13of13) M2Z: 1770 Alt[70.0]
+o7145h0127o|2015-05-03T09:19:29Z|  OBJECT|  180.480266    40.469993 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5086 visit 1
+o7145h0128o|2015-05-03T09:20:40Z|  OBJECT|  181.940177    43.179995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5071 visit 1
+o7145h0129o|2015-05-03T09:21:50Z|  OBJECT|  184.100404    40.769999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4962 visit 1
+o7145h0130o|2015-05-03T09:23:01Z|  OBJECT|  182.690636    38.119995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5073 visit 1
+o7145h0131o|2015-05-03T09:24:13Z|  OBJECT|  181.390288    35.469996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5088 visit 1
+o7145h0132o|2015-05-03T09:25:23Z|  OBJECT|  184.800970    35.719995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4963 visit 1
+o7145h0133o|2015-05-03T09:26:34Z|  OBJECT|  186.200629    38.330098 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5072 visit 1
+o7145h0134o|2015-05-03T09:27:45Z|  OBJECT|  187.720650    40.939998 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5059 visit 1
+o7145h0135o|2015-05-03T09:28:54Z|  OBJECT|  185.660782    43.419996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5070 visit 1
+o7145h0136o|2015-05-03T09:30:04Z|  OBJECT|  189.400239    43.539994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4956 visit 1
+o7145h0137o|2015-05-03T09:31:13Z|  OBJECT|  191.350569    40.989996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5058 visit 1
+o7145h0138o|2015-05-03T09:32:24Z|  OBJECT|  193.160259    43.539995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5047 visit 1
+o7145h0139o|2015-05-03T09:33:33Z|  OBJECT|  194.960235    40.919997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4952 visit 1
+o7145h0140o|2015-05-03T09:34:44Z|  OBJECT|  193.210332    38.409995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5049 visit 1
+o7145h0141o|2015-05-03T09:35:54Z|  OBJECT|  195.060485    35.800101 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4953 visit 1
+o7145h0142o|2015-05-03T09:37:05Z|  OBJECT|  191.640044    35.889994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5060 visit 1
+o7145h0143o|2015-05-03T09:38:14Z|  OBJECT|  188.220171    35.859999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5061 visit 1
+o7145h0144o|2015-05-03T09:39:25Z|  OBJECT|  189.710326    38.429993 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4957 visit 1
+o7145h0145o|2015-05-03T09:40:36Z|  OBJECT|  180.480343    40.469996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5086 visit 2
+o7145h0146o|2015-05-03T09:41:46Z|  OBJECT|  181.940403    43.179997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5071 visit 2
+o7145h0147o|2015-05-03T09:42:56Z|  OBJECT|  184.100349    40.769994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4962 visit 2
+o7145h0148o|2015-05-03T09:44:07Z|  OBJECT|  182.690285    38.119996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5073 visit 2
+o7145h0149o|2015-05-03T09:45:18Z|  OBJECT|  181.390387    35.469999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5088 visit 2
+o7145h0150o|2015-05-03T09:46:27Z|  OBJECT|  184.800375    35.719995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4963 visit 2
+o7145h0151o|2015-05-03T09:47:37Z|  OBJECT|  186.200264    38.329992 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5072 visit 2
+o7145h0152o|2015-05-03T09:48:48Z|  OBJECT|  187.720351    40.939996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5059 visit 2
+o7145h0153o|2015-05-03T09:49:57Z|  OBJECT|  185.660174    43.419995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5070 visit 2
+o7145h0154o|2015-05-03T09:51:07Z|  OBJECT|  189.400402    43.539995 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4956 visit 2
+o7145h0155o|2015-05-03T09:52:16Z|  OBJECT|  191.351041    40.989997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5058 visit 2
+o7145h0156o|2015-05-03T09:53:27Z|  OBJECT|  193.160693    43.539997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5047 visit 2
+o7145h0157o|2015-05-03T09:54:36Z|  OBJECT|  194.960278    40.919994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4952 visit 2
+o7145h0158o|2015-05-03T09:55:47Z|  OBJECT|  193.210836    38.409991 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5049 visit 2
+o7145h0159o|2015-05-03T09:56:56Z|  OBJECT|  195.060417    35.799994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4953 visit 2
+o7145h0160o|2015-05-03T09:58:05Z|  OBJECT|  191.640725    35.889994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5060 visit 2
+o7145h0161o|2015-05-03T09:59:15Z|  OBJECT|  188.220843    35.859996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5061 visit 2
+o7145h0162o|2015-05-03T10:00:26Z|  OBJECT|  189.710283    38.429996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4957 visit 2
+o7145h0163o|2015-05-03T10:01:37Z|  OBJECT|  180.480434    40.469997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5086 visit 3
+o7145h0164o|2015-05-03T10:02:47Z|  OBJECT|  181.940364    43.179996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5071 visit 3
+o7145h0165o|2015-05-03T10:03:56Z|  OBJECT|  184.100186    40.769996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4962 visit 3
+o7145h0166o|2015-05-03T10:05:06Z|  OBJECT|  182.690464    38.119998 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5073 visit 3
+o7145h0167o|2015-05-03T10:06:16Z|  OBJECT|  181.390487    35.469997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5088 visit 3
+o7145h0168o|2015-05-03T10:07:25Z|  OBJECT|  184.800290    35.719997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4963 visit 3
+o7145h0169o|2015-05-03T10:08:35Z|  OBJECT|  186.200864    38.329996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5072 visit 3
+o7145h0170o|2015-05-03T10:09:46Z|  OBJECT|  187.720386    40.939996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5059 visit 3
+o7145h0171o|2015-05-03T10:10:56Z|  OBJECT|  185.660421    43.419996 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5070 visit 3
+o7145h0172o|2015-05-03T10:12:05Z|  OBJECT|  189.400342    43.539993 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4956 visit 3
+o7145h0173o|2015-05-03T10:31:55Z|  OBJECT|  191.350038    40.989997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5058 visit 3
+o7145h0174o|2015-05-03T10:33:06Z|  OBJECT|  193.160578    43.539994 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5047 visit 3
+o7145h0175o|2015-05-03T10:34:15Z|  OBJECT|  194.960407    40.919993 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4952 visit 3
+o7145h0176o|2015-05-03T11:21:18Z|  OBJECT|  193.210265    38.409999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5049 visit 3
+o7145h0177o|2015-05-03T11:22:27Z|  OBJECT|  195.060313    35.799999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4953 visit 3
+o7145h0178o|2015-05-03T11:23:37Z|  OBJECT|  191.640284    35.889999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5060 visit 3
+o7145h0179o|2015-05-03T11:24:46Z|  OBJECT|  188.220644    35.860001 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5061 visit 3
+o7145h0180o|2015-05-03T11:25:56Z|  OBJECT|  189.710660    38.430000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4957 visit 3
+o7145h0181o|2015-05-03T11:27:07Z|  OBJECT|  180.480661    40.470000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5086 visit 4
+o7145h0182o|2015-05-03T11:28:16Z|  OBJECT|  181.940218    43.179999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5071 visit 4
+o7145h0183o|2015-05-03T11:29:25Z|  OBJECT|  184.100377    40.769999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4962 visit 4
+o7145h0184o|2015-05-03T11:30:35Z|  OBJECT|  182.690294    38.120000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5073 visit 4
+o7145h0185o|2015-05-03T11:31:45Z|  OBJECT|  181.390902    35.469999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5088 visit 4
+o7145h0186o|2015-05-03T11:32:54Z|  OBJECT|  184.800618    35.720000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4963 visit 4
+o7145h0187o|2015-05-03T11:34:04Z|  OBJECT|  186.200391    38.329998 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5072 visit 4
+o7145h0188o|2015-05-03T11:35:13Z|  OBJECT|  187.720467    40.939999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5059 visit 4
+o7145h0189o|2015-05-03T11:36:23Z|  OBJECT|  185.660202    43.420000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5070 visit 4
+o7145h0190o|2015-05-03T11:37:31Z|  OBJECT|  189.400247    43.539999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4956 visit 4
+o7145h0191o|2015-05-03T11:38:41Z|  OBJECT|  191.350238    40.989998 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5058 visit 4
+o7145h0192o|2015-05-03T11:39:52Z|  OBJECT|  193.160437    43.539999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5047 visit 4
+o7145h0193o|2015-05-03T11:41:01Z|  OBJECT|  194.960363    40.920000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4952 visit 4
+o7145h0194o|2015-05-03T11:42:11Z|  OBJECT|  193.210779    38.409997 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5049 visit 4
+o7145h0195o|2015-05-03T11:43:20Z|  OBJECT|  195.060796    35.799999 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4953 visit 4
+o7145h0196o|2015-05-03T11:44:29Z|  OBJECT|  191.640158    35.890000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5060 visit 4
+o7145h0197o|2015-05-03T11:45:38Z|  OBJECT|  188.220265    35.859998 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_5061 visit 4
+o7145h0198o|2015-05-03T11:46:47Z|  OBJECT|  189.710137    38.430000 2000| 45.0|i|-9999.990|OSSR.R12N5.10.Q.i ps1_26_4957 visit 4
+o7145h0199o|2015-05-03T11:53:31Z|  OBJECT|  242.905009    40.746182 2000| 20.0|i|-9999.990|test image for focus
+o7145h0200o|2015-05-03T11:59:59Z|  OBJECT|  244.451924    40.744064 2000| 20.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1700 Alt[70.0]
+o7145h0201o|2015-05-03T12:00:54Z|  OBJECT|  244.686092    40.743750 2000| 20.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1705 Alt[70.0]
+o7145h0202o|2015-05-03T12:01:49Z|  OBJECT|  244.915709    40.743449 2000| 20.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1710 Alt[70.0]
+o7145h0203o|2015-05-03T12:02:44Z|  OBJECT|  245.145538    40.743143 2000| 20.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1715 Alt[70.0]
+o7145h0204o|2015-05-03T12:03:38Z|  OBJECT|  245.371266    40.742849 2000| 20.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1720 Alt[70.0]
+o7145h0205o|2015-05-03T12:04:33Z|  OBJECT|  245.601354    40.742549 2000| 20.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1725 Alt[70.0]
+o7145h0206o|2015-05-03T12:05:25Z|  OBJECT|  245.818732    40.742261 2000| 20.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1730 Alt[70.0]
+o7145h0207o|2015-05-03T12:06:20Z|  OBJECT|  246.044613    40.741965 2000| 20.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1735 Alt[70.0]
+o7145h0208o|2015-05-03T12:07:12Z|  OBJECT|  246.266103    40.741675 2000| 20.0|i|-9999.990|Focus Sweep ( 9of13) M2Z: 1740 Alt[70.0]
+o7145h0209o|2015-05-03T12:08:07Z|  OBJECT|  246.495879    40.741365 2000| 20.0|i|-9999.990|Focus Sweep (10of13) M2Z: 1745 Alt[70.0]
+o7145h0210o|2015-05-03T12:09:02Z|  OBJECT|  246.726136    40.741057 2000| 20.0|i|-9999.990|Focus Sweep (11of13) M2Z: 1750 Alt[70.0]
+o7145h0211o|2015-05-03T12:09:56Z|  OBJECT|  246.951784    40.740752 2000| 20.0|i|-9999.990|Focus Sweep (12of13) M2Z: 1755 Alt[70.0]
+o7145h0212o|2015-05-03T12:10:49Z|  OBJECT|  247.173262    40.740460 2000| 20.0|i|-9999.990|Focus Sweep (13of13) M2Z: 1760 Alt[70.0]
+o7145h0213o|2015-05-03T12:16:10Z|  OBJECT|  255.800857    46.609999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4072 visit 1
+o7145h0214o|2015-05-03T12:17:19Z|  OBJECT|  258.080842    48.939998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3909 visit 1
+o7145h0215o|2015-05-03T12:18:29Z|  OBJECT|  256.170042    51.650001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4096 visit 1
+o7145h0216o|2015-05-03T12:19:39Z|  OBJECT|  258.760150    53.950008 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3920 visit 1
+o7145h0217o|2015-05-03T12:20:48Z|  OBJECT|  256.660973    56.660000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4115 visit 1
+o7145h0218o|2015-05-03T12:21:58Z|  OBJECT|  261.650535    56.170000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4095 visit 1
+o7145h0219o|2015-05-03T12:23:07Z|  OBJECT|  263.420315    53.410000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4094 visit 1
+o7145h0220o|2015-05-03T12:24:17Z|  OBJECT|  260.611035    51.209997 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4071 visit 1
+o7145h0221o|2015-05-03T12:25:27Z|  OBJECT|  262.250275    48.450001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4070 visit 1
+o7145h0222o|2015-05-03T12:26:37Z|  OBJECT|  259.790685    46.210003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4049 visit 1
+o7145h0223o|2015-05-03T12:27:48Z|  OBJECT|  263.730114    45.670000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3898 visit 1
+o7145h0224o|2015-05-03T12:28:57Z|  OBJECT|  266.340430    47.810002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4047 visit 1
+o7145h0225o|2015-05-03T12:30:07Z|  OBJECT|  267.600188    44.990005 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4046 visit 1
+o7145h0226o|2015-05-03T12:31:16Z|  OBJECT|  270.340442    47.010002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3897 visit 1
+o7145h0227o|2015-05-03T12:32:26Z|  OBJECT|  269.200148    49.860000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4068 visit 1
+o7145h0228o|2015-05-03T12:33:36Z|  OBJECT|  264.970292    50.620000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3908 visit 1
+o7145h0229o|2015-05-03T12:34:45Z|  OBJECT|  267.950330    52.699998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4069 visit 1
+o7145h0230o|2015-05-03T12:35:54Z|  OBJECT|  266.530368    55.520004 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3919 visit 1
+o7145h0231o|2015-05-03T12:37:03Z|  OBJECT|  269.990216    57.559999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4093 visit 1
+o7145h0232o|2015-05-03T12:38:17Z|  OBJECT|  255.800256    46.609999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4072 visit 2
+o7145h0233o|2015-05-03T12:39:27Z|  OBJECT|  258.080518    48.939998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3909 visit 2
+o7145h0234o|2015-05-03T12:40:36Z|  OBJECT|  256.170229    51.650003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4096 visit 2
+o7145h0235o|2015-05-03T12:41:47Z|  OBJECT|  258.760848    53.950001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3920 visit 2
+o7145h0236o|2015-05-03T12:42:55Z|  OBJECT|  256.660384    56.659999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4115 visit 2
+o7145h0237o|2015-05-03T12:44:05Z|  OBJECT|  261.650298    56.170002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4095 visit 2
+o7145h0238o|2015-05-03T12:45:15Z|  OBJECT|  263.420102    53.410000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4094 visit 2
+o7145h0239o|2015-05-03T12:46:24Z|  OBJECT|  260.610197    51.210002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4071 visit 2
+o7145h0240o|2015-05-03T12:47:33Z|  OBJECT|  262.250251    48.450000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4070 visit 2
+o7145h0241o|2015-05-03T12:48:43Z|  OBJECT|  259.790224    46.209997 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4049 visit 2
+o7145h0242o|2015-05-03T12:49:54Z|  OBJECT|  263.730589    45.669999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3898 visit 2
+o7145h0243o|2015-05-03T12:51:03Z|  OBJECT|  266.340289    47.810000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4047 visit 2
+o7145h0244o|2015-05-03T12:52:13Z|  OBJECT|  267.600191    44.990003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4046 visit 2
+o7145h0245o|2015-05-03T12:53:22Z|  OBJECT|  270.340292    47.010001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3897 visit 2
+o7145h0246o|2015-05-03T12:54:31Z|  OBJECT|  269.200264    49.860002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4068 visit 2
+o7145h0247o|2015-05-03T12:55:42Z|  OBJECT|  264.970353    50.620001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3908 visit 2
+o7145h0248o|2015-05-03T12:56:52Z|  OBJECT|  267.950172    52.700000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4069 visit 2
+o7145h0249o|2015-05-03T12:58:02Z|  OBJECT|  266.530262    55.520001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3919 visit 2
+o7145h0250o|2015-05-03T12:59:12Z|  OBJECT|  269.990318    57.560000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4093 visit 2
+o7145h0251o|2015-05-03T13:00:27Z|  OBJECT|  255.800303    46.609998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4072 visit 3
+o7145h0252o|2015-05-03T13:01:37Z|  OBJECT|  258.080196    48.940003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3909 visit 3
+o7145h0253o|2015-05-03T13:02:46Z|  OBJECT|  256.170271    51.650001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4096 visit 3
+o7145h0254o|2015-05-03T13:03:57Z|  OBJECT|  258.760093    53.950000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3920 visit 3
+o7145h0255o|2015-05-03T13:05:06Z|  OBJECT|  256.660441    56.659999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4115 visit 3
+o7145h0256o|2015-05-03T13:06:17Z|  OBJECT|  261.650697    56.170003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4095 visit 3
+o7145h0257o|2015-05-03T13:07:26Z|  OBJECT|  263.420517    53.409996 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4094 visit 3
+o7145h0258o|2015-05-03T13:08:35Z|  OBJECT|  260.610323    51.210001 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4071 visit 3
+o7145h0259o|2015-05-03T13:09:45Z|  OBJECT|  262.250152    48.450000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4070 visit 3
+o7145h0260o|2015-05-03T13:10:54Z|  OBJECT|  259.790344    46.209999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4049 visit 3
+o7145h0261o|2015-05-03T13:12:05Z|  OBJECT|  263.730288    45.669994 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3898 visit 3
+o7145h0262o|2015-05-03T13:13:15Z|  OBJECT|  266.340221    47.810000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4047 visit 3
+o7145h0263o|2015-05-03T13:14:24Z|  OBJECT|  267.600366    44.990000 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4046 visit 3
+o7145h0264o|2015-05-03T13:15:33Z|  OBJECT|  270.340390    47.009997 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3897 visit 3
+o7145h0265o|2015-05-03T13:16:42Z|  OBJECT|  269.200208    49.859998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4068 visit 3
+o7145h0266o|2015-05-03T13:17:52Z|  OBJECT|  264.970653    50.619999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3908 visit 3
+o7145h0267o|2015-05-03T13:19:01Z|  OBJECT|  267.950369    52.699998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4069 visit 3
+o7145h0268o|2015-05-03T13:20:12Z|  OBJECT|  266.530149    55.519999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3919 visit 3
+o7145h0269o|2015-05-03T13:21:21Z|  OBJECT|  269.990223    57.559996 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4093 visit 3
+o7145h0270o|2015-05-03T13:22:39Z|  OBJECT|  255.800344    46.609992 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4072 visit 4
+o7145h0271o|2015-05-03T13:23:52Z|  OBJECT|  258.080184    48.940002 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3909 visit 4
+o7145h0272o|2015-05-03T13:25:02Z|  OBJECT|  256.170264    51.649999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4096 visit 4
+o7145h0273o|2015-05-03T13:26:11Z|  OBJECT|  258.760862    53.949999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3920 visit 4
+o7145h0274o|2015-05-03T13:27:22Z|  OBJECT|  256.660364    56.659996 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4115 visit 4
+o7145h0275o|2015-05-03T13:28:32Z|  OBJECT|  261.650882    56.169998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4095 visit 4
+o7145h0276o|2015-05-03T13:29:41Z|  OBJECT|  263.420706    53.409998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4094 visit 4
+o7145h0277o|2015-05-03T13:30:51Z|  OBJECT|  260.610223    51.209995 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4071 visit 4
+o7145h0278o|2015-05-03T13:32:00Z|  OBJECT|  262.250846    48.449997 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4070 visit 4
+o7145h0279o|2015-05-03T13:33:10Z|  OBJECT|  259.790368    46.209999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4049 visit 4
+o7145h0280o|2015-05-03T13:34:21Z|  OBJECT|  263.730481    45.669998 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3898 visit 4
+o7145h0281o|2015-05-03T13:35:32Z|  OBJECT|  266.340438    47.809996 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4047 visit 4
+o7145h0282o|2015-05-03T13:36:42Z|  OBJECT|  267.600692    44.989999 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4046 visit 4
+o7145h0283o|2015-05-03T13:37:53Z|  OBJECT|  270.340206    47.010004 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3897 visit 4
+o7145h0284o|2015-05-03T13:39:01Z|  OBJECT|  269.200140    49.859994 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4068 visit 4
+o7145h0285o|2015-05-03T13:40:12Z|  OBJECT|  264.970194    50.619997 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3908 visit 4
+o7145h0286o|2015-05-03T13:41:22Z|  OBJECT|  267.950184    52.699995 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4069 visit 4
+o7145h0287o|2015-05-03T13:42:31Z|  OBJECT|  266.530152    55.520003 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_3919 visit 4
+o7145h0288o|2015-05-03T13:43:40Z|  OBJECT|  269.990463    57.560004 2000| 45.0|i|-9999.990|OSSR.R17N6.10.Q.i ps1_26_4093 visit 4
+o7145h0289o|2015-05-03T13:50:12Z|  OBJECT|  272.043341    40.705385 2000| 20.0|i|-9999.990|test image for focus
+o7145h0290o|2015-05-03T13:57:04Z|  OBJECT|  273.885863    40.702719 2000| 20.0|i|-9999.990|test image for focus
+o7145h0291o|2015-05-03T14:03:09Z|  OBJECT|  285.128840    43.801753 2000| 45.0|i|-9999.990|ASASSN-15fs_m150501_dither_1
+o7145h0292o|2015-05-03T14:04:18Z|  OBJECT|  285.128929    43.135083 2000| 45.0|i|-9999.990|ASASSN-15fs_m150501_dither_2
+o7145h0293o|2015-05-03T14:05:26Z|  OBJECT|  284.210387    43.801749 2000| 45.0|i|-9999.990|ASASSN-15fs_m150501_dither_3
+o7145h0294o|2015-05-03T14:06:36Z|  OBJECT|  284.210511    43.135081 2000| 45.0|i|-9999.990|ASASSN-15fs_m150501_dither_4
+o7145h0295o|2015-05-03T14:08:02Z|  OBJECT|  285.128893    43.801747 2000| 45.0|r|-9999.990|ASASSN-15fs_m150501_dither_1
+o7145h0296o|2015-05-03T14:09:10Z|  OBJECT|  285.128862    43.135087 2000| 45.0|r|-9999.990|ASASSN-15fs_m150501_dither_2
+o7145h0297o|2015-05-03T14:10:20Z|  OBJECT|  284.210265    43.801751 2000| 45.0|r|-9999.990|ASASSN-15fs_m150501_dither_3
+o7145h0298o|2015-05-03T14:11:28Z|  OBJECT|  284.210260    43.135081 2000| 45.0|r|-9999.990|ASASSN-15fs_m150501_dither_4
+o7145h0299o|2015-05-03T14:12:53Z|  OBJECT|  285.129093    43.801746 2000| 45.0|z|-9999.990|ASASSN-15fs_m150501_dither_1
+o7145h0300o|2015-05-03T14:14:02Z|  OBJECT|  285.128953    43.135078 2000| 45.0|z|-9999.990|ASASSN-15fs_m150501_dither_2
+o7145h0301o|2015-05-03T14:15:11Z|  OBJECT|  284.210366    43.801752 2000| 45.0|z|-9999.990|ASASSN-15fs_m150501_dither_3
+o7145h0302o|2015-05-03T14:16:20Z|  OBJECT|  284.210522    43.135085 2000| 45.0|z|-9999.990|ASASSN-15fs_m150501_dither_4
+o7145h0303o|2015-05-03T14:17:42Z|  OBJECT|  285.129070    43.801753 2000| 45.0|g|-9999.990|ASASSN-15fs_m150501_dither_1
+o7145h0304o|2015-05-03T14:18:51Z|  OBJECT|  285.128974    43.135084 2000| 45.0|g|-9999.990|ASASSN-15fs_m150501_dither_2
+o7145h0305o|2015-05-03T14:20:01Z|  OBJECT|  284.210436    43.801748 2000| 45.0|g|-9999.990|ASASSN-15fs_m150501_dither_3
+o7145h0306o|2015-05-03T14:21:10Z|  OBJECT|  284.210425    43.135083 2000| 45.0|g|-9999.990|ASASSN-15fs_m150501_dither_4
+o7145h0307q|2015-05-03T14:25:43Z|     OOF|  296.627564    35.244059 2000| 30.0|g|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0308q|2015-05-03T14:26:46Z|     OOF|  296.890194    35.243719 2000| 30.0|g|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0309q|2015-05-03T14:27:57Z|     OOF|  297.182676    35.243345 2000| 30.0|r|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0310q|2015-05-03T14:29:00Z|     OOF|  297.445778    35.243002 2000| 30.0|r|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0311q|2015-05-03T14:30:07Z|     OOF|  297.725297    35.242645 2000| 30.0|i|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0312q|2015-05-03T14:31:12Z|     OOF|  298.001015    35.242293 2000| 30.0|i|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0313q|2015-05-03T14:32:25Z|     OOF|  298.305880    35.241898 2000| 30.0|w|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0314q|2015-05-03T14:33:27Z|     OOF|  298.564765    35.241568 2000| 30.0|w|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0315q|2015-05-03T14:34:34Z|     OOF|  298.844780    35.241213 2000| 30.0|z|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0316q|2015-05-03T14:35:39Z|     OOF|  299.111915    35.240874 2000| 30.0|z|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0317q|2015-05-03T14:37:08Z|     OOF|  299.487868    35.240401 2000| 30.0|MOVING|-9999.990|coldunk_56007 NOMFOC-600
+o7145h0318q|2015-05-03T14:38:15Z|     OOF|  299.763639    35.240053 2000| 30.0|y|-9999.990|coldunk_56007 NOMFOC+600
+o7145h0319q|2015-05-03T15:00:09Z|     OOF|  289.580398   -24.324502 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0320f|2015-05-03T15:02:28Z| SKYFLAT|  289.566419   -24.324501 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0322f|2015-05-03T15:06:13Z| SKYFLAT|  289.580452   -24.324501 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0323f|2015-05-03T15:08:19Z| SKYFLAT|  289.580271   -24.337503 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0324f|2015-05-03T15:11:34Z| SKYFLAT|  289.565823   -24.337498 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0325f|2015-05-03T15:12:42Z| SKYFLAT|  289.566479   -24.324502 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0326f|2015-05-03T15:13:41Z| SKYFLAT|  289.580491   -24.324500 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0327f|2015-05-03T15:14:41Z| SKYFLAT|  289.565910   -24.337500 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0328f|2015-05-03T15:15:34Z| SKYFLAT|  289.552226   -24.337498 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0329f|2015-05-03T15:16:21Z| SKYFLAT|  289.551599   -24.324500 2000| 10.0|g|-9999.990|sky flat in g
+o7145h0330f|2015-05-03T15:17:50Z| SKYFLAT|  289.537368   -24.324496 2000|  5.0|r|-9999.990|sky flat in r
+o7145h0331f|2015-05-03T15:18:45Z| SKYFLAT|  289.537337   -24.311497 2000|  5.0|r|-9999.990|sky flat in r
+o7145h0332f|2015-05-03T15:19:51Z| SKYFLAT|  289.508778   -24.311497 2000|  6.0|r|-9999.990|sky flat in r
+o7145h0333f|2015-05-03T15:20:34Z| SKYFLAT|  289.508897   -24.298495 2000|  6.0|r|-9999.990|sky flat in r
+o7145h0334f|2015-05-03T15:20:59Z| SKYFLAT|  289.494721   -24.298498 2000|  6.0|r|-9999.990|sky flat in r
+o7145h0335f|2015-05-03T15:21:33Z| SKYFLAT|  289.480654   -24.298498 2000|  5.0|r|-9999.990|sky flat in r
+o7145h0336f|2015-05-03T15:22:28Z| SKYFLAT|  289.466028   -24.298503 2000|  5.0|i|-9999.990|sky flat in i
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150504.idx
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150504.idx	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150504.idx	(revision 38253)
@@ -0,0 +1,109 @@
+# filesetID|time registered     |type    |telescope pointing            |etime|f|airm|comments
+o7146h0001d|2015-05-04T02:05:18Z|    DARK|   96.528074    20.711146 2000|  0.1|CLEAR|-9999.990|Queue ( 1of11) Dark Sweep
+o7146h0002d|2015-05-04T02:05:38Z|    DARK|   96.599043    20.711260 2000|  0.1|CLEAR|-9999.990|Queue ( 2of11) Dark Sweep
+o7146h0003d|2015-05-04T02:05:58Z|    DARK|   96.682458    20.711377 2000|  0.1|CLEAR|-9999.990|Queue ( 3of11) Dark Sweep
+o7146h0004d|2015-05-04T02:06:18Z|    DARK|   96.766079    20.711503 2000|  0.1|CLEAR|-9999.990|Queue ( 4of11) Dark Sweep
+o7146h0005d|2015-05-04T02:06:38Z|    DARK|   96.849486    20.711629 2000|  0.1|CLEAR|-9999.990|Queue ( 5of11) Dark Sweep
+o7146h0006d|2015-05-04T02:06:58Z|    DARK|   96.933116    20.711754 2000|  0.1|CLEAR|-9999.990|Queue ( 6of11) Dark Sweep
+o7146h0007d|2015-05-04T02:07:18Z|    DARK|   97.016749    20.711880 2000|  0.1|CLEAR|-9999.990|Queue ( 7of11) Dark Sweep
+o7146h0008d|2015-05-04T02:07:38Z|    DARK|   97.100152    20.712000 2000|  0.1|CLEAR|-9999.990|Queue ( 8of11) Dark Sweep
+o7146h0009d|2015-05-04T02:07:58Z|    DARK|   97.183560    20.712124 2000|  0.1|CLEAR|-9999.990|Queue ( 9of11) Dark Sweep
+o7146h0010d|2015-05-04T02:08:18Z|    DARK|   97.267202    20.712249 2000|  0.1|CLEAR|-9999.990|Queue (10of11) Dark Sweep
+o7146h0011d|2015-05-04T02:08:38Z|    DARK|   97.350844    20.712367 2000|  0.1|CLEAR|-9999.990|Queue (11of11) Dark Sweep
+o7146h0012d|2015-05-04T07:46:58Z|    DARK|  166.525117    35.346497 2000|  1.0|CLEAR|-9999.990|test
+o7146h0013o|2015-05-04T07:50:10Z|  OBJECT|  167.183057    35.312816 2000| 15.0|i|-9999.990|Focus Sweep ( 1of19) M2Z: 1665 Alt[70.0]
+o7146h0014o|2015-05-04T07:50:57Z|  OBJECT|  167.379601    35.312876 2000| 15.0|i|-9999.990|Focus Sweep ( 2of19) M2Z: 1670 Alt[70.0]
+o7146h0015o|2015-05-04T07:51:46Z|  OBJECT|  167.584491    35.312940 2000| 15.0|i|-9999.990|Focus Sweep ( 3of19) M2Z: 1675 Alt[70.0]
+o7146h0016o|2015-05-04T07:52:36Z|  OBJECT|  167.793730    35.313003 2000| 15.0|i|-9999.990|Focus Sweep ( 4of19) M2Z: 1680 Alt[70.0]
+o7146h0017o|2015-05-04T07:53:26Z|  OBJECT|  168.002816    35.313066 2000| 15.0|i|-9999.990|Focus Sweep ( 5of19) M2Z: 1685 Alt[70.0]
+o7146h0018o|2015-05-04T07:54:15Z|  OBJECT|  168.207740    35.313127 2000| 15.0|i|-9999.990|Focus Sweep ( 6of19) M2Z: 1690 Alt[70.0]
+o7146h0019o|2015-05-04T07:55:06Z|  OBJECT|  168.421413    35.313181 2000| 15.0|i|-9999.990|Focus Sweep ( 7of19) M2Z: 1695 Alt[70.0]
+o7146h0020o|2015-05-04T07:55:57Z|  OBJECT|  168.635024    35.313243 2000| 15.0|i|-9999.990|Focus Sweep ( 8of19) M2Z: 1700 Alt[70.0]
+o7146h0021o|2015-05-04T07:56:47Z|  OBJECT|  168.847465    35.313304 2000| 15.0|i|-9999.990|Focus Sweep ( 9of19) M2Z: 1705 Alt[70.0]
+o7146h0022o|2015-05-04T07:57:37Z|  OBJECT|  169.052366    35.313361 2000| 15.0|i|-9999.990|Focus Sweep (10of19) M2Z: 1710 Alt[70.0]
+o7146h0023o|2015-05-04T07:58:28Z|  OBJECT|  169.265591    35.313415 2000| 15.0|i|-9999.990|Focus Sweep (11of19) M2Z: 1715 Alt[70.0]
+o7146h0024o|2015-05-04T07:59:19Z|  OBJECT|  169.481288    35.311836 2000| 15.0|i|-9999.990|Focus Sweep (12of19) M2Z: 1720 Alt[70.0]
+o7146h0025o|2015-05-04T08:00:08Z|  OBJECT|  169.683751    35.313523 2000| 15.0|i|-9999.990|Focus Sweep (13of19) M2Z: 1725 Alt[70.0]
+o7146h0026o|2015-05-04T08:00:58Z|  OBJECT|  169.893045    35.312937 2000| 15.0|i|-9999.990|Focus Sweep (14of19) M2Z: 1730 Alt[70.0]
+o7146h0027o|2015-05-04T08:01:53Z|  OBJECT|  170.106963    35.313626 2000| 15.0|i|-9999.990|Focus Sweep (15of19) M2Z: 1735 Alt[70.0]
+o7146h0028o|2015-05-04T08:02:42Z|  OBJECT|  170.328287    35.313681 2000| 15.0|i|-9999.990|Focus Sweep (16of19) M2Z: 1740 Alt[70.0]
+o7146h0029o|2015-05-04T08:03:32Z|  OBJECT|  170.539438    35.312092 2000| 15.0|i|-9999.990|Focus Sweep (17of19) M2Z: 1745 Alt[70.0]
+o7146h0030o|2015-05-04T08:04:23Z|  OBJECT|  170.750910    35.313775 2000| 15.0|i|-9999.990|Focus Sweep (18of19) M2Z: 1750 Alt[70.0]
+o7146h0031o|2015-05-04T08:05:14Z|  OBJECT|  170.963537    35.313824 2000| 15.0|i|-9999.990|Focus Sweep (19of19) M2Z: 1755 Alt[70.0]
+o7146h0032o|2015-05-04T08:19:11Z|  OBJECT|  164.630985    39.739996 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0965 visit 1
+o7146h0033o|2015-05-04T08:20:21Z|  OBJECT|  165.400442    37.009996 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0853 visit 1
+o7146h0034o|2015-05-04T08:21:31Z|  OBJECT|  166.060433    34.239996 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0962 visit 1
+o7146h0035o|2015-05-04T08:22:42Z|  OBJECT|  168.711073    36.249995 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0951 visit 1
+o7146h0036o|2015-05-04T08:23:52Z|  OBJECT|  168.120207    39.029994 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0964 visit 1
+o7146h0037o|2015-05-04T08:25:03Z|  OBJECT|  167.450144    41.789997 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0854 visit 1
+o7146h0038o|2015-05-04T08:26:14Z|  OBJECT|  170.450221    43.780001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0966 visit 1
+o7146h0039o|2015-05-04T08:27:24Z|  OBJECT|  171.010956    41.009999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0953 visit 1
+o7146h0040o|2015-05-04T08:28:33Z|  OBJECT|  171.500190    38.219995 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0848 visit 1
+o7146h0041o|2015-05-04T08:29:43Z|  OBJECT|  171.920977    35.409996 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0950 visit 1
+o7146h0042o|2015-05-04T08:30:54Z|  OBJECT|  174.780307    37.329994 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0941 visit 1
+o7146h0043o|2015-05-04T08:32:04Z|  OBJECT|  175.050659    34.509995 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0843 visit 1
+o7146h0044o|2015-05-04T08:33:16Z|  OBJECT|  177.970413    36.379992 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0940 visit 1
+o7146h0045o|2015-05-04T08:34:27Z|  OBJECT|  177.830193    39.179994 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5548 visit 1
+o7146h0046o|2015-05-04T08:35:35Z|  OBJECT|  174.470113    40.139995 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0952 visit 1
+o7146h0047o|2015-05-04T08:36:45Z|  OBJECT|  174.100525    42.929998 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5549 visit 1
+o7146h0048o|2015-05-04T08:37:54Z|  OBJECT|  177.630459    41.969997 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_1216 visit 1
+o7146h0049o|2015-05-04T08:39:10Z|  OBJECT|  164.630162    39.739995 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0965 visit 2
+o7146h0050o|2015-05-04T08:40:21Z|  OBJECT|  165.400218    37.009997 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0853 visit 2
+o7146h0051o|2015-05-04T08:41:31Z|  OBJECT|  166.060884    34.240000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0962 visit 2
+o7146h0052o|2015-05-04T10:12:28Z|  OBJECT|  168.710707    36.250000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0951 visit 2
+o7146h0053o|2015-05-04T10:13:38Z|  OBJECT|  168.120318    39.029999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0964 visit 2
+o7146h0054o|2015-05-04T10:14:48Z|  OBJECT|  167.451137    41.789999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0854 visit 2
+o7146h0055o|2015-05-04T10:15:57Z|  OBJECT|  170.450568    43.779999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0966 visit 2
+o7146h0056o|2015-05-04T10:17:09Z|  OBJECT|  171.015043    41.009424 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0953 visit 2
+o7146h0057o|2015-05-04T10:18:18Z|  OBJECT|  171.500269    38.219999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0848 visit 2
+o7146h0058o|2015-05-04T10:19:28Z|  OBJECT|  171.920306    35.410000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0950 visit 2
+o7146h0059o|2015-05-04T10:20:37Z|  OBJECT|  174.780063    37.330035 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0941 visit 2
+o7146h0060o|2015-05-04T10:21:47Z|  OBJECT|  175.050233    34.510000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0843 visit 2
+o7146h0061o|2015-05-04T10:22:56Z|  OBJECT|  177.970271    36.380000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0940 visit 2
+o7146h0062o|2015-05-04T10:24:06Z|  OBJECT|  177.830958    39.179999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5548 visit 2
+o7146h0063o|2015-05-04T10:25:15Z|  OBJECT|  174.471292    40.139999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0952 visit 2
+o7146h0064o|2015-05-04T10:26:25Z|  OBJECT|  174.100409    42.929998 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5549 visit 2
+o7146h0065o|2015-05-04T10:27:34Z|  OBJECT|  177.630357    41.969999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_1216 visit 2
+o7146h0066o|2015-05-04T10:28:49Z|  OBJECT|  164.630340    39.740001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0965 visit 3
+o7146h0067o|2015-05-04T10:29:58Z|  OBJECT|  165.400563    37.010000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0853 visit 3
+o7146h0068o|2015-05-04T10:31:09Z|  OBJECT|  166.060193    34.239999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0962 visit 3
+o7146h0069o|2015-05-04T10:32:18Z|  OBJECT|  168.710367    36.250000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0951 visit 3
+o7146h0070o|2015-05-04T10:33:28Z|  OBJECT|  168.120240    39.029999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0964 visit 3
+o7146h0071o|2015-05-04T10:34:37Z|  OBJECT|  167.450208    41.789999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0854 visit 3
+o7146h0072o|2015-05-04T10:35:47Z|  OBJECT|  170.450197    43.780001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0966 visit 3
+o7146h0073o|2015-05-04T10:36:56Z|  OBJECT|  171.010361    41.009999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0953 visit 3
+o7146h0074o|2015-05-04T10:38:06Z|  OBJECT|  171.500934    38.220000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0848 visit 3
+o7146h0075o|2015-05-04T10:39:16Z|  OBJECT|  171.920139    35.409999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0950 visit 3
+o7146h0076o|2015-05-04T10:40:25Z|  OBJECT|  174.780131    37.330000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0941 visit 3
+o7146h0077o|2015-05-04T10:41:34Z|  OBJECT|  175.050257    34.510000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0843 visit 3
+o7146h0078o|2015-05-04T10:42:43Z|  OBJECT|  177.970112    36.380000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0940 visit 3
+o7146h0079o|2015-05-04T10:43:54Z|  OBJECT|  177.830244    39.179999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5548 visit 3
+o7146h0080o|2015-05-04T10:45:18Z|  OBJECT|  174.537244    40.140018 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0952 visit 3
+o7146h0081o|2015-05-04T11:11:19Z|  OBJECT|  174.470069    40.139999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0952 visit 3
+o7146h0082o|2015-05-04T11:12:29Z|  OBJECT|  174.100281    42.930000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5549 visit 3
+o7146h0083o|2015-05-04T11:13:38Z|  OBJECT|  177.631004    41.969999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_1216 visit 3
+o7146h0084o|2015-05-04T11:14:51Z|  OBJECT|  164.630624    39.739999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0965 visit 4
+o7146h0085o|2015-05-04T11:16:00Z|  OBJECT|  165.400811    37.010000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0853 visit 4
+o7146h0086o|2015-05-04T11:17:09Z|  OBJECT|  166.060254    34.240000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0962 visit 4
+o7146h0087o|2015-05-04T11:18:18Z|  OBJECT|  168.710163    36.250001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0951 visit 4
+o7146h0088o|2015-05-04T11:19:28Z|  OBJECT|  168.121071    39.029999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0964 visit 4
+o7146h0089o|2015-05-04T11:20:37Z|  OBJECT|  167.450292    41.790000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0854 visit 4
+o7146h0090o|2015-05-04T11:21:46Z|  OBJECT|  170.450245    43.779999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0966 visit 4
+o7146h0091o|2015-05-04T11:22:55Z|  OBJECT|  171.010126    41.009997 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0953 visit 4
+o7146h0092o|2015-05-04T11:24:04Z|  OBJECT|  171.500336    38.220000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0848 visit 4
+o7146h0093o|2015-05-04T11:25:13Z|  OBJECT|  171.920326    35.409985 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0950 visit 4
+o7146h0094o|2015-05-04T11:26:23Z|  OBJECT|  174.780367    37.330000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0941 visit 4
+o7146h0095o|2015-05-04T11:27:32Z|  OBJECT|  175.050183    34.510000 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0843 visit 4
+o7146h0096o|2015-05-04T11:28:42Z|  OBJECT|  177.970378    36.379998 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0940 visit 4
+o7146h0097o|2015-05-04T11:29:51Z|  OBJECT|  177.830656    39.180001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5548 visit 4
+o7146h0098o|2015-05-04T11:31:00Z|  OBJECT|  174.470447    40.139999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_0952 visit 4
+o7146h0099o|2015-05-04T11:32:11Z|  OBJECT|  174.100306    42.930001 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_5549 visit 4
+o7146h0100o|2015-05-04T11:33:19Z|  OBJECT|  177.630514    41.969999 2000| 45.0|i|-9999.990|OSSR.R11N5.12.Q.i ps1_28_1216 visit 4
+o7146h0101o|2015-05-04T11:59:40Z|  OBJECT|  226.762928    31.788287 2000| 15.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1715 Alt[70.0]
+o7146h0102o|2015-05-04T12:00:29Z|  OBJECT|  226.971658    31.788066 2000| 15.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1720 Alt[70.0]
+o7146h0103o|2015-05-04T12:01:17Z|  OBJECT|  227.172624    31.787850 2000| 15.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1725 Alt[70.0]
+o7146h0104o|2015-05-04T12:02:07Z|  OBJECT|  227.377909    31.787628 2000| 15.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1730 Alt[70.0]
+o7146h0105o|2015-05-04T12:02:56Z|  OBJECT|  227.586547    31.787401 2000| 15.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1735 Alt[70.0]
+o7146h0106o|2015-05-04T12:03:46Z|  OBJECT|  227.795950    31.787172 2000| 15.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1740 Alt[70.0]
+o7146h0107o|2015-05-04T12:04:37Z|  OBJECT|  228.008704    31.786942 2000| 15.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1745 Alt[70.0]
+o7146h0108o|2015-05-04T12:05:25Z|  OBJECT|  228.209701    31.786722 2000| 15.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1750 Alt[70.0]
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150505.idx
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150505.idx	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/20150505.idx	(revision 38253)
@@ -0,0 +1,143 @@
+# filesetID|time registered     |type    |telescope pointing            |etime|f|airm|comments
+o7147h0001d|2015-05-05T03:02:19Z|    DARK|  102.952966    29.445498 2000|  0.1|CLEAR|-9999.990|Queue ( 1of11) Dark Sweep
+o7147h0002d|2015-05-05T03:02:39Z|    DARK|  102.953475    29.445497 2000|  0.1|CLEAR|-9999.990|Queue ( 2of11) Dark Sweep
+o7147h0003d|2015-05-05T03:02:59Z|    DARK|  102.955480    29.443705 2000|  0.1|CLEAR|-9999.990|Queue ( 3of11) Dark Sweep
+o7147h0004d|2015-05-05T03:03:19Z|    DARK|  102.953039    29.445499 2000|  0.1|CLEAR|-9999.990|Queue ( 4of11) Dark Sweep
+o7147h0005d|2015-05-05T03:03:39Z|    DARK|  102.953323    29.445498 2000|  0.1|CLEAR|-9999.990|Queue ( 5of11) Dark Sweep
+o7147h0006d|2015-05-05T03:03:59Z|    DARK|  102.953360    29.445494 2000|  0.1|CLEAR|-9999.990|Queue ( 6of11) Dark Sweep
+o7147h0007d|2015-05-05T03:04:19Z|    DARK|  102.953010    29.445500 2000|  0.1|CLEAR|-9999.990|Queue ( 7of11) Dark Sweep
+o7147h0008d|2015-05-05T03:04:39Z|    DARK|  102.952982    29.445499 2000|  0.1|CLEAR|-9999.990|Queue ( 8of11) Dark Sweep
+o7147h0009d|2015-05-05T03:04:59Z|    DARK|  102.953183    29.445500 2000|  0.1|CLEAR|-9999.990|Queue ( 9of11) Dark Sweep
+o7147h0010d|2015-05-05T03:05:19Z|    DARK|  102.953373    29.445494 2000|  0.1|CLEAR|-9999.990|Queue (10of11) Dark Sweep
+o7147h0011d|2015-05-05T03:05:39Z|    DARK|  102.953008    29.445498 2000|  0.1|CLEAR|-9999.990|Queue (11of11) Dark Sweep
+o7147h0012d|2015-05-05T03:48:19Z|    DARK|  123.339662    20.743704 2000|  0.1|CLEAR|-9999.990|test Dark
+o7147h0013d|2015-05-05T04:52:24Z|    DARK|  132.722615    28.705039 2000|  0.1|CLEAR|-9999.990|test Dark
+c7147h0003d|2015-05-05T05:09:14Z|    DARK|  190.504536    14.563535 2000|  0.0|w|-9999.990|test Dark
+c7147h0004d|2015-05-05T05:10:29Z|    DARK|  190.568831    14.563511 2000|  0.1|w|-9999.990|sky flats
+c7147h0005d|2015-05-05T05:11:34Z|    DARK|  190.569360    14.663512 2000|  1.0|w|-9999.990|sky flats
+c7147h0006f|2015-05-05T05:13:14Z| SKYFLAT|  190.568884    14.663515 2000|  0.1|w|-9999.990|sky flats
+c7147h0007f|2015-05-05T05:14:04Z| SKYFLAT|  190.568809    14.763512 2000|  0.1|w|-9999.990|sky flats
+c7147h0008f|2015-05-05T05:15:04Z| SKYFLAT|  190.672211    14.763514 2000|  0.1|w|-9999.990|sky flats
+c7147h0009f|2015-05-05T05:16:04Z| SKYFLAT|  190.672378    14.663513 2000|  0.2|w|-9999.990|sky flats
+c7147h0010f|2015-05-05T05:16:59Z| SKYFLAT|  190.776109    14.663509 2000|  0.2|w|-9999.990|sky flats
+c7147h0011f|2015-05-05T05:18:04Z| SKYFLAT|  190.775631    14.763512 2000|  0.3|w|-9999.990|sky flats
+c7147h0012f|2015-05-05T05:19:24Z| SKYFLAT|  190.879184    14.763510 2000|  0.5|w|-9999.990|sky flats
+c7147h0013f|2015-05-05T05:20:29Z| SKYFLAT|  190.879505    14.663511 2000|  0.6|w|-9999.990|sky flats
+c7147h0014f|2015-05-05T05:21:24Z| SKYFLAT|  190.982349    14.663512 2000|  0.7|w|-9999.990|sky flats
+c7147h0015f|2015-05-05T05:22:59Z| SKYFLAT|  190.982663    14.363512 2000|  0.9|w|-9999.990|sky flats
+c7147h0016f|2015-05-05T05:23:54Z| SKYFLAT|  190.879681    14.363513 2000|  1.1|w|-9999.990|sky flats
+c7147h0017f|2015-05-05T05:24:39Z| SKYFLAT|  190.879696    14.463514 2000|  1.3|w|-9999.990|sky flats
+o7147h0014o|2015-05-05T06:25:40Z|  OBJECT|  163.019290     0.691869 2000| 15.0|w|-9999.990|Focus Sweep ( 1of19) M2Z: 1605 Alt[69.9]
+o7147h0015o|2015-05-05T06:26:30Z|  OBJECT|  163.232434     0.691953 2000| 15.0|w|-9999.990|Focus Sweep ( 2of19) M2Z: 1610 Alt[69.9]
+o7147h0016o|2015-05-05T06:27:21Z|  OBJECT|  163.441327     0.692037 2000| 15.0|w|-9999.990|Focus Sweep ( 3of19) M2Z: 1615 Alt[69.9]
+o7147h0017o|2015-05-05T06:28:12Z|  OBJECT|  163.654283     0.692116 2000| 15.0|w|-9999.990|Focus Sweep ( 4of19) M2Z: 1620 Alt[69.9]
+o7147h0018o|2015-05-05T06:29:01Z|  OBJECT|  163.863271     0.692194 2000| 15.0|w|-9999.990|Focus Sweep ( 5of19) M2Z: 1625 Alt[69.9]
+o7147h0019o|2015-05-05T06:29:52Z|  OBJECT|  164.072010     0.692269 2000| 15.0|w|-9999.990|Focus Sweep ( 6of19) M2Z: 1630 Alt[69.9]
+o7147h0020o|2015-05-05T06:30:43Z|  OBJECT|  164.285240     0.692351 2000| 15.0|w|-9999.990|Focus Sweep ( 7of19) M2Z: 1635 Alt[69.9]
+o7147h0021o|2015-05-05T06:31:34Z|  OBJECT|  164.498044     0.692428 2000| 15.0|w|-9999.990|Focus Sweep ( 8of19) M2Z: 1640 Alt[69.9]
+o7147h0022o|2015-05-05T06:32:25Z|  OBJECT|  164.711302     0.692510 2000| 15.0|w|-9999.990|Focus Sweep ( 9of19) M2Z: 1645 Alt[69.9]
+o7147h0023o|2015-05-05T06:33:16Z|  OBJECT|  164.924860     0.692576 2000| 15.0|w|-9999.990|Focus Sweep (10of19) M2Z: 1650 Alt[69.9]
+o7147h0024o|2015-05-05T06:34:08Z|  OBJECT|  165.137380     0.692657 2000| 15.0|w|-9999.990|Focus Sweep (11of19) M2Z: 1655 Alt[69.9]
+o7147h0025o|2015-05-05T06:34:57Z|  OBJECT|  165.354678     0.692728 2000| 15.0|w|-9999.990|Focus Sweep (12of19) M2Z: 1660 Alt[69.9]
+o7147h0026o|2015-05-05T06:35:45Z|  OBJECT|  165.546834     0.692794 2000| 15.0|w|-9999.990|Focus Sweep (13of19) M2Z: 1665 Alt[69.9]
+o7147h0027o|2015-05-05T06:36:33Z|  OBJECT|  165.747087     0.692859 2000| 15.0|w|-9999.990|Focus Sweep (14of19) M2Z: 1670 Alt[69.9]
+o7147h0028o|2015-05-05T06:37:24Z|  OBJECT|  165.947845     0.692927 2000| 15.0|w|-9999.990|Focus Sweep (15of19) M2Z: 1675 Alt[69.9]
+o7147h0029o|2015-05-05T06:38:16Z|  OBJECT|  166.178762     0.692998 2000| 15.0|w|-9999.990|Focus Sweep (16of19) M2Z: 1680 Alt[69.9]
+o7147h0030o|2015-05-05T06:39:08Z|  OBJECT|  166.394837     0.693064 2000| 15.0|w|-9999.990|Focus Sweep (17of19) M2Z: 1685 Alt[69.9]
+o7147h0031o|2015-05-05T06:39:59Z|  OBJECT|  166.608566     0.693129 2000| 15.0|w|-9999.990|Focus Sweep (18of19) M2Z: 1690 Alt[69.9]
+o7147h0032o|2015-05-05T06:40:50Z|  OBJECT|  166.822038     0.693192 2000| 15.0|w|-9999.990|Focus Sweep (19of19) M2Z: 1695 Alt[69.9]
+o7147h0033o|2015-05-05T07:03:02Z|  OBJECT|  173.964100     0.959309 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_1
+o7147h0034o|2015-05-05T07:04:14Z|  OBJECT|  173.963889     0.292636 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_2
+o7147h0035o|2015-05-05T07:05:23Z|  OBJECT|  173.297569     0.959307 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_3
+o7147h0036o|2015-05-05T07:06:32Z|  OBJECT|  173.297073     0.292638 2000| 45.0|g|-9999.990|PS15ae_a150418_dither_4
+o7147h0037o|2015-05-05T07:07:58Z|  OBJECT|  173.963726     0.959310 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_1
+o7147h0038o|2015-05-05T07:09:07Z|  OBJECT|  173.963637     0.292643 2000| 45.0|r|-9999.990|PS15ae_a150418_dither_2
+o7147h0039o|2015-05-05T08:40:44Z|  OBJECT|  196.451676     0.790126 2000| 15.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1730 Alt[70.0]
+o7147h0040o|2015-05-05T08:41:31Z|  OBJECT|  196.647523     0.790036 2000| 15.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1735 Alt[70.0]
+o7147h0041o|2015-05-05T08:42:20Z|  OBJECT|  196.852148     0.789936 2000| 15.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1740 Alt[70.0]
+o7147h0042o|2015-05-05T08:43:11Z|  OBJECT|  197.061070     0.789834 2000| 15.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1745 Alt[70.0]
+o7147h0043o|2015-05-05T08:44:02Z|  OBJECT|  197.278249     0.789729 2000| 15.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1750 Alt[70.0]
+o7147h0044o|2015-05-05T08:44:52Z|  OBJECT|  197.487254     0.789630 2000| 15.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1755 Alt[70.0]
+o7147h0045o|2015-05-05T08:45:42Z|  OBJECT|  197.695821     0.789526 2000| 15.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1760 Alt[70.0]
+o7147h0046o|2015-05-05T08:46:33Z|  OBJECT|  197.909343     0.789414 2000| 15.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1765 Alt[70.0]
+o7147h0047o|2015-05-05T08:47:23Z|  OBJECT|  198.118062     0.789309 2000| 15.0|i|-9999.990|Focus Sweep ( 9of13) M2Z: 1770 Alt[70.0]
+o7147h0048o|2015-05-05T08:48:10Z|  OBJECT|  198.314374     0.789216 2000| 15.0|i|-9999.990|Focus Sweep (10of13) M2Z: 1775 Alt[70.0]
+o7147h0049o|2015-05-05T08:49:01Z|  OBJECT|  198.527471     0.789100 2000| 15.0|i|-9999.990|Focus Sweep (11of13) M2Z: 1780 Alt[70.0]
+o7147h0050o|2015-05-05T08:50:43Z|  OBJECT|  198.953762     0.788877 2000| 15.0|i|-9999.990|Focus Sweep (12of13) M2Z: 1785 Alt[70.0]
+o7147h0051o|2015-05-05T08:52:26Z|  OBJECT|  199.384677     0.788648 2000| 15.0|i|-9999.990|Focus Sweep (13of13) M2Z: 1790 Alt[70.0]
+o7147h0052o|2015-05-05T09:04:51Z|  OBJECT|  202.517880     0.786785 2000| 15.0|i|-9999.990|Focus Sweep ( 1of13) M2Z: 1660 Alt[70.0]
+o7147h0053o|2015-05-05T09:05:41Z|  OBJECT|  202.730416     0.786654 2000| 15.0|i|-9999.990|Focus Sweep ( 2of13) M2Z: 1665 Alt[70.0]
+o7147h0054o|2015-05-05T09:07:24Z|  OBJECT|  203.160983     0.786380 2000| 15.0|i|-9999.990|Focus Sweep ( 3of13) M2Z: 1670 Alt[70.0]
+o7147h0055o|2015-05-05T09:09:07Z|  OBJECT|  203.591836     0.786110 2000| 15.0|i|-9999.990|Focus Sweep ( 4of13) M2Z: 1675 Alt[70.0]
+o7147h0056o|2015-05-05T09:10:50Z|  OBJECT|  204.021650     0.785828 2000| 15.0|i|-9999.990|Focus Sweep ( 5of13) M2Z: 1680 Alt[70.0]
+o7147h0057o|2015-05-05T09:12:33Z|  OBJECT|  204.451969     0.785547 2000| 15.0|i|-9999.990|Focus Sweep ( 6of13) M2Z: 1685 Alt[70.0]
+o7147h0058o|2015-05-05T09:14:15Z|  OBJECT|  204.877953     0.785265 2000| 15.0|i|-9999.990|Focus Sweep ( 7of13) M2Z: 1690 Alt[70.0]
+o7147h0059o|2015-05-05T09:16:01Z|  OBJECT|  205.308757     0.784976 2000| 15.0|i|-9999.990|Focus Sweep ( 8of13) M2Z: 1695 Alt[70.0]
+o7147h0060o|2015-05-05T09:17:44Z|  OBJECT|  205.751407     0.784674 2000| 15.0|i|-9999.990|Focus Sweep ( 9of13) M2Z: 1700 Alt[70.0]
+o7147h0061o|2015-05-05T09:19:26Z|  OBJECT|  206.177443     0.784377 2000| 15.0|i|-9999.990|Focus Sweep (10of13) M2Z: 1705 Alt[70.0]
+o7147h0062o|2015-05-05T09:21:09Z|  OBJECT|  206.607596     0.784071 2000| 15.0|i|-9999.990|Focus Sweep (11of13) M2Z: 1710 Alt[70.0]
+o7147h0063o|2015-05-05T13:20:31Z|  OBJECT|  266.648022     0.711158 2000| 15.0|i|-9999.990|test
+o7147h0064o|2015-05-05T13:31:33Z|  OBJECT|  269.840340    39.400003 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4007 visit 1
+o7147h0065o|2015-05-05T13:32:42Z|  OBJECT|  270.860324    36.639994 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4006 visit 1
+o7147h0066o|2015-05-05T13:33:53Z|  OBJECT|  273.370439    38.609998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3879 visit 1
+o7147h0067o|2015-05-05T13:35:02Z|  OBJECT|  272.410356    41.369994 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4024 visit 1
+o7147h0068o|2015-05-05T13:36:12Z|  OBJECT|  275.150242    43.240001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3887 visit 1
+o7147h0069o|2015-05-05T13:37:21Z|  OBJECT|  276.040450    40.450001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4005 visit 1
+o7147h0070o|2015-05-05T13:38:32Z|  OBJECT|  276.890448    37.700005 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4004 visit 1
+o7147h0071o|2015-05-05T13:39:43Z|  OBJECT|  274.280403    35.869997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3989 visit 1
+o7147h0072o|2015-05-05T13:40:56Z|  OBJECT|  277.690038    34.969998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3871 visit 1
+o7147h0073o|2015-05-05T13:42:07Z|  OBJECT|  280.380232    36.650004 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3987 visit 1
+o7147h0074o|2015-05-05T13:43:19Z|  OBJECT|  283.790507    35.490008 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3870 visit 1
+o7147h0075o|2015-05-05T13:44:30Z|  OBJECT|  283.190593    38.250006 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4002 visit 1
+o7147h0076o|2015-05-05T13:45:42Z|  OBJECT|  279.650470    39.409999 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3878 visit 1
+o7147h0077o|2015-05-05T13:46:52Z|  OBJECT|  278.870448    42.180003 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4022 visit 1
+o7147h0078o|2015-05-05T13:48:01Z|  OBJECT|  281.840299    43.810001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3886 visit 1
+o7147h0079o|2015-05-05T13:49:10Z|  OBJECT|  282.530308    41.019999 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4003 visit 1
+o7147h0080o|2015-05-05T13:50:32Z|  OBJECT|  269.840732    39.399995 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4007 visit 2
+o7147h0081o|2015-05-05T13:51:41Z|  OBJECT|  270.860183    36.639997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4006 visit 2
+o7147h0082o|2015-05-05T13:52:53Z|  OBJECT|  273.370357    38.610003 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3879 visit 2
+o7147h0083o|2015-05-05T13:54:02Z|  OBJECT|  272.410928    41.369999 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4024 visit 2
+o7147h0084o|2015-05-05T13:55:13Z|  OBJECT|  275.150944    43.240001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3887 visit 2
+o7147h0085o|2015-05-05T13:56:22Z|  OBJECT|  276.040333    40.450001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4005 visit 2
+o7147h0086o|2015-05-05T13:57:31Z|  OBJECT|  276.890334    37.699996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4004 visit 2
+o7147h0087o|2015-05-05T13:58:43Z|  OBJECT|  274.280220    35.869997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3989 visit 2
+o7147h0088o|2015-05-05T13:59:56Z|  OBJECT|  277.690203    34.970001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3871 visit 2
+o7147h0089o|2015-05-05T14:01:08Z|  OBJECT|  280.380205    36.649998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3987 visit 2
+o7147h0090o|2015-05-05T14:02:21Z|  OBJECT|  283.790150    35.489997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3870 visit 2
+o7147h0091o|2015-05-05T14:03:32Z|  OBJECT|  283.190338    38.249994 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4002 visit 2
+o7147h0092o|2015-05-05T14:04:44Z|  OBJECT|  279.650636    39.409994 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3878 visit 2
+o7147h0093o|2015-05-05T14:05:53Z|  OBJECT|  278.870172    42.179996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4022 visit 2
+o7147h0094o|2015-05-05T14:07:05Z|  OBJECT|  281.840373    43.809999 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3886 visit 2
+o7147h0095o|2015-05-05T14:08:14Z|  OBJECT|  282.530238    41.020000 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4003 visit 2
+o7147h0096o|2015-05-05T14:09:36Z|  OBJECT|  269.840232    39.399993 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4007 visit 3
+o7147h0097o|2015-05-05T14:10:46Z|  OBJECT|  270.860488    36.639995 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4006 visit 3
+o7147h0098o|2015-05-05T14:11:58Z|  OBJECT|  273.370910    38.609996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3879 visit 3
+o7147h0099o|2015-05-05T14:13:07Z|  OBJECT|  272.410447    41.369996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4024 visit 3
+o7147h0100o|2015-05-05T14:14:18Z|  OBJECT|  275.150101    43.239995 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3887 visit 3
+o7147h0101o|2015-05-05T14:15:27Z|  OBJECT|  276.040345    40.449996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4005 visit 3
+o7147h0102o|2015-05-05T14:16:36Z|  OBJECT|  276.890484    37.699998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4004 visit 3
+o7147h0103o|2015-05-05T14:17:48Z|  OBJECT|  274.280298    35.869992 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3989 visit 3
+o7147h0104o|2015-05-05T14:19:00Z|  OBJECT|  277.690346    34.969996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3871 visit 3
+o7147h0105o|2015-05-05T14:20:13Z|  OBJECT|  280.380472    36.649773 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3987 visit 3
+o7147h0106o|2015-05-05T14:21:26Z|  OBJECT|  283.790316    35.490001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3870 visit 3
+o7147h0107o|2015-05-05T14:22:36Z|  OBJECT|  283.190407    38.250000 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4002 visit 3
+o7147h0108o|2015-05-05T14:23:48Z|  OBJECT|  279.650263    39.410001 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3878 visit 3
+o7147h0109o|2015-05-05T14:24:57Z|  OBJECT|  278.870464    42.179997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4022 visit 3
+o7147h0110o|2015-05-05T14:26:08Z|  OBJECT|  281.840250    43.809998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3886 visit 3
+o7147h0111o|2015-05-05T14:27:17Z|  OBJECT|  282.530508    41.019998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4003 visit 3
+o7147h0112o|2015-05-05T14:28:39Z|  OBJECT|  269.840266    39.400000 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4007 visit 4
+o7147h0113o|2015-05-05T14:29:49Z|  OBJECT|  270.860458    36.639992 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4006 visit 4
+o7147h0114o|2015-05-05T14:31:00Z|  OBJECT|  273.370143    38.609994 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3879 visit 4
+o7147h0115o|2015-05-05T14:32:10Z|  OBJECT|  272.410788    41.369996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4024 visit 4
+o7147h0116o|2015-05-05T14:33:21Z|  OBJECT|  275.151008    43.239996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3887 visit 4
+o7147h0117o|2015-05-05T14:34:30Z|  OBJECT|  276.040657    40.449996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4005 visit 4
+o7147h0118o|2015-05-05T14:35:39Z|  OBJECT|  276.890192    37.699997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4004 visit 4
+o7147h0119o|2015-05-05T14:36:51Z|  OBJECT|  274.280061    35.869997 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3989 visit 4
+o7147h0120o|2015-05-05T14:38:03Z|  OBJECT|  277.690382    34.969998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3871 visit 4
+o7147h0121o|2015-05-05T14:39:15Z|  OBJECT|  280.380854    36.649993 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3987 visit 4
+o7147h0122o|2015-05-05T14:40:27Z|  OBJECT|  283.790577    35.489996 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3870 visit 4
+o7147h0123o|2015-05-05T14:41:37Z|  OBJECT|  283.190412    38.250000 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4002 visit 4
+o7147h0124o|2015-05-05T14:42:50Z|  OBJECT|  279.650323    39.409998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3878 visit 4
+o7147h0125o|2015-05-05T14:44:00Z|  OBJECT|  278.870226    42.179998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4022 visit 4
+o7147h0126o|2015-05-05T14:45:11Z|  OBJECT|  281.840393    43.809999 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_3886 visit 4
+o7147h0127o|2015-05-05T14:46:20Z|  OBJECT|  282.530448    41.019998 2000| 45.0|i|-9999.990|OSSR.R18N5.10.Q.i ps1_26_4003 visit 4
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0307q/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0307q/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0307q/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0308q/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0308q/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0308q/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0309q/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0309q/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0309q/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0310q/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0310q/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/gpc2/o7145h0310q/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt.template
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt.template	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/htdocs/index.txt.template	(revision 38253)
@@ -0,0 +1,1 @@
+<!--#include virtual="/ps2-cgi/dstxtindex.cgi" -->
Index: /branches/eam_branches/ipp-20150419/oofview/notes.txt
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/notes.txt	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/notes.txt	(revision 38253)
@@ -0,0 +1,2 @@
+
+wget "http://dsmaster.ps2/ds/gpc2/index.txt?20150505" -O 20150505.idx
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/create.tables.sql
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/create.tables.sql	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/create.tables.sql	(revision 38253)
@@ -0,0 +1,66 @@
+mysql> CREATE TABLE `dsFile` (
+    ->   `fileset_id` bigint(20) default NULL,
+    ->   `file_id` bigint(20) NOT NULL auto_increment,
+    ->   `file_name` varchar(255) NOT NULL,
+    ->   `bytes` bigint(20) default NULL,
+    ->   `md5sum` varchar(255) default NULL,
+    ->   `type` varchar(64) default NULL,
+    ->   `type_col_0` varchar(64) default NULL,
+    ->   `type_col_1` varchar(64) default NULL,
+    ->   `type_col_2` varchar(64) default NULL,
+    ->   `type_col_3` varchar(64) default NULL,
+    ->   `type_col_4` varchar(64) default NULL,
+    ->   `type_col_5` varchar(64) default NULL,
+    ->   `type_col_6` varchar(64) default NULL,
+    ->   `type_col_7` varchar(64) default NULL,
+    ->   PRIMARY KEY  (`file_id`),
+    ->   KEY `fileset_id` (`fileset_id`)
+    -> ) ;
+Query OK, 0 rows affected (0.02 sec)
+
+mysql> CREATE TABLE `dsFileType` (
+    ->   `type` varchar(64) default NULL,
+    ->   `type_col_0` varchar(64) default NULL,
+    ->   `type_col_1` varchar(64) default NULL,
+    ->   `type_col_2` varchar(64) default NULL,
+    ->   `type_col_3` varchar(64) default NULL
+    -> ) ;
+Query OK, 0 rows affected (0.02 sec)
+
+mysql> CREATE TABLE `dsFileset` (
+    ->   `prod_id` bigint(20) default NULL,
+    ->   `fileset_id` bigint(20) NOT NULL auto_increment,
+    ->   `fileset_name` varchar(64) NOT NULL,
+    ->   `reg_time` datetime NOT NULL,
+    ->   `hide` tinyint(4) default '0',
+    ->   `type` varchar(64) default NULL,
+    ->   `prod_col_0` varchar(64) default NULL,
+    ->   `prod_col_1` varchar(64) default NULL,
+    ->   `prod_col_2` varchar(64) default NULL,
+    ->   `prod_col_3` varchar(64) default NULL,
+    ->   `prod_col_4` varchar(64) default NULL,
+    ->   `prod_col_5` varchar(64) default NULL,
+    ->   `prod_col_6` varchar(64) default NULL,
+    ->   `prod_col_7` varchar(64) default NULL,
+    ->   PRIMARY KEY  (`fileset_id`),
+    ->   KEY `prod_id` (`prod_id`),
+    ->   KEY `fileset_name` (`fileset_name`)
+    -> ) ;
+mysql> CREATE TABLE `dsProduct` (
+    ->   `prod_id` bigint(20) NOT NULL auto_increment,
+    ->   `prod_name` varchar(64) NOT NULL,
+    ->   `last_update` datetime default NULL,
+    ->   `last_fs` varchar(64) default NULL,
+    ->   `type` varchar(64) default NULL,
+    ->   `description` varchar(255) default NULL,
+    ->   `prod_col_0` varchar(64) default NULL,
+    ->   `prod_col_1` varchar(64) default NULL,
+    ->   `prod_col_2` varchar(64) default NULL,
+    ->   `prod_col_3` varchar(64) default NULL,
+    ->   `prod_col_4` varchar(64) default NULL,
+    ->   `prod_col_5` varchar(64) default NULL,
+    ->   `prod_col_6` varchar(64) default NULL,
+    ->   `prod_col_7` varchar(64) default NULL,
+    ->   PRIMARY KEY  (`prod_id`),
+    ->   UNIQUE KEY `prod_name` (`prod_name`)
+);
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/mkoof.sh
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/mkoof.sh	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/mkoof.sh	(revision 38253)
@@ -0,0 +1,38 @@
+#!/bin/csh -f
+
+if ($#argv != 1) then
+  echo "USAGE: mkoof.sh (path)"
+  echo "  path should be the neb path to the basename of the files"
+  echo "  eg neb://any/gpc2/oof/20150503/o7145h0307q/o7145h0307q"
+  exit 2
+endif
+
+# output list file
+set listfile = `mktemp`
+
+# my output files have the wrong name structure in nebulous.  i have to link the neb entries 
+# to the right format and then generate a list with those names
+
+foreach f (`neb-ls -c $1%.raw.fits`)
+  set dskfile = `neb-locate -p $f`
+  set nebfile = `basename $f`
+  set newfile = `echo $nebfile | sed s/.XY// | sed s/.raw//`
+  set expname = `echo $nebfile | awk '{print substr($1,0,11)}'`
+
+  # echo "dskfile: $dskfile"
+    echo "nebfile: $nebfile"
+  # echo "newfile: $newfile"
+  # echo "expname: $expname"
+
+  mkdir -p $expname
+
+  if (! -e $expname/$newfile) ln -s $dskfile $expname/$newfile
+  echo $newfile | awk '{n = substr($1,12,2)}{printf "%s|||ota%02d\n", $1, n}' >> $listfile
+end
+
+set datapath = `pwd`/$expname
+
+# register the files
+/export/ippc20.0/ps2-oof/scripts/pfreg --add $expname --product gpc2 --type OOF --list $listfile --link --datapath $datapath
+
+rm $listfile
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh	(revision 38253)
@@ -0,0 +1,170 @@
+# -- sh-mode -- 
+
+# I need to have a pantasks to run the ppImage command across many machines
+
+# generate a list of exposures to process
+# generate a list of ppimage commands to run
+
+$srcdir = /local/ipp/psconfig
+
+$test = 1
+
+if not($?Nrun)       set Nrun = 0
+if not($?input:n)    set input:n = 0
+if not($?output:n)   set output:n = 0
+if not($?expname)    set expname:n = 0
+if not($?runstate:n) set runstate:n = 0
+
+if (not($?ppImageOpts))
+  $ppImageOpts = 
+  $ppImageOpts = $ppImageOpts -dbname gpc2
+  $ppImageOpts = $ppImageOpts -recipe PPIMAGE PPIMAGE_DET_ONLY
+  $ppImageOpts = $ppImageOpts -F PPIMAGE.OUTPUT PPIMAGE.OUTPUT.NOCOMP
+  $ppImageOpts = $ppImageOpts -Db FLAT F
+  $ppImageOpts = $ppImageOpts -Db BASE.FITS T
+  $ppImageOpts = $ppImageOpts -Db SQUASH.NANS T
+  $ppImageOpts = $ppImageOpts -threads 4
+end
+
+if not($?LOGDIR) 
+  $today = `date +%Y%m%d`
+  $LOGDIR = logs.$today
+end
+
+mkdir $LOGDIR
+
+list hosts
+  ippc35
+  ippc36
+  ippc37
+  ippc38
+  ippc39
+  ippc40
+end
+
+macro show.exposures
+  local i j name
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    for j 0 $name[]
+      $Njob = $name[$j]
+      echo $Njob $input:$Njob $runstate:$Njob
+    end
+  end
+end
+
+macro check.exposures
+  local i j name
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    $alldone = 1
+    for j 0 $name[]
+      $Njob = $name[$j]
+      if ("$runstate:$Njob" == "done") continue
+      $alldone = 0
+    end
+    if ($alldone)
+      echo "$expset:$i is DONE"
+    else
+      echo "$expset:$i is not DONE"
+    end
+  end
+end
+
+macro show.state
+
+  local i name
+  for i 0 $input:n
+    echo $input:$i $output:$i $expname:$i $runstate:$i
+  end
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    echo $expset:$i $name[]
+  end
+end
+
+# just make all connections so we can run 
+macro mkhosts
+ for i 0 $hosts:n
+   control host add $hosts:$i
+ end
+end
+
+# define the current hosts and targets
+macro mkcommands
+  if ($0 != 2)
+    echo "USAGE: uri"
+    break
+  end
+
+  local i tmp
+
+  # I expect filenames of the form gpc2/date/expname/expname.otaNN.fits
+  # construct an output path of the form gpc2/oof/date/expname/expname
+
+  dirname $1 -var tmp
+  basename $tmp -var expname
+  dirname $tmp -var tmp
+  basename $tmp -var datename
+
+  delete -q $expname
+  list expset -add $expname
+
+  list word -x "neb-ls -c $1%.fits"
+  for i 0 $word:n
+    list input    -add neb:///$word:$i
+    list output   -add neb:///gpc2/oof/$datename/$expname/$expname
+    list expname  -add $expname
+    list runstate -add new
+    concat {$input:n - 1} $expname
+  end
+end
+
+task mkjobs
+  periods -poll 0.5
+  periods -timeout 10
+  host anyhost
+
+  task.exec 
+    periods -exec 0.2
+
+    if (not($?input:n)) 
+      periods -exec 5.0
+      break
+    end
+
+    if ($Nrun >= $input:n) 
+      periods -exec 5.0
+      break
+    end
+
+    $src = $input:$Nrun
+    $tgt = $output:$Nrun
+
+    # host -required foobar
+
+    stdout $LOGDIR/tmp.log
+    stderr $LOGDIR/tmp.log
+
+    $run = ppImage $ppImageOpts -file $src $tgt
+
+    if ($test)
+      command echo $run
+    else
+      command $run
+    end
+    options $Nrun
+    $runstate:$Nrun = run
+
+    $Nrun ++
+  end
+
+  task.exit default
+    $myRun = $options:0
+    $runstate:$myRun = done
+  end
+end
+
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh.v1
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh.v1	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/oof.sh.v1	(revision 38253)
@@ -0,0 +1,168 @@
+# -- sh-mode -- 
+
+# I need to have a pantasks to run the ppImage command across many machines
+
+# generate a list of exposures to process
+# generate a list of ppimage commands to run
+
+$srcdir = /local/ipp/psconfig
+
+$test = 0
+
+if not($?Nrun)       set Nrun = 0
+if not($?input:n)    set input:n = 0
+if not($?output:n)   set output:n = 0
+if not($?expname)    set expname:n = 0
+if not($?runstate:n) set runstate:n = 0
+
+if (not($?ppImageOpts))
+  $ppImageOpts = 
+  $ppImageOpts = $ppImageOpts -dbname gpc2
+  $ppImageOpts = $ppImageOpts -recipe PPIMAGE PPIMAGE_DET_ONLY
+  $ppImageOpts = $ppImageOpts -F PPIMAGE.OUTPUT PPIMAGE.OUTPUT.NOCOMP
+  $ppImageOpts = $ppImageOpts -Db SQUASH.NANS T
+  $ppImageOpts = $ppImageOpts -threads 4
+end
+
+if not($?LOGDIR) 
+  $today = `date +%Y%m%d`
+  $LOGDIR = logs.$today
+end
+
+mkdir $LOGDIR
+
+list hosts
+  ippc35
+  ippc36
+  ippc37
+  ippc38
+  ippc39
+  ippc40
+end
+
+macro show.exposures
+  local i j name
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    for j 0 $name[]
+      $Njob = $name[$j]
+      echo $Njob $input:$Njob $runstate:$Njob
+    end
+  end
+end
+
+macro check.exposures
+  local i j name
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    $alldone = 1
+    for j 0 $name[]
+      $Njob = $name[$j]
+      if ("$runstate:$Njob" == "done") continue
+      $alldone = 0
+    end
+    if ($alldone)
+      echo "$expset:$i is DONE"
+    else
+      echo "$expset:$i is not DONE"
+    end
+  end
+end
+
+macro show.state
+
+  local i name
+  for i 0 $input:n
+    echo $input:$i $output:$i $expname:$i $runstate:$i
+  end
+
+  for i 0 $expset:n
+    $name = $expset:$i
+    echo $expset:$i $name[]
+  end
+end
+
+# just make all connections so we can run 
+macro mkhosts
+ for i 0 $hosts:n
+   control host add $hosts:$i
+ end
+end
+
+# define the current hosts and targets
+macro mkcommands
+  if ($0 != 2)
+    echo "USAGE: uri"
+    break
+  end
+
+  local i tmp
+
+  # I expect filenames of the form gpc2/date/expname/expname.otaNN.fits
+  # construct an output path of the form gpc2/oof/date/expname/expname
+
+  dirname $1 -var tmp
+  basename $tmp -var expname
+  dirname $tmp -var tmp
+  basename $tmp -var datename
+
+  delete -q $expname
+  list expset -add $expname
+
+  list word -x "neb-ls -c $1%.fits"
+  for i 0 $word:n
+    list input    -add neb:///$word:$i
+    list output   -add neb:///gpc2/oof/$datename/$expname/$expname
+    list expname  -add $expname
+    list runstate -add new
+    concat {$input:n - 1} $expname
+  end
+end
+
+task mkjobs
+  periods -poll 0.5
+  periods -timeout 10
+  host anyhost
+
+  task.exec 
+    periods -exec 0.2
+
+    if (not($?input:n)) 
+      periods -exec 5.0
+      break
+    end
+
+    if ($Nrun >= $input:n) 
+      periods -exec 5.0
+      break
+    end
+
+    $src = $input:$Nrun
+    $tgt = $output:$Nrun
+
+    # host -required foobar
+
+    stdout $LOGDIR/tmp.log
+    stderr $LOGDIR/tmp.log
+
+    $run = ppImage $ppImageOpts -file $src $tgt
+
+    if ($test)
+      command echo $run
+    else
+      command $run
+    end
+    options $Nrun
+    $runstate:$Nrun = run
+
+    $Nrun ++
+  end
+
+  task.exit default
+    $myRun = $options:0
+    $runstate:$myRun = done
+  end
+end
+
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/pfprodtool
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/pfprodtool	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/pfprodtool	(revision 38253)
@@ -0,0 +1,294 @@
+#!/usr/bin/env perl
+#
+# Data Store product  create and delete
+#
+
+use strict;
+use warnings;
+
+use Getopt::Long qw( GetOptions );
+use Pod::Usage qw( pod2usage );
+use DBI;
+use PS::IPP::Metadata::Config;
+use File::Copy;
+
+use Term::ReadKey;
+
+use PS::IPP::Config qw($PS_EXIT_SUCCESS
+		       $PS_EXIT_UNKNOWN_ERROR
+		       $PS_EXIT_SYS_ERROR
+		       $PS_EXIT_CONFIG_ERROR
+		       $PS_EXIT_PROG_ERROR
+		       $PS_EXIT_DATA_ERROR
+		       $PS_EXIT_TIMEOUT_ERROR
+		       metadataLookupStr
+		       metadataLookupBool
+		       caturi
+		       );
+my $product;
+
+# XXX allow group write permission. TODO: set group to something restrictive
+umask 2;
+
+my $ptype;
+my $description;
+
+my ($ps0, $ps1, $ps2, $ps3, $ps4, $ps5, $ps6, $ps7);
+
+my $dsroot;
+my $dbname;
+my $dbserver;
+my $dbpass;
+
+my $add;
+my $del;
+my $remove;
+
+my $we_created_dir = 0;
+
+GetOptions(
+        'add=s'         =>      \$add,
+        'del=s'         =>      \$del,
+	'type=s'	=>	\$ptype,
+        'description=s' =>      \$description,
+        'rm'            =>      \$remove,
+	'ps0=s'		=>	\$ps0,          # product specific columns 0 - 7
+	'ps1=s'		=>	\$ps1,
+	'ps2=s'		=>	\$ps2,
+	'ps3=s'		=>	\$ps3,
+	'ps4=s'		=>	\$ps4,
+	'ps5=s'		=>	\$ps5,
+	'ps6=s'		=>	\$ps6,
+	'ps7=s'		=>	\$ps7,
+        'dbname=s'      =>      \$dbname,
+        'dbserver=s'    =>      \$dbserver,
+        'dsroot=s'      =>      \$dsroot,
+) or pod2usage(2);
+
+my $err = "";
+
+# will exit if neither or both -add and -del were specified
+show_usage( "Must specify either --add or --del.")
+    unless $add xor $del;
+
+if ($add) {
+    $product = $add;
+    if (!$ptype) {
+        $err .= "need to specify Product type to add\n";
+    }
+    if (!$description) {
+        $err .= "need to specify Product description\n";
+    }
+
+} elsif ($del) {
+    $product = $del;
+    if (! -t STDIN) {
+        die "cannot delete product from script\n";
+    }
+    print "*** Delete the Data Store Product $product? ***\n";
+    print "*** to delete $product answer YES, and give password ***\n";
+    print "*** WARNING this action is permanant *** \n";
+    print "Delete? (YES/[n]): ";
+
+    my $line = ReadLine(0);
+    chomp $line;
+    exit 1 if !$line or ($line ne "YES");
+
+    print "password: ";
+    ReadMode('noecho');
+    $line = ReadLine(0);
+    ReadMode('normal');
+    print "\n";
+    chomp $line;
+    $dbpass = $line;
+}
+
+#
+# lookup the location of the Data Store
+#
+
+my $ipprc =  PS::IPP::Config->new(); # IPP Configuration
+my $siteConfig = $ipprc->{_siteConfig};
+if (!$dsroot) {
+    $dsroot = metadataLookupStr($ipprc->{_siteConfig}, 'PF_ROOT');
+    if (!$dsroot) {
+        die("Data Store root directory not set");
+    }
+}
+
+my $root_index_script = "$dsroot/index.txt.template";
+if (!stat($root_index_script)) {
+    $err .= "Data Store not found at '$dsroot'.\n"
+}
+
+# bail if any of the above args were improper
+show_usage($err)
+    if ($err);
+
+$dbserver = metadataLookupStr($siteConfig, 'PF_DBSERVER') 
+    unless defined $dbserver;
+$dbname      = metadataLookupStr($siteConfig, 'PF_DBNAME')
+    unless defined $dbname;
+my $dbuser   = metadataLookupStr($siteConfig, 'PF_DBUSER');
+$dbpass   = metadataLookupStr($siteConfig, 'PF_DBPASSWORD') if !$dbpass;
+exit ($PS_EXIT_CONFIG_ERROR) unless defined $dbserver and $dbname and $dbuser and $dbpass;
+
+my $dsn = "DBI:mysql:host=$dbserver;database=$dbname";
+
+my $product_dir = "$dsroot/$product";
+my $index_script_name = "$product_dir/index.txt";
+
+if ($del) {
+    my $dbh = DBI->connect($dsn, $dbuser, $dbpass) or die "Cannot connect to server\n";
+    #
+    # delete product
+    #
+    my $stmt = $dbh->prepare("SELECT prod_id, last_fs FROM dsProduct WHERE prod_name = \'$product\'");
+    $stmt->execute();
+    my $prod_row = $stmt->fetchrow_hashref();
+
+    if (!$prod_row) {
+        die("product $product not found");
+    }
+    my $prod_id = $prod_row->{prod_id};
+
+
+    # loop over filesets in the product and delete them
+    $stmt = $dbh->prepare("SELECT fileset_id FROM dsFileset WHERE prod_id = $prod_id");
+    $stmt->execute();
+    my $fs_row;
+    while ($fs_row = $stmt->fetchrow_hashref()) {
+        my $fileset_id = $fs_row->{fileset_id};
+        $dbh->do("DELETE from dsFile where fileset_id = $fileset_id");
+        $dbh->do("DELETE from dsFileset where fileset_id = $fileset_id");
+    }
+    $dbh->do("DELETE from dsProduct where prod_id = $prod_id");
+
+    print "Product $product deleted.\n";
+
+    # if requested, remove the product directory
+    if ($remove) {
+        print "Removing files from $product.\n";
+        if (system "rm -r $product_dir") {
+            die("failed to remove $product_dir");
+        }
+    } else  {
+        # otherwise just zap the index script
+        unlink("$index_script_name");
+    }
+
+    exit 0;
+
+} else {
+    #
+    # add a new product
+    #
+    my $dbh = DBI->connect($dsn, $dbuser, $dbpass) or die "Cannot connect to server\n";
+
+    my $stmt = $dbh->prepare("SELECT prod_id FROM dsProduct WHERE prod_name = \'$product\'");
+    $stmt->execute();
+    my $row = $stmt->fetchrow_hashref();
+
+    if ($row) {
+        die("product $product already exists");
+    }
+
+    # set up the product directory
+    # if there is an old index file delete it
+    if (-e $index_script_name ) {
+        if (!unlink($index_script_name)) {
+            die("failed trying to remove old $index_script_name");
+        }
+    }
+    if (! -e $product_dir) {
+        $we_created_dir = 1;
+        if (!mkdir $product_dir) {
+            die("failed trying to make product directory $product_dir");
+        }
+    } else {
+        # directory alrady exists make sure that it's empty
+        my @dirlist = glob("$product_dir/*");
+        die ("existing product directory $product_dir is not empty") if scalar @dirlist;
+    }
+
+    if (!copy($root_index_script, $index_script_name)) {
+        print STDERR "failed trying to copy($root_index_script, $index_script_name)";
+        cleanup();
+        exit 1;
+    }
+
+    my $prodcolstr = make_prodcol_str($ps0, $ps1, $ps2, $ps3, $ps4, $ps5, $ps6, $ps7);
+
+    my $query = "INSERT INTO dsProduct (prod_name, last_update, type, description, " .
+                " prod_col_0, prod_col_1, prod_col_2, prod_col_3, prod_col_4, prod_col_5, prod_col_6, prod_col_7)" .
+                "VALUES('$product', UTC_TIMESTAMP(), '$ptype', '$description' $prodcolstr)"; 
+
+    my $count = $dbh->do($query);
+    if ($count == 0E0) {
+        print STDERR "failed to insert Product $product in database";
+        cleanup();
+        exit 1;
+    }
+
+
+
+    exit 0;
+}
+
+
+sub show_usage {
+    my $str = shift;
+
+    chomp $str;
+
+    my @tmp = split(/\//, $0);
+
+    pod2usage(
+        -msg => 
+"usage: $tmp[$#tmp] [--add prod_name |--del prod_name ] --type prod_type [options]
+
+Commands:
+
+    --add           Add a new Product
+    --del           Remove a Product.
+
+Options:
+    --type          Product type (required)
+    --description   Product Description (required)
+    --ps0 - ps7     Optional product specific data
+    --rm            with --del remove the Product directory from the Data Store
+    --dbname        select the Data Store's database name
+                    (usually required depending on configuration)
+
+
+    
+$str",
+        -exitval => 2
+    );
+}
+
+sub make_prodcol_str {
+
+    my @list = @_;
+    my $string = "";
+
+    foreach my $s (@list) {
+        if ($s) {
+            $string .= ", \'$s\'";
+        } else {
+            $string .= ", NULL";
+        }
+    }
+
+    return $string;
+}
+
+sub cleanup {
+    # don't delete the product directory unless we made it
+    if (!$we_created_dir) {
+        return 0;
+    }
+    if (system "rm -r $product_dir") {
+            print STDERR "failed to remove $product_dir";
+    }
+}
Index: /branches/eam_branches/ipp-20150419/oofview/scripts/pfreg
===================================================================
--- /branches/eam_branches/ipp-20150419/oofview/scripts/pfreg	(revision 38253)
+++ /branches/eam_branches/ipp-20150419/oofview/scripts/pfreg	(revision 38253)
@@ -0,0 +1,564 @@
+#!/usr/bin/env perl
+#
+# Data Store file set registration and de-registration program
+#
+
+use strict;
+use warnings;
+
+use Getopt::Long qw( GetOptions );
+use Pod::Usage qw( pod2usage );
+use Carp;
+use Digest::MD5::File qw( file_md5_hex );
+use DBI;
+use PS::IPP::Metadata::Config;
+use PS::IPP::Metadata::Stats;
+use PS::IPP::Metadata::List qw( parse_md_list );
+use File::Copy;
+use File::Basename;
+
+use PS::IPP::Config qw($PS_EXIT_SUCCESS
+                       $PS_EXIT_UNKNOWN_ERROR
+                       $PS_EXIT_SYS_ERROR
+                       $PS_EXIT_CONFIG_ERROR
+                       $PS_EXIT_PROG_ERROR
+                       $PS_EXIT_DATA_ERROR
+                       $PS_EXIT_TIMEOUT_ERROR
+                       metadataLookupStr
+                       metadataLookupBool
+                       caturi
+                       );
+my $product;
+my $fileset;
+my $filelist;
+my $empty;
+
+my $fstype;
+my ($ps0, $ps1, $ps2, $ps3, $ps4, $ps5, $ps6, $ps7);
+
+my $linkfiles;      # if set, put links to files in the Data Store. The actuall directory is $datapath
+my $copyfiles;      # if set, copy files from this directory to the Data Store fileset
+my $datapath;       # source for files required if $linkfiles or $copyfiles
+my $abspath;			# Path specified is absolute
+
+my $dbname;         # Database name
+my $dbserver;       # Database host
+my $dsroot;         # root directory of the data store
+
+my $add;
+my $del;
+my $remove;
+my $force;          # on --del don't return error if fileset doesn't exist
+
+my $verbose = 0;
+my $no_cleanup = 0; # if something goes wrong don't delete copied or linked files for debug
+
+# XXX allow group write permission: 
+# TODO: set the group to a more restrictive one than users
+umask 2;
+
+#
+# parse args
+#
+
+GetOptions(
+        'add=s'         =>      \$add,
+        'del=s'         =>      \$del,
+        'product=s'     =>      \$product,
+        'list=s'        =>      \$filelist,
+        'empty'         =>      \$empty,
+        'type=s'        =>      \$fstype,
+        'datapath=s'    =>      \$datapath,
+	'abspath'       =>      \$abspath,
+        'link'          =>      \$linkfiles,
+        'copy'          =>      \$copyfiles,
+        'rm'            =>      \$remove,
+        'force'         =>      \$force,
+        'ps0=s'         =>      \$ps0,          # product specific columns 0 - 7
+        'ps1=s'         =>      \$ps1,
+        'ps2=s'         =>      \$ps2,
+        'ps3=s'         =>      \$ps3,
+        'ps4=s'         =>      \$ps4,
+        'ps5=s'         =>      \$ps5,
+        'ps6=s'         =>      \$ps6,
+        'ps7=s'         =>      \$ps7,
+        'dbname=s'      =>      \$dbname,
+        'dbserver=s'    =>      \$dbserver,
+        'dbhost=s'      =>      \$dbserver,
+        'dsroot=s'      =>      \$dsroot,
+        'verbose'       =>      \$verbose,
+) or pod2usage(2);
+
+pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
+
+# collect all command line argument errors and only fail once below.
+my $err = "";
+
+$err .= "--product is required\n" unless defined $product;
+
+# will exit if neither --add and --del is specified or if they both are specified
+$err .= "Must specify either --add or --del.\n"
+    unless $add xor $del;
+
+if ($add) {
+    $fileset = $add;
+    $err .= "--type is required\n" unless defined $fstype;
+    $err .= "--list is required\n" unless defined $filelist or $empty;
+    if ($linkfiles and $copyfiles) {
+        $err .= "only one of --link and --copy is allowed\n";
+    }
+    if (($linkfiles or $copyfiles) and !$datapath and !$abspath) {
+        $err .= "need to specify datapath or abspath with --link and --copy\n";
+    }
+    if (!$abspath && $linkfiles && (substr($datapath, 0, 1) ne "/")) {
+        $err .= "datapath must begin with / when using --link\n";
+    }
+} else {
+    $fileset = $del;
+}
+
+
+#
+# lookup the location of the Data Store
+#
+
+my $ipprc =  PS::IPP::Config->new(); # IPP Configuration
+my $siteConfig = $ipprc->{_siteConfig};
+if (!$dsroot) {
+    $dsroot = metadataLookupStr($ipprc->{_siteConfig}, 'PF_ROOT');
+    if (!$dsroot) {
+        &my_die("Data Store root directory not set", $PS_EXIT_CONFIG_ERROR);
+    }
+}
+
+if (!stat("$dsroot/index.txt")) {
+    $err .= "Data Store not found at '$dsroot'.\n"
+}
+
+# bail if any errors above
+show_usage($err) if ($err);
+
+show_usage("Invalid data store product '$product'.")
+    unless defined stat("$dsroot/$product/index.txt");
+
+$dbname      = metadataLookupStr($siteConfig, 'PF_DBNAME') unless defined $dbname;
+$dbserver    = metadataLookupStr($siteConfig, 'PF_DBSERVER') unless defined $dbserver;
+my $dbuser   = metadataLookupStr($siteConfig, 'PF_DBUSER');
+my $dbpass   = metadataLookupStr($siteConfig, 'PF_DBPASSWORD');
+exit ($PS_EXIT_CONFIG_ERROR) unless defined $dbserver and $dbname and $dbuser and $dbpass;
+
+my $dsn = "DBI:mysql:host=$dbserver;database=$dbname";
+# mysql cookbook says 'PrintError can interfere with failure detection in some cases'
+my %conn_attrs = (PrintError => 0, RaiseError => 1, AutoCommit => 0);
+
+my $dbh = DBI->connect_cached($dsn, $dbuser, $dbpass, \%conn_attrs)
+        or &my_die("Cannot connect to DB server\n", $PS_EXIT_SYS_ERROR);
+
+print STDERR "dbh: $dbh\n" if $verbose;
+
+my $fileset_dir = "$dsroot/$product/$fileset";
+my $index_script_name = "$fileset_dir/index.txt";
+
+if ($del) {
+    #
+    # delete fileset
+    #
+
+    my $stmt = $dbh->prepare("SELECT prod_id, last_fs FROM dsProduct WHERE prod_name = ?");
+    my $execute_status = $stmt->execute($product);
+    if (!$execute_status) {
+        print STDERR "failed to execute product lookup\n";
+        exit 2;
+    }
+
+    my $prod_row = $stmt->fetchrow_hashref();
+    my $prod_id = $prod_row->{prod_id};
+    my $old_last_fs = $prod_row->{last_fs};
+
+    if (!$prod_id) {
+        print STDERR "product '$product' not found\n";
+        if ($force) {
+            exit(0);
+        } else {
+            exit(1);
+        }
+    }
+    $stmt = $dbh->prepare("SELECT fileset_id,fileset_name FROM dsFileset" .
+                                 " WHERE fileset_name = ? AND prod_id = $prod_id");
+
+    $stmt->execute($fileset);
+    my $fs_row = $stmt->fetchrow_hashref();
+
+    if (!$fs_row) {
+        print STDERR "Fileset '$fileset' not found in $product.\n";
+        if ($force) {
+            exit 0;
+        } else {
+            exit 1;
+        }
+    }
+    $stmt->finish();
+
+    my $fileset_id = $fs_row->{fileset_id};
+
+    my $rows_affected;
+    eval {
+        $dbh->do("DELETE from dsFile where fileset_id = $fileset_id");
+        $rows_affected = $dbh->do("DELETE from dsFileset where fileset_id = $fileset_id");
+
+        if ($old_last_fs eq $fs_row->{fileset_name}) {
+            # print STDERR "deleting most recent fileset in $product\n";
+
+            $stmt = $dbh->prepare("SELECT fileset_name from dsFileset " .
+                        "WHERE prod_id = $prod_id ORDER BY reg_time DESC LIMIT 1");
+            $stmt->execute();
+            my $new_last_fs;
+            my $new_newest = $stmt->fetchrow_hashref();
+            if ($new_newest) {
+                $new_last_fs = $new_newest->{fileset_name};
+            } else {
+                $new_last_fs = undef;
+            }
+            $stmt->finish();
+            $dbh->do("UPDATE dsProduct SET last_fs = ? WHERE prod_id = $prod_id", undef, ($new_last_fs));
+        }
+        $dbh->commit();
+    };
+    if (!$rows_affected or $@) { # an error occured
+        print STDERR "transaction failed, rolling back error was:\n$@\n";
+        # roll back within eval to prevent rollback failure from terminating the script
+        eval {$dbh->rollback();};
+        exit 1;
+    }
+
+    $dbh->disconnect();
+
+    if ($remove and -e $fileset_dir) {
+        my $rc;
+        if (($rc = system "rm -rf $fileset_dir")) {
+            &my_die("failed to remove $fileset_dir error code: $rc", $PS_EXIT_UNKNOWN_ERROR);
+        }
+    } else  {
+        # just zap the index script
+        unlink("$index_script_name");
+    }
+    exit 0;
+
+} else {
+    #
+    # add a new fileset
+    #
+
+    if (!$datapath) {
+        $datapath = $fileset_dir;
+    }
+
+    my $stmt = $dbh->prepare("SELECT prod_id FROM dsProduct WHERE prod_name = ?");
+    $stmt->execute($product);
+    my $row = $stmt->fetchrow_hashref();
+    my $prod_id = $row->{prod_id};
+    $stmt->finish();
+
+    if (!$prod_id) {
+        &my_die("product $product not found", $PS_EXIT_UNKNOWN_ERROR);
+    }
+    my $count = $dbh->do("SELECT fileset_id FROM dsFileset WHERE fileset_name = ?" .
+                        " AND prod_id = $prod_id", undef, ($fileset));
+    if ($count != 0E0) {
+        print STDERR "Fileset '$fileset' already exists in product $product.\n";
+        exit 1;
+    }
+
+
+    # Note: There is a race condition here. Somebody could sneak in now and add a fileset with
+    # fileset_name = $fileset. So later we'll check again that only one fileset with the name exists
+
+    ## create the fileset directory
+    if (! -e $fileset_dir) {
+        if (!mkdir $fileset_dir) {
+            &my_die("failed trying to create fileset directory $fileset_dir", $PS_EXIT_SYS_ERROR);
+        }
+	if (! -d $fileset_dir ) {
+            &my_die("cannot access just created fileset directory $fileset_dir", $PS_EXIT_SYS_ERROR);
+	}
+    }
+
+    my @files;
+    if (!$empty) {
+        my $in;
+        if ($filelist eq "-") {
+            $in = *STDIN;
+        } else {
+            open $in, "<$filelist" or &my_die("cannot open filelist file $filelist\n", $PS_EXIT_UNKNOWN_ERROR);
+        }
+
+        my $lineno = 0;
+        while (<$in>) {
+            chomp;
+            $lineno++;
+
+            my $filename;
+            my $bytes;
+            my $md5sum;
+            my $filetype;
+
+            my @fields = split /\|/;
+            if (@fields < 4) {
+                &my_die("malformed input line at $filelist line $lineno: $_\n", $PS_EXIT_PROG_ERROR);
+            }
+            $filename = shift @fields;
+            $bytes    = shift @fields;  # if this is null it will be calculated below
+            $md5sum   = shift @fields;  # if this is null it will be calculated below
+            $filetype = shift @fields;
+
+            # make sure the length of the type specific columns is 8
+            while (@fields < 8) {
+                push @fields, undef;
+            }
+            my $ts_cols = [@fields];
+
+            my $hashref = {
+                'file'      => $filename,
+                'bytes'     => $bytes,
+                'md5sum'    => $md5sum,
+                'type'      => $filetype,
+                'ts_cols'   => $ts_cols,
+            };
+
+            push @files, $hashref;
+        }
+
+        &my_die("empty filelist\n", $PS_EXIT_PROG_ERROR) if (@files == 0);
+
+        # Prepare the fileset directory
+        if ($linkfiles or $copyfiles) {
+            eval {
+                ## then copy or symlink the files into place
+                foreach my $ref (@files) {
+                    my $src_path = (defined $abspath ? '' : "$datapath/") . "$ref->{file}";
+                    my $filename = fileparse($ref->{file}, ());
+                    my $dest = "$fileset_dir/$filename";
+
+                    my $src = $ipprc->file_resolve($src_path);
+                    if (!$src) {
+		    	print STDERR "failed to resolve file $src_path\n";
+			exit $PS_EXIT_SYS_ERROR;
+                    }
+		    if ( !-e $src or !-r $src) {
+		    	print STDERR "source file $src does not exist or is not accessible\n";
+			exit $PS_EXIT_SYS_ERROR;
+		    }
+		    if ( -e $dest ) {
+		    	print STDERR "destination $dest already exists removing\n";
+			if (! unlink $dest ) {
+                            print STDERR "failed trying to unlink $dest\n";
+			    exit $PS_EXIT_SYS_ERROR;
+			}
+		    }
+
+                    if ($linkfiles) {
+                        if (! symlink $src, $dest) {
+                            print STDERR "failed trying to link $src to $dest\n";
+			    exit $PS_EXIT_SYS_ERROR;
+                        }
+                    } else {
+                        if (!copy($src, $dest)) {
+                            &my_die("copy($src, $dest) failed", $PS_EXIT_UNKNOWN_ERROR);
+                        }
+                    }
+                }
+            };
+            if ($@) { # an error occured
+                print STDERR "error preparing the fileset directory: $@\n";
+
+                if (!$no_cleanup && system "rm -r $fileset_dir") {
+                    &my_die("failed to remove $fileset_dir", $PS_EXIT_UNKNOWN_ERROR);
+                }
+                exit $PS_EXIT_UNKNOWN_ERROR;
+            }
+        }
+
+        # now calculate the md5sum and file size if they weren't provided
+        foreach my $file (@files) {
+            my $filename = fileparse($file->{file}, ());
+            my $path = "$fileset_dir/$filename";
+            if (! -e $path ) {
+                &my_die("file $path not found", , $PS_EXIT_UNKNOWN_ERROR);
+            }
+            # get the size of the file
+            my @finfo = stat($path);
+            unless (@finfo) {
+                &my_die ("can't stat $path", $PS_EXIT_UNKNOWN_ERROR);
+            }
+            # if size was supplied make sure that it matches the actual
+            # size
+            my $current_size = $finfo[7];
+            if ($file->{bytes}) {
+                if ($file->{bytes} != $current_size) {
+
+#                   XXX we are getting to many instances where sizes and md5sums change between 
+#                   the time that a job runs and measures the value and when the filesets are registered.
+#                   So far it looks as though the files are actually ok.
+#                   For now just remeasure if size changes. Might want to do something more
+#                   clever and raise an error if the difference is larger than some fraction
+
+#                    &my_die("size on disk: $current_size does not match supplied"
+#                    . " size: $file->{bytes} for $path", $PS_EXIT_PROG_ERROR);
+
+                    print STDERR "\nWarning: size on disk for $path: $current_size does not match supplied size: $file->{bytes}.\nUsing current size.\n";
+                    $file->{bytes} = $current_size;
+                    $file->{md5sum} = undef;
+                }
+            } else {
+                $file->{bytes}  = $current_size;
+            }
+            if (!$file->{md5sum}) {
+                # Get MD5 sum
+                $file->{md5sum} = file_md5_hex($path);
+                &my_die("failed to compute valid md5sum for $path", $PS_EXIT_UNKNOWN_ERROR) if !$file->{md5sum};
+            }
+        }
+    }
+
+
+    if (! $dbh->ping()) {
+        # database connection has gone away, reconnect
+        $dbh->disconnect();
+        $dbh = DBI->connect_cached($dsn, $dbuser, $dbpass, \%conn_attrs)
+            or &my_die("Cannot connect to server\n", $PS_EXIT_SYS_ERROR);
+        print STDERR "ping failed new dbh: $dbh\n" if $verbose;
+    }
+
+    eval {
+        my $qstring = "INSERT into dsFileset" .
+                " (prod_id, fileset_name, reg_time, type," .
+                " prod_col_0, prod_col_1, prod_col_2, prod_col_3, prod_col_4, prod_col_5, " .
+                " prod_col_6, prod_col_7)" .
+                " VALUES(?, ?, UTC_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+
+        $count = $dbh->do($qstring, undef, ($prod_id, $fileset, $fstype, 
+                            $ps0, $ps1, $ps2, $ps3, $ps4, $ps5, $ps6, $ps7));
+
+        &my_die("failed to insert $fileset", $PS_EXIT_UNKNOWN_ERROR) if (!defined($count) or ($count == 0E0));
+
+        # I don't use last_insert_id() because I've seen some problems with it and
+        # the DBI perldoc says that it's use is problematic
+        my @fsids = $dbh->selectrow_array("SELECT fileset_id FROM dsFileset" .
+                        " WHERE fileset_name = '$fileset' AND prod_id = $prod_id");
+        my $nfs = @fsids;
+        if (!$nfs) {
+            &my_die("fileset '$fileset' missing even though we just added it", $PS_EXIT_UNKNOWN_ERROR);
+        } elsif ($nfs > 1) {
+            &my_die("Fileset '$fileset' already exists under $product.", $PS_EXIT_PROG_ERROR);
+        }
+        my $fileset_id = $fsids[0];
+
+        foreach my $ref (@files) {
+	    my $filename = fileparse($ref->{file}, ());
+            my $query = "INSERT INTO dsFile" .  
+                    " (fileset_id, file_id, file_name, bytes, md5sum, type," .
+                    " type_col_0, type_col_1, type_col_2, type_col_3, type_col_4, type_col_5," .
+                    " type_col_6, type_col_7)" .
+                    " VALUES($fileset_id, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+
+            my $aref = $ref->{ts_cols};
+            my $do_args =  [($filename, $ref->{bytes}, $ref->{md5sum}, $ref->{type}), @$aref];
+
+            $count = $dbh->do($query, undef, @$do_args);
+
+            if ($count == 0E0) {
+                &my_die("failed to insert $filename into $fileset", $PS_EXIT_UNKNOWN_ERROR);
+            }
+        }
+
+        $count = $dbh->do("UPDATE dsProduct SET last_update = UTC_TIMESTAMP(), last_fs = \'$fileset\'"
+                                . " WHERE prod_id = $prod_id");
+        if ($count == 0E0) {
+            &my_die("failed to update dsProduct $prod_id", $PS_EXIT_UNKNOWN_ERROR);
+        }
+
+        $dbh->commit();
+
+        # create the cgi script index.txt by making a copy of its parent's
+        if (!copy("$dsroot/$product/index.txt", $index_script_name)) {
+            &my_die("failed to copy index script to file set", $PS_EXIT_UNKNOWN_ERROR);
+        }
+    };
+    if ($@) { # an error occured
+        print STDERR "transaction failed, rolling back error was:\n$@\n";
+        eval {$dbh->rollback();};
+        cleanup();
+        exit 1;
+    }
+
+    print STDERR "calling disconnect before exit\n" if $verbose;
+    $dbh->disconnect();
+
+    exit 0;
+}
+
+
+sub show_usage {
+    my $str = shift;
+
+    chomp $str;
+
+    my @tmp = split(/\//, $0);
+
+    pod2usage(
+        -msg =>
+"usage: $tmp[$#tmp] --add fs_name |--del fs_name --product prod_name --type fs_type --list filelist [options]
+
+Commands:
+
+    --add       Add a new fileset with the given metadata to the specified product.
+                File information will be read per-line from the file specifed by the
+                list option.
+                Input lines are in the following format:
+
+                    fileID|size|md5sum|type|ts0|ts1|ts2|ts3
+
+                These entries are read until EOF is reached.
+
+                If either size or md5sum are left blank they will be calculated by dsreg
+
+                (The type specific fields ts[0-3]fields are optional and may be omitted)
+
+    --del       Remove the fileset fs_name.
+
+
+
+Options:
+    --product   the product for the given file set (required)
+    --list      file containing list of files (use - for STDIN) (required)
+    --link      Link files from datapath to Data Store
+    --copy      Copy files from datapath to Data Store
+    --datapath  path to source files for --copy or --link
+    --abspath   path to source files is absoloute (--datapath not needed)
+    --ps0 - ps7 Optional product specific data
+    --rm        with --del remove the fileset directory from the Data Store
+    --force     with --del do not return error status if the fileset does not exist
+    --dbname    select the Data Store's database name
+                (usually required depending on configuration)
+
+$str",
+        -exitval => 2
+    );
+}
+
+sub cleanup {
+    if (!$no_cleanup && ($linkfiles or $copyfiles)) {
+        if (system "rm -r $fileset_dir") {
+            print STDERR "failed to remove $fileset_dir";
+        }
+    } else {
+        unlink($index_script_name);
+    }
+}
+
+sub my_die {
+    my $msg = shift;
+    my $fault = shift;
+    carp $msg;
+    exit $fault;
+}
