Index: /branches/eam_branches/20091201/ippTasks/dqstats.pro
===================================================================
--- /branches/eam_branches/20091201/ippTasks/dqstats.pro	(revision 26860)
+++ /branches/eam_branches/20091201/ippTasks/dqstats.pro	(revision 26860)
@@ -0,0 +1,239 @@
+## dqstats.pro : globals and support macros : -*- sh -*-
+## this file contains the tasks for running the dqstats analysis stage
+## these tasks use the book dqstatsPendingExp
+
+# test for required global variables
+check.globals
+
+book init dqstatsPendingExp
+
+macro dqstats.status
+  book listbook dqstatsPendingExp
+end
+
+macro dqstats.reset
+  book init dqstatsPendingExp
+end
+
+macro dqstats.on
+  task dqstats.load
+    active true
+  end
+  task dqstats.run
+    active true
+  end
+  task dqstats.revert
+    active true
+  end
+end
+
+macro dqstats.off
+  task dqstats.load
+    active false
+  end
+  task dqstats.run
+    active false
+  end
+  task dqstats.revert
+    active false
+  end
+end
+
+# this variable will cycle through the known database names
+$dqstats_DB = 0
+$dqstats_revert_DB = 0
+
+# select images ready for dqstats analysis
+# new entries are added to dqstatsPendingExp
+# skip already-present entries
+task	       dqstats.load
+  host         local
+
+  periods      -poll $LOADPOLL
+  periods      -exec $LOADEXEC
+  periods      -timeout 30
+  npending     1
+
+  stdout NULL
+  stderr $LOGDIR/dqstats.log
+
+  task.exec
+    if ($LABEL:n == 0) break
+    $run = dqstatstool -pendingbundle
+    if ($DB:n == 0)
+      option DEFAULT
+    else
+      # save the DB name for the exit tasks
+      option $DB:$dqstats_DB
+      $run = $run -dbname $DB:$dqstats_DB
+      $dqstats_DB ++
+      if ($dqstats_DB >= $DB:n) set dqstats_DB = 0
+    end
+    add_poll_args run
+    add_poll_labels run
+    command $run
+  end
+
+  # success
+  task.exit    0
+    # convert 'stdout' to book format
+    ipptool2book stdout dqstatsPendingExp -key dqstats_id -uniq -setword dbname $options:0 -setword pantaskState INIT
+    if ($VERBOSE > 2)
+      book listbook dqstatsPendingExp
+    end
+
+    # delete existing entries in the appropriate pantaskStates
+    process_cleanup dqstatsPendingExp
+  end
+
+  # default exit status
+  task.exit    default
+    showcommand failure
+  end
+
+  task.exit    crash
+    showcommand crash
+  end
+
+  # operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+# run the dqstats script on pending exposures
+task	       dqstats.run
+  periods      -poll $RUNPOLL
+  periods      -exec $RUNEXEC
+  periods      -timeout 10
+
+  ## we want only a single outstanding dqstats job.  
+  host         local
+  npending     1
+
+  task.exec
+    book npages dqstatsPendingExp -var N
+    if ($N == 0) break
+    if ($NETWORK == 0) break
+    
+    # look for new images in dqstatsPendingExp (pantaskState == INIT)
+    book getpage dqstatsPendingExp 0 -var pageName -key pantaskState INIT
+    if ("$pageName" == "NULL") break
+
+    book setword dqstatsPendingExp $pageName pantaskState RUN
+    book getword dqstatsPendingExp $pageName camera -var CAMERA
+    book getword dqstatsPendingExp $pageName exp_tag -var EXP_TAG
+    book getword dqstatsPendingExp $pageName dqstats_id -var DQSTATS_ID
+#    book getword dqstatsPendingExp $pageName camroot -var CAMROOT
+#    book getword dqstatsPendingExp $pageName workdir -var WORKDIR_TEMPLATE
+#    book getword dqstatsPendingExp $pageName reduction -var REDUCTION
+#    book getword dqstatsPendingExp $pageName dvodb  -var DVODB
+#    book getword dqstatsPendingExp $pageName image_only -var IMAGE_ONLY
+    book getword dqstatsPendingExp $pageName dbname -var DBNAME
+
+    # specify choice of remote host based on camera and chip (class_id)
+    # set.host.for.camera $CAMERA FPA
+
+    # set the WORKDIR variable
+#    set.workdir.by.camera $CAMERA FPA $WORKDIR_TEMPLATE $default_host WORKDIR
+
+    # notes on how this works:
+    # -- raw workdir examples:
+    # file://data/@HOST@.0/gpc1/20080130
+    # neb:///@HOST@-vol0/gpc1/20080130 (need to supply volname?, or are we re-defining this each time?)
+    # -- out workdir examples:
+    # file://data/ipp004.0/gpc1/20080130
+    # neb:///ipp004-vol0/gpc1/20080130
+
+    ## generate outroot specific to this exposure (& chip)
+    # Uri's need to be standardized when the run is created.
+#    sprintf outroot "%s/%s/%s.dqstats.%s" $WORKDIR $EXP_TAG $EXP_TAG $DQSTATS_ID
+
+    stdout $LOGDIR/dqstats.log
+    stderr $LOGDIR/dqstats.log
+
+    $run = dqstats_bundle.pl --exp_tag $EXP_TAG --dqstats_id $DQSTATS_ID --camera GPC1 --redirect-output
+#     if ("$REDUCTION" != "NULL")
+#       $run = $run --reduction $REDUCTION
+#     end
+#     if ("$IMAGE_ONLY" == "T")
+#       $run = $run --image-only
+#     end
+
+        
+    add_standard_args run
+
+    # save the pageName for future reference below
+    options $pageName
+
+    # create the command line
+    if ($VERBOSE > 1)
+      echo command $run
+    end
+    command $run
+  end
+
+  # success
+  task.exit default
+    process_exit dqstatsPendingExp $options:0 $JOB_STATUS
+  end
+
+  # locked list
+  task.exit    crash
+    showcommand crash
+    echo "hostname: $JOB_HOSTNAME"
+    book setword dqstatsPendingExp $options:0 pantaskState CRASH
+  end
+
+  # operation times out?
+  task.exit    timeout
+    showcommand timeout
+    book setword dqstatsPendingExp $options:0 pantaskState TIMEOUT
+  end
+end
+
+task dqstats.revert
+  host         local
+
+  periods      -poll 5.0
+  periods      -exec 60.0
+  periods      -timeout 120.0
+  npending     1
+
+  stdout NULL
+  stderr $LOGDIR/revert.log
+
+  task.exec
+    if ($LABEL:n == 0) break
+    $run = dqstatstool -revertrun
+    if ($DB:n == 0)
+      option DEFAULT
+    else
+      # save the DB name for the exit tasks
+      option $DB:$dqstats_revert_DB
+      $run = $run -dbname $DB:$dqstats_revert_DB
+      $dqstats_revert_DB ++
+      if ($dqstats_revert_DB >= $DB:n) set dqstats_revert_DB = 0
+    end
+    add_poll_labels run
+    command $run
+  end
+
+  # success
+  task.exit    0
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+
+  task.exit    crash
+    showcommand crash
+  end
+
+  # operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
Index: /branches/eam_branches/20091201/ippTasks/nightly_stacks.pro
===================================================================
--- /branches/eam_branches/20091201/ippTasks/nightly_stacks.pro	(revision 26860)
+++ /branches/eam_branches/20091201/ippTasks/nightly_stacks.pro	(revision 26860)
@@ -0,0 +1,710 @@
+## nightly_stacks.pro : -*- sh -*-
+
+check.globals
+
+macro nightly.stacks.on
+    ns.initday.on
+    ns.registration.on
+    ns.burntool.on
+    ns.chips.on
+    ns.stacks.on
+end
+
+macro nightly.stacks.off
+    ns.initday.off
+    ns.registration.off
+    ns.burntool.off
+    ns.chips.off
+    ns.stacks.off
+end
+
+macro ns.initday.on
+  task ns.initday.load
+    active true
+  end
+end
+
+macro ns.registration.on
+  task ns.registration.load
+    active true
+  end
+end
+
+macro ns.burntool.on
+  task ns.burntool.load
+    active true
+  end
+  task ns.burntool.run
+    active true
+  end
+end
+
+macro ns.chips.on
+  task ns.chips.load
+    active true
+  end
+  task ns.chips.run
+    active true
+  end
+end
+
+macro ns.stacks.on
+  task ns.stacks.load
+    active true
+  end
+  task ns.stacks.run
+    active true
+  end
+end
+
+macro ns.initday.off
+  task ns.initday.load
+    active false
+  end
+end
+
+macro ns.registration.off
+  task ns.registration.load
+    active false
+  end
+end
+
+macro ns.burntool.off
+  task ns.burntool.load
+    active false
+  end
+  task ns.burntool.run
+    active false
+  end
+end
+
+macro ns.chips.off
+  task ns.chips.load
+    active false
+  end
+  task ns.chips.run
+    active false
+  end
+end
+
+macro ns.stacks.off
+  task ns.stacks.load
+    active false
+  end
+  task ns.stacks.run
+    active false
+  end
+end
+
+$ns_regPAGE = 0
+$ns_burnPAGE = 0
+$ns_RburnPAGE = 0
+$ns_RburnCELL = 0
+$ns_chipPAGE = 0
+$ns_RchipPAGE = 0
+$ns_stackPAGE = 0
+$ns_RstackPAGE = 0
+
+book init nsData
+#
+# Macros to control the book.
+#
+macro ns.add.date
+   book newpage nsData $1
+   book setword nsData $1 nsState NEW
+end
+
+macro ns.show.dates
+    book npages nsData -var Npages
+    for i 0 $Npages
+       book getpage nsData $i -var date
+       book getword nsData $date nsState -var state
+       echo $date $state
+    end
+end
+
+macro ns.del.date
+    book delpage nsData $1
+end
+
+macro ns.set.date
+    book setword nsData $1 nsState $2
+end
+
+
+
+#
+# Start a new date to work on
+#
+task              ns.initday.load
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  trange          16:30:00 17:30:00 -nmax 1
+  npending        1
+
+  task.exec
+    $today = `date +%Y-%m-%d`
+    book newpage nsData $today
+    book setword nsData $today nsState NEW
+
+    command echo $today
+#   command automate_stacks.pl --clean_old --date $today
+  end
+
+  task.exit       0
+    # nothing to do here?
+  end
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Check to see if registration is complete
+#
+task              ns.registration.load
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+    stdout NULL
+    stderr $LOGDIR/ns.registration.log
+
+    book getpage nsData $ns_regPAGE -var date
+    book getword nsData $date nsState -var ns_STATE
+    book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.registration.load: " $ns_regPAGE $date $ns_STATE $Npages
+    end
+
+    $ns_regPAGE ++
+    if ($ns_regPAGE >= $Npages) set ns_regPAGE = 0
+    option $date
+
+    if ("$ns_STATE" != "NEW") break
+    $run = automate_stacks.pl --check_registration --date $date
+    command $run
+  end
+
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+    book delpage nsData $options:0
+    ipptool2book stdout nsData -uniq -key date
+
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Check to see if the chips have been properly burntooled and are ready for queueing
+#
+task              ns.chips.load
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.chips.log
+
+     book getpage nsData $ns_chipPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+     if ($VERBOSE > 5)
+	echo "ns.chips.load: " $ns_chipPAGE $date $ns_STATE $Npages
+     end
+
+     $ns_chipPAGE ++
+     if ($ns_chipPAGE >= $Npages) set ns_chipPAGE = 0
+     option $date
+
+     if (("$ns_STATE" != "REGISTERED")&&("$ns_STATE" != "BURNING")) break
+     $run = automate_stacks.pl --check_chips --date $date
+
+     if ("$ns_STATE" == "BURNING") 
+	$run = $run --isburning
+     end
+     command $run
+   end
+  # success
+  task.exit   0
+#   convert 'stdout' to book format
+    book delpage nsData $options:0
+    ipptool2book stdout nsData -uniq -key date
+
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Check to see if the chips have been properly burntooled and are ready for queueing
+#
+task              ns.chips.run
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.chips.log
+
+     book getpage nsData $ns_RchipPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.chips.run: " $ns_RchipPAGE $date $ns_STATE $Npages
+    end
+     
+     $ns_RchipPAGE ++
+     if ($ns_RchipPAGE >= $Npages) set ns_RchipPAGE = 0
+     option $date
+
+     if ("$ns_STATE" != "QUEUECHIPS") break
+     $run = automate_stacks.pl --queue_chips --date $date
+     command $run
+   end
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+    book delpage nsData $options:0
+    ipptool2book stdout nsData -uniq -key date
+
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+
+#
+# Check to see if the warps are finished
+#
+task              ns.stacks.load
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.stacks.log
+
+     book getpage nsData $ns_stackPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.stacks.load: " $ns_stackPAGE $date $ns_STATE $Npages
+    end
+
+     $ns_stackPAGE ++
+     if ($ns_stackPAGE >= $Npages) set ns_stackPAGE = 0
+     option $date
+
+     if ("$ns_STATE" != "TOWARP") break
+     $run = automate_stacks.pl --check_stacks --date $date
+     command $run
+   end
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+    book delpage nsData $options:0
+    ipptool2book stdout nsData -uniq -key date
+
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Check to see if the warps are finished and so we can make stacks.
+#
+task              ns.stacks.run
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.stacks.log
+
+     book getpage nsData $ns_RstackPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.stacks.run: " $ns_RstackPAGE $date $ns_STATE $Npages
+    end
+
+     $ns_RstackPAGE ++
+     if ($ns_RstackPAGE >= $Npages) set ns_RstackPAGE = 0
+     option $date
+
+     if ("$ns_STATE" != "QUEUESTACKS") break
+     $run = automate_stacks.pl --queue_stacks --date $date
+     command $run
+   end
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+    book delpage nsData $options:0
+# We've queued up stacking. We're done with this date, so don't reload the page.
+#    ipptool2book stdout nsData -uniq -key date
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Generate a list of date ranges that need to be processed with burntool
+#
+task              ns.burntool.load
+  host            local
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 30
+  npending        1
+
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.burntool.log
+
+     book getpage nsData $ns_burnPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.burntool.load: " $ns_burnPAGE $date $ns_STATE $Npages
+    end
+
+     $ns_burnPAGE ++
+     if ($ns_burnPAGE >= $Npages) set ns_burnPAGE = 0
+     option $date
+
+     if ("$ns_STATE" != "NEEDSBURNING") break
+     $run = automate_stacks.pl --define_burntool --date $date
+     command $run
+   end
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+    book delpage nsData $options:0
+    ipptool2book stdout nsData -uniq -key date
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+#
+# Magically run burntool on the data, based on the time ranges stored in our book.
+#
+task              ns.burntool.run
+  periods         -poll $LOADPOLL
+  periods         -exec $LOADEXEC
+  periods         -timeout 10800
+  npending        20
+  task.exec
+     stdout NULL
+     stderr $LOGDIR/ns.burntool.log
+
+     book getpage nsData $ns_RburnPAGE -var date
+     book getword nsData $date nsState -var ns_STATE
+     book npages nsData -var Npages
+
+    if ($VERBOSE > 5) 
+       echo "ns.burntool.run: " $ns_RburnPAGE $date $ns_STATE $Npages
+    end
+
+     $ns_RburnPAGE ++
+     if ($ns_RburnPAGE >= $Npages) set ns_RburnPAGE = 0
+
+     if ("$ns_STATE" != "QUEUEBURNING") break
+	book getword nsData $date btN -var btN
+	book getword nsData $date btNCounter -var btNcounter
+
+	if ($btNcounter > $btN) 
+	    book setword nsData $date nsState "BURNING"
+	    break
+	end
+
+	sprintf start_date_label "btBegin%d"   $btNcounter
+	sprintf end_date_label   "btEnd%d"     $btNcounter
+	sprintf counter_label    "btCounter%d" $btNcounter
+
+	book getword nsData $date $start_date_label -var start_date
+	book getword nsData $date $end_date_label -var end_date
+	book getword nsData $date $counter_label -var chip_counter
+	
+	list word -split $hostmatch:$chip_counter
+	$class_id = $word:0
+	$host = $word:1
+	host $host
+	$logfile = "burntool_logs/$class_id.$start_date.log"
+
+	$run = ipp_apply_burntool.pl --class_id $class_id --dateobs_begin $start_date --dateobs_end $end_date --dbname gpc1 --logfile $logfile
+	
+	echo "ns.burntool.run: " $date $btN $btNcounter $start_date $end_date $chip_counter $class_id $host $logfile $run
+	$chip_counter ++
+	if ($chip_counter >= $hostmatch:n) 
+	   $chip_counter = 0
+	   $btNcounter ++
+	end
+	$new_state = "QUEUEBURNING"
+	if ($btNcounter > $btN)
+	    $new_state = "BURNING"
+	end
+
+	echo "ns.burntool.run: " $date $btN $btNcounter $chip_counter $new_state
+	book setword nsData $date $counter_label $chip_counter
+	book setword nsData $date btNCounter $btNcounter
+	option $date $new_state
+	
+	command $run
+#     command /bin/true
+   end
+  # success
+  task.exit   0
+#    convert 'stdout' to book format
+#    book delpage nsData $options:0
+#    ipptool2book stdout nsData -uniq -key date
+    book setword nsData $options:0 nsState $options:1
+
+    if ($VERBOSE > 2)
+	book listbook nsData
+    end
+  end
+
+  # locked list
+  task.exit    default
+    showcommand failure
+  end
+  task.exit    crash
+    showcommand crash
+  end
+  #operation times out?
+  task.exit    timeout
+    showcommand timeout
+  end
+end
+
+
+#
+# This is all burntool related stuff.
+#
+
+macro burntool
+  if ($0 != 3)
+    echo "USAGE: burntool (dateobs_begin) (dateobs_end)"
+    break
+  end
+
+  for i 0 $hostmatch:n
+    job -host $word:1 ipp_apply_burntool.pl --class_id $class_id --dateobs_begin $1 --dateobs_end $2 --dbname gpc1 --logfile $logfile
+  end
+end
+macro loadhosts
+  for i 0 $allhosts:n
+    controller host add $allhosts:$i
+  end
+end
+
+# sorry this list is messy, it's supposed to be that way to try and keep to burntools from running on the same host at the same time.
+
+list hostmatch
+  XY01    ipp014
+  XY03    ipp038
+  XY05    ipp023
+  XY10    ipp039
+  XY12    ipp024
+  XY15    ipp040
+  XY17    ipp020
+  XY21    ipp041
+  XY23    ipp042
+  XY25    ipp043
+  XY27    ipp028
+  XY31    ipp044
+  XY33    ipp029
+  XY35    ipp045
+  XY37    ipp030
+  XY41    ipp046
+  XY43    ipp031
+  XY45    ipp047
+  XY47    ipp032
+  XY51    ipp048
+  XY53    ipp033
+  XY55    ipp049
+  XY57    ipp034
+  XY61    ipp050
+  XY63    ipp035
+  XY65    ipp051
+  XY67    ipp036
+  XY72    ipp052
+  XY74    ipp015
+  XY76    ipp053
+  XY02    ipp014
+  XY04    ipp038
+  XY06    ipp023
+  XY11    ipp039
+  XY13    ipp024
+  XY14    ipp040
+  XY16    ipp020
+  XY20    ipp041
+  XY22    ipp042
+  XY24    ipp043 
+  XY26    ipp028
+  XY30    ipp044
+  XY32    ipp029
+  XY34    ipp045
+  XY36    ipp030
+  XY40    ipp046
+  XY42    ipp031
+  XY44    ipp047
+  XY46    ipp032
+  XY50    ipp048
+  XY52    ipp033
+  XY54    ipp049
+  XY56    ipp034
+  XY60    ipp050
+  XY62    ipp035
+  XY64    ipp051
+  XY66    ipp036
+  XY71    ipp052
+  XY73    ipp015
+  XY75    ipp053
+end
+
+list allhosts
+  ipp043
+  ipp014
+  ipp015
+  ipp023
+  ipp024
+  ipp020
+  ipp028
+  ipp029
+  ipp030
+  ipp031
+  ipp032
+  ipp033
+  ipp034
+  ipp035
+  ipp036
+  ipp038
+  ipp039
+  ipp040
+  ipp041
+  ipp042
+  ipp044
+  ipp045
+  ipp046
+  ipp047
+  ipp048
+  ipp049
+  ipp050
+  ipp051
+  ipp052
+  ipp053
+end
Index: /branches/eam_branches/20091201/ippconfig/recipes/dqStatsTool.config
===================================================================
--- /branches/eam_branches/20091201/ippconfig/recipes/dqStatsTool.config	(revision 26860)
+++ /branches/eam_branches/20091201/ippconfig/recipes/dqStatsTool.config	(revision 26860)
@@ -0,0 +1,37 @@
+BUNDLE_SIZE	S32	1000       # Number of exposures to bundle together
+# BUNDLE_AGE      ?      "2 hours"? # I'd like this to be a way to tell if we can just skip ahead, since the bundle is "old" Don't know how, though.
+
+
+STATS.COLUMNS METADATA             # Column definitions for what goes into a bundle
+
+C1 METADATA
+    TABLE    STR rawExp
+    ENTRY    STR ra
+    DATATYPE STR PS_DATA_F64
+    COLNAME  STR RA
+END
+
+C2 METADATA
+    TABLE    STR rawExp
+    ENTRY    STR decl
+    DATATYPE STR PS_DATA_F64
+    COLNAME  STR DEC
+END
+
+C3 METADATA
+    TABLE    STR camProcessedExp
+    ENTRY    STR iq_m2
+    DATATYPE STR PS_DATA_F32
+    COLNAME  STR IQ_M2
+END
+
+C4 METADATA
+    TABLE    STR camProcessedExp
+    ENTRY    STR iq_fwhm_major
+    DATATYPE STR PS_DATA_F32
+    COLNAME  STR IQ_FWHM_MAJOR
+END
+
+
+END
+
Index: /branches/eam_branches/20091201/ippconfig/recipes/nightly_science.config
===================================================================
--- /branches/eam_branches/20091201/ippconfig/recipes/nightly_science.config	(revision 26860)
+++ /branches/eam_branches/20091201/ippconfig/recipes/nightly_science.config	(revision 26860)
@@ -0,0 +1,106 @@
+RETENTION_TIME   U16	9000
+
+FILTERS MULTI
+FILTERS STR g.00000
+FILTERS STR r.00000
+FILTERS STR i.00000
+FILTERS STR z.00000
+FILTERS STR y.00000
+
+TARGETS MULTI
+TARGETS METADATA
+  NAME STR CMB
+  TESS STR RINGS.V0
+  COMMENT STR CMB_Cold%
+  STACKABLE BOOL FALSE
+END
+TARGETS METADATA
+  NAME STR M31
+  TESS STR M31
+  COMMENT STR M31%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD01
+  TESS STR MD01
+  COMMENT STR MD01%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD02
+  TESS STR MD02
+  COMMENT STR MD02%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD03
+  TESS STR MD03
+  COMMENT STR MD03%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD04
+  TESS STR MD04
+  COMMENT STR MD04%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD05
+  TESS STR MD05
+  COMMENT STR MD05%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD06
+  TESS STR MD06
+  COMMENT STR MD06%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD07
+  TESS STR MD07
+  COMMENT STR MD07%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD08
+  TESS STR MD08
+  COMMENT STR MD08%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD09
+  TESS STR MD09
+  COMMENT STR MD09%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR MD10
+  TESS STR MD10
+  COMMENT STR MD10%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR STS
+  TESS STR STS
+  COMMENT STR Stellar Transit%
+  STACKABLE BOOL TRUE
+END
+TARGETS METADATA
+  NAME STR SVS
+  TESS STR RINGS.V0
+  COMMENT STR SVS%
+  STACKABLE BOOL FALSE
+END
+TARGETS METADATA
+  NAME STR SweetSpot
+  TESS STR RINGS.V0
+  COMMENT STR Sweetspot%
+  STACKABLE BOOL FALSE
+END
+TARGETS METADATA
+  NAME STR ThreePi
+  TESS STR RINGS.V0
+  COMMENT STR ThreePi%
+  STACKABLE BOOL FALSE
+END
Index: /branches/eam_branches/20091201/magic/remove/Doxyfile.in
===================================================================
--- /branches/eam_branches/20091201/magic/remove/Doxyfile.in	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/Doxyfile.in	(revision 26860)
@@ -0,0 +1,1310 @@
+# Doxyfile 1.5.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that 
+# follow. The default is UTF-8 which is also the encoding used for all text before 
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
+# possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = streaksremove
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = ipp-2.7.dev
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./docs
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct (or union) is 
+# documented as struct with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code where the coding convention is that all structs are 
+# typedef'ed and only the typedef is referenced never the struct's name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted 
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
+# where file will be replaced with the base name of the file that contains the anonymous 
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = ./src
+
+# This tag can be used to specify the character encoding of the source files that 
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the output. 
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
+# then you must also enable this option. If you don't then doxygen will produce 
+# a warning and turn it on anyway
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
+# be found in the default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a caller dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable caller graphs for selected 
+# functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the number 
+# of direct children of the root node in a graph is already larger than 
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
Index: /branches/eam_branches/20091201/magic/remove/Makefile.am
===================================================================
--- /branches/eam_branches/20091201/magic/remove/Makefile.am	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/Makefile.am	(revision 26860)
@@ -0,0 +1,4 @@
+SUBDIRS = src
+
+CLEANFILES = *.pyc *~ core core.*
+
Index: /branches/eam_branches/20091201/magic/remove/autogen.sh
===================================================================
--- /branches/eam_branches/20091201/magic/remove/autogen.sh	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/autogen.sh	(revision 26860)
@@ -0,0 +1,103 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+
+PROJECT=streaks
+TEST_TYPE=-f
+# change this to be a unique filename in the top level dir
+FILE=autogen.sh
+
+DIE=0
+
+LIBTOOLIZE=libtoolize
+ACLOCAL="aclocal $ACLOCAL_FLAGS"
+AUTOHEADER=autoheader
+AUTOMAKE=automake
+AUTOCONF=autoconf
+
+($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have $LIBTOOLIZE installed to compile $PROJECT."
+        echo "Download the appropriate package for your distribution,"
+        echo "or get the source tarball at http://ftp.gnu.org/gnu/libtool/"
+        DIE=1
+}
+
+($ACLOCAL --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have $ACLOCAL installed to compile $PROJECT."
+        echo "Download the appropriate package for your distribution,"
+        echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/"
+        DIE=1
+}
+
+($AUTOHEADER --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have $AUTOHEADER installed to compile $PROJECT."
+        echo "Download the appropriate package for your distribution,"
+        echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/"
+        DIE=1
+}
+
+($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have $AUTOMAKE installed to compile $PROJECT."
+        echo "Download the appropriate package for your distribution,"
+        echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/"
+        DIE=1
+}
+
+($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have $AUTOCONF installed to compile $PROJECT."
+        echo "Download the appropriate package for your distribution,"
+        echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/"
+        DIE=1
+}
+
+if test "$DIE" -eq 1; then
+        exit 1
+fi
+
+test $TEST_TYPE $FILE || {
+        echo "You must run this script in the top-level $PROJECT directory"
+        exit 1
+}
+
+if test -z "$*"; then
+        echo "I am going to run ./configure with no arguments - if you wish "
+        echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+$LIBTOOLIZE --copy --force || echo "$LIBTOOLIZE failed"
+$ACLOCAL || echo "$ACLOCAL failed"
+$AUTOHEADER || echo "$AUTOHEADER failed"
+$AUTOMAKE --add-missing --force-missing --copy || echo "$AUTOMAKE  failed"
+$AUTOCONF || echo "$AUTOCONF failed"
+
+cd $ORIGDIR
+
+run_configure=true
+for arg in $*; do
+    case $arg in
+        --no-configure)
+            run_configure=false
+            ;;
+        *)
+            ;;
+    esac
+done
+
+if $run_configure; then
+    $srcdir/configure --enable-maintainer-mode "$@"
+    echo
+    echo "Now type 'make' to compile $PROJECT."
+else
+    echo
+    echo "Now run 'configure' and 'make' to compile $PROJECT."
+fi
Index: /branches/eam_branches/20091201/magic/remove/configure.ac
===================================================================
--- /branches/eam_branches/20091201/magic/remove/configure.ac	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/configure.ac	(revision 26860)
@@ -0,0 +1,43 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.61)
+
+AC_INIT([streaksremove], [0.9.0], [ipp-support@ifa.hawaii.edu])
+AC_CONFIG_SRCDIR([src])
+
+AM_INIT_AUTOMAKE([1.6 foreign dist-bzip2])
+AM_CONFIG_HEADER([src/config.h])
+AM_MAINTAINER_MODE
+
+IPP_STDCFLAGS
+
+AC_LANG(C)
+AC_GNU_SOURCE
+AC_PROG_CC_C99
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+AC_SYS_LARGEFILE
+
+dnl ------------------------------------------------------------
+
+dnl ------------- psLib, psModules ---------------
+PKG_CHECK_MODULES([PSLIB],    [pslib >= 1.0.0])
+PKG_CHECK_MODULES([PSMODULE], [psmodules >= 1.0.0])
+
+dnl Set CFLAGS for build
+IPP_STDOPTS
+CFLAGS="${CFLAGS=} -Wall -Werror"
+echo "STREAKSREMOVE_CFLAGS: $STREAKSREMOVE_CFLAGS"
+echo "STREAKSREMOVE_LIBS: $STREAKSREMOVE_LIBS"
+
+IPP_VERSION
+
+AC_SUBST([STREAKSREMOVE_CFLAGS])
+AC_SUBST([STREAKSREMOVE_LIBS])
+
+AC_CONFIG_FILES([
+  Makefile
+  src/Makefile
+  Doxyfile
+])
+
+AC_OUTPUT
Index: /branches/eam_branches/20091201/magic/remove/src/Makefile.am
===================================================================
--- /branches/eam_branches/20091201/magic/remove/src/Makefile.am	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/src/Makefile.am	(revision 26860)
@@ -0,0 +1,95 @@
+if HAVE_SVNVERSION
+STREAKS_VERSION=`$(SVNVERSION) ..`
+else
+STREAKS_VERSION="UNKNOWN"
+endif
+
+if HAVE_SVN
+STREAKS_BRANCH=`$(SVN) info .. | $(SED) -n -e '/URL:/ h' -e '/Repository Root:/ { x; H; x; s|Repository Root: \(.*\)\nURL: \1\(.*\)|\2| ; s|^/|| ; s|/[a-zA-Z]*/src.*|| ; p }'`
+STREAKS_SOURCE=`$(SVN) info | $(SED) -n -e 's/Repository UUID: // p'`
+else
+STREAKS_BRANCH="UNKNOWN"
+STREAKS_SOURCE="UNKNOWN"
+endif
+
+# Force recompilation of streaksVersion.c, since it gets the version information
+streaksVersion.c: streaksVersionDefinitions.h
+streaksVersionDefinitions.h: streaksVersionDefinitions.h.in FORCE
+	-$(RM) streaksVersionDefinitions.h
+	$(SED) -e "s|@STREAKS_VERSION@|\"$(STREAKS_VERSION)\"|" -e "s|@STREAKS_BRANCH@|\"$(STREAKS_BRANCH)\"|" -e "s|@STREAKS_SOURCE@|\"$(STREAKS_SOURCE)\"|" streaksVersionDefinitions.h.in > streaksVersionDefinitions.h
+FORCE: ;
+
+bin_PROGRAMS = streaksremove streaksrelease streaksreplace streakscompare isdestreaked
+
+STREAKSREMOVE_CFLAGS=-DSTREAKS_COMPRESS_OUTPUT=1
+
+STREAKSCFLAGS = $(STREAKSREMOVE_CFLAGS) $(PSMODULE_CFLAGS) $(PSLIB_CFLAGS)
+STREAKSLDFLAGS = $(STREAKSREMOVE_LIBS) $(PSMODULE_LIBS) $(PSLIB_LIBS)
+
+streaksremove_CFLAGS = $(STREAKSCFLAGS)
+streaksremove_LDFLAGS = $(STREAKSLDFLAGS)
+streaksreplace_CFLAGS = $(STREAKSCFLAGS)
+streaksreplace_LDFLAGS = $(STREAKSLDFLAGS)
+streaksrelease_CFLAGS = $(STREAKSCFLAGS)
+streaksrelease_LDFLAGS = $(STREAKSLDFLAGS)
+streakscompare_CFLAGS = $(STREAKSCFLAGS)
+streakscompare_LDFLAGS = $(STREAKSLDFLAGS)
+isdestreaked_CFLAGS = $(STREAKSCFLAGS)
+isdestreaked_LDFLAGS = $(STREAKSLDFLAGS)
+
+COMMON_SOURCES = 	\
+	streaksio.c 	\
+	streaksutil.c 	\
+	streaksastrom.c \
+	streaksVersion.c
+
+streaksremove_SOURCES = \
+	streaksremove.c	\
+	streaksextern.c	\
+	diffedpixels.c	\
+	Line.c		\
+	$(COMMON_SOURCES)
+
+streaksrelease_SOURCES = \
+	streaksrelease.c\
+	streaksio.c	\
+	streaksutil.c	\
+	streaksastrom.c \
+	streaksVersion.c
+
+streaksreplace_SOURCES = \
+	streaksreplace.c\
+	streaksio.c	\
+	streaksutil.c	\
+	streaksastrom.c \
+	streaksVersion.c
+
+streakscompare_SOURCES = \
+	streakscompare.c\
+	streaksio.c	\
+	streaksutil.c	\
+	streaksastrom.c \
+	streaksVersion.c
+
+isdestreaked_SOURCES = \
+	isdestreaked.c\
+	streaksio.c	\
+	streaksutil.c	\
+	streaksastrom.c \
+	streaksVersion.c
+
+include_HEADERS = 	\
+	streaksastrom.h \
+	streaksextern.h \
+	streaksio.h 	\
+	streaksremove.h \
+	streaksVersionDefinitions.h
+
+clean-local:
+	-rm -f TAGS
+	-rm -f tags
+
+# Tags for emacs and vi
+tags:
+	etags `find . -name \*.[ch] -print`
+	ctags `find . -name \*.[ch] -print`
Index: /branches/eam_branches/20091201/magic/remove/src/diffedpixels.c
===================================================================
--- /branches/eam_branches/20091201/magic/remove/src/diffedpixels.c	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/src/diffedpixels.c	(revision 26860)
@@ -0,0 +1,332 @@
+#include "streaksremove.h"
+#include "pmAstrometryWCS.h"
+
+// #define DEBUG_PRINT 1
+
+static void addTouchedPixels(streakFiles *sf, psString fileName);
+static void nameCorners(psPlane pt[4]);
+static int xLeft(psPlane *pt, int y);
+static int xRight(psPlane *pt, int y);
+
+// Examine the set of diff skycells and compute the pixels that were
+// included in difference processing
+bool
+computeDiffedPixels(streakFiles *sf)
+{
+    bool status;
+    pmConfig    *config = sf->config;
+
+    psArray *skycells = psMetadataLookupPtr(&status, config->arguments, "SKYCELLS");
+    if (skycells == NULL) {
+        return false;
+    }
+
+    int n = psArrayLength(skycells);
+
+    psRegion     *bounds = pmChipPixels(sf->chip);
+
+    int width  = bounds->x1 - bounds->x0;
+    int height = bounds->y1 - bounds->y0;
+
+    psFree(bounds);
+
+    sf->diffedPixels = psImageAlloc(width, height, PS_TYPE_U8);
+    psImageInit(sf->diffedPixels, 0);
+
+    for (int i=0; i<n; i++) {
+        psString filename = psArrayGet(skycells, i);
+        psString resolved_name = pmConfigConvertFilename(filename, config, false, false);
+
+        addTouchedPixels(sf, resolved_name);
+        psFree(resolved_name);
+    }
+
+    bool writeTouchedPixels = false; // XXX: make this an argument to the program
+    if (writeTouchedPixels) {
+        // write out the diffed pixels
+        psMetadata * header = psMetadataAlloc();
+        if (sf->inAstrom->fpa->toSky->type != PS_PROJ_DIS) {
+            pmAstromWriteWCS(header, sf->inAstrom->fpa, sf->chip, 0.001);
+        }
+        psFits *fits = psFitsOpen("diffedpixels.fits", "w");
+
+        psFitsWriteImage(fits, header, sf->diffedPixels, 0, NULL);
+        psFitsClose(fits);
+        psFree(header);
+    }
+    return true;
+}
+
+static void
+addTouchedPixels(streakFiles *sf, psString fileName)
+{
+    // read fits header
+    psFits *fits = psFitsOpen(fileName, "r");
+    if (!fits) {
+        psError(PS_ERR_IO, false, "failed to open skycell file: %s", fileName);
+        streaksExit("", PS_EXIT_DATA_ERROR);
+    }
+    psMetadata *header = psFitsReadHeader(NULL, fits);
+    psFitsClose(fits);
+    if (!header) {
+        psError(PS_ERR_IO, false, "failed to read fixts header from skycell file: %s", fileName);
+        streaksExit("", PS_EXIT_DATA_ERROR);
+    }
+    // set up astrometry for conversion from skycell image to sky
+    pmAstromWCS *wcs = pmAstromWCSfromHeader(header);
+    if (!wcs) {
+        psError(PS_ERR_IO, false, "failed to read astrometry  from skycell file: %s", fileName);
+        streaksExit("", PS_EXIT_DATA_ERROR);
+    }
+    int naxis1 = psMetadataLookupS32(NULL, header, "NAXIS1");
+    int naxis2 = psMetadataLookupS32(NULL, header, "NAXIS2");
+
+    psFree(header);
+
+    /* now set up our wrapper to the chip astrometry to apply to the whole chip */
+    sf->astrom = streakSetAstrometry(sf->astrom, sf->stage, sf->inAstrom->fpa, sf->chip, false, NULL,
+        sf->diffedPixels->numCols, sf->diffedPixels->numRows);
+
+    // convert corners of skycell to sky coordinates
+    // compute overlap with the chip using astrometry
+    psPlane pt[4];
+    pt[0].x = 0;
+    pt[0].y = 0;
+
+    pt[1].x = naxis1 - 1;
+    pt[1].y = 0;
+
+    pt[2].x = naxis1 - 1;
+    pt[2].y = naxis2 - 1;
+
+    pt[3].x = 0;
+    pt[3].y = naxis2 - 1;
+
+    for (int i = 0; i < 4 ; i++ ) {
+        psSphere sky;
+
+        // convert corner of skycell to sky coordinates
+        if (!pmAstromWCStoSky(&sky, wcs, &pt[i])) {
+            psErrorStackPrint(stderr, "failed to convert pt %d of %s to sky coords", i, fileName);
+            streaksExit("", PS_EXIT_DATA_ERROR);
+        }
+        strkPt p;
+        // convert to chip coordinates
+        if (!skyToCell(&p, sf->astrom, sky.r, sky.d)) {
+            psErrorStackPrint(stderr, "failed to convert pt %d of %s to sky coords", i, fileName);
+            streaksExit("", PS_EXIT_DATA_ERROR);
+        }
+        pt[i].x = p.x;
+        pt[i].y = p.y;
+    }
+
+    psFree(wcs);
+
+    // put the corners in the desired order (see comments below)
+
+    nameCorners(pt);
+    psString type;
+    if (pt[0].y < pt[2].y ) {
+        type = "1";
+    } else {
+        type = "2";
+    }
+#ifdef DEBUG_PRINT
+    printf("\nSKYCELL %s Type: %s\n", fileName, type);
+    for (int i=0; i<4; i++) {
+        printf("%f %f\n", pt[i].x, pt[i].y);
+    }
+#endif
+    // Now set the touched pixels
+    int ymin = fmax(0, pt[1].y );
+    int ymax = fmin(pt[3].y + 0.5, sf->diffedPixels->numRows - 1);
+#if (DEBUG_PRINT > 1)
+    printf("\nymin: %d ymax: %d\n", ymin, ymax);
+#endif
+    for (int y = ymin ; y <= ymax; y++) {
+        int xleft  = xLeft(pt, y);
+        int xright = xRight(pt, y);
+
+        if (xleft < 0) {
+            xleft = 0;
+        }
+        if (xleft > sf->diffedPixels->numCols) {
+            continue;
+        }
+        if (xright < 0) {
+            continue;
+        }
+        if (xright >= sf->diffedPixels->numCols) {
+            xright = sf->diffedPixels->numCols - 1;
+        }
+#if (DEBUG_PRINT > 1)
+        printf("  y: %d xleft: %d xright: %d\n", y, xleft, xright);
+#endif
+
+        psU8 *rowPixels = sf->diffedPixels->data.U8[y];
+
+        int n = xright - xleft + 1;
+        if (n > 0) {
+            memset(&rowPixels[xleft], 255, n);
+        }
+    }
+}
+
+// x as a function of y for the line between two points
+// Note: the caller guarentees that the y's of the two points are different
+static double xOfY(psPlane *pI, psPlane *pJ, int y)
+{
+    double m_inv = (double) (pJ->x - pI->x) / (double) (pJ->y - pI->y);
+
+    double x = ((double) y - pI->y) * m_inv + (double) pI->x;
+
+    return x;
+}
+
+static int xLeft(psPlane *pt, int y)
+{
+    double x_d;
+    if (y < pt[0].y) {
+        // left boundary is the line from pt 0 to pt 1
+        x_d = xOfY(&pt[0], &pt[1], y);
+    } else {
+        // left boundary is the line from pt 0 to pt 3
+        x_d = xOfY(&pt[0], &pt[3], y);
+    }
+    return (int) (x_d + 0.5);
+}
+
+static int xRight(psPlane *pt, int y)
+{
+    double x_d;
+    if (y < pt[2].y) {
+        // right boundary is the line from pt 1 to pt 2
+        x_d = xOfY(&pt[1], &pt[2], y);
+
+    } else {
+        // right boundary is the line from pt 2 to pt 3
+        x_d = xOfY(&pt[2], &pt[3], y);
+    }
+    return (int) x_d;
+}
+
+/*
+ * To compute the overlap of a quadrilateral with a set of
+ * points we transform the 4 corners to image coordinates
+ * and name the 4 points of the quad
+            pt 0 is left most (bottom most corner)
+            pt 1 is bottom most (right most corner)
+            pt 2 is right most (top most corner)
+            pt 3 is top most (left most corner)
+
+* Then we can divide the quad into 3 regions A B and C based
+* on the y coordinate
+
+* (in the degenerate case of a rectangle aligned to the axes
+* we only have 1 region)
+* In each of the three regions A, B, and C the test for whether a
+* point is contained in the quad on scanline y is simply
+
+        x >= xleft(y) x < xright(y)
+
+* where xleft(y) and xright(y) are the bounding lines at the given
+* y coordinate.
+
+The following diagrams show some examples. The 4 points are labeled 0 to 3
+The three regions are labeld A B and C, the boundaries between the regions
+ocur at pt0.y and pt2.y
+
+Example 1
+
+                3
+                 C
+         ---------------2           left boundary:  line 0_1 y < pt0.y
+                 B                                  line 0_3 y >= pt0.y
+          0--------------
+                 A                  right boundary: line 1_2 y < pt2.y
+                   1                                line 2_3  y >= pt.y
+**************************
+Example 2
+                3
+              C
+        0----------------
+              B
+      ----------------2
+              A
+            1
+
+**************************
+Example 3
+
+        3       2
+
+            B
+
+        0       1
+
+(region A and C are empty in the case where the points form a rectangle)
+*/
+
+/*
+    Name the corners
+    The following algorithm works for points that form a quadrilateral
+    I think it also works for the situation where 3 points are co-linear
+    and we have a triangle, but that isn't important for our purposes
+
+*/
+
+static void
+nameCorners(psPlane pt[4])
+{
+    psPlane   pt0, pt1, pt2, pt3;
+
+    /* find pt0 the left most (bottom most) corner */
+    int imin = 0;
+    int  min = (int) pt[0].x;
+    int i;
+    for (i=1; i<4; i++) {
+        int x = pt[i].x;
+        if ((x < min) ||
+            ((x == min) && (pt[i].y < pt[imin].y))) {
+            imin = i;
+            min = x;
+        }
+    }
+    // remve pt0 from the list
+    pt0 = pt[imin];
+    for (i=imin; i<3; i++) {
+        pt[i] = pt[i+1];
+    }
+
+    // find the bottom most (right most) corner from the remaining 3
+    imin = 0;
+    min = pt[0].y;
+    for (i=1; i<3; i++) {
+        int y = pt[i].y;
+        if ((y < min) ||
+            ((y == min) && (pt[i].x > pt[imin].x)) ) {
+            imin = i;
+            min = y;
+        }
+    }
+    // remve pt1 from the list
+    pt1 = pt[imin];
+    for (i=imin; i<3; i++) {
+        pt[i] = pt[i+1];
+    }
+
+    // now find the right most (top most) of the remaining 2 points
+    if ((pt[0].x > pt[1].x) ||
+        ((pt[0].x == pt[1].x) && (pt[0].y > pt[1].y))) {
+        pt2 = pt[0];
+        pt3 = pt[1];
+    } else {
+        pt2 = pt[1];
+        pt3 = pt[0];
+    }
+    /* write the outputs */
+    pt[0] = pt0;
+    pt[1] = pt1;
+    pt[2] = pt2;
+    pt[3] = pt3;
+}
Index: /branches/eam_branches/20091201/magic/remove/src/streaksVersion.c
===================================================================
--- /branches/eam_branches/20091201/magic/remove/src/streaksVersion.c	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/src/streaksVersion.c	(revision 26860)
@@ -0,0 +1,113 @@
+/** @file streaksVersion.c
+ *
+ *  @brief
+ *
+ *  @ingroup streaks
+ *
+ *  Copyright 2009 Institute for Astronomy, University of Hawaii
+ */
+
+#include "streaksremove.h"
+#include "streaksVersionDefinitions.h"
+
+#ifndef STREAKS_VERSION
+#error "STREAKS_VERSION is not set"
+#endif
+#ifndef STREAKS_BRANCH
+#error "STREAKS_BRANCH is not set"
+#endif
+#ifndef STREAKS_SOURCE
+#error "STREAKS_SOURCE is not set"
+#endif
+
+psString streaksVersion(void)
+{
+    char *value = NULL;
+    psStringAppend(&value, "%s@%s", STREAKS_BRANCH, STREAKS_VERSION);
+    return value;
+}
+
+psString streaksSource(void)
+{
+  return psStringCopy(STREAKS_SOURCE);
+}
+
+psString streaksVersionLong(void)
+{
+    psString version = streaksVersion();  // Version, to return
+    psString source = streaksSource();    // Source
+
+    psStringPrepend(&version, "%s ", streaksProgram);
+    psStringAppend(&version, " from %s, built %s, %s", source, __DATE__, __TIME__);
+    psFree(source);
+
+#ifdef __OPTIMIZE__
+    psStringAppend(&version, " optimised");
+#else
+    psStringAppend(&version, " unoptimised");
+#endif
+
+    return version;
+};
+
+bool streaksVersionHeader(psMetadata *header)
+{
+    PS_ASSERT_METADATA_NON_NULL(header, false);
+
+    psString version = streaksVersion(); // Software version
+    psString source = streaksSource();   // Software source
+
+    psStringPrepend(&version, "%s version: ", streaksProgram);
+    psStringPrepend(&source, "%s source: ", streaksProgram);
+
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, version);
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, source);
+
+    psFree(version);
+    psFree(source);
+
+    return true;
+}
+
+bool streaksVersionHeaderFull(psMetadata *header)
+{
+    PS_ASSERT_METADATA_NON_NULL(header, false);
+
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psString history = NULL;               // History string
+    psStringAppend(&history, "%s at %s", streaksProgram, timeString);
+    psFree(timeString);
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, history);
+    psFree(history);
+
+    psLibVersionHeader(header);
+    psModulesVersionHeader(header);
+    streaksVersionHeader(header);
+
+    return true;
+}
+
+void streaksVersionPrint(void)
+{
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psLogMsg("streaks", PS_LOG_INFO, "%s at %s", streaksProgram, timeString);
+    psFree(timeString);
+
+    psString pslib = psLibVersionLong();// psLib version
+    psString psmodules = psModulesVersionLong(); // psModules version
+    psString streaks = streaksVersionLong(); // streaks version
+
+    psLogMsg("streaks", PS_LOG_INFO, "%s", pslib);
+    psLogMsg("streaks", PS_LOG_INFO, "%s", psmodules);
+    psLogMsg("streaks", PS_LOG_INFO, "%s", streaks);
+
+    psFree(pslib);
+    psFree(psmodules);
+    psFree(streaks);
+
+    return;
+}
Index: /branches/eam_branches/20091201/magic/remove/src/streaksVersionDefinitions.h.in
===================================================================
--- /branches/eam_branches/20091201/magic/remove/src/streaksVersionDefinitions.h.in	(revision 26860)
+++ /branches/eam_branches/20091201/magic/remove/src/streaksVersionDefinitions.h.in	(revision 26860)
@@ -0,0 +1,8 @@
+#ifndef STREAKS_VERSION_DEFINITIONS_H
+#define STREAKS_VERSION_DEFINITIONS_H
+
+#define STREAKS_VERSION @STREAKS_VERSION@ // SVN version
+#define STREAKS_BRANCH  @STREAKS_BRANCH@  // SVN branch
+#define STREAKS_SOURCE  @STREAKS_SOURCE@  // SVN source
+
+#endif
Index: /branches/eam_branches/20091201/psconfig/tagsets/00_nebulous-1.0.perl
===================================================================
--- /branches/eam_branches/20091201/psconfig/tagsets/00_nebulous-1.0.perl	(revision 26860)
+++ /branches/eam_branches/20091201/psconfig/tagsets/00_nebulous-1.0.perl	(revision 26860)
@@ -0,0 +1,87 @@
+# NN    Name                           Tarball                                  Version        Optional Responses
+# a Version of 0 is required if no specific version is desired
+  00    Getopt::Long                   Getopt-Long-2.36.tar.gz                  2.3            n
+  00    Module::Build                  Module-Build-0.2806.tar.gz               0.2806
+  01    ExtUtils::MakeMaker            ExtUtils-MakeMaker-6.54.tar.gz           0
+  02    Params::Validate               Params-Validate-0.92.tar.gz              0.92
+# 02    Apache::Test                   Apache-Test-1.29.tar.gz                  1.29
+  03    DateTime::TimeZone             DateTime-TimeZone-0.59.tar.gz            0
+  04    DateTime::Locale               DateTime-Locale-0.33.tar.gz              0
+  05    Time::Local                    Time-Local-1.17.tar.gz                   0
+  06    DateTime                       DateTime-0.36.tar.gz                     0
+  07    MIME::Base64                   MIME-Base64-3.07.tar.gz                  0
+  08    IO::Compress::Base             IO-Compress-Base-2.003.tar.gz            0
+  09    Compress::Raw::Zlib            Compress-Raw-Zlib-2.003.tar.gz           0
+  10    Class::Factory::Util           Class-Factory-Util-1.6.tar.gz            0
+  11    DateTime::Format::Strptime     DateTime-Format-Strptime-1.0700.tar.gz   0
+  12    Net::Domain::TLD               Net-Domain-TLD-1.65.tar.gz               0
+  13    Sub::Uplevel                   Sub-Uplevel-0.14.tar.gz                  0
+  14    HTML::Tagset                   HTML-Tagset-3.10.tar.gz                  0
+  15    Digest                         Digest-1.15.tar.gz                       0
+  16    IO::Compress::Zlib::Extra      IO-Compress-Zlib-2.003.tar.gz            0
+  17    version                        version-0.70.tar.gz                      0
+  18    Text::Balanced                 Text-Balanced-v2.0.0.tar.gz              0
+  19    DateTime::Format::Builder      DateTime-Format-Builder-0.7807.tar.gz    0
+  20    ExtUtils::Manifest             ExtUtils-Manifest-1.51.tar.gz            0
+  21    URI                            URI-1.35.tar.gz                          1.30
+  22    Data::Validate::Domain         Data-Validate-Domain-0.05.tar.gz         0
+  23    Test::Exception                Test-Exception-0.24.tar.gz               0
+  24    Tree::DAG_Node                 Tree-DAG_Node-1.05.tar.gz                0
+  25    Array::Compare                 Array-Compare-1.13.tar.gz                0
+  26    HTML::Parser                   HTML-Parser-3.56.tar.gz                  0
+  27    Digest::MD5                    Digest-MD5-2.36.tar.gz                   0
+  28    Net::FTP                       libnet-1.19.tar.gz                       0
+  29    Compress::Zlib                 Compress-Zlib-2.003.tar.gz               0
+  30    Locale::Maketext::Simple       Locale-Maketext-Simple-0.18.tar.gz       0
+  31    Parse::RecDescent              Parse-RecDescent-1.94.tar.gz             1.94
+  32    Class::Accessor                Class-Accessor-0.30.tar.gz               0.19
+  33    DateTime::Format::ISO8601      DateTime-Format-ISO8601-0.06.tar.gz      0.06
+  34    CGI                            CGI.pm-3.25.tar.gz                       3
+  35    Test::Cmd                      Test-Cmd-1.05.tar.gz                     1.05
+  36    Net::HTTPServer                Net-HTTPServer-1.1.1.tar.gz              1.1.1
+  37    LWP                            libwww-perl-5.805.tar.gz                 0
+  38    Digest::MD5::File              Digest-MD5-File-0.05.tar.gz              0.03
+  39    File::Temp                     File-Temp-0.18.tar.gz                    0.16
+  40    Data::Validate::URI            Data-Validate-URI-0.01.tar.gz            0.01
+  41    Test::Warn                     Test-Warn-0.08.tar.gz                    0
+  42    YAML                           YAML-0.62.tar.gz                         0.58           y
+  43    Module::Load                   Module-Load-0.10.tar.gz                  0
+  44    Params::Check                  Params-Check-0.25.tar.gz                 0
+  45    Template                       Template-Toolkit-2.16.tar.gz             0              n,n
+  46    Statistics::Descriptive        Statistics-Descriptive-2.6.tar.gz        2.6
+  47    Storable                       Storable-2.15.tar.gz                     0
+  48    IO::String                     IO-String-1.08.tar.gz                    0
+  49    Date::Parse                    TimeDate-1.16.tar.gz                     0
+  50    Digest::SHA1                   Digest-SHA1-2.11.tar.gz                  0
+  51    DB_File                        DB_File-1.814.tar.gz                     0
+  52    File::NFSLock                  File-NFSLock-1.20.tar.gz                 0
+  53    Heap                           Heap-0.71.tar.gz                         0
+  54    Module::Load::Conditional      Module-Load-Conditional-0.16.tar.gz      0
+  55    IPC::Run                       IPC-Run-0.80.tar.gz                      0
+  56    Cache                          Cache-2.04.tar.gz                        0
+  57    IPC::Cmd                       IPC-Cmd-0.36.tar.gz                      0.36
+  58    SOAP::Lite                     SOAP-Lite-0.69.tar.gz                    0              yes,yes,no
+  59    Log::Log4perl                  Log-Log4perl-1.10.tar.gz                 0
+  61    Text::Glob                     Text-Glob-0.08.tar.gz                    0.08
+  62    Number::Compare                Number-Compare-0.01.tar.gz               0.01
+  63    File::Find::Rule               File-Find-Rule-0.30.tar.gz               0.30
+  65    Test::More                     Test-Simple-0.74.tar.gz                  0.49
+  66    Apache::DBI                    Apache-DBI-1.06.tar.gz                   0
+  67    Apache2::SOAP                  Apache2-SOAP-0.72.tar.gz                 0
+  68    Test::URI                      Test-URI-1.08.tar.gz                     0
+# 69    Sys::Statistics::Linux::DiskUsage Sys-Statistics-Linux-0.26.tar.gz      0
+  70    Config::YAML                   Config-YAML-1.42.tar.gz                  0
+  72    File::ExtAttr                  File-ExtAttr-1.07.tar.gz                 0
+  73    DBI                            DBI-1.601.tar.gz                         0
+  71    DBD::mysql                     DBD-mysql-4.006.tar.gz                   0
+  74    Net::Server::Daemonize         Net-Server-0.97.tar.gz                   0.05
+  75    File::Path                      File-Path-2.04.tar.gz			0
+  76    File::Mountpoint                File-Mountpoint-0.01.tar.gz             0.01
+  77    Filesys::Df                     Filesys-Df-0.92.tar.gz                  0.92
+  78    SQL::Interp                     SQL-Interp-1.06.tar.gz                  0
+  79    Log::Dispatch::Email::MailSend  Log-Dispatch-2.22.tar.gz		0
+  80    Abstract::Meta::Class          Abstract-Meta-Class-0.13.tar.gz		0
+  81    DBIx::Connection               DBIx-Connection-0.13.tar.gz		0
+  82    Simple::SAX::Serializer        Simple-SAX-Serializer-0.05.tar.gz	0
+  83    Test::Distribution             Test-Distribution-2.00.tar.gz		0
+  84    Test::DBUnit                   Test-DBUnit-0.20.tar.gz                  0.20
Index: /branches/eam_branches/20091201/tools/cam_inputs.pl
===================================================================
--- /branches/eam_branches/20091201/tools/cam_inputs.pl	(revision 26860)
+++ /branches/eam_branches/20091201/tools/cam_inputs.pl	(revision 26860)
@@ -0,0 +1,97 @@
+#!/usr/bin/env perl
+
+#
+# Copy camera stage inputs to the current directory
+#
+
+use warnings;
+use strict;
+
+use DBI;
+use constant DB_SOCKET => '/var/run/mysqld/mysqld.sock'; # Socket for mysql
+use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
+
+use constant SOURCES => '.cmf';  # Sources extension
+
+
+my ($db_host, $db_name, $db_user, $db_pw); # Database details
+my ($cam_id);                              # Camera run of interest
+my ($sources);                             # Name for list of sources
+my ($muggle);                   # No magicked inputs?
+
+GetOptions(
+           'dbhost=s' => \$db_host, # Database host name
+           'dbname=s' => \$db_name, # Database name
+           'dbuser=s' => \$db_user, # Database user
+           'dbpass=s' => \$db_pw, # Database p/w
+           'cam_id=s' => \$cam_id, # Camera run identifier
+           'sources=s' => \$sources, # File with sources
+           'muggle'   => \$muggle, # No magicked inputs?
+           ) or die "Unable to parse arguments.\n";
+die "Unknown option: @ARGV\n" if @ARGV;
+die "Required options: --dbhost --dbname --dbuser --dbpass --cam_id\n"
+    unless defined $db_host
+    and defined $db_name
+    and defined $db_user
+    and defined $db_pw
+    and defined $cam_id;
+
+# Database connection
+my $db = DBI->connect( "DBI:mysql:database=$db_name;host=$db_host;mysql_socket=" . DB_SOCKET(),
+                       $db_user,
+                       $db_pw,
+                       { RaiseError => 1, AutoCommit => 1 }
+                       ) or die "Unable to connect to database: $DBI::errstr";
+
+# Query to run
+my $sql = "SELECT" .
+    " chipProcessedImfile.path_base," .
+    " class_id" .
+    " FROM camRun" .
+    " JOIN chipProcessedImfile USING(chip_id)" .
+    " WHERE cam_id = $cam_id";
+
+my $results = $db->selectall_arrayref( $sql ) or die "Unable to execute SQL: $DBI::errstr";
+$db->disconnect;
+
+my ($sourcesList); # Files to write to
+open $sourcesList, "> $sources" if defined $sources;
+
+foreach my $row ( @$results ) {
+    my $path = $$row[0];        # Chip path
+    my $class_id = $$row[1];    # Class identifier
+
+    $path .= '.' . $class_id;
+
+    my $sourcesName = $path . SOURCES(); # Name of sources file
+
+    $sourcesName = copy_file( $sourcesName );
+
+    print $sourcesList "$sourcesName\n" if defined $sources;
+
+
+}
+
+close $sourcesList if defined $sources;
+
+
+# Pau.
+
+
+sub copy_file
+{
+    my $file = shift;           # File to copy
+
+    if (defined $muggle) {
+        my @file = split /\//, $file;
+        my $last = pop @file;
+        push @file, "SR_$last";
+        $file = join '/', @file;
+    }
+
+    my $source = `ipp_datapath.pl $file` or die "Unable to locate $file\n"; # Actual file
+    chomp $source;
+    my ($target) = $source =~ m|^.*[:/](.*)|; # Target name
+    !system "cp $source $target" or die "Unable to copy $source\n";
+    return $target;
+}
Index: /branches/eam_branches/20091201/tools/neb-tail
===================================================================
--- /branches/eam_branches/20091201/tools/neb-tail	(revision 26860)
+++ /branches/eam_branches/20091201/tools/neb-tail	(revision 26860)
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+#use it like this: 
+#
+#neb-tail neb://ipp015.0/gpc1/magictest.20100127/MD04/skycell.101/MD04.skycell.101.dif.27980.log
+#
+# or 
+# neb-tail gpc1/magictest.20100127/MD04/skycell.101/MD04.skycell.101.dif.27980.log
+#
+
+$file=$ARGV[0];
+   	
+
+@nebitems=`neb-locate --path --server http://nebulous.mhpcc.ipp.ifa.hawaii.edu/nebulous --path $file 2>&1`;
+
+
+if ($nebitems[0] =~ /no instances/) {
+    print "no instances\n";
+    
+} 
+else  {
+    @tail=`tail -n 50 $nebitems[0]`;
+    foreach $tail_item (@tail) {
+	print $tail_item;
+    }
+}
+
+	
+
Index: /branches/eam_branches/20091201/tools/processing_quick_check.pl
===================================================================
--- /branches/eam_branches/20091201/tools/processing_quick_check.pl	(revision 26860)
+++ /branches/eam_branches/20091201/tools/processing_quick_check.pl	(revision 26860)
@@ -0,0 +1,227 @@
+#!/usr/bin/perl -w
+use DBI;
+use constant DB_SOCKET => '/var/run/mysqld/mysqld.sock'; # Socket for mysql
+use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
+
+GetOptions('label=s' => \$label,) or die "unable to parse arguments.\n";
+die "Unknown option: @ARGV\n" if @ARGV;
+die "required options: --label \n"
+	   unless defined $label;
+
+
+my $dbname = 'gpc1';
+my $dbserver = 'ippdb01';
+my $dbuser = 'ippuser';
+my $dbpass = 'ippuser';
+my $db = DBI->connect(
+                      "DBI:mysql:database=${dbname};host=${dbserver};mysql_socket=" .
+                      DB_SOCKET(),${dbuser},${dbpass}, 
+                      {
+                          RaiseError => 1, AutoCommit => 1}
+                      ) or die "Unable to connect to database $DBI::errstr\n";
+my $qr = "SELECT label,state,count(state) as n FROM chipRun WHERE label like '$label' group by state;";
+
+my $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+print "chip stage \n";
+
+foreach my $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\ncam stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM camRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\nfake stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM fakeRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+#rint $qr;
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\nwarp stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM warpRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+
+print "\nstack stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM stackRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\ndiff stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM diffRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\nmagic stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM magicRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+print "\nmagicDS stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM magicDSRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+
+print "\ndist stage\n";
+ $qr = "SELECT label,state,count(state) as n FROM distRun WHERE label like '$label' group by state;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "${$item}[0] ${$item}[1] ${$item}[2] \n";
+}
+
+print "\n-------------------\n";
+print "faults and log files\n\n";
+
+$qr = "select chip_id,class_id,state, fault, path_base from chipRun join chipProcessedImfile using(chip_id) where   label ='$label' and (fault > 0) order by fault desc;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "chip ${$item}[2] ${$item}[3] ${$item}[4].${$item}[1].log\n";
+}
+ 
+
+$qr = "select cam_id,state, fault, path_base from camRun join camProcessedExp using (cam_id) where label ='$label' and (fault > 0) order by fault desc;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "cam  ${$item}[1] ${$item}[2] ${$item}[3].log\n";
+}
+
+$qr = "select fake_id,state, fault, path_base from fakeRun join fakeProcessedImfile using(fake_id) where label ='$label' and (fault > 0) order by fault desc;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "fake ${$item}[1] ${$item}[2] ${$item}[3].log\n";
+}
+
+$qr = "select warp_id,skycell_id,state, fault, path_base from warpRun join warpSkyfile using(warp_id) where label ='$label' and (fault > 0) order by fault desc;";  
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "warp ${$item}[2] ${$item}[3] ${$item}[4].log\n";
+} 
+
+$qr = "select warp_id,skycell_id,state, fault, workdir from warpRun join warpSkyCellMap using(warp_id) where label ='$label' and (fault > 0) order by fault desc;";  
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "warp ${$item}[2] ${$item}[3] ${$item}[4]\n";
+} 
+
+
+
+
+
+
+$qr = "select stack_id,skycell_id,state, fault, path_base from stackRun join stackSumSkyfile using(stack_id) where label ='$label' and (fault > 0) order by fault desc;";
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "stck ${$item}[2] ${$item}[3] ${$item}[4].log \n";
+} 
+
+
+$qr = "select diff_id,skycell_id,state, fault, path_base from diffRun join diffSkyfile using(diff_id) where label ='$label' and (fault > 0) order by fault desc;";  
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "diff ${$item}[2] ${$item}[3] ${$item}[4].log  \n";
+} 
+ 
+
+$qr = "select magic_id, magicRun.state, magicNodeResult.fault, path_base, workdir from magicRun join magicNodeResult using (magic_id) where label ='$label' and (magicNodeResult.fault > 0) order by magicNodeResult.fault desc;"; 
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+foreach  $item (@{$query}) {
+if (!defined( ${$item}[3])) { ${$item}[3]=${$item}[4];}
+    print "magic ${$item}[1] ${$item}[2] ${$item}[3]\n";
+}
+
+$qr = "select magic_id, state, magicDSFile.fault, outroot from magicDSRun join magicDSFile using (magic_ds_id) where label ='$label' and (magicDSFile.fault > 0) order by magicDSFile.fault desc;"; 
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+
+foreach  $item (@{$query}) {
+    print "destreak ${$item}[1] ${$item}[2]  ${$item}[3] \n";
+}
+
+
+
+$qr = "select  distRun.state, distComponent.fault, distComponent.outdir, outroot from distRun join distComponent using (dist_id) where label ='$label' and (distComponent.fault > 0) order by distComponent.fault desc;"; 
+
+ $query = $db->selectall_arrayref( $qr ) ||
+    die "Unable to execute SQL: $DBI::errstr\n";
+
+
+foreach  $item (@{$query}) {
+    print "dist ${$item}[0] ${$item}[1] ${$item}[2]\n";
+}
+
+$db->disconnect();
