Print

Print


Author: [log in to unmask]
Date: Tue Oct 13 13:46:34 2015
New Revision: 3841

Log:
file summary utility

Added:
    java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java
      - copied, changed from r3812, java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBiasConditionsLoader.java

Copied: java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java (from r3812, 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/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java	Tue Oct 13 13:46:34 2015
@@ -1,168 +1,49 @@
-package org.hps.conditions.svt;
-
-import hep.aida.IDataPoint;
-import hep.aida.IDataPointSet;
-import hep.aida.IDataPointSetFactory;
-import hep.aida.IPlotter;
-import hep.aida.IPlotterStyle;
+package org.hps.users.meeg;
 
 import java.io.BufferedReader;
-import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
-import java.sql.SQLException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.TimeZone;
+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;
-import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
-import org.hps.conditions.api.ConditionsRecord;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
 import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.conditions.run.RunRange;
-import org.hps.conditions.run.RunSpreadsheet;
-import org.hps.conditions.run.RunSpreadsheet.RunData;
-import org.hps.conditions.run.RunSpreadsheet.RunMap;
+import org.hps.conditions.svt.SvtAlignmentConstant;
+import org.hps.conditions.svt.SvtBiasConstant;
 import org.hps.conditions.svt.SvtBiasConstant.SvtBiasConstantCollection;
-import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasMyaRange;
-import org.hps.conditions.svt.SvtBiasMyaDataReader.SvtBiasRunRange;
-import org.hps.conditions.svt.SvtMotorMyaDataReader.SvtPositionMyaRange;
-import org.hps.conditions.svt.SvtMotorMyaDataReader.SvtPositionRunRange;
+import org.hps.conditions.svt.SvtMotorPosition;
 import org.hps.conditions.svt.SvtMotorPosition.SvtMotorPositionCollection;
-import org.lcsim.util.aida.AIDA;
+import org.hps.run.database.RunManager;
 
 /**
- * @author Per Hansson Adrian <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
  *
  */
-public class SvtBiasConditionsLoader {
-
-    private static final Set<String> FIELDS = new HashSet<String>();
-    
+public class SvtChargeIntegrator {
+
     /**
      * Initialize the logger.
      */
-    private static Logger LOGGER = Logger.getLogger(SvtBiasConditionsLoader.class.getPackage().getName());
-
-    /**
-     * Setup conditions.
-     */
-    private static final DatabaseConditionsManager MANAGER = DatabaseConditionsManager.getInstance();
-
-    static {
-        FIELDS.add("run");
-        FIELDS.add("date");
-        FIELDS.add("start_time");
-        FIELDS.add("end_time");
-    }
-
-    /**
-     * Setup control plots.
-     */
-    private static final AIDA aida = AIDA.defaultInstance();
-    static IDataPointSet dpsRuns = null;
-    static IDataPointSet dpsBiasRuns = null;
-    static IDataPointSet dpsPositionRuns = null;
-
-    private static void setupPlots(boolean show) {
-        IDataPointSetFactory dpsf = aida.analysisFactory().createDataPointSetFactory(aida.tree());
-        dpsRuns = dpsf.create("dpsRuns", "Run intervals", 2);
-        dpsBiasRuns = dpsf.create("dpsBiasRuns", "Bias ON intervals associated with runs", 2);
-        dpsPositionRuns = dpsf.create("dpsPositionRuns", "Position stable intervals associated with runs", 2);
-        IPlotter plotter = aida.analysisFactory().createPlotterFactory().create("Bias run ranges");
-        IPlotterStyle plotterStyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle();
-        plotterStyle.xAxisStyle().setParameter("type", "date");
-        plotter.createRegions(1, 4);
-        plotter.region(0).plot(dpsRuns, plotterStyle);
-        plotter.region(1).plot(dpsBiasRuns, plotterStyle);
-        plotter.region(2).plot(dpsPositionRuns, plotterStyle);
-        plotter.region(3).plot(dpsRuns, plotterStyle);
-        plotter.region(3).plot(dpsBiasRuns, plotterStyle, "mode=overlay");
-        plotter.region(3).plot(dpsPositionRuns, plotterStyle, "mode=overlay");
-        if (show) {
-            plotter.show();
-        }
-
-    }
-
-    private static IDataPoint addPoint(IDataPointSet dps, long mstime, double val) {
-        IDataPoint dp = dps.addPoint();
-        dp.coordinate(0).setValue(mstime / 1000.);
-        dp.coordinate(1).setValue(val);
-        return dp;
-    }
+    private static Logger LOGGER = Logger.getLogger(SvtChargeIntegrator.class.getPackage().getName());
+
+    private static final double angleTolerance = 1e-4;
 
     /**
      * Default constructor
      */
-    public SvtBiasConditionsLoader() {
-    }
-
-    /**
-     * Check validity of @link RunData
-     *
-     * @param data the @link RunData to check
-     * @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 GregorianCalendar(1999, 1, 1)).getTime())) {
-            LOGGER.fine("This run data is not valid: " + data.toString());
-            return false;
-        }
-        if (data.getStartDate().after(data.getEndDate())) {
-            throw new RuntimeException("start date is after end date?!" + data.toString());
-        }
-        return true;
-    }
-
-    //private static Options options = null;
-    public static RunMap getRunMapFromSpreadSheet(String path) {
-        // Load in CSV records from the exported run spreadsheet.
-        LOGGER.info(path);
-        final RunSpreadsheet runSheet = new RunSpreadsheet(new File(path));
-
-        // Find the run ranges that have the same fields values.
-        final List<RunRange> ranges = RunRange.findRunRanges(runSheet, FIELDS);
-        LOGGER.info("Found " + ranges.size() + " ranges.");
-        for (RunRange range : ranges) {
-            LOGGER.fine(range.toString());
-        }
-        // find the run records (has converted dates and stuff) for these ranges
-        RunMap runmap = runSheet.getRunMap(ranges);
-        LOGGER.info("Found " + runmap.size() + " runs in the run map.");
-        return runmap;
-    }
-
-    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)) {
-                runList.add(data);
-            }
-        }
-        return runList;
+    public SvtChargeIntegrator() {
     }
 
     /**
@@ -174,14 +55,14 @@
     public static void main(String[] args) {
 
         Options options = new Options();
-        options.addOption(new Option("c", true, "CSV run file"));
-        options.addOption(new Option("m", true, "MYA dump file for bias"));
-        options.addOption(new Option("p", true, "MYA dump file for motor positions"));
-        options.addOption(new Option("t", false, "use run table format (from crawler) for bias"));
-        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("b", true, "beam current file"));
-        options.addOption(new Option("s", false, "Show plots"));
+//        options.addOption(new Option("c", true, "CSV run file"));
+//        options.addOption(new Option("m", true, "MYA dump file for bias"));
+//        options.addOption(new Option("p", true, "MYA dump file for motor positions"));
+//        options.addOption(new Option("t", false, "use run table format (from crawler) for bias"));
+//        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("b", true, "beam current file"));
+//        options.addOption(new Option("s", false, "Show plots"));
 
         final CommandLineParser parser = new PosixParser();
         CommandLine cl = null;
@@ -191,283 +72,130 @@
             throw new RuntimeException("Cannot parse.", e);
         }
 
-        if (!cl.hasOption("c") || (!cl.hasOption("m") && !cl.hasOption("p"))) {
-            printUsage(options);
-            return;
+//        if (!cl.hasOption("c") || (!cl.hasOption("m") && !cl.hasOption("p"))) {
+//            printUsage(options);
+//            return;
+//        }
+        List<CSVRecord> records = null;
+        try {
+            FileReader reader = new FileReader(cl.getArgs()[0]);
+            final CSVFormat format = CSVFormat.DEFAULT;
+
+            final CSVParser csvParser;
+            csvParser = new CSVParser(reader, format);
+
+            records = csvParser.getRecords();
+
+//            // Remove first two rows of headers.
+//            records.remove(0);
+//            records.remove(0);
+            csvParser.close();
+        } catch (FileNotFoundException ex) {
+            Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (IOException ex) {
+            Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
         }
 
-        // Setup plots
-        setupPlots(cl.hasOption("s"));
-
-        // Load in CSV records from the exported run spreadsheet.
-        List<RunData> runList;
-        if (cl.hasOption("t")) {
-            runList = SvtBiasMyaDataReader.readRunTable(new File(cl.getOptionValue("c")));
-        } else {
-            runList = getRunListFromSpreadSheet(cl.getOptionValue("c"));
-        }
-
-        List<SvtBiasRunRange> biasRunRanges = null;
-        List<SvtPositionRunRange> positionRunRanges = null;
-        // Load MYA dump
-        if (cl.hasOption("m")) {
-            List<SvtBiasMyaRange> biasRanges = SvtBiasMyaDataReader.readMyaData(new File(cl.getOptionValue("m")), 178.0, 2000, cl.hasOption("d"));
-            LOGGER.info("Got " + biasRanges.size() + " bias ranges");
-            biasRunRanges = SvtBiasMyaDataReader.findOverlappingRanges(runList, biasRanges);
-        }
-
-        if (cl.hasOption("p")) {
-            List<SvtPositionMyaRange> positionRanges = SvtMotorMyaDataReader.readMyaData(new File(cl.getOptionValue("p")), 200, 10000);
-            LOGGER.info("Got " + positionRanges.size() + " position ranges");
-            positionRunRanges = SvtMotorMyaDataReader.findOverlappingRanges(runList, positionRanges);
-        }
-
-        // Combine them to run ranges when bias was on        
-        // each run may have multiple bias ranges
-        // fill graphs
-        if (cl.hasOption("s")) {
-            if (cl.hasOption("m")) {
-                for (SvtBiasRunRange r : biasRunRanges) {
-                    LOGGER.info(r.toString());
-                    if (r.getRun().getRun() > 5600) {//9999999999999.0) {
-                        //if(dpsRuns.size()/4.0<500) {//9999999999999.0) {
-                        addPoint(dpsRuns, r.getRun().getStartDate().getTime(), 0.0);
-                        addPoint(dpsRuns, r.getRun().getStartDate().getTime(), 1.0);
-                        addPoint(dpsRuns, r.getRun().getEndDate().getTime(), 1.0);
-                        addPoint(dpsRuns, r.getRun().getEndDate().getTime(), 0.0);
-
-                        for (SvtBiasMyaRange br : r.getRanges()) {
-                            addPoint(dpsBiasRuns, br.getStartDate().getTime(), 0.0);
-                            addPoint(dpsBiasRuns, br.getStartDate().getTime(), 0.3);
-                            addPoint(dpsBiasRuns, br.getEndDate().getTime(), 0.3);
-                            addPoint(dpsBiasRuns, br.getEndDate().getTime(), 0.0);
-                        }
-                    }
-                }
-            }
-            if (cl.hasOption("p")) {
-                for (SvtPositionRunRange r : positionRunRanges) {
-                    LOGGER.info(r.toString());
-                    if (r.getRun().getRun() > 5600) {//9999999999999.0) {
-                        //if(dpsRuns.size()/4.0<500) {//9999999999999.0) {
-                        for (SvtPositionMyaRange br : r.getRanges()) {
-                            addPoint(dpsPositionRuns, br.getStartDate().getTime(), 0.0);
-                            addPoint(dpsPositionRuns, br.getStartDate().getTime(), 0.5 + 100 * Math.max(br.getTop(), br.getBottom()));
-                            addPoint(dpsPositionRuns, br.getEndDate().getTime(), 0.5 + 100 * Math.max(br.getTop(), br.getBottom()));
-                            addPoint(dpsPositionRuns, br.getEndDate().getTime(), 0.0);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (cl.hasOption("b") && cl.hasOption("m") && cl.hasOption("p")) {
-            readBeamData(new File(cl.getOptionValue("b")), runList, positionRunRanges, biasRunRanges);
-        }
-
-        // load to DB
-        if (cl.hasOption("g")) {
-            if (cl.hasOption("m")) {
-                loadBiasesToConditionsDB(biasRunRanges);
-            }
-            if (cl.hasOption("p")) {
-                loadPositionsToConditionsDB(positionRunRanges);
-            }
-        }
-    }
-
-    private static void printUsage(Options options) {
-        HelpFormatter formatter = new HelpFormatter();
-        formatter.printHelp("Need to adhere to these options", options);
-
-    }
-
-    private static void loadBiasesToConditionsDB(List<SvtBiasRunRange> ranges) {
-        LOGGER.info("Load to DB...");
-
-        // Create a new collection for each run
-        List<Integer> runsadded = new ArrayList<Integer>();
-
-        for (SvtBiasRunRange range : ranges) {
-            LOGGER.info("Loading " + range.toString());
-            RunData rundata = range.getRun();
-            if (runsadded.contains(rundata.getRun())) {
-                LOGGER.warning("Run " + Integer.toString(rundata.getRun()) + " was already added?");
-                throw new RuntimeException("Run " + Integer.toString(rundata.getRun()) + " was already added?");
-            }
-            runsadded.add(rundata.getRun());
-
-            if (range.getRanges().isEmpty()) {
-                LOGGER.info("No bias range for run " + range.getRun().getRun());
-                continue;
-            }
-
-            // create a collection
-            SvtBiasConstantCollection collection = new SvtBiasConstantCollection();
-
-            // Set the table meta data
-            collection.setTableMetaData(MANAGER.findTableMetaData("svt_bias_constants"));
-            collection.setConnection(MANAGER.getConnection());
-
-            int collectionId = -1;
-            try {
-                collectionId = MANAGER.getCollectionId(collection, "run ranges for SVT HV bias ON");
-            } catch (SQLException e1) {
-                throw new RuntimeException(e1);
-            }
-
-            collection.setCollectionId(collectionId);
-
-            final ConditionsRecord condition = new ConditionsRecord();
-            condition.setFieldValue("run_start", rundata.getRun());
-            condition.setFieldValue("run_end", rundata.getRun());
-            condition.setFieldValue("name", "svt_bias_constants");
-            condition.setFieldValue("table_name", "svt_bias_constants");
-            condition.setFieldValue("notes", "constants from mya");
-            condition.setFieldValue("created", new Date());
-            condition.setFieldValue("created_by", System.getProperty("user.name"));
-            condition.setFieldValue("collection_id", collectionId);
-            condition.setTableMetaData(MANAGER.findTableMetaData("conditions"));
-            condition.setConnection(MANAGER.getConnection());
-            LOGGER.info(condition.toString());
-
-            try {
-
-                for (SvtBiasMyaRange biasRange : range.getRanges()) {
-                    // create a constant and add to the collection
-                    final SvtBiasConstant constant = new SvtBiasConstant();
-                    constant.setFieldValue("start", biasRange.getStartDate().getTime());
-                    constant.setFieldValue("end", biasRange.getEndDate().getTime());
-                    constant.setFieldValue("value", biasRange.getValue());
-                    collection.add(constant);
-                }
-
-                // Insert collection data.
-                collection.insert();
-
-                // Insert conditions record.
-                condition.insert();
-
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    private static void loadPositionsToConditionsDB(List<SvtPositionRunRange> ranges) {
-        LOGGER.info("Load to DB...");
-
-        // Create a new collection for each run
-        List<Integer> runsadded = new ArrayList<Integer>();
-
-        for (SvtPositionRunRange range : ranges) {
-            LOGGER.info("Loading " + range.toString());
-            RunData rundata = range.getRun();
-            if (runsadded.contains(rundata.getRun())) {
-                LOGGER.warning("Run " + Integer.toString(rundata.getRun()) + " was already added?");
-                throw new RuntimeException("Run " + Integer.toString(rundata.getRun()) + " was already added?");
-            }
-            runsadded.add(rundata.getRun());
-
-            if (range.getRanges().isEmpty()) {
-                LOGGER.info("No position range for run " + range.getRun().getRun());
-                continue;
-            }
-
-            // create a collection
-            SvtMotorPositionCollection collection = new SvtMotorPositionCollection();
-
-            // Set the table meta data
-            collection.setTableMetaData(MANAGER.findTableMetaData("svt_motor_positions"));
-            collection.setConnection(MANAGER.getConnection());
-
-            int collectionId = -1;
-            try {
-                collectionId = MANAGER.getCollectionId(collection, "run ranges for SVT positions");
-            } catch (SQLException e1) {
-                throw new RuntimeException(e1);
-            }
-
-            collection.setCollectionId(collectionId);
-
-            final ConditionsRecord condition = new ConditionsRecord();
-            condition.setFieldValue("run_start", rundata.getRun());
-            condition.setFieldValue("run_end", rundata.getRun());
-            condition.setFieldValue("name", "svt_motor_positions");
-            condition.setFieldValue("table_name", "svt_motor_positions");
-            condition.setFieldValue("notes", "constants from mya");
-            condition.setFieldValue("created", new Date());
-            condition.setFieldValue("created_by", System.getProperty("user.name"));
-            condition.setFieldValue("collection_id", collectionId);
-            condition.setTableMetaData(MANAGER.findTableMetaData("conditions"));
-            condition.setConnection(MANAGER.getConnection());
-            LOGGER.info(condition.toString());
-
-            try {
-
-                for (SvtPositionMyaRange positionRange : range.getRanges()) {
-                    // create a constant and add to the collection
-                    final SvtMotorPosition constant = new SvtMotorPosition();
-                    constant.setFieldValue("start", positionRange.getStartDate().getTime());
-                    constant.setFieldValue("end", positionRange.getEndDate().getTime());
-                    constant.setFieldValue("top", positionRange.getTop());
-                    constant.setFieldValue("bottom", positionRange.getBottom());
-                    collection.add(constant);
-                }
-
-                // Insert collection data.
-                collection.insert();
-
-                // Insert conditions record.
-                condition.insert();
-
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    private static void readBeamData(File file, List<RunData> runList, List<SvtPositionRunRange> positionRanges, List<SvtBiasRunRange> biasRanges) {
+//        for (CSVRecord record : records) {
+//            int runNum = Integer.parseInt(record.get(0));
+//            int fileNum = Integer.parseInt(record.get(1));
+////            int nEvents = Integer.parseInt(record.get(2));
+////            int badEvents = Integer.parseInt(record.get(3));
+////            int firstTimestamp = Integer.parseInt(record.get(4));
+////            int lastTimestamp = Integer.parseInt(record.get(5));
+//            long firstTI = Long.parseLong(record.get(6));
+//            long lastTI = Long.parseLong(record.get(7));
+////            long tiOffset = Long.parseLong(record.get(8));
+////            data.add(new FileData(runNum, fileNum, firstTI, lastTI, record));
+//        }
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
         dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
 
-        Map<Integer, SvtPositionRunRange> positionRangeMap = new HashMap<Integer, SvtPositionRunRange>();
-        for (SvtPositionRunRange range : positionRanges) {
-            positionRangeMap.put(range.getRun().getRun(), range);
-        }
-        Map<Integer, SvtBiasRunRange> biasRangeMap = new HashMap<Integer, SvtBiasRunRange>();
-        for (SvtBiasRunRange range : biasRanges) {
-            biasRangeMap.put(range.getRun().getRun(), range);
-        }
-
         try {
-            BufferedReader br = new BufferedReader(new FileReader(file));
+            BufferedReader br = new BufferedReader(new FileReader(cl.getArgs()[1]));
             String line;
-            System.out.println("myaData header: " + br.readLine()); //discard the first line
-            System.out.println("run\ttotalQ\ttotalQBias\tfracBias\ttotalQNom\tfracNom\ttotalQ1pt5\tfrac1pt5\ttotalGatedQ\ttotalGatedQBias\tfracGatedBias\ttotalGatedQNom\tfracGatedNom\ttotalGatedQ1pt5\tfracGated1pt5");
-
-            for (RunData run : runList) {
+            System.err.println("myaData header: " + br.readLine()); //discard the first line
+//            System.out.println("run\ttotalQ\ttotalQBias\tfracBias\ttotalQNom\tfracNom\ttotalQ1pt5\tfrac1pt5\ttotalGatedQ\ttotalGatedQBias\tfracGatedBias\ttotalGatedQNom\tfracGatedNom\ttotalGatedQ1pt5\tfracGated1pt5");
+            System.out.println("run_num\tfile_num\tnominal_position\tnEvents\ttotalQ\ttotalQ_withbias\ttotalQ_atnom\tgatedQ\tgatedQ_withbias\tgatedQ_atnom");
+
+            int currentRun = 0;
+            double nominalAngleTop = -999;
+            double nominalAngleBottom = -999;
+            String nominalPosition = null;
+            long tiTimeOffset = 0;
+            SvtBiasConstantCollection svtBiasConstants = null;
+            SvtMotorPositionCollection svtPositionConstants = null;
+            SvtAlignmentConstant.SvtAlignmentConstantCollection alignmentConstants = null;
+
+            for (CSVRecord record : records) {
+                int runNum = Integer.parseInt(record.get(0));
+                int fileNum = Integer.parseInt(record.get(1));
+                long firstTI = Long.parseLong(record.get(6));
+                long lastTI = Long.parseLong(record.get(7));
+
+                if (runNum != currentRun) {
+                    RunManager.getRunManager().setRun(runNum);
+                    try {
+                        DatabaseConditionsManager.getInstance().setDetector("HPS-EngRun2015-Nominal-v3", runNum);
+
+                        svtBiasConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtBiasConstant.SvtBiasConstantCollection.class, "svt_bias_constants").getCachedData();
+                        svtPositionConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtMotorPosition.SvtMotorPositionCollection.class, "svt_motor_positions").getCachedData();
+                        alignmentConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtAlignmentConstant.SvtAlignmentConstantCollection.class, "svt_alignments").getCachedData();
+                    } catch (Exception ex) {
+                        continue;
+                    }
+
+                    if (!RunManager.getRunManager().runExists() || RunManager.getRunManager().getTriggerConfig().getTiTimeOffset() == null) {
+                        continue;
+                    }
+
+                    tiTimeOffset = RunManager.getRunManager().getTriggerConfig().getTiTimeOffset();
+
+                    for (final SvtAlignmentConstant constant : alignmentConstants) {
+                        switch (constant.getParameter()) {
+                            case 13100:
+                                nominalAngleTop = constant.getValue();
+                                break;
+                            case 23100:
+                                nominalAngleBottom = -constant.getValue();
+                                break;
+                        }
+                    }
+
+                    if (Math.abs(nominalAngleBottom) < angleTolerance && Math.abs(nominalAngleTop) < angleTolerance) {
+                        nominalPosition = "0pt5";
+                    } else if (Math.abs(nominalAngleBottom - 0.0033) < angleTolerance && Math.abs(nominalAngleTop - 0.0031) < angleTolerance) {
+                        nominalPosition = "1pt5";
+                    } else {
+                        nominalPosition = "unknown";
+                    }
+                    currentRun = runNum;
+                }
+
+                Date startDate = new Date((long) ((firstTI + tiTimeOffset) / 1e6));
+                Date endDate = new Date((long) ((lastTI + tiTimeOffset) / 1e6));
+
                 double totalCharge = 0;
                 double totalChargeWithBias = 0;
                 double totalChargeWithBiasAtNominal = 0;
-                double totalChargeWithBiasAt1pt5 = 0;
                 double totalGatedCharge = 0;
                 double totalGatedChargeWithBias = 0;
                 double totalGatedChargeWithBiasAtNominal = 0;
-                double totalGatedChargeWithBiasAt1pt5 = 0;
+                Date date = null;
                 Date lastDate = null;
 
                 while ((line = br.readLine()) != null) {
                     String arr[] = line.split(" +");
 
                     if (arr.length != 4) {
-                        throw new java.text.ParseException("this line is not correct.", 0);
-                    }
-                    Date date = dateFormat.parse(arr[0] + " " + arr[1]);
-                    if (date.after(run.getEndDate())) {
+                        throw new RuntimeException("this line is not correct.");
+                    }
+                    lastDate = date;
+                    date = dateFormat.parse(arr[0] + " " + arr[1]);
+                    if (date.after(endDate) && lastDate != null && lastDate.after(endDate)) {
                         break;
                     }
-                    if (date.before(run.getStartDate())) {
+                    if (date.before(startDate)) {
                         continue;
                     }
 
@@ -483,55 +211,52 @@
                         livetime = Math.min(100.0, Math.max(0.0, Double.parseDouble(arr[3]))) / 100.0;
                     }
 
-                    if (date.after(run.getStartDate())) {
-                        if (lastDate != null) {
-                            double dt = (date.getTime() - lastDate.getTime()) / 1000.0;
-                            double dq = dt * current; // nC
-                            double dqGated = dt * current * livetime; // nC
-
-                            totalCharge += dq;
-                            totalGatedCharge += dqGated;
-                            SvtBiasRunRange biasRunRange = biasRangeMap.get(run.getRun());
-                            if (biasRunRange != null) {
-                                for (SvtBiasMyaRange biasRange : biasRunRange.getRanges()) {
-                                    if (biasRange.includes(date)) {
-                                        totalChargeWithBias += dq;
-                                        totalGatedChargeWithBias += dqGated;
-
-                                        SvtPositionRunRange positionRunRange = positionRangeMap.get(run.getRun());
-                                        if (positionRunRange != null) {
-                                            for (SvtPositionMyaRange positionRange : positionRunRange.getRanges()) {
-                                                if (positionRange.includes(date)) {
-                                                    if (Math.abs(positionRange.getBottom()) < 0.0001 && Math.abs(positionRange.getTop()) < 0.0001) {
-                                                        totalChargeWithBiasAtNominal += dq;
-                                                        totalGatedChargeWithBiasAtNominal += dqGated;
-                                                    } else if (Math.abs(positionRange.getBottom() - 0.0033) < 0.0001 && Math.abs(positionRange.getTop() - 0.0031) < 0.0001) {
-                                                        totalChargeWithBiasAt1pt5 += dq;
-                                                        totalGatedChargeWithBiasAt1pt5 += dqGated;
-                                                    }
-                                                    break;
-                                                }
-                                            }
-                                        }
-
-                                        break;
-                                    }
-                                }
+                    boolean biasGood = false;
+                    boolean positionGood = false;
+
+                    SvtBiasConstant biasConstant = svtBiasConstants.find(date);
+                    if (biasConstant != null) {
+                        biasGood = true;
+                    }
+                    if (svtPositionConstants != null) {
+                        SvtMotorPosition positionConstant = svtPositionConstants.find(date);
+                        if (positionConstant != null) {
+//                    System.out.format("%f %f %f %f\n", positionConstant.getBottom(), nominalAngleBottom, positionConstant.getTop(), nominalAngleTop);
+                            if (Math.abs(positionConstant.getBottom() - nominalAngleBottom) < angleTolerance && Math.abs(positionConstant.getTop() - nominalAngleTop) < angleTolerance) {
+                                positionGood = true;
                             }
-
                         }
                     }
-                    lastDate = date;
+
+                    if (lastDate != null) {
+                        double dt = (Math.min(date.getTime(), endDate.getTime()) - Math.max(startDate.getTime(), lastDate.getTime())) / 1000.0;
+                        double dq = dt * current; // nC
+                        double dqGated = dt * current * livetime; // nC
+//                        System.out.format("start %d end %d date %d lastDate %d current %f dt %f\n", startDate.getTime(), endDate.getTime(), date.getTime(), lastDate.getTime(), current, dt);
+                        totalCharge += dq;
+                        totalGatedCharge += dqGated;
+                        if (biasGood) {
+                            totalChargeWithBias += dq;
+                            totalGatedChargeWithBias += dqGated;
+                            if (positionGood) {
+                                totalChargeWithBiasAtNominal += dq;
+                                totalGatedChargeWithBiasAtNominal += dqGated;
+                            }
+                        }
+                    }
                 }
-//                System.out.format("run\t%d\ttotalQ\t%.0f\ttotalQBias\t%.0f\tfracBias\t%f\ttotalQNom\t%.0f\tfracNom\t%f\ttotalQ1pt5\t%.0f\tfrac1pt5\t%f\ttotalGatedQ\t%.0f\ttotalGatedQBias\t%.0f\tfracGatedBias\t%f\ttotalGatedQNom\t%.0f\tfracGatedNom\t%f\ttotalGatedQ1pt5\t%.0f\tfracGated1pt5\t%f\n", run.getRun(), totalCharge, totalChargeWithBias, totalChargeWithBias / totalCharge, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominal / totalCharge, totalChargeWithBiasAt1pt5, totalChargeWithBiasAt1pt5 / totalCharge, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBias / totalGatedCharge, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominal / totalGatedCharge, totalGatedChargeWithBiasAt1pt5, totalGatedChargeWithBiasAt1pt5 / totalGatedCharge);
-                System.out.format("%d\t%.0f\t%.0f\t%f\t%.0f\t%f\t%.0f\t%f\t%.0f\t%.0f\t%f\t%.0f\t%f\t%.0f\t%f\n", run.getRun(), totalCharge, totalChargeWithBias, totalChargeWithBias / totalCharge, totalChargeWithBiasAtNominal, totalChargeWithBiasAtNominal / totalCharge, totalChargeWithBiasAt1pt5, totalChargeWithBiasAt1pt5 / totalCharge, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBias / totalGatedCharge, totalGatedChargeWithBiasAtNominal, totalGatedChargeWithBiasAtNominal / totalGatedCharge, totalGatedChargeWithBiasAt1pt5, totalGatedChargeWithBiasAt1pt5 / totalGatedCharge);
+                int nEvents = Integer.parseInt(record.get(2));
+                System.out.format("%d\t%d\t%s\t%d\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", runNum, fileNum, nominalPosition, nEvents, totalCharge, totalChargeWithBias, totalChargeWithBiasAtNominal, totalGatedCharge, totalGatedChargeWithBias, totalGatedChargeWithBiasAtNominal);
             }
-            br.close();
-
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } catch (java.text.ParseException e) {
-            throw new RuntimeException(e);
+        } catch (Exception ex) {
+            Logger.getLogger(SvtChargeIntegrator.class.getName()).log(Level.SEVERE, null, ex);
         }
+
+    }
+
+    private static void printUsage(Options options) {
+        HelpFormatter formatter = new HelpFormatter();
+        formatter.printHelp("Need to adhere to these options", options);
+
     }
 }