Author: [log in to unmask] Date: Wed Aug 26 19:31:38 2015 New Revision: 3411 Log: Various changes in record-util module for getting a stable version of run database API. Added: java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryImpl.java java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDao.java - copied, changed from r3409, java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDao.java java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDaoImpl.java - copied, changed from r3409, java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDaoImpl.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TiTimeOffsetEvioProcessor.java - copied, changed from r3409, java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigInt.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigVariable.java Removed: java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfig.java java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDao.java java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDaoImpl.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioBankTag.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/Crawler.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileVisitor.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryMap.java java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryDaoImpl.java Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioBankTag.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioBankTag.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioBankTag.java Wed Aug 26 19:31:38 2015 @@ -49,7 +49,7 @@ */ public BaseStructure findBank(final BaseStructure startBank) { BaseStructure foundBank = null; - if (this.isBankTag(startBank)) { + if (this.equals(startBank)) { foundBank = startBank; } else if (startBank.getChildrenList() != null) { for (final BaseStructure subBank : startBank.getChildrenList()) { @@ -77,7 +77,7 @@ * @param bank the EVIO data bank * @return <code>true</code> if bank's tag matches this one */ - public boolean isBankTag(final BaseStructure bank) { + public boolean equals(final BaseStructure bank) { return bank.getHeader().getTag() == bankTag; } @@ -87,7 +87,7 @@ * @param bankTag the bank tag value * @return <code>true</code> if the bank tag value matches this one */ - public boolean isBankTag(final int bankTag) { + public boolean equals(final int bankTag) { return bankTag == this.getBankTag(); } } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/Crawler.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/Crawler.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/Crawler.java Wed Aug 26 19:31:38 2015 @@ -23,6 +23,7 @@ import org.hps.conditions.database.ConnectionParameters; import org.hps.record.run.RunSummary; import org.hps.record.run.RunSummaryDaoImpl; +import org.hps.record.run.RunSummaryImpl; import org.lcsim.util.log.DefaultLogFormatter; import org.lcsim.util.log.LogUtil; @@ -53,7 +54,6 @@ * Statically define the command options. */ static { - // TODO: add -f argument with file name to include; others would be excluded if they do not match OPTIONS.addOption("b", "min-date", true, "min date for a file (example \"2015-03-26 11:28:59\")"); OPTIONS.addOption("c", "cache", false, "automatically cache files from MSS to cache disk (JLAB only)"); OPTIONS.addOption("C", "connection-properties", true, "database connection properties file (required)"); @@ -65,8 +65,7 @@ OPTIONS.addOption("r", "run", true, "add a run number to accept (when used others will be excluded)"); OPTIONS.addOption("t", "timestamp-file", true, "existing or new timestamp file name"); OPTIONS.addOption("w", "max-cache-wait", true, "total time to allow for file caching (seconds)"); - OPTIONS.addOption("u", "update", false, - "allow replacement of existing data in the run db (not allowed by default)"); + OPTIONS.addOption("u", "update", false, "allow replacement of existing data in the run db (not allowed by default)"); OPTIONS.addOption("x", "max-depth", true, "max depth to crawl in the directory tree"); } @@ -278,8 +277,6 @@ /** * Run the full crawler job. - * <p> - * This might take quite a long time! * * @throws Exception if there is some error during the job */ @@ -302,12 +299,12 @@ // Process all the files, performing caching from the MSS if necessary. LOGGER.info("processing all runs"); - RunProcessor.processAllRuns(this.cacheManager, runs, config); + processRuns(this.cacheManager, runs, config.useFileCache()); LOGGER.getHandlers()[0].flush(); // Execute the run database update. LOGGER.info("updating run database"); - this.updateRunDatabase(runs); + this.updateRunDatabase(runs); LOGGER.getHandlers()[0].flush(); // Update the timestamp output file. @@ -333,7 +330,7 @@ // Open a DB connection. final Connection connection = config.connectionParameters().createConnection(); - // Insert all run summaries into the database. + // Insert all run summaries into the database. new RunSummaryDaoImpl(connection).insertFullRunSummaries(new ArrayList<RunSummary>(runs.getRunSummaries()), config.allowUpdates()); @@ -396,4 +393,33 @@ throw new RuntimeException("Error while walking the directory tree.", e); } } + + /** + * Process all the runs that were found. + * + * @param runs the run log containing the list of run summaries + * @throws Exception if there is an error processing one of the runs + */ + static void processRuns(JCacheManager cacheManager, final RunSummaryMap runs, boolean useFileCache) + throws Exception { + + // Process all of the runs that were found. + for (final RunSummary runSummary : runs.getRunSummaries()) { + + // Clear the cache manager. + if (useFileCache) { + LOGGER.info("clearing file cache"); + cacheManager.clear(); + } + + // Create a processor to process all the EVIO events in the run. + LOGGER.info("creating run processor for " + runSummary.getRun()); + final RunProcessor runProcessor = new RunProcessor(cacheManager, (RunSummaryImpl) runSummary, useFileCache); + + // Process all of the files from the run. + LOGGER.info("processing run " + runSummary.getRun()); + runProcessor.processRun(); + } + } + } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileVisitor.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileVisitor.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileVisitor.java Wed Aug 26 19:31:38 2015 @@ -110,6 +110,7 @@ // Add this file to the file list for the run. this.runs.getRunSummary(run).addFile(file); + } else { // File was rejected by one of the filters. LOGGER.finer("rejected file " + file.getPath()); Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java Wed Aug 26 19:31:38 2015 @@ -1,25 +1,28 @@ package org.hps.record.evio.crawler; import java.io.File; +import java.util.Collections; import java.util.logging.Level; import java.util.logging.Logger; + import org.hps.record.epics.EpicsRunProcessor; import org.hps.record.evio.EvioFileMetaData; import org.hps.record.evio.EvioFileMetaDataReader; +import org.hps.record.evio.EvioFileSequenceComparator; import org.hps.record.evio.EvioFileSource; import org.hps.record.evio.EvioLoop; -import org.hps.record.run.RunSummary; +import org.hps.record.run.RunSummaryImpl; import org.hps.record.scalers.ScalersEvioProcessor; -import org.hps.record.triggerbank.TriggerEvioProcessor; +import org.hps.record.triggerbank.TiTimeOffsetEvioProcessor; +import org.hps.record.triggerbank.TriggerConfigInt; import org.lcsim.util.log.DefaultLogFormatter; import org.lcsim.util.log.LogUtil; /** - * Processes EVIO files from a run in order to extract various meta data - * information including start and end dates. + * Processes EVIO files from a run in order to extract various meta data information including start and end dates. * <p> - * This class is a wrapper for activating different sub-tasks, including - * optionally caching all files from the JLAB MSS to the cache disk. + * This class is a wrapper for activating different sub-tasks, including optionally caching all files from the JLAB MSS + * to the cache disk. * <p> * There is also a list of processors which is run on all events from the run. * @@ -31,35 +34,7 @@ * Setup logger. */ private static final Logger LOGGER = LogUtil.create(RunProcessor.class, new DefaultLogFormatter(), Level.FINE); - - /** - * Process all the runs that were found. - * - * @param runs the run log containing the list of run summaries - * @throws Exception if there is an error processing one of the runs - */ - static void processAllRuns(final JCacheManager cacheManager, final RunSummaryMap runs, final CrawlerConfig config) - throws Exception { - - // Process all of the runs that were found. - for (final RunSummary runSummary : runs.getRunSummaries()) { - - // Clear the cache manager. - if (config.useFileCache()) { - LOGGER.info("clearing file cache"); - cacheManager.clear(); - } - - // Create a processor to process all the EVIO events in the run. - LOGGER.info("creating run processor for " + runSummary.getRun()); - final RunProcessor runProcessor = new RunProcessor(cacheManager, runSummary, config); - - // Process all of the run's files. - LOGGER.info("processing run " + runSummary.getRun()); - runProcessor.processRun(); - } - } - + /** * The cache manager. */ @@ -68,7 +43,7 @@ /** * Processor for extracting EPICS information. */ - private final EpicsRunProcessor epicsLog; + private final EpicsRunProcessor epicsProcessor; /** * The data source with the list of EVIO files to process. @@ -83,7 +58,7 @@ /** * The run summary information updated by running this processor. */ - private final RunSummary runSummary; + private final RunSummaryImpl runSummary; /** * Processor for extracting scaler data. @@ -91,9 +66,9 @@ private final ScalersEvioProcessor scalersProcessor; /** - * Processor for extracting trigger config. - */ - private final TriggerEvioProcessor triggerProcessor; + * Processor for extracting TI time offset. + */ + private final TiTimeOffsetEvioProcessor triggerTimeProcessor; /** * Set to <code>true</code> to use file caching. @@ -106,45 +81,47 @@ * @param runSummary the run summary object for the run * @return the run processor */ - RunProcessor(final JCacheManager cacheManager, final RunSummary runSummary, final CrawlerConfig config) { + RunProcessor(final JCacheManager cacheManager, final RunSummaryImpl runSummary, boolean useFileCache) { this.runSummary = runSummary; this.cacheManager = cacheManager; + // Set whether file caching from MSS is enabled. + this.useFileCache = useFileCache; + + // Sort the list of EVIO files. + Collections.sort(runSummary.getEvioFiles(), new EvioFileSequenceComparator()); + // Setup record loop. - runSummary.sortFiles(); - evioFileSource = new EvioFileSource(runSummary.getEvioFileList()); + evioFileSource = new EvioFileSource(runSummary.getEvioFiles()); evioLoop.setEvioFileSource(evioFileSource); // Add EPICS processor. - epicsLog = new EpicsRunProcessor(); - evioLoop.addEvioEventProcessor(epicsLog); - - // Add Scaler data processor. + epicsProcessor = new EpicsRunProcessor(); + evioLoop.addEvioEventProcessor(epicsProcessor); + + // Add scaler data processor. scalersProcessor = new ScalersEvioProcessor(); scalersProcessor.setResetEveryEvent(false); evioLoop.addEvioEventProcessor(scalersProcessor); - - triggerProcessor = new TriggerEvioProcessor(); - evioLoop.addEvioEventProcessor(triggerProcessor); - - // Set whether file caching from MSS is enabled. - this.useFileCache(config.useFileCache()); + + // Add processor for extracting TI time offset. + triggerTimeProcessor = new TiTimeOffsetEvioProcessor(); + evioLoop.addEvioEventProcessor(triggerTimeProcessor); } /** * Cache all files and wait for the operation to complete. * <p> - * Potentially, this operation can take a very long time. This can be - * managed using the {@link JCacheManager#setWaitTime(long)} method to set a - * timeout. + * Potentially, this operation can take a very long time. This can be managed using the + * {@link JCacheManager#setWaitTime(long)} method to set a timeout. */ private void cacheFiles() { LOGGER.info("caching files from run " + this.runSummary.getRun()); - // Cache all the files and wait for the operation to complete (it will take awhile!). - this.cacheManager.cache(this.runSummary.getEvioFileList()); + // Cache all the files and wait for the operation to complete. + this.cacheManager.cache(this.runSummary.getEvioFiles()); final boolean cached = this.cacheManager.waitForCache(); // If the files weren't cached then die. @@ -156,18 +133,16 @@ } /** - * Process the run by executing the registered - * {@link org.hps.record.evio.EvioEventProcessor}s and extracting the start - * and end dates. + * Process the run by executing the registered {@link org.hps.record.evio.EvioEventProcessor}s and extracting the + * start and end dates. * <p> - * This method will also execute file caching from MSS, if enabled by the - * {@link #useFileCache} option. + * This method will also execute file caching from MSS, if enabled by the {@link #useFileCache} option. * * @throws Exception if there is an error processing a file */ void processRun() throws Exception { - LOGGER.info("processing " + this.runSummary.getEvioFileList().size() + " files from run " + LOGGER.info("processing " + this.runSummary.getEvioFiles().size() + " files from run " + this.runSummary.getRun()); // Cache files from MSS if this is enabled. @@ -181,11 +156,11 @@ evioLoop.loop(-1); // Get run start date. - LOGGER.info("setting run start date"); + LOGGER.info("processing first file"); this.processFirstFile(); // Get run end date. - LOGGER.info("setting run end date"); + LOGGER.info("processing last file"); this.processLastFile(); // Update run summary from processors. @@ -196,11 +171,10 @@ } /** - * Set the run end date by getting meta data from the last file and copying - * it to the run summary. + * Extract meta data from last file in run. */ private void processLastFile() { - final File lastEvioFile = runSummary.getEvioFileList().get(runSummary.getEvioFileList().size() - 1); + final File lastEvioFile = runSummary.getEvioFiles().get(runSummary.getEvioFiles().size() - 1); LOGGER.info("getting meta data for " + lastEvioFile.getPath()); final EvioFileMetaDataReader metaDataReader = new EvioFileMetaDataReader(); final EvioFileMetaData metaData = metaDataReader.getMetaData(lastEvioFile); @@ -215,11 +189,10 @@ } /** - * Set the run start date by getting meta data from the first file and - * copying it to the run summary. + * Extract meta data from first file in run. */ private void processFirstFile() { - final File firstEvioFile = runSummary.getEvioFileList().get(0); + final File firstEvioFile = runSummary.getEvioFiles().get(0); LOGGER.info("getting meta data for " + firstEvioFile.getPath()); final EvioFileMetaDataReader metaDataReader = new EvioFileMetaDataReader(); final EvioFileMetaData metaData = metaDataReader.getMetaData(firstEvioFile); @@ -233,8 +206,7 @@ } /** - * Update the current run summary by copying data to it from the EVIO - * processors. + * Update the current run summary by copying data to it from the EVIO processors and the event loop. */ private void updateRunSummary() { @@ -245,23 +217,11 @@ runSummary.setScalerData(this.scalersProcessor.getScalerData()); // Add EPICS data from the EPICS EVIO processor. - runSummary.setEpicsData(this.epicsLog.getEpicsData()); - - // Add trigger config from the trigger EVIO processor. - runSummary.setTriggerConfig(this.triggerProcessor.getTriggerConfig()); - } - - /** - * Set whether or not to use the file caching, which copies files from the - * JLAB MSS to the cache disk. - * <p> - * Since EVIO data files at JLAB are primarily kept on the MSS, running - * without this option enabled there will likely cause the job to fail. - * - * @param cacheFiles <code>true</code> to enabled file caching - */ - void useFileCache(final boolean cacheFiles) { - this.useFileCache = cacheFiles; - LOGGER.config("file caching enabled"); - } + runSummary.setEpicsData(this.epicsProcessor.getEpicsData()); + + // Add trigger config from the trigger time processor. + TriggerConfigInt triggerConfig = new TriggerConfigInt(); + this.triggerTimeProcessor.updateTriggerConfig(triggerConfig); + runSummary.setTriggerConfigInt(triggerConfig); + } } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryMap.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryMap.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryMap.java Wed Aug 26 19:31:38 2015 @@ -5,6 +5,7 @@ import java.util.logging.Logger; import org.hps.record.run.RunSummary; +import org.hps.record.run.RunSummaryImpl; import org.lcsim.util.log.LogUtil; /** @@ -13,7 +14,7 @@ * @author Jeremy McCormick, SLAC */ @SuppressWarnings("serial") -final class RunSummaryMap extends HashMap<Integer, RunSummary> { +final class RunSummaryMap extends HashMap<Integer, RunSummaryImpl> { /** * Setup logging. @@ -25,7 +26,7 @@ * * @return the collection of {@link RunSummary} objects */ - public Collection<RunSummary> getRunSummaries() { + Collection<RunSummaryImpl> getRunSummaries() { return this.values(); } @@ -37,10 +38,10 @@ * @param run the run number * @return the <code>RunSummary</code> for the run number */ - public RunSummary getRunSummary(final int run) { + RunSummaryImpl getRunSummary(final int run) { if (!this.containsKey(run)) { LOGGER.info("creating new RunSummary for run " + run); - this.put(run, new RunSummary(run)); + this.put(run, new RunSummaryImpl(run)); } return this.get(run); } Modified: java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java Wed Aug 26 19:31:38 2015 @@ -1,471 +1,143 @@ package org.hps.record.run; import java.io.File; -import java.io.PrintStream; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.GregorianCalendar; import java.util.List; -import java.util.Map; -import java.util.TimeZone; import org.hps.record.epics.EpicsData; -import org.hps.record.evio.EvioFileSequenceComparator; import org.hps.record.scalers.ScalerData; +import org.hps.record.triggerbank.TriggerConfigInt; /** - * This class models the run summary information which is persisted as a row in - * the <i>run_log</i> table of the run database. + * This is an API for accessing run summary information which is persisted as a row in the <i>runs</i> table of the run + * database. * <p> * This information includes: * <ul> * <li>run number</li> - * <li>start time (UTC)</li> - * <li>end time (UTC)</li> - * <li>total number of events in the run</li> - * <li>number of EVIO files in the run</li> - * <li>whether the END event was found indicating that the DAQ did not - * crash</li> + * <li>start date</li> + * <li>end date</li> + * <li>number of events</li> + * <li>number of EVIO files</li> + * <li>whether the END event was found indicating that the DAQ did not crash</li> * <li>whether the run is considered good (all <code>true</code> for now)</li> * </ul> * <p> - * It also references several complex objects including lists of - * {@link org.hps.record.epics.EpicsData} and - * {@link org.hps.record.scalers.ScalerData} for the run, as well as a list of - * EVIO files. + * It also references several complex objects including lists of {@link org.hps.record.epics.EpicsData} and + * {@link org.hps.record.scalers.ScalerData} for the run, as well as a list of EVIO files. * + * @see RunSummaryImpl + * @see RunSummaryDao + * @see RunSummaryDaoImpl + * @see RunManager + * * @author Jeremy McCormick, SLAC */ -public final class RunSummary { - - /** - * Default date display format. - */ - private static final DateFormat DATE_DISPLAY = new SimpleDateFormat(); - - static { - /** - * Set default time zone for display to East Coast (JLAB) where data was - * taken. - */ - DATE_DISPLAY.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("America/New_York"))); - } - - /** - * Date this record was created. - */ - private Date created; - - /** - * End date of run. - */ - private Date endDate; - - /** - * This is <code>true</code> if the END event is found in the data. - */ - private boolean endOkay; - - /** - * The run end time in UTC (milliseconds). - */ - private long endTimeUtc; - - /** - * The EPICS data from the run. - */ - private List<EpicsData> epicsDataList; - - /** - * The counts of different types of events that were found. - */ - private Map<Object, Integer> eventTypeCounts; - - /** - * The list of EVIO files in the run. - */ - private List<File> evioFileList = new ArrayList<File>(); - - /** - * The run number. - */ - private final int run; - - /** - * Flag to indicate run was okay. - */ - private boolean runOkay = true; - - /** - * The scaler data for the run. - */ - private List<ScalerData> scalerDataList; - - /** - * The trigger data for the run. - */ - private TriggerConfig triggerConfig; - - /** - * Start date of run. - */ - private Date startDate; - - /** - * The total events found in the run across all files. - */ - private int totalEvents = -1; - - /** - * The total number of files in the run. - */ - private int totalFiles = 0; - - /** - * Date when the run record was last updated. - */ - private Date updated; - - /** - * Create a run summary. - * - * @param run the run number - */ - public RunSummary(final int run) { - this.run = run; - } - - /** - * Add an EVIO file from this run to the list. - * - * @param file the file to add - */ - public void addFile(final File file) { - this.evioFileList.add(file); - } - +public interface RunSummary { + /** * Get the creation date of this run record. * * @return the creation date of this run record */ - public Date getCreated() { - return this.created; - } + Date getCreated(); /** * Get the end date. * * @return the end date */ - public Date getEndDate() { - return endDate; - } + Date getEndDate(); /** * Return <code>true</code> if END event was found in the data. * * @return <code>true</code> if END event was in the data */ - public boolean getEndOkay() { - return this.endOkay; - } + boolean getEndOkay(); /** * Get the EPICS data from the run. * * @return the EPICS data from the run */ - public List<EpicsData> getEpicsDataSet() { - return this.epicsDataList; - } + List<EpicsData> getEpicsData(); /** - * Get the event rate (effectively the trigger rate) which is the total - * events divided by the number of seconds in the run. + * Get the event rate (effectively the trigger rate) which is the total events divided by the number of seconds in + * the run. * * @return the event rate */ - public double getEventRate() { - if (this.getTotalEvents() <= 0) { - throw new RuntimeException("Total events is zero or invalid."); - } - return (double) this.getTotalEvents() / (double) this.getTotalSeconds(); - } - - /** - * Get the counts of different event types. - * - * @return the counts of different event types - */ - public Map<Object, Integer> getEventTypeCounts() { - return this.eventTypeCounts; - } + double getEventRate(); /** * Get the list of EVIO files in this run. * * @return the list of EVIO files in this run */ - public List<File> getEvioFileList() { - return this.evioFileList; - } + List<File> getEvioFiles(); /** * Get the run number. * * @return the run number */ - public int getRun() { - return this.run; - } + int getRun(); /** - * Return <code>true</code> if the run was okay (no major errors or data - * corruption occurred). + * Return <code>true</code> if the run was okay (no major errors or data corruption occurred). * * @return <code>true</code> if the run was okay */ - public boolean getRunOkay() { - return this.runOkay; - } + boolean getRunOkay(); /** * Get the scaler data of this run. * * @return the scaler data of this run */ - public List<ScalerData> getScalerData() { - return this.scalerDataList; - } + List<ScalerData> getScalerData(); /** - * Get the trigger config of this run. + * Get the trigger config int values. * - * @return the trigger config of this run + * @return the trigger config int values */ - public TriggerConfig getTriggerConfig() { - return triggerConfig; - } + TriggerConfigInt getTriggerConfigInt(); /** * Get the start date. * * @return the start date */ - public Date getStartDate() { - return startDate; - } + Date getStartDate(); /** * Get the total events in the run. * * @return the total events in the run */ - public int getTotalEvents() { - return this.totalEvents; - } + int getTotalEvents(); /** * Get the total number of files for this run. * * @return the total number of files for this run */ - public int getTotalFiles() { - return this.totalFiles; - } + int getTotalFiles(); /** - * Get the number of seconds in the run which is the difference between the - * start and end times. + * Get the number of seconds in the run which is the difference between the start and end times. * * @return the total seconds in the run */ - public long getTotalSeconds() { - return (endDate.getTime() - startDate.getTime()) / 1000; - } + long getTotalSeconds(); /** * Get the date when this run record was last updated. * * @return the date when this run record was last updated */ - public Date getUpdated() { - return updated; - } - - /** - * Print the run summary. - * - * @param ps the print stream for output - */ - public void printOut(final PrintStream ps) { - ps.println("--------------------------------------------"); - ps.println("run: " + this.run); - ps.println("first file: " + this.evioFileList.get(0)); - ps.println("last file: " + this.evioFileList.get(evioFileList.size() - 1)); - ps.println("started: " + DATE_DISPLAY.format(this.getStartDate())); - ps.println("ended: " + DATE_DISPLAY.format(this.getEndDate())); - ps.println("total events: " + this.getTotalEvents()); - ps.println("end OK: " + this.getEndOkay()); - ps.println("event rate: " + this.getEventRate()); - ps.println("event types"); - for (final Object key : this.eventTypeCounts.keySet()) { - ps.println(" " + key + ": " + this.eventTypeCounts.get(key)); - } - ps.println(this.evioFileList.size() + " files"); - for (final File file : this.evioFileList) { - ps.println(" " + file.getPath()); - } - } - - /** - * Set the creation date of the run record. - * - * @param created the creation date of the run record - */ - public void setCreated(final Date created) { - this.created = created; - } - - /** - * Set the start date. - * - * @param startDate the start date - */ - public void setEndDate(final Date endDate) { - this.endDate = endDate; - } - - /** - * Set if end is okay. - * - * @param endOkay <code>true</code> if end is okay - */ - public void setEndOkay(final boolean endOkay) { - this.endOkay = endOkay; - } - - /** - * Set the end date. - * - * @param endTimeUtc the end date - */ - public void setEndTimeUtc(final long endTimeUtc) { - this.endTimeUtc = endTimeUtc; - } - - /** - * Set the EPICS data for the run. - * - * @param epics the EPICS data for the run - */ - public void setEpicsData(final List<EpicsData> epicsDataList) { - this.epicsDataList = epicsDataList; - } - - /** - * Set the event type counts for the run. - * - * @param eventTypeCounts the event type counts for the run - */ - public void setEventTypeCounts(final Map<Object, Integer> eventTypeCounts) { - this.eventTypeCounts = eventTypeCounts; - } - - /** - * Set the list of EVIO files for the run. - * - * @param evioFileList the list of EVIO files for the run - */ - public void setEvioFileList(final List<File> evioFileList) { - this.evioFileList = evioFileList; - } - - /** - * Set whether the run was "okay" meaning the data is usable for physics - * analysis. - * - * @param runOkay <code>true</code> if the run is okay - */ - public void setRunOkay(final boolean runOkay) { - this.runOkay = runOkay; - } - - /** - * Set the scaler data of the run. - * - * @param scalerData the scaler data - */ - public void setScalerData(final List<ScalerData> scalerDataList) { - this.scalerDataList = scalerDataList; - } - - /** - * Set the trigger config of the run. - * - * @param triggerConfig the trigger config - */ - public void setTriggerConfig(final TriggerConfig triggerConfig) { - this.triggerConfig = triggerConfig; - } - - /** - * Set the start date. - * - * @param startDate the start date - */ - public void setStartDate(final Date startDate) { - this.startDate = startDate; - } - - /** - * Set the total number of physics events in the run. - * - * @param totalEvents the total number of physics events in the run - */ - public void setTotalEvents(final int totalEvents) { - this.totalEvents = totalEvents; - } - - /** - * Set the total number of EVIO files in the run. - * - * @param totalFiles the total number of EVIO files in the run - */ - public void setTotalFiles(final int totalFiles) { - this.totalFiles = totalFiles; - } - - /** - * Set the date when this run record was last updated. - * - * @param updated the date when the run record was last updated - */ - public void setUpdated(final Date updated) { - this.updated = updated; - } - - /** - * Sort the files in the run by sequence number in place. - */ - public void sortFiles() { - Collections.sort(this.evioFileList, new EvioFileSequenceComparator()); - } - - /** - * Convert this object to a string. - * - * @return this object converted to a string - */ - @Override - public String toString() { - return "RunSummary { run: " + this.getRun() + ", startDate: " + DATE_DISPLAY.format(this.getStartDate()) - + ", endDate: " + DATE_DISPLAY.format(this.getEndDate()) + ", totalEvents: " + this.getTotalEvents() - + ", totalFiles: " + this.getTotalFiles() + ", endOkay: " + this.getEndOkay() + ", runOkay: " - + this.getRunOkay() + ", updated: " + this.getUpdated() + ", created: " + this.getCreated() + " }"; - } + Date getUpdated(); } Modified: java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryDaoImpl.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryDaoImpl.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryDaoImpl.java Wed Aug 26 19:31:38 2015 @@ -78,6 +78,11 @@ * The database API for scaler data. */ private ScalerDataDao scalerDataDao = null; + + /** + * The database API for integer trigger config. + */ + private TriggerConfigIntDao triggerConfigIntDao = null; /** * Create a new DAO object for run summary information. @@ -95,6 +100,7 @@ epicsDataDao = new EpicsDataDaoImpl(this.connection); scalerDataDao = new ScalerDataDaoImpl(this.connection); evioFilesDao = new EvioFilesDaoImpl(this.connection); + triggerConfigIntDao = new TriggerConfigIntDaoImpl(this.connection); } /** @@ -104,17 +110,23 @@ */ @Override public void deleteFullRunSummary(final RunSummary runSummary) { + + int run = runSummary.getRun(); + // Delete EPICS log. - epicsDataDao.deleteEpicsData(runSummary.getRun()); + this.epicsDataDao.deleteEpicsData(run); // Delete scaler data. - scalerDataDao.deleteScalerData(runSummary.getRun()); + this.scalerDataDao.deleteScalerData(run); // Delete file list. - evioFilesDao.deleteEvioFiles(runSummary.getRun()); + this.evioFilesDao.deleteEvioFiles(run); + + // Delete trigger config. + this.triggerConfigIntDao.deleteTriggerConfigInt(run); // Finally delete the run summary information. - this.deleteRunSummary(runSummary.getRun()); + this.deleteRunSummary(run); } /** @@ -210,7 +222,7 @@ statement = this.connection.prepareStatement(RunSummaryQuery.SELECT_ALL); final ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { - final RunSummary runSummary = new RunSummary(resultSet.getInt("run")); + final RunSummaryImpl runSummary = new RunSummaryImpl(resultSet.getInt("run")); runSummary.setStartDate(resultSet.getTimestamp("start_date")); runSummary.setEndDate(resultSet.getTimestamp("end_date")); runSummary.setTotalEvents(resultSet.getInt("nevents")); @@ -244,7 +256,7 @@ @Override public RunSummary getRunSummary(final int run) { PreparedStatement statement = null; - RunSummary runSummary = null; + RunSummaryImpl runSummary = null; try { statement = this.connection.prepareStatement(RunSummaryQuery.SELECT_RUN); statement.setInt(1, run); @@ -253,7 +265,7 @@ throw new IllegalArgumentException("No record exists for run " + run + " in database."); } - runSummary = new RunSummary(run); + runSummary = new RunSummaryImpl(run); runSummary.setStartDate(resultSet.getTimestamp("start_date")); runSummary.setEndDate(resultSet.getTimestamp("end_date")); runSummary.setTotalEvents(resultSet.getInt("nevents")); @@ -370,16 +382,21 @@ this.insertRunSummary(runSummary); // Insert list of files. - LOGGER.info("inserting EVIO " + runSummary.getEvioFileList().size() + " files"); - evioFilesDao.insertEvioFiles(runSummary.getEvioFileList(), runSummary.getRun()); + LOGGER.info("inserting EVIO " + runSummary.getEvioFiles().size() + " files"); + evioFilesDao.insertEvioFiles(runSummary.getEvioFiles(), runSummary.getRun()); // Insert EPICS data. - LOGGER.info("inserting " + runSummary.getEpicsDataSet().size() + " EPICS records"); - epicsDataDao.insertEpicsData(runSummary.getEpicsDataSet()); + LOGGER.info("inserting " + runSummary.getEpicsData().size() + " EPICS records"); + epicsDataDao.insertEpicsData(runSummary.getEpicsData()); // Insert scaler data. LOGGER.info("inserting " + runSummary.getScalerData().size() + " scaler data records"); scalerDataDao.insertScalerData(runSummary.getScalerData(), runSummary.getRun()); + + // Insert trigger config. + LOGGER.info("inserting " + runSummary.getTriggerConfigInt().size() + " trigger config variables"); + triggerConfigIntDao.insertTriggerConfigInt(runSummary.getTriggerConfigInt(), runSummary.getRun()); + } /** @@ -396,7 +413,7 @@ preparedStatement.setTimestamp(2, new java.sql.Timestamp(runSummary.getStartDate().getTime()), CALENDAR); preparedStatement.setTimestamp(3, new java.sql.Timestamp(runSummary.getEndDate().getTime()), CALENDAR); preparedStatement.setInt(4, runSummary.getTotalEvents()); - preparedStatement.setInt(5, runSummary.getEvioFileList().size()); + preparedStatement.setInt(5, runSummary.getEvioFiles().size()); preparedStatement.setBoolean(6, runSummary.getEndOkay()); preparedStatement.executeUpdate(); } catch (final SQLException e) { @@ -422,7 +439,7 @@ public RunSummary readFullRunSummary(final int run) { // Read main run summary but not referenced objects. - final RunSummary runSummary = this.getRunSummary(run); + final RunSummaryImpl runSummary = (RunSummaryImpl) this.getRunSummary(run); // Read EPICS data and set on RunSummary. runSummary.setEpicsData(epicsDataDao.getEpicsData(run)); @@ -431,7 +448,10 @@ runSummary.setScalerData(scalerDataDao.getScalerData(run)); // Read EVIO file list and set on RunSummary. - runSummary.setEvioFileList(evioFilesDao.getEvioFiles(run)); + runSummary.setEvioFiles(evioFilesDao.getEvioFiles(run)); + + // Read trigger config. + runSummary.setTriggerConfigInt(triggerConfigIntDao.getTriggerConfigInt(run)); return runSummary; } @@ -476,7 +496,7 @@ preparedStatement.setTimestamp(1, new java.sql.Timestamp(runSummary.getStartDate().getTime()), CALENDAR); preparedStatement.setTimestamp(2, new java.sql.Timestamp(runSummary.getEndDate().getTime()), CALENDAR); preparedStatement.setInt(3, runSummary.getTotalEvents()); - preparedStatement.setInt(4, runSummary.getEvioFileList().size()); + preparedStatement.setInt(4, runSummary.getEvioFiles().size()); preparedStatement.setBoolean(5, runSummary.getEndOkay()); preparedStatement.setBoolean(6, runSummary.getRunOkay()); preparedStatement.setInt(7, runSummary.getRun()); Added: java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryImpl.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryImpl.java (added) +++ java/trunk/record-util/src/main/java/org/hps/record/run/RunSummaryImpl.java Wed Aug 26 19:31:38 2015 @@ -0,0 +1,381 @@ +package org.hps.record.run; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.TimeZone; + +import org.hps.record.epics.EpicsData; +import org.hps.record.scalers.ScalerData; +import org.hps.record.triggerbank.TriggerConfigInt; + +/** + * Implementation of {@link RunSummary} for retrieving information from the run database. + * + * @author Jeremy McCormick, SLAC + */ +public final class RunSummaryImpl implements RunSummary { + + /** + * Default date display format. + */ + private static final DateFormat DATE_DISPLAY = new SimpleDateFormat(); + + static { + /** + * Set default time zone for display to East Coast (JLAB) where data was + * taken. + */ + DATE_DISPLAY.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("America/New_York"))); + } + + /** + * Date this record was created. + */ + private Date created; + + /** + * End date of run. + */ + private Date endDate; + + /** + * This is <code>true</code> if the END event is found in the data. + */ + private boolean endOkay; + + /** + * The EPICS data from the run. + */ + private List<EpicsData> epicsDataList; + + /** + * The list of EVIO files in the run. + */ + private List<File> evioFileList = new ArrayList<File>(); + + /** + * The run number. + */ + private final int run; + + /** + * Flag to indicate run was okay. + */ + private boolean runOkay = true; + + /** + * The scaler data for the run. + */ + private List<ScalerData> scalerDataList; + + /** + * The trigger data for the run. + */ + private TriggerConfigInt triggerConfigInt; + + /** + * Start date of run. + */ + private Date startDate; + + /** + * The total events found in the run across all files. + */ + private int totalEvents = -1; + + /** + * The total number of files in the run. + */ + private int totalFiles = 0; + + /** + * Date when the run record was last updated. + */ + private Date updated; + + /** + * Create a run summary. + * + * @param run the run number + */ + public RunSummaryImpl(final int run) { + this.run = run; + } + + /** + * Add an EVIO file from this run to the list. + * + * @param file the file to add + */ + public void addFile(final File file) { + this.evioFileList.add(file); + } + + /** + * Get the creation date of this run record. + * + * @return the creation date of this run record + */ + public Date getCreated() { + return this.created; + } + + /** + * Get the end date. + * + * @return the end date + */ + public Date getEndDate() { + return endDate; + } + + /** + * Return <code>true</code> if END event was found in the data. + * + * @return <code>true</code> if END event was in the data + */ + public boolean getEndOkay() { + return this.endOkay; + } + + /** + * Get the EPICS data from the run. + * + * @return the EPICS data from the run + */ + public List<EpicsData> getEpicsData() { + return this.epicsDataList; + } + + /** + * Get the event rate (effectively the trigger rate) which is the total + * events divided by the number of seconds in the run. + * + * @return the event rate + */ + public double getEventRate() { + if (this.getTotalEvents() <= 0) { + throw new RuntimeException("Total events is zero or invalid."); + } + return (double) this.getTotalEvents() / (double) this.getTotalSeconds(); + } + + /** + * Get the list of EVIO files in this run. + * + * @return the list of EVIO files in this run + */ + public List<File> getEvioFiles() { + return this.evioFileList; + } + + /** + * Get the run number. + * + * @return the run number + */ + public int getRun() { + return this.run; + } + + /** + * Return <code>true</code> if the run was okay (no major errors or data + * corruption occurred). + * + * @return <code>true</code> if the run was okay + */ + public boolean getRunOkay() { + return this.runOkay; + } + + /** + * Get the scaler data of this run. + * + * @return the scaler data of this run + */ + public List<ScalerData> getScalerData() { + return this.scalerDataList; + } + + /** + * Get the trigger config of this run. + * + * @return the trigger config of this run + */ + public TriggerConfigInt getTriggerConfigInt() { + return triggerConfigInt; + } + + /** + * Get the start date. + * + * @return the start date + */ + public Date getStartDate() { + return startDate; + } + + /** + * Get the total events in the run. + * + * @return the total events in the run + */ + public int getTotalEvents() { + return this.totalEvents; + } + + /** + * Get the total number of files for this run. + * + * @return the total number of files for this run + */ + public int getTotalFiles() { + return this.totalFiles; + } + + /** + * Get the number of seconds in the run which is the difference between the + * start and end times. + * + * @return the total seconds in the run + */ + public long getTotalSeconds() { + return (endDate.getTime() - startDate.getTime()) / 1000; + } + + /** + * Get the date when this run record was last updated. + * + * @return the date when this run record was last updated + */ + public Date getUpdated() { + return updated; + } + + /** + * Set the creation date of the run record. + * + * @param created the creation date of the run record + */ + void setCreated(final Date created) { + this.created = created; + } + + /** + * Set the start date. + * + * @param startDate the start date + */ + public void setEndDate(final Date endDate) { + this.endDate = endDate; + } + + /** + * Set if end is okay. + * + * @param endOkay <code>true</code> if end is okay + */ + public void setEndOkay(final boolean endOkay) { + this.endOkay = endOkay; + } + + /** + * Set the EPICS data for the run. + * + * @param epics the EPICS data for the run + */ + public void setEpicsData(final List<EpicsData> epicsDataList) { + this.epicsDataList = epicsDataList; + } + + /** + * Set the list of EVIO files for the run. + * + * @param evioFileList the list of EVIO files for the run + */ + public void setEvioFiles(final List<File> evioFileList) { + this.evioFileList = evioFileList; + } + + /** + * Set whether the run was "okay" meaning the data is usable for physics + * analysis. + * + * @param runOkay <code>true</code> if the run is okay + */ + public void setRunOkay(final boolean runOkay) { + this.runOkay = runOkay; + } + + /** + * Set the scaler data of the run. + * + * @param scalerData the scaler data + */ + public void setScalerData(final List<ScalerData> scalerDataList) { + this.scalerDataList = scalerDataList; + } + + /** + * Set the trigger config of the run. + * + * @param triggerConfig the trigger config + */ + public void setTriggerConfigInt(final TriggerConfigInt triggerConfigInt) { + this.triggerConfigInt = triggerConfigInt; + } + + /** + * Set the start date. + * + * @param startDate the start date + */ + public void setStartDate(final Date startDate) { + this.startDate = startDate; + } + + /** + * Set the total number of physics events in the run. + * + * @param totalEvents the total number of physics events in the run + */ + public void setTotalEvents(final int totalEvents) { + this.totalEvents = totalEvents; + } + + /** + * Set the total number of EVIO files in the run. + * + * @param totalFiles the total number of EVIO files in the run + */ + public void setTotalFiles(final int totalFiles) { + this.totalFiles = totalFiles; + } + + /** + * Set the date when this run record was last updated. + * + * @param updated the date when the run record was last updated + */ + public void setUpdated(final Date updated) { + this.updated = updated; + } + + /** + * Convert this object to a string. + * + * @return this object converted to a string + */ + @Override + public String toString() { + return "RunSummary { run: " + this.getRun() + ", startDate: " + DATE_DISPLAY.format(this.getStartDate()) + + ", endDate: " + DATE_DISPLAY.format(this.getEndDate()) + ", totalEvents: " + this.getTotalEvents() + + ", totalFiles: " + this.getTotalFiles() + ", endOkay: " + this.getEndOkay() + ", runOkay: " + + this.getRunOkay() + ", updated: " + this.getUpdated() + ", created: " + this.getCreated() + " }"; + } +} Copied: java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDao.java (from r3409, java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDao.java) ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDao.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDao.java Wed Aug 26 19:31:38 2015 @@ -1,11 +1,13 @@ package org.hps.record.run; + +import org.hps.record.triggerbank.TriggerConfigInt; /** * Database interface to trigger config. * * @author Jeremy McCormick, SLAC */ -public interface TriggerConfigDao { +public interface TriggerConfigIntDao { /** * Get the trigger config by run. @@ -13,7 +15,7 @@ * @param run the run number * @return the trigger config */ - TriggerConfig getTriggerConfig(int run); + TriggerConfigInt getTriggerConfigInt(int run); /** * Insert a trigger config for a run. @@ -21,21 +23,12 @@ * @param run the run number * @param triggerConfig the trigger config */ - void insertTriggerConfig(int run, TriggerConfig triggerConfig); - - - /** - * Update a trigger config by run number. - * - * @param run the run number - * @param triggerConfig the trigger config - */ - void updateTriggerConfig(int run, TriggerConfig triggerConfig); - + void insertTriggerConfigInt(TriggerConfigInt triggerConfig, int run); + /** * Delete a trigger config by run number. * * @param run the run number */ - void deleteTriggerConfig(int run); + void deleteTriggerConfigInt(int run); } Copied: java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDaoImpl.java (from r3409, java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDaoImpl.java) ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigDaoImpl.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfigIntDaoImpl.java Wed Aug 26 19:31:38 2015 @@ -4,13 +4,16 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Map; + +import org.hps.record.triggerbank.TriggerConfigInt; /** * Implementation of trigger config database interface. * * @author Jeremy McCormick, SLAC */ -public class TriggerConfigDaoImpl implements TriggerConfigDao { +public class TriggerConfigIntDaoImpl implements TriggerConfigIntDao { /** * The database connection. @@ -24,19 +27,15 @@ /** * Select by run. */ - static final String SELECT_RUN = "SELECT * FROM run_trigger_config WHERE run = ?"; + static final String SELECT_RUN = "SELECT * FROM run_trigger_config_int WHERE run = ?"; /** * Insert by run. */ - static final String INSERT_RUN = "INSERT INTO run_trigger_config (run, ti_time_offset) VALUES (?, ?)"; - /** - * Update by run. - */ - static final String UPDATE_RUN = "UPDATE run_trigger_config SET ti_time_offset = ? WHERE run = ?"; + static final String INSERT_VARIABLE = "INSERT INTO run_trigger_config_int (run, variable_name, value) VALUES (?, ?, ?)"; /** * Delete by run. */ - static final String DELETE_RUN = "DELETE FROM run_trigger_config WHERE run = ?"; + static final String DELETE_RUN = "DELETE FROM run_trigger_config_int WHERE run = ?"; } /** @@ -44,27 +43,19 @@ * * @param connection the database connection */ - TriggerConfigDaoImpl(Connection connection) { + TriggerConfigIntDaoImpl(Connection connection) { this.connection = connection; } - - /** - * Get the trigger config by run. - * - * @param run the run number - * @return the trigger config - */ + @Override - public TriggerConfig getTriggerConfig(int run) { + public TriggerConfigInt getTriggerConfigInt(int run) { PreparedStatement preparedStatement = null; - TriggerConfig triggerConfig = null; + TriggerConfigInt triggerConfig = new TriggerConfigInt(); try { preparedStatement = connection.prepareStatement(TriggerConfigQuery.SELECT_RUN); - preparedStatement.setInt(1, run); - final ResultSet resultSet = preparedStatement.executeQuery(); - if (resultSet.next()) { - triggerConfig = new TriggerConfig(); - triggerConfig.setTiTimeOffset(resultSet.getLong("ti_time_offset")); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + triggerConfig.put(resultSet.getString("variable_name"), resultSet.getLong("value")); } } catch (final SQLException e) { throw new RuntimeException(e); @@ -78,47 +69,17 @@ return triggerConfig; } - /** - * Insert a trigger config for a run. - * - * @param run the run number - * @param triggerConfig the trigger config - */ @Override - public void insertTriggerConfig(int run, TriggerConfig triggerConfig) { + public void insertTriggerConfigInt(TriggerConfigInt triggerConfig, int run) { PreparedStatement preparedStatement = null; try { - preparedStatement = connection.prepareStatement(TriggerConfigQuery.INSERT_RUN); - preparedStatement.setInt(1, run); - preparedStatement.setLong(2, triggerConfig.getTiTimeOffset()); - preparedStatement.executeUpdate(); - } catch (final SQLException e) { - throw new RuntimeException(e); - } finally { - if (preparedStatement != null) { - try { - preparedStatement.close(); - } catch (final SQLException e) { - e.printStackTrace(); - } + preparedStatement = connection.prepareStatement(TriggerConfigQuery.INSERT_VARIABLE); + for (Map.Entry<String, Long> entry : triggerConfig.entrySet()) { + preparedStatement.setInt(1, run); + preparedStatement.setString(2, entry.getKey()); + preparedStatement.setLong(3, entry.getValue()); + preparedStatement.executeUpdate(); } - } - } - - /** - * Update a trigger config by run number. - * - * @param run the run number - * @param triggerConfig the trigger config - */ - @Override - public void updateTriggerConfig(int run, TriggerConfig triggerConfig) { - PreparedStatement preparedStatement = null; - try { - preparedStatement = connection.prepareStatement(TriggerConfigQuery.UPDATE_RUN); - preparedStatement.setLong(1, triggerConfig.getTiTimeOffset()); - preparedStatement.setInt(2, run); - preparedStatement.executeUpdate(); } catch (final SQLException e) { throw new RuntimeException(e); } finally { @@ -133,13 +94,8 @@ } - /** - * Delete a trigger config by run number. - * - * @param run the run number - */ @Override - public void deleteTriggerConfig(int run) { + public void deleteTriggerConfigInt(int run) { PreparedStatement preparedStatement = null; try { preparedStatement = connection.prepareStatement(TriggerConfigQuery.DELETE_RUN); @@ -155,6 +111,6 @@ e.printStackTrace(); } } - } - } + } + } } Copied: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TiTimeOffsetEvioProcessor.java (from r3409, java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java) ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TiTimeOffsetEvioProcessor.java Wed Aug 26 19:31:38 2015 @@ -1,24 +1,23 @@ package org.hps.record.triggerbank; import org.hps.record.evio.EvioEventProcessor; -import org.hps.record.run.TriggerConfig; import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition; import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.EvioEvent; /** - * + * Extract trigger time offset from EVIO data. + * * @author Sho Uemura <[log in to unmask]> - * @version $Id: $ */ -public class TriggerEvioProcessor extends EvioEventProcessor { +public class TiTimeOffsetEvioProcessor extends EvioEventProcessor { private final IntBankDefinition headBankDefinition; private final IntBankDefinition tiBankDefinition; private long minOffset = 0; private long maxOffset = 0; - public TriggerEvioProcessor() { + public TiTimeOffsetEvioProcessor() { headBankDefinition = new IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f}); tiBankDefinition = new IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a}); } @@ -42,15 +41,13 @@ } } } - - public TriggerConfig getTriggerConfig() { - TriggerConfig triggerConfig = new TriggerConfig(); + + public void updateTriggerConfig(TriggerConfigInt triggerConfig) { long offsetRange = maxOffset - minOffset; if (offsetRange > 0.99 * 1e9 && offsetRange < 1.01 * 1e9) { - triggerConfig.setTiTimeOffset(minOffset); + triggerConfig.put(TriggerConfigVariable.TI_TIME_OFFSET.name(), minOffset); } else { - triggerConfig.setTiTimeOffset(0); + triggerConfig.put(TriggerConfigVariable.TI_TIME_OFFSET.name(), 0L); } - return triggerConfig; } } Added: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigInt.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigInt.java (added) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigInt.java Wed Aug 26 19:31:38 2015 @@ -0,0 +1,25 @@ +package org.hps.record.triggerbank; + +import java.util.HashMap; + +/** + * Trigger config information in the form of string keys and long values. + * <p> + * This is not the "standard" interface using in LCSim to access trigger configuration. + * It is used as a simplistic representation for the run database. + * + * @author Jeremy McCormick, SLAC + */ +@SuppressWarnings("serial") +public class TriggerConfigInt extends HashMap<String, Long> { + + /** + * Get a particular trigger config variable's value. + * + * @param variable the variable enum + * @return the variable's value + */ + Long getValue(TriggerConfigVariable variable) { + return this.get(variable.name()); + } +} Added: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigVariable.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigVariable.java (added) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigVariable.java Wed Aug 26 19:31:38 2015 @@ -0,0 +1,13 @@ +package org.hps.record.triggerbank; + +/** + * Enum for trigger config variables. + * + * @author Jeremy McCormick, SLAC + */ +public enum TriggerConfigVariable { + /** + * TI time offset + */ + TI_TIME_OFFSET +}