Author: [log in to unmask] Date: Tue Aug 4 15:11:36 2015 New Revision: 3333 Log: Change crawler to use UTC times in milliseconds instead of SQL timestamps. HPSJAVA-570 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/EvioFileFilter.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileSequenceComparator.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.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/JCacheManager.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunFilter.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/RunSummaryUpdater.java 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 Tue Aug 4 15:11:36 2015 @@ -308,7 +308,7 @@ runs.sortFiles(); // Process all the files, performing caching from the MSS if necessary. - RunProcessor.processRuns(this.cacheManager, runs, config); + RunProcessor.processAllRuns(this.cacheManager, runs, config); // Print the summary information after the run processing is done. runs.printRunSummaries(); Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileFilter.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileFilter.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileFilter.java Tue Aug 4 15:11:36 2015 @@ -21,7 +21,7 @@ final boolean isEvio = pathname.getName().contains(".evio"); boolean hasSeqNum = false; try { - EvioFileUtilities.getSequenceNumber(pathname); + EvioFileUtilities.getSequence(pathname); hasSeqNum = true; } catch (final Exception e) { } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileSequenceComparator.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileSequenceComparator.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileSequenceComparator.java Tue Aug 4 15:11:36 2015 @@ -17,8 +17,8 @@ */ @Override public int compare(final File o1, final File o2) { - final Integer sequenceNumber1 = EvioFileUtilities.getSequenceNumber(o1); - final Integer sequenceNumber2 = EvioFileUtilities.getSequenceNumber(o2); + final Integer sequenceNumber1 = EvioFileUtilities.getSequence(o1); + final Integer sequenceNumber2 = EvioFileUtilities.getSequence(o2); return sequenceNumber1.compareTo(sequenceNumber2); } } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java Tue Aug 4 15:11:36 2015 @@ -2,7 +2,6 @@ import java.io.File; import java.io.IOException; -import java.util.Date; import java.util.logging.Logger; import org.hps.record.evio.EvioEventConstants; @@ -48,44 +47,50 @@ } /** - * Get the date from the control bank of an EVIO event. - * - * @param file the EVIO file - * @param eventTag the event tag on the bank - * @param gotoEvent an event to start the scanning - * @return the control bank date or null if not found - */ - static Date getControlDate(final File file, final int eventTag, final int gotoEvent) { - Date date = null; - EvioReader reader = null; + * Get the end date + * + * @param evioReader the <code>EvioReader</code> + * @return the run end date + */ + static Long getEndTimestamp(final EvioReader evioReader) { + + // Date endDate = null; + Long timestamp = null; + try { - reader = open(file, true); - EvioEvent event; - if (gotoEvent > 0) { - reader.gotoEventNumber(gotoEvent); - } else if (gotoEvent < 0) { - reader.gotoEventNumber(reader.getEventCount() + gotoEvent); - } - while ((event = reader.parseNextEvent()) != null) { - if (event.getHeader().getTag() == eventTag) { - final int[] data = EvioEventUtilities.getControlEventData(event); - final long seconds = data[0]; - date = new Date(seconds * MILLISECONDS); - break; + // Search for the last physics event in the last 5 events of the file. + System.out.println("going to event " + (evioReader.getEventCount() - 5) + " / " + + evioReader.getEventCount() + " to find end date"); + evioReader.gotoEventNumber(evioReader.getEventCount() - 5); + EvioEvent evioEvent = null; + EvioEvent lastPhysicsEvent = null; + + // Find last physics event. + while ((evioEvent = evioReader.parseNextEvent()) != null) { + if (EvioEventUtilities.isPhysicsEvent(evioEvent)) { + lastPhysicsEvent = evioEvent; } } + + // If there is no physics event found this is an error. + if (lastPhysicsEvent == null) { + throw new RuntimeException("No physics event found."); + } + + // Get the timestamp from the head bank of the physics event. + LOGGER.info("getting head bank date from " + lastPhysicsEvent.getEventNumber()); + final Long eventTimestamp = getHeadBankTimestamp(lastPhysicsEvent); + if (eventTimestamp != null) { + LOGGER.info("found end timestamp " + eventTimestamp); + timestamp = eventTimestamp; + } else { + throw new RuntimeException("No timestamp found in head bank."); + } + } catch (EvioException | IOException e) { throw new RuntimeException(e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (final IOException e) { - e.printStackTrace(); - } - } - } - return date; + } + return timestamp; } /** @@ -94,63 +99,18 @@ * @param event the EVIO file * @return the date from the head bank or null if not found */ - static Date getHeadBankDate(final EvioEvent event) { - Date date = null; + static Long getHeadBankTimestamp(final EvioEvent event) { + // Date date = null; + Long timestamp = null; final BaseStructure headBank = EvioEventUtilities.getHeadBank(event); if (headBank != null) { final int[] data = headBank.getIntData(); final long time = data[3]; if (time != 0L) { - date = new Date(time * MILLISECONDS); - } - } - return date; - } - - /** - * Get the run end date which is taken either from the END event or the last physics event if the END event is not - * found in the file. - * - * @param file the EVIO file - * @return the run end date - */ - static Date getRunEnd(final File file) { - - // Search for the END event in the last 10 events of the file. - Date endDate = getControlDate(file, EvioEventConstants.END_EVENT_TAG, -10); - - // Was the end date found from the END event? - if (endDate == null) { - - EvioReader reader = null; - try { - reader = open(file, true); - - // Search for the last physics event in the last 10 events of the file. - reader.gotoEventNumber(reader.getEventCount() - 10); - EvioEvent event = null; - while ((event = reader.parseNextEvent()) != null) { - if (EvioEventUtilities.isPhysicsEvent(event)) { - final Date eventDate = getHeadBankDate(event); - if (eventDate != null) { - // This might be set multiple times but should result in the time of the last physics event. - endDate = eventDate; - } - } - } - } catch (EvioException | IOException e) { - throw new RuntimeException(e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (final IOException e) { - e.printStackTrace(); - } - } - } - } - return endDate; + timestamp = time * MILLISECONDS; + } + } + return timestamp; } /** @@ -160,7 +120,7 @@ * @return the run number * @throws Exception if there is a problem parsing out the run number */ - static Integer getRunFromName(final File file) { + static Integer getRun(final File file) { final String name = file.getName(); final int startIndex = name.lastIndexOf("_") + 1; final int endIndex = name.indexOf("."); @@ -168,58 +128,71 @@ } /** - * Get the run start date from an EVIO file (should be the first file in the run). - * <p> - * This is taken from the PRESTART event if available or the first physics event. - * - * @param file the EVIO file + * Get the EVIO file sequence number, which is the number at the end of the file name. + * + * @param file the EVIO file + * @return the file's sequence number + * @throws Exception if there is an error parsing out the sequence number + */ + static Integer getSequence(final File file) { + final String name = file.getName(); + return Integer.parseInt(name.substring(name.lastIndexOf(".") + 1)); + } + + /** + * Get the start date from the first physics event. + * + * @param evioReader the <code>EvioReader</code> * @return the run start date */ - static Date getRunStart(final File file) { - - // First try to find the start date in the special PRESTART event. - Date date = getControlDate(file, EvioEventConstants.PRESTART_EVENT_TAG, 0); - - // Was start date not found from PRESTART? - if (date == null) { - - // Read events until there is a physics event and use its time for the start date. - EvioReader reader = null; - try { - reader = open(file, true); - EvioEvent event = null; - while ((event = reader.parseNextEvent()) != null) { - if (EvioEventUtilities.isPhysicsEvent(event)) { - if ((date = getHeadBankDate(event)) != null) { - break; - } + static Long getStartTimestamp(final EvioReader evioReader) { + + Long timestamp = null; + + // Read events until there is a physics event and return its timestamp. + try { + EvioEvent event = null; + while ((event = evioReader.parseNextEvent()) != null) { + if (EvioEventUtilities.isPhysicsEvent(event)) { + if ((timestamp = getHeadBankTimestamp(event)) != null) { + break; } } - } catch (EvioException | IOException e) { - throw new RuntimeException(e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (final IOException e) { - e.printStackTrace(); - } + } + } catch (EvioException | IOException e) { + throw new RuntimeException(e); + } + return timestamp; + } + + /** + * Get the date from the control bank of an EVIO event. + * + * @param file the EVIO file + * @param eventTag the event tag on the bank + * @param gotoEvent an event to start the scanning + * @return the control bank date or null if not found + */ + static Long getTimestamp(final EvioReader evioReader, final int eventTag, final int gotoEvent) { + Long timestamp = null; + try { + EvioEvent evioEvent; + if (gotoEvent > 0) { + evioReader.gotoEventNumber(gotoEvent); + } else if (gotoEvent < 0) { + evioReader.gotoEventNumber(evioReader.getEventCount() + gotoEvent); + } + while ((evioEvent = evioReader.parseNextEvent()) != null) { + if (evioEvent.getHeader().getTag() == eventTag) { + final int[] data = EvioEventUtilities.getControlEventData(evioEvent); + timestamp = (long) (data[0] * MILLISECONDS); + break; } } - } - return date; - } - - /** - * Get the EVIO file sequence number, which is the number at the end of the file name. - * - * @param file the EVIO file - * @return the file's sequence number - * @throws Exception if there is an error parsing out the sequence number - */ - static Integer getSequenceNumber(final File file) { - final String name = file.getName(); - return Integer.parseInt(name.substring(name.lastIndexOf(".") + 1)); + } catch (EvioException | IOException e) { + throw new RuntimeException(e); + } + return timestamp; } /** @@ -230,6 +203,33 @@ */ static boolean isCachedFile(final File file) { return file.getPath().startsWith("/cache"); + } + + /** + * Return <code>true</code> if a valid CODA <i>END</i> event can be located in the <code>EvioReader</code>'s current + * file. + * + * @param reader the EVIO reader + * @return <code>true</code> if valid END event is located + * @throws Exception if there are IO problems using the reader + */ + static boolean isEndOkay(final EvioReader reader) throws Exception { + LOGGER.info("checking is END okay ..."); + + boolean endOkay = false; + + // Go to second to last event for searching. + reader.gotoEventNumber(reader.getEventCount() - 2); + + // Look for END event. + EvioEvent event = null; + while ((event = reader.parseNextEvent()) != null) { + if (event.getHeader().getTag() == EvioEventConstants.END_EVENT_TAG) { + endOkay = true; + break; + } + } + return endOkay; } /** @@ -287,4 +287,10 @@ static EvioReader open(final String path) throws IOException, EvioException { return open(new File(path), false); } + + /** + * Present class instantiation. + */ + private EvioFileUtilities() { + } } 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 Tue Aug 4 15:11:36 2015 @@ -99,10 +99,10 @@ if (this.accept(file)) { // Get the run number from the file name. - final Integer run = EvioFileUtilities.getRunFromName(file); + final Integer run = EvioFileUtilities.getRun(file); // Get the sequence number from the file name. - final Integer seq = EvioFileUtilities.getSequenceNumber(file); + final Integer seq = EvioFileUtilities.getSequence(file); LOGGER.info("accepted file " + file.getPath() + " with run " + run + " and seq " + seq); Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java Tue Aug 4 15:11:36 2015 @@ -299,7 +299,7 @@ /** * The time in milliseconds when the caching operation started. */ - long start = 0; + private long start = 0; /** * Cache a file by submitting a 'jcache submit' process. @@ -357,7 +357,7 @@ // Loop over all files, refresh the status, and check that they are cached. for (final Entry<File, CacheStatus> entry : this.cacheStatuses.entrySet()) { - // Get the cache status the file. + // Get the cache status of the file. final CacheStatus cacheStatus = entry.getValue(); LOGGER.info("checking status of " + cacheStatus.getFile().getPath() + " with req ID '" Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunFilter.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunFilter.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunFilter.java Tue Aug 4 15:11:36 2015 @@ -36,6 +36,6 @@ */ @Override public boolean accept(final File file) { - return this.acceptRuns.contains(EvioFileUtilities.getRunFromName(file)); + return this.acceptRuns.contains(EvioFileUtilities.getRun(file)); } } 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 Tue Aug 4 15:11:36 2015 @@ -3,7 +3,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -41,13 +40,12 @@ * @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(final JCacheManager cacheManager, final RunLog runs, final CrawlerConfig config) + static void processAllRuns(final JCacheManager cacheManager, final RunLog runs, final CrawlerConfig config) throws Exception { - // Configure max wait time of jcache manager. + // Configure the max wait time for file caching operations. if (config.waitTime() != null && config.waitTime() > 0L) { cacheManager.setWaitTime(config.waitTime()); - LOGGER.config("JCacheManager max wait time set to " + config.waitTime()); } // Process all of the runs that were found. @@ -71,7 +69,7 @@ } // Process all of the run's files. - runProcessor.process(); + runProcessor.processRun(); } } @@ -86,17 +84,17 @@ private final EpicsLog epicsLog; /** + * Processor for extracting event type counts (sync, physics, trigger types, etc.). + */ + private final EventCountProcessor eventCountProcessor; + + /** * The event printing interval when processing EVIO files. */ private int eventPrintInterval = 1000; /** - * Processor for extracting event type counts (sync, physics, trigger types, etc.). - */ - private final EventCountProcessor eventCountProcessor; - - /** - * Max files to read (defaults to unlimited). + * Max total files to read (default is unlimited). */ private int maxFiles = -1; @@ -189,15 +187,55 @@ } /** - * Get the event count from the current <code>EvioReader</code>. - * - * @param reader the current <code>EvioReader</code> - * @return the event count - * @throws IOException if there is a generic IO error - * @throws EvioException if there is an EVIO related error - */ - Integer computeEventCount(final EvioReader reader) throws IOException, EvioException { - return reader.getEventCount(); + * Find the end date in the EVIO events. + * + * @param evioReader the open <code>EvioReader</code> + */ + private void findEndDate(final EvioReader evioReader) { + + // Try to get end date from END event. + Long endTimestamp = EvioFileUtilities.getTimestamp(evioReader, EvioEventConstants.END_EVENT_TAG, -5); + + if (endTimestamp != null) { + // Flag end okay for the run. + this.runSummary.setEndOkay(true); + } else { + // Try to find the end date from the last physics event. + endTimestamp = EvioFileUtilities.getEndTimestamp(evioReader); + this.runSummary.setEndOkay(false); + } + + if (endTimestamp == null) { + // Not finding the end date is a fatal error. + throw new RuntimeException("Failed to find end date."); + } + + LOGGER.info("found end timestamp " + endTimestamp); + this.runSummary.setEndTimeUtc(endTimestamp); + } + + /** + * Find the start date in the EVIO events. + * + * @param evioReader the open <code>EvioReader</code> + */ + private void findStartDate(final EvioReader evioReader) { + + // First try to find the start date in the PRESTART event. + Long startTimestamp = EvioFileUtilities.getTimestamp(evioReader, EvioEventConstants.PRESTART_EVENT_TAG, 0); + + if (startTimestamp == null) { + // Search for start date in first physics event. + startTimestamp = EvioFileUtilities.getStartTimestamp(evioReader); + } + + if (startTimestamp == null) { + // Not finding the start date is a fatal error. + throw new RuntimeException("Failed to find start date."); + } + + LOGGER.fine("got run start " + startTimestamp); + this.runSummary.setStartTimeUtc(startTimestamp); } /** @@ -228,81 +266,50 @@ } /** - * Return <code>true</code> if a valid CODA <i>END</i> event can be located in the <code>EvioReader</code>'s current - * file. - * - * @param reader the EVIO reader - * @return <code>true</code> if valid END event is located - * @throws Exception if there are IO problems using the reader - */ - boolean isEndOkay(final EvioReader reader) throws Exception { - LOGGER.info("checking is END okay ..."); - - boolean endOkay = false; - - // Go to second to last event for searching. - reader.gotoEventNumber(reader.getEventCount() - 2); - - // Look for END event. - EvioEvent event = null; - while ((event = reader.parseNextEvent()) != null) { - if (event.getHeader().getTag() == EvioEventConstants.END_EVENT_TAG) { - endOkay = true; - break; - } - } - return endOkay; - } - - /** - * Process the run by executing the registered {@link org.hps.record.evio.EvioEventProcessor}s and performing - * special tasks such as the extraction of start and end dates. - * <p> - * This method will also activate file caching, if enabled by the {@link #useFileCache} option. - * - * @throws Exception if there is an error processing a file - */ - void process() throws Exception { - - LOGGER.info("processing run " + this.runSummary.getRun() + " ..."); - - // First cache all the files we will process, if necessary. - if (this.useFileCache) { - this.cacheFiles(); - } - - // Run the start of job hooks. - for (final EvioEventProcessor processor : this.processors) { - processor.startJob(); - } - - final List<File> files = this.getFiles(); - - LOGGER.info("processing " + files.size() + " from run " + this.runSummary.getRun()); - - // Process all the files. - for (final File file : files) { - this.process(file); - } - - // Run the end job hooks. - for (final EvioEventProcessor processor : this.processors) { - processor.endJob(); - } - - // Put scaler data from EVIO processor into run summary. - runSummary.setScalerData(this.scalersProcessor.getScalerData()); - - // Set the counts of event types on the run summary. - runSummary.setEventTypeCounts(eventCountProcessor.getEventCounts()); - - // Set total number of events on the run summary from the event counter. - runSummary.setTotalEvents(this.eventCountProcessor.getTotalEventCount()); - - // Set EpicsData for the run. - runSummary.setEpicsData(this.epicsLog.getEpicsData()); - - LOGGER.info("done processing run " + this.runSummary.getRun()); + * Return <code>true</code> if the file is the first one in the list for the run. + * + * @param file the EVIO <code>File</code> + * @return <code>true</code> if the file is the first one in the list for the run + */ + private boolean isFirstFile(final File file) { + return file.equals(this.runSummary.getEvioFileList().first()); + } + + /** + * Return <code>true</code> if the file is the last one in the list for the run. + * + * @param file the EVIO <code>File</code> + * @return <code>true</code> if the file is the last one in the list for the run + */ + private boolean isLastFile(final File file) { + return file.equals(this.getFiles().get(this.getFiles().size() - 1)); + } + + /** + * Process events using the list of EVIO processors. + * + * @param evioReader the open <code>EvioReader</code> + * @throws IOException if there is a file IO error + * @throws EvioException if there is an EVIO error + * @throws Exception if there is some other error + */ + private void processEvents(final EvioReader evioReader) throws IOException, EvioException, Exception { + LOGGER.finer("running EVIO processors ..."); + evioReader.gotoEventNumber(0); + int nProcessed = 0; + if (!this.processors.isEmpty()) { + EvioEvent event = null; + while ((event = evioReader.parseNextEvent()) != null) { + for (final EvioEventProcessor processor : this.processors) { + processor.process(event); + } + ++nProcessed; + if (nProcessed % this.eventPrintInterval == 0) { + LOGGER.finer("processed " + nProcessed + " EVIO events"); + } + } + LOGGER.info("done running EVIO processors"); + } } /** @@ -313,60 +320,91 @@ * @throws IOException if there is some kind of IO error * @throws Exception if there is a generic error thrown by event processing */ - private void process(final File file) throws EvioException, IOException, Exception { - LOGGER.fine("processing " + file.getPath() + " ..."); - - EvioReader reader = null; + private void processFile(final File file) throws EvioException, IOException, Exception { + + LOGGER.fine("processing file " + file.getPath() + " ..."); + + EvioReader evioReader = null; try { - // Open with wrapper method which will use the cached file path if necessary. - LOGGER.fine("opening " + file.getPath() + " for reading ..."); - reader = EvioFileUtilities.open(file, true); - LOGGER.fine("done opening " + file.getPath()); + + // Open file for reading (flag should be true for sequential or false for mem map). + evioReader = EvioFileUtilities.open(file, true); // If this is the first file then get the start date. - if (file.equals(this.runSummary.getEvioFileList().first())) { - LOGGER.fine("getting run start ..."); - final Date runStart = EvioFileUtilities.getRunStart(file); - LOGGER.fine("got run start " + runStart); - this.runSummary.setStartDate(runStart); - } - - // Process the events using the EVIO processors. - LOGGER.info("running EVIO processors ..."); - reader.gotoEventNumber(0); - int nProcessed = 0; - if (!this.processors.isEmpty()) { - EvioEvent event = null; - while ((event = reader.parseNextEvent()) != null) { - for (final EvioEventProcessor processor : this.processors) { - processor.process(event); - ++nProcessed; - if (nProcessed % this.eventPrintInterval == 0) { - LOGGER.finer("processed " + nProcessed + " EVIO events"); - } - } - } - } - LOGGER.info("done running EVIO processors"); - - // Check if END event is present if this is the last file in the run. - if (file.equals(this.getFiles().get(this.getFiles().size() - 1))) { - final boolean endOkay = this.isEndOkay(reader); - this.runSummary.setEndOkay(endOkay); - LOGGER.info("endOkay set to " + endOkay); - - LOGGER.info("getting end date ..."); - final Date endDate = EvioFileUtilities.getRunEnd(file); - this.runSummary.setEndDate(endDate); - LOGGER.info("found end date " + endDate); + if (this.isFirstFile(file)) { + LOGGER.fine("getting run start from first file " + file.getPath() + " ..."); + this.findStartDate(evioReader); + } + + // Go back to the first event and process the events using the list of EVIO processors. + this.processEvents(evioReader); + + // Find end date from last file in the run. + if (this.isLastFile(file)) { + LOGGER.fine("getting run end from last file " + file.getPath() + " ..."); + this.findEndDate(evioReader); } } finally { - if (reader != null) { - reader.close(); + // Close the EvioReader for the current file. + if (evioReader != null) { + evioReader.close(); } } LOGGER.fine("done processing " + file.getPath()); + } + + /** + * Process the run by executing the registered {@link org.hps.record.evio.EvioEventProcessor}s extracting the start + * and end dates. + * <p> + * This method will also activate file caching, if enabled by the {@link #useFileCache} option. + * + * @throws Exception if there is an error processing a file + */ + void processRun() throws Exception { + + LOGGER.info("processing run " + this.runSummary.getRun() + " ..."); + + // First cache all the files we will process, if necessary. + if (this.useFileCache) { + this.cacheFiles(); + } + + // Run the start of job hooks. + for (final EvioEventProcessor processor : this.processors) { + processor.startJob(); + } + + // Get the list of files, limited by max files setting. + final List<File> files = this.getFiles(); + + LOGGER.info("processing " + files.size() + " from run " + this.runSummary.getRun()); + + // Process all the files. + for (final File file : files) { + this.processFile(file); + } + + // Run the end job hooks. + LOGGER.info("running end of job hooks on EVIO processors ..."); + for (final EvioEventProcessor processor : this.processors) { + processor.endJob(); + } + + // Put scaler data from EVIO processor into run summary. + runSummary.setScalerData(this.scalersProcessor.getScalerData()); + + // Set the counts of event types on the run summary. + runSummary.setEventTypeCounts(eventCountProcessor.getEventCounts()); + + // Set total number of events on the run summary from the event counter. + runSummary.setTotalEvents(this.eventCountProcessor.getTotalEventCount()); + + // Set EpicsData for the run. + runSummary.setEpicsData(this.epicsLog.getEpicsData()); + + LOGGER.info("done processing run " + this.runSummary.getRun()); } /** Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryUpdater.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryUpdater.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunSummaryUpdater.java Tue Aug 4 15:11:36 2015 @@ -239,11 +239,11 @@ */ private void insertRun() throws SQLException { final PreparedStatement statement = connection - .prepareStatement("INSERT INTO runs (run, start_date, end_date, nevents, nfiles, end_ok, created) VALUES(?, ?, ?, ?, ?, ?, NOW())"); + .prepareStatement("INSERT INTO runs (run, start_time_utc, end_time_utc, nevents, nfiles, end_ok, created) VALUES(?, ?, ?, ?, ?, ?, NOW())"); LOGGER.info("preparing to insert run " + run + " into runs table .."); statement.setInt(1, run); - statement.setTimestamp(2, new java.sql.Timestamp(runSummary.getStartDate().getTime())); - statement.setTimestamp(3, new java.sql.Timestamp(runSummary.getEndDate().getTime())); + statement.setLong(2, runSummary.getStartTimeUtc()); + statement.setLong(3, runSummary.getEndTimeUtc()); statement.setInt(4, runSummary.getTotalEvents()); statement.setInt(5, runSummary.getEvioFileList().size()); statement.setBoolean(6, runSummary.getEndOkay()); @@ -253,7 +253,7 @@ /** * Insert scaler data into the database. - * + * * @throws SQLException if there is a SQL query error */ private void insertScalarData() throws SQLException {