Print

Print


Author: [log in to unmask]
Date: Wed Jul 29 14:20:41 2015
New Revision: 3293

Log:
lots of changes

Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDataReader.java
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/run/RunSpreadsheet.java	Wed Jul 29 14:20:41 2015
@@ -187,14 +187,21 @@
             run = parseRunNumber(this.record);
             try {
                 startDate = RunSpreadsheet.parseStartDate(this.record);
-            } catch (ParseException e) {                
+            } catch (ParseException e) {
             }
             try {
                 endDate = RunSpreadsheet.parseEndDate(this.record);
-            } catch (ParseException e) {                
-            }
-        }
-        
+            } catch (ParseException e) {
+            }
+        }
+
+        public RunData(Date startDate, Date endDate, int run) {
+            this.startDate = startDate;
+            this.endDate = endDate;
+            this.run = run;
+            record = null;
+        }
+
         public int getRun() {
             return run;
         }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java	Wed Jul 29 14:20:41 2015
@@ -5,14 +5,14 @@
 import java.io.File;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.HelpFormatter;
@@ -27,9 +27,8 @@
 import org.hps.conditions.run.RunSpreadsheet.RunData;
 import org.hps.conditions.run.RunSpreadsheet.RunMap;
 import org.hps.conditions.svt.SvtBiasConstant.SvtBiasConstantCollection;
-import org.hps.conditions.svt.SvtBiasMyaDumpReader.SvtBiasMyaRange;
-import org.hps.conditions.svt.SvtBiasMyaDumpReader.SvtBiasMyaRanges;
-import org.hps.conditions.svt.SvtBiasMyaDumpReader.SvtBiasRunRange;
+import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasMyaRange;
+import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasRunRange;
 import org.hps.util.BasicLogFormatter;
 import org.lcsim.util.aida.AIDA;
 import org.lcsim.util.log.LogUtil;
@@ -100,7 +99,7 @@
      * @return <code>true</code> if valid, <code>false</code> otherwise.
      */
     private static boolean isValid(RunData data) {
-        if (data.getStartDate() == null || data.getEndDate() == null || data.getStartDate().before(new Date(99, 1, 1))) {
+        if (data.getStartDate() == null || data.getEndDate() == null || data.getStartDate().before((new GregorianCalendar(1999, 1, 1)).getTime())) {
             logger.fine("This run data is not valid: " + data.toString());
             return false;
         }
@@ -128,39 +127,22 @@
         return runmap;
     }
 
-    public static List<SvtBiasRunRange> getBiasRunRanges(RunMap runmap,
-            SvtBiasMyaDumpReader biasMyaReader) {
-        List<SvtBiasRunRange> biasRunRanges = new ArrayList<SvtBiasRunRange>();
-        // loop over runs from CSV        
-        RunData prev = null;
-        for (Entry<Integer, RunData> entry : runmap.entrySet()) {
-            int run = entry.getKey();
-            RunData data = entry.getValue();
-            logger.fine("Processing " + run + " " + data.toString());
-
-            //check that data is ok
+    public static List<RunData> getRunListFromSpreadSheet(String path) {
+        // Load in CSV records from the exported run spreadsheet.
+        List<RunData> runList = new ArrayList<RunData>();
+
+        // find the run records (has converted dates and stuff) for these ranges
+        RunMap runmap = getRunMapFromSpreadSheet(path);
+
+        List<Integer> runNums = new ArrayList<Integer>(runmap.keySet());
+        Collections.sort(runNums);
+        for (Integer runNum : runNums) {
+            RunData data = runmap.get(runNum);
             if (isValid(data)) {
-                if (prev != null) {
-                    if (isValid(prev)) {
-                        if (prev.getEndDate().after(data.getStartDate())) {
-                            throw new RuntimeException("prev end date after run started?: " + prev.toString() + "   " + data.toString());
-                        } else if (prev.getStartDate().after(data.getEndDate())) {
-                            throw new RuntimeException("prev start date before run ended?: " + prev.toString() + "   " + data.toString());
-                        }
-                    }
-                }
-
-                // find the bias ranges applicable to this run
-                SvtBiasMyaRanges overlaps = biasMyaReader.findOverlappingRanges(data.getStartDate(), data.getEndDate());
-                logger.fine("Found " + overlaps.size() + " overlapping bias ranges");
-                logger.fine(overlaps.toString());
-
-                biasRunRanges.add(new SvtBiasRunRange(data, overlaps));
-                prev = data;
-
-            }
-        }
-        return biasRunRanges;
+                runList.add(data);
+            }
+        }
+        return runList;
     }
 
     /**
@@ -172,10 +154,10 @@
     public static void main(String[] args) {
 
         Options options = new Options();
-        options.addOption(new Option("c", true, "CVS run file"));
+        options.addOption(new Option("c", true, "CSV run file"));
         options.addOption(new Option("m", true, "MYA dump file"));
-//        options.addOption(new Option("t", true, "run table from crawler"));
-//        options.addOption(new Option("d", true, "myaData dump file"));
+        options.addOption(new Option("t", false, "use run table format (from crawler)"));
+        options.addOption(new Option("d", false, "discard first line of MYA data (for myaData output)"));
         options.addOption(new Option("g", false, "Actually load stuff into DB"));
         options.addOption(new Option("s", false, "Show plots"));
 
@@ -187,34 +169,33 @@
             throw new RuntimeException("Cannot parse.", e);
         }
 
-//        if (!cl.hasOption("c") || !cl.hasOption("m")) {
-//            printUsage(options);
-//            return;
-//        }
+        if (!cl.hasOption("c") || !cl.hasOption("m")) {
+            printUsage(options);
+            return;
+        }
+
         // Setup plots
         setupPlots(cl.hasOption("s"));
 
         // Load in CSV records from the exported run spreadsheet.
-        RunMap runmap = getRunMapFromSpreadSheet(cl.getOptionValue("c"));
+        List<RunData> runList = null;
+        if (cl.hasOption("t")) {
+            runList = SvtBiasMyaDataReader.readRunTable(new File(cl.getOptionValue("c")));
+        } else {
+            runList = getRunListFromSpreadSheet(cl.getOptionValue("c"));
+        }
 
         // Load MYA dump
-        SvtBiasMyaDumpReader biasMyaReader = new SvtBiasMyaDumpReader(cl.getOptionValue("m"));
-        logger.info("Got " + biasMyaReader.getRanges().size() + " bias ranges");
-
-//        if (cl.hasOption("d")) {
-//            List<SvtBiasMyaDataReader.SvtBiasMyaRange> ranges = SvtBiasMyaDataReader.readMyaData(new File(cl.getOptionValue("d")), 178.0, 2000);
-//        }
-//
-//        if (cl.hasOption("t")) {
-//            List<SvtBiasMyaDataReader.RunData> runData = SvtBiasMyaDataReader.readRunTable(new File(cl.getOptionValue("t")));
-//        }
+        List<SvtBiasMyaRange> ranges = SvtBiasMyaDataReader.readMyaData(new File(cl.getOptionValue("m")), 178.0, 2000, cl.hasOption("d"));
+        logger.info("Got " + ranges.size() + " bias ranges");
+
         // Combine them to run ranges when bias was on        
         // each run may have multiple bias ranges
-        List<SvtBiasRunRange> biasRunRanges = getBiasRunRanges(runmap, biasMyaReader);
+        List<SvtBiasRunRange> biasRunRanges = SvtBiasMyaDataReader.findOverlappingRanges(runList, ranges);
 
         // fill graphs
         if (cl.hasOption("s")) {
-            for (SvtBiasRunRange r : biasRunRanges) {
+            for (SvtBiasMyaDataReader.SvtBiasRunRange r : biasRunRanges) {
                 logger.info(r.toString());
                 if (r.getRun().getRun() > 5600) {//9999999999999.0) {
                     //if(dpsRuns.size()/4.0<500) {//9999999999999.0) {
@@ -224,10 +205,10 @@
                     addPoint(dpsRuns, r.getRun().getEndDate().getTime(), 0.0);
 
                     for (SvtBiasMyaRange br : r.getRanges()) {
-                        addPoint(dpsBiasRuns, br.getStart().getDate().getTime(), 0.0);
-                        addPoint(dpsBiasRuns, br.getStart().getDate().getTime(), 0.5);
-                        addPoint(dpsBiasRuns, br.getEnd().getDate().getTime(), 0.5);
-                        addPoint(dpsBiasRuns, br.getEnd().getDate().getTime(), 0.0);
+                        addPoint(dpsBiasRuns, br.getStartDate().getTime(), 0.0);
+                        addPoint(dpsBiasRuns, br.getStartDate().getTime(), 0.5);
+                        addPoint(dpsBiasRuns, br.getEndDate().getTime(), 0.5);
+                        addPoint(dpsBiasRuns, br.getEndDate().getTime(), 0.0);
                     }
 
                 }
@@ -305,7 +286,7 @@
                     final SvtBiasConstant constant = new SvtBiasConstant();
                     constant.setFieldValue("start", biasRange.getStartDate());
                     constant.setFieldValue("end", biasRange.getEndDate());
-                    constant.setFieldValue("value", biasRange.getStart().getValue());
+                    constant.setFieldValue("value", biasRange.getValue());
                     collection.add(constant);
                     logger.info(condition.toString());
                 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDataReader.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDataReader.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasMyaDataReader.java	Wed Jul 29 14:20:41 2015
@@ -5,7 +5,6 @@
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
-import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -26,6 +25,7 @@
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVRecord;
+import org.hps.conditions.run.RunSpreadsheet.RunData;
 
 public class SvtBiasMyaDataReader {
 
@@ -56,49 +56,44 @@
             throw new RuntimeException("Missing myData dump or run time file.");
         }
 
-        List<SvtBiasMyaRange> ranges = SvtBiasMyaDataReader.readMyaData(new File(cl.getArgs()[0]), 178.0, 2000);
-
-//        for (SvtBiasMyaRange range : ranges) {
-//            System.out.println(range);
-//        }
+        List<SvtBiasMyaRange> ranges = SvtBiasMyaDataReader.readMyaData(new File(cl.getArgs()[0]), 178.0, 2000, true);
+
         List<RunData> runData = SvtBiasMyaDataReader.readRunTable(new File(cl.getArgs()[1]));
 
+        List<SvtBiasRunRange> runRanges = findOverlappingRanges(runData, ranges);
+
+        for (SvtBiasRunRange runRange : runRanges) {
+            System.out.println(runRange);
+        }
+
+    }
+
+    public static List<SvtBiasRunRange> findOverlappingRanges(List<RunData> runList, List<SvtBiasMyaRange> ranges) {
         List<SvtBiasRunRange> runRanges = new ArrayList<SvtBiasRunRange>();
 
         Iterator<SvtBiasMyaRange> rangesIter = ranges.iterator();
         SvtBiasMyaRange nextRange = rangesIter.next();
 
-        runLoop:
-        for (RunData data : runData) {
-
-            while (nextRange.getEnd().before(data.getStart())) {
+        for (RunData run : runList) {
+            SvtBiasRunRange runRange = new SvtBiasRunRange(run);
+            while (nextRange.getEndDate().before(run.getStartDate()) && rangesIter.hasNext()) {
                 nextRange = rangesIter.next();
+            }
+            while (nextRange.getStartDate().before(run.getEndDate())) {
+                runRange.addRange(nextRange);
+                if (nextRange.getEndDate().after(run.getEndDate())) {
+                    break;
+                }
                 if (!rangesIter.hasNext()) {
-                    break runLoop;
-                }
-            }
-            while (nextRange.getStart().before(data.getEnd())) {
-                runRanges.add(new SvtBiasRunRange(data, nextRange));
+                    break;
+                }
                 nextRange = rangesIter.next();
-                if (!rangesIter.hasNext()) {
-                    break runLoop;
-                }
-            }
-//            System.out.println(data);
-        }
-
-        for (SvtBiasRunRange runRange : runRanges) {
-            System.out.println(runRange);
-        }
-
-//        
-//        boolean quiet = cl.hasOption("q");
-//        boolean printControlEvents = cl.hasOption("c");
-//        boolean seqRead = cl.hasOption("s");
-//
-//        SvtBiasMyaDataReader dumpReader = new SvtBiasMyaDataReader(args);
-//
-//        dumpReader.printRanges();
+            }
+            if (!runRange.getRanges().isEmpty()) {
+                runRanges.add(runRange);
+            }
+        }
+        return runRanges;
     }
 
 //    private static final SimpleDateFormat DATE_FORMAT = new RunSpreadsheet.AnotherSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -106,61 +101,55 @@
     public SvtBiasMyaDataReader(double biasValueOn, int endMargin) {
     }
 
-    public static List<SvtBiasMyaRange> readMyaData(File file, double biasValueOn, int endMargin) {
+    public static List<SvtBiasMyaRange> readMyaData(File file, double biasValueOn, int endMargin, boolean discardHeader) {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
 
         List<SvtBiasMyaRange> ranges = new ArrayList<SvtBiasMyaRange>();
         try {
-
             BufferedReader br = new BufferedReader(new FileReader(file));
             String line;
-            System.out.println(br.readLine());
-
+            if (discardHeader) {
+                System.out.println(br.readLine()); //discard the first line
+            }
             SvtBiasMyaRange currentRange = null;
             while ((line = br.readLine()) != null) {
-                //System.out.println(line);
                 String arr[] = line.split(" +");
-                try {
-
-                    if (arr.length < 3) {
-                        throw new ParseException("this line is not correct.", 0);
+
+                if (arr.length < 3) {
+                    throw new ParseException("this line is not correct.", 0);
+                }
+
+                Date date = dateFormat.parse(arr[0] + " " + arr[1]);
+                Double[] values = new Double[arr.length - 2];
+                for (int i = 2; i < arr.length; i++) {
+                    if (arr[i].equals("<undefined>")) {
+                        values[i - 2] = 0.0; //assume it's bad
+                    } else {
+                        values[i - 2] = Double.parseDouble(arr[i]);
                     }
-
-                    Date date = dateFormat.parse(arr[0] + " " + arr[1]);
-                    Double[] values = new Double[arr.length - 2];
-                    for (int i = 2; i < arr.length; i++) {
-                        if (arr[i].equals("<undefined>")) {
-                            values[i - 2] = 0.0;
-                        } else {
-                            values[i - 2] = Double.parseDouble(arr[i]);
-                        }
+                }
+                double biasValue = Collections.min(Arrays.asList(values));
+                if (biasValue > biasValueOn) {
+                    if (currentRange == null) {
+                        currentRange = new SvtBiasMyaRange(date, biasValue);
+//                            System.out.format("bias on:\t%d %d %f %s\n", date.getTime(), values.length, biasValue, date.toString());
                     }
-                    double biasValue = Collections.min(Arrays.asList(values));
-                    if (biasValue > biasValueOn) {
-                        if (currentRange == null) {
-                            currentRange = new SvtBiasMyaRange(date, biasValue);
-//                            System.out.format("bias on:\t%d %d %f %s\n", date.getTime(), values.length, biasValue, date.toString());
-                        }
-                    } else {
-                        if (currentRange != null) {
-                            currentRange.setEnd(new Date(date.getTime() - endMargin));
-                            ranges.add(currentRange);
-                            currentRange = null;
+                } else {
+                    if (currentRange != null) {
+                        currentRange.setEndDate(new Date(date.getTime() - endMargin));
+                        ranges.add(currentRange);
+                        currentRange = null;
 //                            System.out.format("bias off:\t%d %d %f %s\n", date.getTime(), values.length, biasValue, date.toString());
-                        }
                     }
-//                    System.out.format("%d %d %f\n", date.getTime(), values.length, biasValue);
-//                    SvtBiasMyaEntry entry = new SvtBiasMyaEntry(file.getName(), date, value);
-//                    myaEntries.add(entry);
-                } catch (ParseException e) {
-                    e.printStackTrace();
                 }
             }
             br.close();
 
         } catch (IOException e) {
-            e.printStackTrace();
+            throw new RuntimeException(e);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
         }
 
         return ranges;
@@ -210,29 +199,20 @@
         public SvtBiasMyaRange() {
         }
 
-//        public boolean overlap(Date date_start, Date date_end) {
-//            if (date_end.before(getStartDate())) {
-//                return false;
-//            } else if (date_start.after(getEndDate())) {
-//                return false;
-//            }
-//            return true;
-//        }
-//
         public SvtBiasMyaRange(Date start, double bias) {
             this.start = start;
             this.bias = bias;
         }
 
-        public Date getEnd() {
+        public Date getEndDate() {
             return end;
         }
 
-        public void setEnd(Date end) {
+        public void setEndDate(Date end) {
             this.end = end;
         }
 
-        public Date getStart() {
+        public Date getStartDate() {
             return start;
         }
 
@@ -242,72 +222,56 @@
         }
 
         public boolean includes(Date date) {
-            return !date.before(getStart()) && !date.after(getEnd());
-        }
-    }
-
-    public static class RunData {
-
-        private final Date start;
-        private final Date end;
-        private final int run;
-
-        public RunData(Date start, Date end, int run) {
-            this.start = start;
-            this.end = end;
+            return !date.before(getStartDate()) && !date.after(getEndDate());
+        }
+
+        Object getValue() {
+            return bias;
+        }
+    }
+
+    public static final class SvtBiasRunRange {
+
+        private RunData run;
+        private final List<SvtBiasMyaRange> ranges = new ArrayList<SvtBiasMyaRange>();
+
+        public SvtBiasRunRange(RunData run) {
+            setRun(run);
+        }
+
+        public RunData getRun() {
+            return run;
+        }
+
+        public void setRun(RunData run) {
             this.run = run;
         }
 
-        public Date getStart() {
-            return start;
-        }
-
-        public Date getEnd() {
-            return end;
-        }
-
-        public int getRun() {
-            return run;
+        public List<SvtBiasMyaRange> getRanges() {
+            return ranges;
+        }
+
+        public void addRange(SvtBiasMyaRange range) {
+            ranges.add(range);
+        }
+
+        public boolean includes(Date date) {
+            for (SvtBiasMyaRange r : ranges) {
+                if (date.after(r.getStartDate()) && date.before(r.getEndDate())) {
+                    return true;
+                }
+            }
+            return false;
         }
 
         @Override
         public String toString() {
-            return String.format("Run %d - START: %s (%d), END: %s (%d), duration: %d", run, start.toString(), start.getTime(), end.toString(), end.getTime(), end.getTime() - start.getTime());
-        }
-    }
-
-    public static final class SvtBiasRunRange {
-
-        private RunData run;
-        private SvtBiasMyaRange range;
-
-        public SvtBiasRunRange(RunData run, SvtBiasMyaRange range) {
-            setRun(run);
-            setRange(range);
-        }
-
-        public RunData getRun() {
-            return run;
-        }
-
-        public void setRun(RunData run) {
-            this.run = run;
-        }
-
-        public SvtBiasMyaRange getRange() {
-            return range;
-        }
-
-        public void setRange(SvtBiasMyaRange range) {
-            this.range = range;
-        }
-
-        @Override
-        public String toString() {
-//            StringBuffer sb = new StringBuffer();
-//            sb.append("\nRun " + run.toString() + ":");
-//            sb.append("\n" + range.toString());
-            return String.format("%s, range %s", run.toString(), range.toString());
+            StringBuilder sb = new StringBuilder();
+            sb.append("\nRun ").append(run.toString()).append(":");
+            for (SvtBiasMyaRange range : ranges) {
+                sb.append("\n").append(range.toString());
+            }
+            return sb.toString();
         }
     }
 

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SampleZeroHVBiasChecker.java	Wed Jul 29 14:20:41 2015
@@ -6,7 +6,7 @@
 import hep.aida.IPlotter;
 import hep.aida.IPlotterFactory;
 import hep.aida.ITree;
-
+import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -16,16 +16,18 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.run.RunSpreadsheet;
 import org.hps.conditions.run.RunSpreadsheet.RunMap;
 import org.hps.conditions.svt.SvtBiasConditionsLoader;
 import org.hps.conditions.svt.SvtBiasConstant;
 import org.hps.conditions.svt.SvtBiasConstant.SvtBiasConstantCollection;
-import org.hps.conditions.svt.SvtBiasMyaDumpReader;
+import org.hps.conditions.svt.SvtBiasMyaDataReader;
+import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasMyaRange;
+import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasRunRange;
+import static org.hps.conditions.svt.SvtBiasMyaDataReader.findOverlappingRanges;
 import org.hps.conditions.svt.SvtTimingConstants;
-import org.hps.conditions.svt.SvtBiasMyaDumpReader.SvtBiasRunRange;
 import org.hps.recon.ecal.triggerbank.AbstractIntData;
 import org.hps.recon.ecal.triggerbank.HeadBankData;
 import org.hps.record.epics.EpicsData;
@@ -39,7 +41,6 @@
 import org.lcsim.util.aida.AIDA;
 import org.lcsim.util.log.LogUtil;
 
-
 /**
  * @author Per Hansson Adrian <[log in to unmask]>
  *
@@ -48,6 +49,7 @@
 
     // Logger
     Logger logger = LogUtil.create(getName(), new BasicLogFormatter(), Level.INFO);
+
     static {
         hep.aida.jfree.AnalysisFactory.register();
     }
@@ -61,14 +63,20 @@
     IPlotter plotter3;
     IPlotter plotter4;
     private boolean showPlots = false;
+    private boolean useRunTableFormat = false;
+    private boolean discardMyaDataHeader = false;
+    private boolean debug = false;
 
     List<HpsSiSensor> sensors;
     private Map<HpsSiSensor, IHistogram1D> hists_rawadc;
     private Map<HpsSiSensor, IHistogram1D> hists_rawadcnoise;
     private Map<HpsSiSensor, IHistogram1D> hists_rawadcnoiseON;
     private Map<HpsSiSensor, IHistogram1D> hists_rawadcnoiseOFF;
+    private final Map<HpsSiSensor, IHistogram1D> hists_hitCounts = new HashMap<HpsSiSensor, IHistogram1D>();
+    private final Map<HpsSiSensor, IHistogram1D> hists_hitCountsON = new HashMap<HpsSiSensor, IHistogram1D>();
+    private final Map<HpsSiSensor, IHistogram1D> hists_hitCountsOFF = new HashMap<HpsSiSensor, IHistogram1D>();
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
-    private String triggerBankCollectionName ="TriggerBank";
+    private String triggerBankCollectionName = "TriggerBank";
     private static final String subdetectorName = "Tracker";
     List<SvtBiasRunRange> runRanges;
     SvtBiasRunRange runRange = null;
@@ -79,16 +87,13 @@
     private String fileName = "biasoutput.txt";
     private int eventCountHvOff = 0;
     private String runSpreadSheetPath;
-    private String myaDumpPath; 
-    private double epicsBiasValue = -1; 
+    private String myaDumpPath;
+    private double epicsBiasValue = -1;
     private boolean hvOnEpics = false;
     private boolean hvOn = false;
     private EpicsData epicsData = null;
     private int eventCountEpicsDisagree = 0;
     SvtBiasConstantCollection svtBiasConstants = null;
-    
-
-    
 
     public void setMyaDumpPath(String myaDumpPath) {
         this.myaDumpPath = myaDumpPath;
@@ -102,31 +107,35 @@
         this.fileName = fileName;
     }
 
-
-    
     public void setShowPlots(boolean showPlots) {
         this.showPlots = showPlots;
     }
 
-    
+    public void setUseRunTableFormat(boolean useRunTableFormat) {
+        this.useRunTableFormat = useRunTableFormat;
+    }
+
+    public void setDiscardMyaDataHeader(boolean discardMyaDataHeader) {
+        this.discardMyaDataHeader = discardMyaDataHeader;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
     @Override
     protected void detectorChanged(Detector detector) {
-    
-        
+
         ConditionsRecordCollection col_svt_bias = DatabaseConditionsManager.getInstance().findConditionsRecords("svt_bias");
-        if(col_svt_bias==null) {
+        if (col_svt_bias == null) {
             logger.info("svt_bias name collection wasn't found");
         }
         ConditionsRecordCollection col_svt_bias_constants = DatabaseConditionsManager.getInstance().findConditionsRecords("svt_bias_constants");
-        if(col_svt_bias_constants==null) {
+        if (col_svt_bias_constants == null) {
             logger.info("col_svt_bias_constants name collection wasn't found");
         }
-        
-        
-        
-        svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class , "svt_bias").getCachedData();
-
-        
+
+//        svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class, "svt_bias").getCachedData();
         try {
             fWriter = new FileWriter(fileName);
         } catch (IOException e) {
@@ -134,9 +143,6 @@
         }
         pWriter = new PrintWriter(fWriter);
 
-
-        
-        
         tree = IAnalysisFactory.create().createTreeFactory().create();
         tree.cd("");
         histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
@@ -145,7 +151,7 @@
         hists_rawadcnoise = new HashMap<HpsSiSensor, IHistogram1D>();
         hists_rawadcnoiseON = new HashMap<HpsSiSensor, IHistogram1D>();
         hists_rawadcnoiseOFF = new HashMap<HpsSiSensor, IHistogram1D>();
-        
+
         sensors = detector.getSubdetector(subdetectorName).getDetectorElement().findDescendants(HpsSiSensor.class);
 
         plotter1 = plotterFactory.create("Pedestal subtracted zero Sample ADC");
@@ -167,31 +173,38 @@
             plotter3.region(SvtPlotUtils.computePlotterRegion(sensor)).plot(hists_rawadcnoiseON.get(sensor));
             hists_rawadcnoiseOFF.put(sensor, aida.histogram1D(sensor.getName() + " raw adc - ped maxSample>4 OFF", 100, -1000.0, 1000.0));
             plotter4.region(SvtPlotUtils.computePlotterRegion(sensor)).plot(hists_rawadcnoiseOFF.get(sensor));
-        }
-
-        if(showPlots) {
+            hists_hitCounts.put(sensor, aida.histogram1D(sensor.getName() + " hit count", 100, 0, 100));
+            hists_hitCountsON.put(sensor, aida.histogram1D(sensor.getName() + " hit count ON", 100, 0, 100));
+            hists_hitCountsOFF.put(sensor, aida.histogram1D(sensor.getName() + " hit count OFF", 100, 0, 100));
+        }
+
+        if (showPlots) {
             plotter1.show();
             plotter2.show();
             plotter3.show();
             plotter4.show();
         }
 
-
-        RunMap runmap = SvtBiasConditionsLoader.getRunMapFromSpreadSheet(runSpreadSheetPath);
-        SvtBiasMyaDumpReader biasDumpReader = new SvtBiasMyaDumpReader(myaDumpPath);
+        List<RunSpreadsheet.RunData> runmap;
+        if (useRunTableFormat) {
+            runmap = SvtBiasMyaDataReader.readRunTable(new File(runSpreadSheetPath));
+        } else {
+            runmap = SvtBiasConditionsLoader.getRunListFromSpreadSheet(runSpreadSheetPath);
+        }
+        List<SvtBiasMyaRange> ranges = SvtBiasMyaDataReader.readMyaData(new File(myaDumpPath), 178.0, 2000, discardMyaDataHeader);
+
         //SvtBiasConditionsLoader.setTimeOffset(Calendar.)
-        runRanges = SvtBiasConditionsLoader.getBiasRunRanges(runmap, biasDumpReader);
+        runRanges = SvtBiasMyaDataReader.findOverlappingRanges(runmap, ranges);
         logger.info("Print all " + runRanges.size() + " bias run ranges:");
-        for(SvtBiasRunRange r : runRanges) {
-            logger.info(r.toString());
+        for (SvtBiasRunRange r : runRanges) {
+            if (debug) {
+                logger.info(r.toString());
+            }
             pWriter.println(r.toString());
         }
 
-
-        
-    }
-
-    
+    }
+
     private Date getEventTimeStamp(EventHeader event) {
         List<GenericObject> intDataCollection = event.get(GenericObject.class, triggerBankCollectionName);
         for (GenericObject data : intDataCollection) {
@@ -199,140 +212,155 @@
                 Date date = HeadBankData.getDate(data);
                 if (date != null) {
                     return date;
-                } 
+                }
             }
         }
         return null;
     }
-    
-    
+
     @Override
     public void process(EventHeader event) {
-        
-        
+
         // Read EPICS data if available
         epicsData = EpicsData.read(event);
-        
-        if(epicsData!=null) {
+
+        if (epicsData != null) {
             logger.info(epicsData.toString());
-            if(epicsData.getUsedNames().contains("SVT:bias:top:0:v_sens")) {
-                
+            if (epicsData.getUsedNames().contains("SVT:bias:top:0:v_sens")) {
+
                 epicsBiasValue = epicsData.getValue("SVT:bias:top:0:v_sens");
                 logger.info("epicsBiasValue = " + Double.toString(epicsBiasValue));
-                
-                if(epicsBiasValue>SvtBiasMyaDumpReader.BIASVALUEON) {
+
+                if (epicsBiasValue > 178.0) {
                     hvOnEpics = true;
                 }
-                
+
             }
         } else {
             logger.fine("no epics information in this event");
         }
-        
-        
-        
+
         // Read the timestamp for the event
         // It comes in on block level so not every event has it, use the latest one throughout a block
-        
         Date newEventDate = getEventTimeStamp(event);
-        if(newEventDate!=null) {
+        if (newEventDate != null) {
+            if (eventDate == null || !eventDate.equals(newEventDate)) {
+                System.out.format("event %d with new timestamp %s\n", event.getEventNumber(), newEventDate.toString());
+            }
             eventDate = newEventDate;
         }
-        
+
         // only do this analysis where there is a date availabe.
-        
-        if(eventDate!=null) {
-
-            logger.info("eventDate " + eventDate.toString());
-            
+        if (eventDate != null) {
+            if (debug) {
+                logger.info("eventDate " + eventDate.toString());
+            }
+
             eventCount++;
-            
-            
+
             // check what the DB has
-            if(svtBiasConstants != null) {
+            if (svtBiasConstants != null) {
                 logger.info("there are " + svtBiasConstants.size() + " constants to search");
-                for(SvtBiasConstant constant : svtBiasConstants) {
+                for (SvtBiasConstant constant : svtBiasConstants) {
                     logger.info("start " + constant.getStart().toString() + " end " + constant.getEnd() + " value " + constant.getValue());
                 }
-                
-                
+
                 SvtBiasConstant constant = svtBiasConstants.find(eventDate);
-                
-                logger.info(constant==null?"No constant found!":("Found constant " + "start " + constant.getStart().toString() + " end " + constant.getEnd() + " value " + constant.getValue()));
-                
-            }
-            
-            
-            
-            if(runRange==null) {
-                for(SvtBiasRunRange r : runRanges) {
-                    if (r.getRun().getRun()==event.getRunNumber()) {
+
+                logger.info(constant == null ? "No constant found!" : ("Found constant " + "start " + constant.getStart().toString() + " end " + constant.getEnd() + " value " + constant.getValue()));
+
+            }
+
+            if (runRange == null) {
+                for (SvtBiasRunRange r : runRanges) {
+                    if (r.getRun().getRun() == event.getRunNumber()) {
                         runRange = r;
                     }
                 }
             }
-            
-            hvOn = runRange.getRanges().includes(eventDate);
-            
+
+            hvOn = runRange.includes(eventDate);
+
             // print the cases where epics and run range do not agree
-            if(hvOn!=hvOnEpics && epicsBiasValue>0.) {
-                logger.warning("hvOn is " + (hvOn?"ON":"OFF") + " hvOnEpics " + (hvOnEpics?"ON":"OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn?"YES":"NO") + " hvOnEpics " + (hvOnEpics?"YES":"NO"));
-                pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn?"YES":"NO"));
+            if (hvOn != hvOnEpics && epicsBiasValue > 0.) {
+                logger.warning("hvOn is " + (hvOn ? "ON" : "OFF") + " hvOnEpics " + (hvOnEpics ? "ON" : "OFF") + " for Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO"));
+                pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO"));
                 eventCountEpicsDisagree++;
             }
-            
+
             // print the cases where the HV is OFF
-            if(!hvOn) {
-                logger.info("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn?"YES":"NO")+ " hvOnEpics " + (hvOnEpics?"YES":"NO"));
-                pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn?"YES":"NO")+ " hvOnEpics " + (hvOnEpics?"YES":"NO"));
+            if (!hvOn) {
+                if (debug) {
+                    logger.info("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO"));
+                }
+                pWriter.println("Run " + event.getRunNumber() + " Event " + event.getEventNumber() + " date " + eventDate.toString() + " epoch " + eventDate.getTime() + " hvOn " + (hvOn ? "YES" : "NO") + " hvOnEpics " + (hvOnEpics ? "YES" : "NO"));
                 eventCountHvOff++;
             }
             if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+                Map<HpsSiSensor, Integer> hitCountMap = new HashMap<HpsSiSensor, Integer>();
+
                 // Get RawTrackerHit collection from event.
                 List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
-                
+
                 for (RawTrackerHit hit : rawTrackerHits) {
                     HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement();
+                    Integer count = hitCountMap.get(sensor);
+                    if (count == null) {
+                        count = 0;
+                    }
+                    hitCountMap.put(sensor, count + 1);
+
                     int strip = hit.getIdentifierFieldValue("strip");
                     double pedestal = sensor.getPedestal(strip, 0);
                     hists_rawadc.get(sensor).fill(hit.getADCValues()[0] - pedestal);
 
                     int maxSample = 0;
                     double maxSampleValue = 0;
-                    for(int s=0;s<6;++s) {
-                        if(((double)hit.getADCValues()[s] - pedestal)>maxSampleValue) {
+                    for (int s = 0; s < 6; ++s) {
+                        if (((double) hit.getADCValues()[s] - pedestal) > maxSampleValue) {
                             maxSample = s;
-                            maxSampleValue =  ((double) hit.getADCValues()[s]) - pedestal;
+                            maxSampleValue = ((double) hit.getADCValues()[s]) - pedestal;
                         }
                     }
-                    if(maxSample>=4) {
+                    if (maxSample >= 4) {
                         hists_rawadcnoise.get(sensor).fill(hit.getADCValues()[0] - pedestal);
-                        if(hvOn) {
+                        if (hvOn) {
                             hists_rawadcnoiseON.get(sensor).fill(hit.getADCValues()[0] - pedestal);
                         } else {
                             hists_rawadcnoiseOFF.get(sensor).fill(hit.getADCValues()[0] - pedestal);
                         }
                     }
                 }
+
+                for (HpsSiSensor sensor : sensors) {
+                    Integer count = hitCountMap.get(sensor);
+                    if (count == null) {
+                        count = 0;
+                    }
+                    hists_hitCounts.get(sensor).fill(count);
+                    if (hvOn) {
+                        hists_hitCountsON.get(sensor).fill(count);
+                    } else {
+                        hists_hitCountsOFF.get(sensor).fill(count);
+                    }
+                }
             }
         }
     }
 
     @Override
     public void endOfData() {
-        
+
         logger.info("eventCount " + Integer.toString(eventCount) + " eventCountHvOff " + Integer.toString(eventCountHvOff) + " eventCountEpicsDisagree " + Integer.toString(eventCountEpicsDisagree));
         pWriter.println("eventCount " + Integer.toString(eventCount) + " eventCountHvOff " + Integer.toString(eventCountHvOff) + " eventCountEpicsDisagree " + Integer.toString(eventCountEpicsDisagree));
-        
+
         try {
             pWriter.close();
             fWriter.close();
-        } catch(IOException ex) {
-             logger.log(Level.SEVERE, null, ex);
-        }
-        
-    }
-    
-   
-    
+        } catch (IOException ex) {
+            logger.log(Level.SEVERE, null, ex);
+        }
+
+    }
+
 }