Print

Print


Author: [log in to unmask]
Date: Tue Feb 23 10:25:15 2016
New Revision: 4240

Log:
Minor changes to run database builders (dev branch).

Added:
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java
Removed:
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/DatabaseUpdater.java
Modified:
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java
    java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java
    java/branches/jeremy-dev/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java

Added: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java	(added)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java	Tue Feb 23 10:25:15 2016
@@ -0,0 +1,83 @@
+package org.hps.run.database;
+
+import java.io.File;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.hps.record.epics.EpicsData;
+import org.hps.record.epics.EpicsRunProcessor;
+import org.hps.record.evio.EvioFileSource;
+import org.hps.record.evio.EvioFileUtilities;
+import org.hps.record.evio.EvioLoop;
+import org.hps.record.scalers.ScalerData;
+import org.hps.record.scalers.ScalersEvioProcessor;
+
+/**
+ * Extracts lists of EPICS and scaler data in an EVIO file and insert
+ * them into the run database.
+ * 
+ * @author Jeremy McCormick, SLAC
+ */
+public class EvioDataBuilder extends AbstractRunBuilder {
+
+    private Logger LOGGER = Logger.getLogger(EvioDataBuilder.class.getPackage().getName());
+    private File evioFile;
+    private List<EpicsData> epicsData;
+    private List<ScalerData> scalerData;
+    
+    void setEvioFile(File evioFile) {
+        this.evioFile = evioFile;
+    }
+    
+    List<EpicsData> getEpicsData() {
+        return epicsData;
+    }
+    
+    List<ScalerData> getScalerData() {
+        return scalerData;
+    }
+    
+    @Override
+    void build() {
+        if (evioFile == null) {
+            throw new RuntimeException("The EVIO file was not set.");
+        }
+        EvioLoop loop = new EvioLoop();
+        EvioFileSource src = new EvioFileSource(evioFile);
+        loop.setEvioFileSource(src);
+        ScalersEvioProcessor scalersProcessor = new ScalersEvioProcessor();
+        scalersProcessor.setResetEveryEvent(false);        
+        EpicsRunProcessor epicsProcessor = new EpicsRunProcessor();
+        loop.addProcessor(epicsProcessor);                
+        loop.loop(-1);
+        this.epicsData = epicsProcessor.getEpicsData();
+        this.scalerData = scalersProcessor.getScalerData();
+    }
+    
+    public void main(String args[]) {
+        
+        if (args.length == 0) {
+            throw new RuntimeException("No command line arguments provided.");
+        }
+        String path = args[0];
+        File file = new File(path);
+        int run = EvioFileUtilities.getRunFromName(file);
+        
+        EvioDataBuilder builder = new EvioDataBuilder();
+        builder.setEvioFile(file);
+        builder.build();
+        
+        if (!builder.getEpicsData().isEmpty()) {
+            RunManager runManager = null;
+            try {
+                runManager = new RunManager();
+                runManager.setRun(run);
+                runManager.updateEpicsData(epicsData);
+            } finally {
+                runManager.closeConnection();
+            }
+        } else {
+            LOGGER.warning("No EPICS data was found to insert into run database.");
+        }
+    }
+}

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java	Tue Feb 23 10:25:15 2016
@@ -6,7 +6,6 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -30,7 +29,6 @@
 import org.hps.record.scalers.ScalersEvioProcessor;
 import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
 import org.hps.record.triggerbank.HeadBankData;
-import org.hps.record.triggerbank.TiTimeOffsetCalculator;
 import org.hps.record.triggerbank.TiTimeOffsetEvioProcessor;
 import org.hps.record.triggerbank.TriggerConfigData;
 import org.hps.record.triggerbank.TriggerConfigData.Crate;
@@ -42,7 +40,6 @@
 import org.srs.datacat.model.DatasetModel;
 import org.srs.datacat.model.DatasetResultSetModel;
 import org.srs.datacat.model.dataset.DatasetWithViewModel;
-import org.srs.datacat.shared.DatasetLocation;
 
 /**
  * Builds a complete {@link RunSummary} object from various data sources, including the data catalog and the run

Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java	(original)
+++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunManager.java	Tue Feb 23 10:25:15 2016
@@ -15,7 +15,7 @@
 import org.lcsim.conditions.ConditionsListener;
 
 /**
- * Manages read-only access to the run database and creates a {@link RunSummary} for a specific run.
+ * Manages access to the run database.
  *
  * @author Jeremy McCormick, SLAC
  */
@@ -38,8 +38,7 @@
     private static final Logger LOGGER = Logger.getLogger(RunManager.class.getPackage().getName());
 
     /**
-     * Get the global instance of the {@link RunManager}.
-     *
+     * Get the global instance of the {@link RunManager}.     
      * @return the global instance of the {@link RunManager}
      */
     public static RunManager getRunManager() {
@@ -53,12 +52,7 @@
      * The active database connection.
      */
     private Connection connection;
-
-    /**
-     * The database connection parameters, initially set to the default parameters.
-     */
-    private final ConnectionParameters connectionParameters = DEFAULT_CONNECTION_PARAMETERS;
-
+   
     /**
      * Factory for creating database API objects.
      */
@@ -70,34 +64,28 @@
     private Integer run = null;
 
     /**
+     * Class constructor.     
+     * @param connection the database connection
+     */
+    public RunManager(final Connection connection) {
+        try {
+            if (connection.isClosed()) {
+                throw new RuntimeException("The connection is already closed and cannot be used.");
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+        this.connection = connection;
+        factory = new DaoProvider(this.connection);
+    }
+    
+    /**
      * Class constructor using default connection parameters.
      */
     public RunManager() {
-        this.connection = DEFAULT_CONNECTION_PARAMETERS.createConnection();
-        this.openConnection();
-        factory = new DaoProvider(this.connection);
-    }
-
-    /**
-     * Class constructor.
-     *
-     * @param connection the database connection
-     */
-    public RunManager(final Connection connection) {
-        this.connection = connection;
-        this.openConnection();
-        factory = new DaoProvider(this.connection);
-    }
-
-    /**
-     * Check if the run number has been set.
-     */
-    private void checkRunNumber() {
-        if (this.run == null) {
-            throw new IllegalStateException("The run number was never set.");
-        }
-    }
-
+        this(DEFAULT_CONNECTION_PARAMETERS.createConnection());
+    }
+        
     /**
      * Close the database connection.
      */
@@ -113,7 +101,6 @@
 
     /**
      * Load new run information when conditions have changed.
-     *
      * @param conditionsEvent the event with new conditions information
      */
     @Override
@@ -122,8 +109,159 @@
     }
 
     /**
+     * Return the database connection.     
+     * @return the database connection
+     */
+    Connection getConnection() {
+        return this.connection;
+    }
+
+    /**
+     * Get the EPICS data for the current run.
+     * @param epicsType the type of EPICS data
+     * @return the EPICS data for the current run
+     */
+    public List<EpicsData> getEpicsData(final EpicsType epicsType) {
+        return factory.getEpicsDataDao().getEpicsData(epicsType, this.run);
+    }
+
+    /**
+     * Get the list of EPICS variables definitions.     
+     * @param epicsType the type of EPICS data
+     * @return the list of EPICS variable definitions
+     */
+    public List<EpicsVariable> getEpicsVariables(final EpicsType epicsType) {
+        return factory.getEpicsVariableDao().getEpicsVariables(epicsType);
+    }
+
+    /**
+     * Get the full list of run numbers from the database.     
+     * @return the complete list of run numbers
+     */
+    public List<Integer> getRuns() {
+        return factory.getRunSummaryDao().getRuns();
+    }
+  
+    /**
+     * Get the run summary for the current run.     
+     * @return the run summary for the current run
+     */
+    public RunSummary getRunSummary() {
+        return factory.getRunSummaryDao().getRunSummary(this.run);
+    }
+
+    /**
+     * Get the scaler data for the current run.     
+     * @return the scaler data for the current run
+     */
+    public List<ScalerData> getScalerData() {
+        return factory.getScalerDataDao().getScalerData(this.run);
+    }
+    
+    /**
+     * Get SVT configuration data.     
+     * @return the SVT configuration data
+     */
+    public List<SvtConfigData> getSvtConfigData() {
+        return factory.getSvtConfigDao().getSvtConfigs(this.run);
+    }
+    
+    /**
+     * Get the DAQ (trigger) configuration for the run.
+     * @return the DAQ configuration for the run
+     */
+    public DAQConfig getDAQConfig() {
+        TriggerConfigData config = factory.getTriggerConfigDao().getTriggerConfig(this.run);
+        return config.loadDAQConfig(this.run);
+    }   
+
+    /**
+     * Return <code>true</code> if the run exists in the database.
+     * @return <code>true</code> if the run exists in the database
+     */
+    public boolean runExists() {      
+        return factory.getRunSummaryDao().runSummaryExists(this.run);
+    }
+
+    /**
+     * Set the run number and then load the applicable {@link RunSummary} from the database.
+     * @param run the run number
+     */
+    public void setRun(final int run) {
+        if (this.run == null || run != this.run) {
+            LOGGER.info("setting run " + run);
+            // Set the run number.
+            this.run = run;
+        }
+    }
+    
+    /**
+     * Get the currently active run number or <code>null</code>.
+     * @return the currently active run number of <code>null</code>
+     */
+    public Integer getRun() {
+        return this.run;
+    }
+    
+    /**
+     * Create or replace a run summary in the database.
+     * @param runSummary the run summary to update
+     * @param replaceExisting <code>true</code> to allow an existing run summary to be replaced
+     */
+    void updateRunSummary(RunSummary runSummary, boolean replaceExisting) {
+        final RunSummaryDao runSummaryDao = factory.getRunSummaryDao();
+        RunManager runManager = new RunManager();
+        runManager.setRun(runSummary.getRun());
+        if (runManager.runExists()) {
+            if (replaceExisting) {
+                runSummaryDao.updateRunSummary(runSummary);
+            } else {
+                throw new RuntimeException("Run already exists and replacement is not allowed.");
+            }
+        } else {
+            runSummaryDao.insertRunSummary(runSummary);
+        }                
+    }
+    
+    /**
+     * Create or replace the trigger config for the run.
+     * @param triggerConfig the trigger config
+     * @param replaceExisting <code>true</code> to allow an existing trigger to be replaced
+     */
+    void updateTriggerConfig(TriggerConfigData triggerConfig, boolean replaceExisting) {
+        final TriggerConfigDao configDao = factory.getTriggerConfigDao();
+        if (configDao.getTriggerConfig(run) != null) {
+            if (replaceExisting) {
+                configDao.deleteTriggerConfig(run);
+            } else {
+                throw new RuntimeException("Run already exists and replacement is not allowed.");
+            }
+        }
+        configDao.insertTriggerConfig(triggerConfig, run);
+    }
+    
+    /**
+     * Create or replace EPICS data for the run.
+     * @param epicsData the EPICS data
+     */
+    void updateEpicsData(List<EpicsData> epicsData) {
+        if (epicsData != null && !epicsData.isEmpty()) {
+            factory.getEpicsDataDao().insertEpicsData(epicsData, this.run);
+        }
+    }
+    
+    /**
+     * Create or replace scaler data for the run.
+     * @param scalerData the scaler data
+     */
+    void updateScalerData(List<ScalerData> scalerData) {
+        if (scalerData != null) {
+            factory.getScalerDataDao().insertScalerData(scalerData, this.run);
+        } 
+    }     
+    
+    /**
      * Delete a run from the database.
-     *
      * @param run the run number
      */
     void deleteRun() {        
@@ -134,162 +272,5 @@
         factory.getTriggerConfigDao().deleteTriggerConfig(run);
         factory.getRunSummaryDao().deleteRunSummary(run);
     }
-
-    /**
-     * Return the database connection.
-     *
-     * @return the database connection
-     */
-    Connection getConnection() {
-        return this.connection;
-    }
-
-    /**
-     * Get the EPICS data for the current run.
-     *
-     * @param epicsType the type of EPICS data
-     * @return the EPICS data for the current run
-     */
-    public List<EpicsData> getEpicsData(final EpicsType epicsType) {
-        this.checkRunNumber();
-        return factory.getEpicsDataDao().getEpicsData(epicsType, this.run);
-    }
-
-    /**
-     * Get the EPICS variables.
-     *
-     * @param epicsType the type of EPICS data
-     * @return the EPICS data for the current run
-     */
-    public List<EpicsVariable> getEpicsVariables(final EpicsType epicsType) {
-        this.checkRunNumber();
-        return factory.getEpicsVariableDao().getEpicsVariables(epicsType);
-    }
-
-    /**
-     * Get the current run number.
-     *
-     * @return the run number
-     */
-    public int getCurrentRun() {
-        return run;
-    }
-
-    /**
-     * Get the complete list of run numbers from the database.
-     *
-     * @return the complete list of run numbers
-     */
-    public List<Integer> getRuns() {
-        return factory.getRunSummaryDao().getRuns();
-    }
-  
-    /**
-     * Get the run summary for the current run not including its sub-objects like scaler data.
-     *
-     * @return the run summary for the current run
-     */
-    public RunSummary getRunSummary() {
-        this.checkRunNumber();
-        return factory.getRunSummaryDao().getRunSummary(this.run);
-    }
-
-    /**
-     * Get the scaler data for the current run.
-     *
-     * @return the scaler data for the current run
-     */
-    public List<ScalerData> getScalerData() {
-        this.checkRunNumber();
-        return factory.getScalerDataDao().getScalerData(run);
-    }
-    
-    /**
-     * Get SVT configuration data.
-     * 
-     * @return the SVT configuration data
-     */
-    public List<SvtConfigData> getSvtConfigData() {
-        this.checkRunNumber();
-        return factory.getSvtConfigDao().getSvtConfigs(run);
-    }
-    
-    /**
-     * Get the DAQ configuration for the run.
-     * 
-     * @return the DAQ configuration for the run
-     */
-    public DAQConfig getDAQConfig() {
-        this.checkRunNumber();
-        TriggerConfigData config = factory.getTriggerConfigDao().getTriggerConfig(run);
-        return config.loadDAQConfig(run);
-    }
-     
-    /**
-     * Open a new database connection from the connection parameters if the current one is closed or <code>null</code>.
-     * <p>
-     * This method does nothing if the connection is already open.
-     */
-    public void openConnection() {
-        try {
-            if (this.connection.isClosed()) {
-                LOGGER.info("creating new database connection");
-                this.connection = connectionParameters.createConnection();
-            } 
-        } catch (final SQLException e) {
-            throw new RuntimeException("Error opening database connection.", e);
-        }
-    }
-
-    /**
-     * Return <code>true</code> if the run exists in the database.
-     *
-     * @return <code>true</code> if the run exists in the database
-     */
-    public boolean runExists() {
-        if (factory == null) {
-            throw new RuntimeException("factory is null");
-        }
-        if (factory.getRunSummaryDao() == null) {
-            throw new RuntimeException("RunSummaryDao is null");
-        }
-        if (this.run == null) {
-            throw new RuntimeException("run is null");
-        }
-        return factory.getRunSummaryDao().runSummaryExists(this.run);
-    }
-
-    /**
-     * Return <code>true</code> if the run exists in the database.
-     *
-     * @param run the run number
-     * @return <code>true</code> if the run exists in the database
-     */
-    boolean runExists(final int run) {
-        return factory.getRunSummaryDao().runSummaryExists(run);
-    }
-
-    /**
-     * Set the run number and then load the applicable {@link RunSummary} from the database.
-     *
-     * @param run the run number
-     */
-    public void setRun(final int run) {
-
-        if (this.run == null || run != this.run) {
-
-            LOGGER.info("setting new run " + run);
-
-            // Set the run number.
-            this.run = run;
-        }
-    }
-    
-    /**
-     * Get the currently active run number or <code>null</code>.
-     * @return the currently active run number of <code>null</code>
-     */
-    public Integer getRun() {
-        return this.run;
-    }
+    
 }

Modified: java/branches/jeremy-dev/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java
 =============================================================================
--- java/branches/jeremy-dev/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java	(original)
+++ java/branches/jeremy-dev/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java	Tue Feb 23 10:25:15 2016
@@ -1,7 +1,6 @@
 package org.hps.run.database;
 
 import java.io.File;
-import java.sql.Connection;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -16,11 +15,12 @@
     private static String SPREADSHEET = "/work/hps/rundb/HPS_Runs_2015_Sheet1.csv";
     private static String FOLDER = "/HPS/test";
     private static String SITE = "SLAC";
+    private static String EVIO_TEST_FILE = "/nfs/slac/g/hps3/data/engrun2015/evio/hps_005403.evio.0";
     
     private static final ConnectionParameters CONNECTION_PARAMETERS = 
             new ConnectionParameters("root", "derp", "hps_run_db", "localhost");
         
-    public void testRunBuilder() throws Exception {
+    public void testRunBuilders() throws Exception {
         
         RunSummaryImpl runSummary = new RunSummaryImpl(RUN);
         
@@ -31,7 +31,6 @@
         datacatBuilder.setSite(SITE);
         datacatBuilder.setRunSummary(runSummary);
         datacatBuilder.build();
-        
         List<File> files = datacatBuilder.getFileList();
         
         // livetime measurements
@@ -50,14 +49,17 @@
         spreadsheetBuilder.setSpreadsheetFile(new File(SPREADSHEET));
         spreadsheetBuilder.setRunSummary(datacatBuilder.getRunSummary());
         spreadsheetBuilder.build();
+                
+        // EPICS and scalers (would actually run this in a separate job/process per file)
+        EvioDataBuilder dataBuilder = new EvioDataBuilder();
+        dataBuilder.setEvioFile(new File(EVIO_TEST_FILE));
+        dataBuilder.build();
         
-        // database updater
-        Connection connection = CONNECTION_PARAMETERS.createConnection();
-        DatabaseUpdater updater = new DatabaseUpdater(connection);
-        updater.setRunSummary(runSummary);
-        System.out.println("built run summary ...");
-        System.out.println(runSummary);
-        //updater.setTriggerConfigData(configBuilder.getTriggerConfigData());
-        //updater.update();
+        // update in database
+        RunManager runManager = new RunManager(CONNECTION_PARAMETERS.createConnection());
+        runManager.updateRunSummary(runSummary, true);
+        runManager.updateTriggerConfig(configBuilder.getTriggerConfigData(), true);
+        runManager.updateEpicsData(dataBuilder.getEpicsData());
+        runManager.updateScalerData(dataBuilder.getScalerData());
     }
 }