Author: [log in to unmask] Date: Thu Jul 7 15:52:41 2016 New Revision: 4419 Log: [HPSJAVA-675] Major reorg of run database and datacat modules (see JIRA item sub-tasks for details). Added: java/trunk/datacat/ java/trunk/datacat/pom.xml java/trunk/datacat/src/ java/trunk/datacat/src/main/ java/trunk/datacat/src/main/java/ java/trunk/datacat/src/main/java/org/ java/trunk/datacat/src/main/java/org/hps/ java/trunk/datacat/src/main/java/org/hps/datacat/ java/trunk/datacat/src/main/java/org/hps/datacat/DataType.java - copied, changed from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/DataType.java java/trunk/datacat/src/main/java/org/hps/datacat/DatacatConstants.java java/trunk/datacat/src/main/java/org/hps/datacat/DatacatPrintRun.java - copied, changed from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/DatacatPrintRun.java java/trunk/datacat/src/main/java/org/hps/datacat/DatacatUtilities.java java/trunk/datacat/src/main/java/org/hps/datacat/FileEventRange.java java/trunk/datacat/src/main/java/org/hps/datacat/FileFormat.java - copied, changed from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/FileFormat.java java/trunk/datacat/src/main/java/org/hps/datacat/Site.java - copied, changed from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/Site.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigEvioProcessor.java - copied, changed from r4415, java/trunk/record-util/src/main/java/org/hps/record/daqconfig/TriggerConfigEvioProcessor.java java/trunk/run-database/src/main/java/org/hps/rundb/ java/trunk/run-database/src/main/java/org/hps/rundb/DaoProvider.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/DaoProvider.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDao.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsType.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsType.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariable.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariable.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDao.java java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/RunManager.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunManager.java java/trunk/run-database/src/main/java/org/hps/rundb/RunSummary.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummary.java java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDao.java java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDao.java java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDao.java java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDao.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDao.java java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDaoImpl.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDaoImpl.java java/trunk/run-database/src/main/java/org/hps/rundb/builder/ java/trunk/run-database/src/main/java/org/hps/rundb/builder/AbstractRunBuilder.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/AbstractRunBuilder.java java/trunk/run-database/src/main/java/org/hps/rundb/builder/BuilderCommandLine.java (with props) java/trunk/run-database/src/main/java/org/hps/rundb/builder/DatacatBuilder.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/DatacatBuilder.java java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataBuilder.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataCommandLine.java (with props) java/trunk/run-database/src/main/java/org/hps/rundb/builder/LivetimeBuilder.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/LivetimeBuilder.java java/trunk/run-database/src/main/java/org/hps/rundb/builder/SpreadsheetBuilder.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SpreadsheetBuilder.java java/trunk/run-database/src/main/java/org/hps/rundb/package-info.java - copied, changed from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/package-info.java java/trunk/run-database/src/test/java/org/hps/rundb/ java/trunk/run-database/src/test/java/org/hps/rundb/builder/ java/trunk/run-database/src/test/java/org/hps/rundb/builder/RunBuilderTest.java - copied, changed from r4415, java/trunk/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java Removed: java/trunk/crawler/src/main/java/org/hps/crawler/DataType.java java/trunk/crawler/src/main/java/org/hps/crawler/DatacatPrintRun.java java/trunk/crawler/src/main/java/org/hps/crawler/FileFormat.java java/trunk/crawler/src/main/java/org/hps/crawler/Site.java java/trunk/record-util/src/main/java/org/hps/record/daqconfig/TriggerConfigEvioProcessor.java java/trunk/record-util/src/main/java/org/hps/record/util/ java/trunk/run-database/src/main/java/org/hps/run/ java/trunk/run-database/src/test/java/org/hps/run/ Modified: java/trunk/crawler/pom.xml java/trunk/crawler/src/main/java/org/hps/crawler/CrawlerConfig.java java/trunk/crawler/src/main/java/org/hps/crawler/DatacatAddFile.java java/trunk/crawler/src/main/java/org/hps/crawler/DatacatCrawler.java java/trunk/crawler/src/main/java/org/hps/crawler/DatacatHelper.java java/trunk/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java java/trunk/crawler/src/main/java/org/hps/crawler/FileFormatFilter.java java/trunk/crawler/src/main/java/org/hps/crawler/MetadataWriter.java java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java java/trunk/evio/src/test/java/org/hps/evio/ScalersTest.java java/trunk/job/src/main/java/org/hps/job/DatabaseConditionsManagerSetup.java java/trunk/parent/pom.xml java/trunk/pom.xml java/trunk/run-database/pom.xml java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java java/trunk/users/src/main/java/org/hps/users/spaul/FindBiasOnRange.java Modified: java/trunk/crawler/pom.xml ============================================================================= --- java/trunk/crawler/pom.xml (original) +++ java/trunk/crawler/pom.xml Thu Jul 7 15:52:41 2016 @@ -20,8 +20,8 @@ <artifactId>hps-record-util</artifactId> </dependency> <dependency> - <groupId>srs</groupId> - <artifactId>org-srs-datacat-client</artifactId> + <groupId>org.hps</groupId> + <artifactId>hps-datacat</artifactId> </dependency> </dependencies> </project> Modified: java/trunk/crawler/src/main/java/org/hps/crawler/CrawlerConfig.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/CrawlerConfig.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/CrawlerConfig.java Thu Jul 7 15:52:41 2016 @@ -11,6 +11,9 @@ import java.util.Set; import org.hps.conditions.database.ConnectionParameters; +import org.hps.datacat.DatacatConstants; +import org.hps.datacat.FileFormat; +import org.hps.datacat.Site; /** * Full configuration information for the {@link Crawler} class. @@ -78,7 +81,7 @@ /** * Base URL of datacat client. */ - private String baseUrl = DatacatHelper.DATACAT_URL; + private String baseUrl = DatacatConstants.DATACAT_URL; /** * Set of paths used for filtering files (file's path must match one of these). Modified: java/trunk/crawler/src/main/java/org/hps/crawler/DatacatAddFile.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/DatacatAddFile.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/DatacatAddFile.java Thu Jul 7 15:52:41 2016 @@ -6,10 +6,12 @@ import java.util.logging.Logger; import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.PosixParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; +import org.hps.datacat.DatacatUtilities; +import org.hps.datacat.Site; import org.srs.datacat.model.DatasetModel; /** @@ -23,6 +25,11 @@ private List<File> paths = new ArrayList<File>(); + private String folder = null; + private Site site = Site.JLAB; + private String datacatUrl = "http://hpsweb.jlab.org/datacat/r"; + private boolean dryRun = false; + /** * Command line options. */ @@ -32,11 +39,12 @@ * Statically define the command options. */ static { - OPTIONS.addOption("h", "help", false, "print help and exit (overrides all other arguments)"); - OPTIONS.addOption("f", "folder", true, "datacat folder"); - OPTIONS.addOption("s", "site", true, "datacat site"); - OPTIONS.addOption("u", "base-url", true, "provide a base URL of the datacat server"); - OPTIONS.addOption("D", "dry-run", false, "dry run mode which will not updated the datacat"); + OPTIONS.addOption("h", "help", false, "Print help and exit (overrides all other arguments)."); + OPTIONS.addOption("f", "folder", true, "Datacat folder (required)"); + OPTIONS.addOption("s", "site", true, "Datacat site (default is JLAB)"); + OPTIONS.addOption("u", "url", true, "Set the URL of a datacat server (default is JLAB prod server)"); + OPTIONS.addOption("D", "dry-run", false, "Dry run mode which will not update the datacat"); + OPTIONS.addOption("p", "patch", false, "Allow patching of existing records in the datacat"); } /** @@ -49,14 +57,11 @@ } /** - * The crawler configuration. - */ - private CrawlerConfig config; - - /** * The options parser. */ private final PosixParser parser = new PosixParser(); + + private boolean patch = false; /** * Parse command line options. @@ -68,8 +73,6 @@ LOGGER.config("parsing command line options"); - this.config = new CrawlerConfig(); - try { final CommandLine cl = this.parser.parse(OPTIONS, args); @@ -80,15 +83,15 @@ // Datacat folder. if (cl.hasOption("f")) { - config.setDatacatFolder(cl.getOptionValue("f")); - LOGGER.config("set datacat folder to " + config.folder()); + folder = cl.getOptionValue("f"); + LOGGER.config("set datacat folder to " + folder); } else { throw new RuntimeException("The -f argument with the datacat folder is required."); } // Dry run. if (cl.hasOption("D")) { - config.setDryRun(true); + this.dryRun = true; } // List of paths. @@ -103,21 +106,23 @@ } // Dataset site (defaults to JLAB). - Site site = Site.JLAB; if (cl.hasOption("s")) { - site = Site.valueOf(cl.getOptionValue("s")); + this.site = Site.valueOf(cl.getOptionValue("s")); } - LOGGER.config("dataset site " + site); - config.setSite(site); - + LOGGER.config("datacat site: " + site); + // Data catalog URL. if (cl.hasOption("u")) { - config.setDatacatUrl(cl.getOptionValue("u")); - LOGGER.config("datacat URL " + config.datacatUrl()); + datacatUrl = cl.getOptionValue("u"); } + LOGGER.config("datacat url: " + datacatUrl); + if (cl.hasOption("p")) { + this.patch = true; + } + } catch (final ParseException e) { - throw new RuntimeException("Error parsing options.", e); + throw new RuntimeException("Error parsing the command line options.", e); } LOGGER.info("Done parsing command line options."); @@ -138,12 +143,12 @@ * Run the job. */ private void run() { - List<DatasetModel> datasets = DatacatHelper.createDatasets(paths, config.folder(), config.site().toString()); - if (!config.dryRun()) { - DatacatHelper.addDatasets(datasets, config.folder(), config.datacatUrl()); - LOGGER.info("Added " + datasets.size() + " datasets to datacat."); + List<DatasetModel> datasets = DatacatHelper.createDatasets(paths, folder, site.toString()); + if (!dryRun) { + DatacatUtilities.updateDatasets(datasets, folder, datacatUrl, patch); + //LOGGER.info("Added " + datasets.size() + " datasets to datacat."); } else { - LOGGER.info("Dry run mode; skipped adding dataset."); + LOGGER.info("Dry run is enabled; skipped adding dataset."); } } } Modified: java/trunk/crawler/src/main/java/org/hps/crawler/DatacatCrawler.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/DatacatCrawler.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/DatacatCrawler.java Thu Jul 7 15:52:41 2016 @@ -13,10 +13,13 @@ import java.util.logging.Logger; import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.PosixParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; +import org.hps.datacat.DatacatUtilities; +import org.hps.datacat.FileFormat; +import org.hps.datacat.Site; import org.srs.datacat.model.DatasetModel; /** @@ -63,7 +66,7 @@ OPTIONS.addOption("t", "timestamp-file", true, "existing or new timestamp file name"); OPTIONS.addOption("x", "max-depth", true, "max depth to crawl"); OPTIONS.addOption("D", "dry-run", false, "dry run which will not update the datacat"); - OPTIONS.addOption("u", "base-url", true, "provide a base URL of the datacat server"); + OPTIONS.addOption("u", "url", true, "provide a base URL of the datacat server"); } /** @@ -300,7 +303,7 @@ if (!visitor.getFiles().isEmpty()) { List<DatasetModel> datasets = DatacatHelper.createDatasets(visitor.getFiles(), config.folder(), config.site().toString()); LOGGER.info("built " + datasets.size() + " datasets"); - DatacatHelper.addDatasets(datasets, config.folder(), config.datacatUrl()); + DatacatUtilities.updateDatasets(datasets, config.folder(), config.datacatUrl(), false); LOGGER.info("added datasets to datacat"); } else { LOGGER.warning("No files were found by the crawler."); Modified: java/trunk/crawler/src/main/java/org/hps/crawler/DatacatHelper.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/DatacatHelper.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/DatacatHelper.java Thu Jul 7 15:52:41 2016 @@ -2,23 +2,15 @@ import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.logging.Level; import java.util.logging.Logger; -import org.srs.datacat.client.Client; -import org.srs.datacat.client.ClientBuilder; +import org.hps.datacat.DataType; +import org.hps.datacat.DatacatUtilities; +import org.hps.datacat.FileFormat; import org.srs.datacat.model.DatasetModel; -import org.srs.datacat.model.DatasetView.VersionId; -import org.srs.datacat.shared.Dataset; -import org.srs.datacat.shared.Provider; /** * Datacat helper functions for the crawler. @@ -28,39 +20,7 @@ class DatacatHelper { private static final Logger LOGGER = Logger.getLogger(DatacatHelper.class.getPackage().getName()); - - /* - * Default base URL for datacat. - */ - static final String DATACAT_URL = "http://hpsweb.jlab.org/datacat/r"; - - /* - * Static map of strings to file formats. - */ - private static final Map<String, FileFormat> FORMATS = new HashMap<String, FileFormat>(); - static { - for (final FileFormat format : FileFormat.values()) { - FORMATS.put(format.extension(), format); - } - } - - /* - * System metadata fields. - */ - static final Set<String> SYSTEM_METADATA = new HashSet<String>(); - static { - SYSTEM_METADATA.add("eventCount"); - SYSTEM_METADATA.add("size"); - SYSTEM_METADATA.add("runMin"); - SYSTEM_METADATA.add("runMax"); - SYSTEM_METADATA.add("checksum"); - SYSTEM_METADATA.add("scanStatus"); - } - - static final boolean isSystemMetadata(String name) { - return SYSTEM_METADATA.contains(name); - } - + /** * Create metadata for a file using its {@link FileMetadataReader}. * @@ -68,7 +28,7 @@ * @return the metadata for the file */ static Map<String, Object> createMetadata(final File file) { - LOGGER.fine("creating metadata for " + file.getPath()); + LOGGER.fine("creating metadata for " + file.getPath() + " ..."); File actualFile = file; if (FileUtilities.isMssFile(file)) { actualFile = FileUtilities.getCachedFile(file); @@ -133,7 +93,7 @@ name = stripEvioFileNumber(name); } final String extension = name.substring(name.lastIndexOf(".") + 1); - return FORMATS.get(extension); + return FileFormat.findFormat(extension); } /** @@ -172,72 +132,7 @@ } return strippedName; } - - - - /** - * Create a dataset for insertion into the data catalog. - * - * @param file the file on disk - * @param metadata the metadata map - * @param folder the datacat folder - * @param site the datacat site - * @param dataType the data type - * @param fileFormat the file format - * @return the created dataset - */ - static DatasetModel createDataset( - File file, - Map<String, Object> metadata, - String folder, - String site, - String dataType, - String fileFormat) { - - LOGGER.info("creating dataset for " + file.getPath()); - - Provider provider = new Provider(); - Dataset.Builder datasetBuilder = provider.getDatasetBuilder(); - - // Set basic info on new dataset. - datasetBuilder.versionId(VersionId.valueOf("new")) - .master(true) - .name(file.getName()) - .resource(file.getPath()) - .dataType(dataType) - .fileFormat(fileFormat) - .site(site) - .scanStatus("OK"); - - // Set system metadata from the provided metadata map. - if (metadata.get("eventCount") != null) { - datasetBuilder.eventCount((Long) metadata.get("eventCount")); - } - if (metadata.get("checksum") != null) { - datasetBuilder.checksum((String) metadata.get("checksum")); - } - if (metadata.get("runMin") != null) { - datasetBuilder.runMin((Long) metadata.get("runMin")); - } - if (metadata.get("runMax") != null) { - datasetBuilder.runMax((Long) metadata.get("runMax")); - } - if (metadata.get("size") != null) { - datasetBuilder.size((Long) metadata.get("size")); - } - - // Create user metadata, leaving out system metadata fields. - Map<String, Object> userMetadata = new HashMap<String, Object>(); - for (Entry<String, Object> metadataEntry : metadata.entrySet()) { - if (!SYSTEM_METADATA.contains(metadataEntry.getKey())) { - userMetadata.put(metadataEntry.getKey(), metadataEntry.getValue()); - } - } - datasetBuilder.versionMetadata(userMetadata); - - return datasetBuilder.build(); - } - + /** * Create datasets from a list of files. * @@ -250,7 +145,7 @@ Map<String, Object> metadata = createMetadata(file); DataType dataType = DatacatHelper.getDataType(file); FileFormat fileFormat = DatacatHelper.getFileFormat(file); - DatasetModel dataset = DatacatHelper.createDataset( + DatasetModel dataset = DatacatUtilities.createDataset( file, metadata, folder, @@ -260,28 +155,5 @@ datasets.add(dataset); } return datasets; - } - - /** - * Add datasets to the data catalog. - * - * @param datasets the list of datasets - * @param folder the target folder - * @param url the datacat URL - */ - static void addDatasets(List<DatasetModel> datasets, String folder, String url) { - Client client = null; - try { - client = new ClientBuilder().setUrl(url).build(); - } catch (URISyntaxException e) { - throw new RuntimeException("Bad datacat URL.", e); - } - for (DatasetModel dataset : datasets) { - try { - client.createDataset(folder, dataset); - } catch (Exception e) { - LOGGER.log(Level.SEVERE, e.getMessage(), e); - } - } - } + } } Modified: java/trunk/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/EvioMetadataReader.java Thu Jul 7 15:52:41 2016 @@ -58,10 +58,11 @@ Integer lastHeadTimestamp = null; Integer lastPhysicsEvent = null; Integer firstPhysicsEvent = null; - Integer prestartTimestamp = null; + Integer prestartTimestamp = null; Integer endTimestamp = null; Integer goTimestamp = null; Double triggerRate = null; + Integer endEventCount = null; // Processor for calculating TI time offsets. TiTimeOffsetEvioProcessor tiProcessor = new TiTimeOffsetEvioProcessor(); @@ -168,16 +169,21 @@ ++physicsEvents; } else if (EvioEventUtilities.isControlEvent(evioEvent)) { int[] controlData = EvioEventUtilities.getControlEventData(evioEvent); - if (controlData[0] != 0) { - if (EventTagConstant.PRESTART.isEventTag(evioEvent)) { - prestartTimestamp = controlData[0]; - } - if (EventTagConstant.GO.isEventTag(evioEvent)) { - goTimestamp = controlData[0]; + if (controlData != null) { /* Why is this null sometimes? */ + if (controlData[0] != 0) { + if (EventTagConstant.PRESTART.isEventTag(evioEvent)) { + prestartTimestamp = controlData[0]; + } + if (EventTagConstant.GO.isEventTag(evioEvent)) { + goTimestamp = controlData[0]; + } + if (EventTagConstant.END.isEventTag(evioEvent)) { + endTimestamp = controlData[0]; + endEventCount = controlData[2]; + } } - if (EventTagConstant.END.isEventTag(evioEvent)) { - endTimestamp = controlData[0]; - } + } else { + LOGGER.warning("Event " + evioEvent.getEventNumber() + " is missing valid control data bank."); } } @@ -193,9 +199,12 @@ tiProcessor.process(evioEvent); } catch (Exception e) { - // Trap all event processing errors. + + // Log event processing errors. + LOGGER.log(Level.WARNING, "Error processing EVIO event " + evioEvent.getEventNumber(), e); + + // Increment bad event count. badEvents++; - LOGGER.warning("Error processing EVIO event " + evioEvent.getEventNumber()); } } } catch (final EvioException e) { @@ -278,19 +287,23 @@ if (goTimestamp != null) { metadataMap.put("GO_TIMESTAMP", goTimestamp); } + + if (endEventCount != null) { + metadataMap.put("END_EVENT_COUNT", endEventCount); + } // TI times and offset. metadataMap.put("TI_TIME_MIN_OFFSET", new Long(tiProcessor.getMinOffset()).toString()); metadataMap.put("TI_TIME_MAX_OFFSET", new Long(tiProcessor.getMaxOffset()).toString()); metadataMap.put("TI_TIME_N_OUTLIERS", tiProcessor.getNumOutliers()); - // Event counts. + // Bad event count. metadataMap.put("BAD_EVENTS", badEvents); // Physics event count. metadataMap.put("PHYSICS_EVENTS", physicsEvents); - // Rough trigger rate. + // Rough trigger rate calculation. if (triggerRate != null && !Double.isInfinite(triggerRate) && !Double.isNaN(triggerRate)) { DecimalFormat df = new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.CEILING); @@ -323,7 +336,7 @@ * @param firstTimestamp the first physics timestamp * @param lastTimestamp the last physics timestamp * @param events the number of physics events - * @return the trigger rate calculation in KHz + * @return the trigger rate in Hz */ private double calculateTriggerRate(Integer firstTimestamp, Integer lastTimestamp, long events) { return ((double) events / ((double) lastTimestamp - (double) firstTimestamp)); Modified: java/trunk/crawler/src/main/java/org/hps/crawler/FileFormatFilter.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/FileFormatFilter.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/FileFormatFilter.java Thu Jul 7 15:52:41 2016 @@ -3,6 +3,8 @@ import java.io.File; import java.io.FileFilter; import java.util.Set; + +import org.hps.datacat.FileFormat; /** * Filter files on their format. Modified: java/trunk/crawler/src/main/java/org/hps/crawler/MetadataWriter.java ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/MetadataWriter.java (original) +++ java/trunk/crawler/src/main/java/org/hps/crawler/MetadataWriter.java Thu Jul 7 15:52:41 2016 @@ -9,10 +9,11 @@ import java.util.logging.Logger; import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.PosixParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; +import org.hps.datacat.DatacatConstants; /** * Creates metadata for a file and writes the results to a Python snippet that can be used as input to the SRS datacat. @@ -95,7 +96,7 @@ private static String toPyDict(Map<String, Object> metadata) { StringBuffer sb = new StringBuffer(); sb.append("{"); - for (String name : DatacatHelper.SYSTEM_METADATA) { + for (String name : DatacatConstants.getSystemMetadata()) { if (metadata.containsKey(name)) { Object value = metadata.get(name); if (value instanceof Number) { @@ -108,7 +109,7 @@ sb.setLength(sb.length() - 2); sb.append(", \"versionMetadata\" : {"); for (Map.Entry<String, Object> entry : metadata.entrySet()) { - if (!DatacatHelper.isSystemMetadata(entry.getKey())) { + if (!DatacatConstants.isSystemMetadata(entry.getKey())) { Object value = entry.getValue(); String name = entry.getKey(); if (value instanceof Number) { Added: java/trunk/datacat/pom.xml ============================================================================= --- java/trunk/datacat/pom.xml (added) +++ java/trunk/datacat/pom.xml Thu Jul 7 15:52:41 2016 @@ -0,0 +1,27 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <artifactId>hps-datacat</artifactId> + <name>datacat</name> + <description>SRS data catalog utilities</description> + <parent> + <groupId>org.hps</groupId> + <artifactId>hps-parent</artifactId> + <relativePath>../parent/pom.xml</relativePath> + <version>3.10-SNAPSHOT</version> + </parent> + <scm> + <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/datacat/</url> + <connection>scm:svn:svn://svn.freehep.org/hps/java/trunk/datacat/</connection> + <developerConnection>scm:svn:svn://svn.freehep.org/hps/java/trunk/datacat/</developerConnection> + </scm> + <dependencies> + <dependency> + <groupId>srs</groupId> + <artifactId>org-srs-datacat-client</artifactId> + </dependency> + <dependency> + <groupId>org.hps</groupId> + <artifactId>hps-logging</artifactId> + </dependency> + </dependencies> +</project> Copied: java/trunk/datacat/src/main/java/org/hps/datacat/DataType.java (from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/DataType.java) ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/DataType.java (original) +++ java/trunk/datacat/src/main/java/org/hps/datacat/DataType.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.crawler; +package org.hps.datacat; /** * Dataset types for HPS. Added: java/trunk/datacat/src/main/java/org/hps/datacat/DatacatConstants.java ============================================================================= --- java/trunk/datacat/src/main/java/org/hps/datacat/DatacatConstants.java (added) +++ java/trunk/datacat/src/main/java/org/hps/datacat/DatacatConstants.java Thu Jul 7 15:52:41 2016 @@ -0,0 +1,81 @@ +package org.hps.datacat; + +import java.util.HashSet; +import java.util.Set; + +/** + * Static constants for use with the Data Catalog. + * @author jeremym + */ +public final class DatacatConstants { + + /* + * Default base URL for datacat. + */ + public static final String DATACAT_URL = "http://hpsweb.jlab.org/datacat/r"; + + /* + * Datacat folder where the EVIO files reside. + */ + public static final String RAW_DATA_FOLDER = "/HPS/data/raw"; + + /* + * Datacat folder where the EVIO files reside. + */ + public static final Site DEFAULT_SITE = Site.JLAB; + + /* + * The set of system metadata which is always set for each file. + */ + private static final Set<String> SYSTEM_METADATA = new HashSet<String>(); + static { + SYSTEM_METADATA.add("eventCount"); + SYSTEM_METADATA.add("size"); + SYSTEM_METADATA.add("runMin"); + SYSTEM_METADATA.add("runMax"); + SYSTEM_METADATA.add("checksum"); + SYSTEM_METADATA.add("scanStatus"); + } + + /* metadata fields that should be included in search results */ + public static final String[] EVIO_METADATA = { + "BAD_EVENTS", + "BLINDED", + "END_EVENT_COUNT", + "END_TIMESTAMP", + "FILE", + "FIRST_HEAD_TIMESTAMP", + "FIRST_PHYSICS_EVENT", + "LAST_HEAD_TIMESTAMP", + "LAST_PHYSICS_EVENT", + "LED_COSMIC", + "PAIRS0", + "PAIRS1", + "PHYSICS_EVENTS", + "PULSER", + "SINGLES0", + "SINGLES1", + "TI_TIME_MAX_OFFSET", + "TI_TIME_MIN_OFFSET", + "TI_TIME_N_OUTLIERS", + "TRIGGER_RATE" + }; + + /** + * Get the set of system metadata field names. + * + * @return the set of system metadata field names + */ + public static Set<String> getSystemMetadata() { + return SYSTEM_METADATA; + } + + /** + * Return <code>true</code> if the metadata field is system metadata. + * @param name the metadata field name + * @return <code>true</code> if the metadata field is system metadata + */ + public static final boolean isSystemMetadata(String name) { + return SYSTEM_METADATA.contains(name); + } +} Copied: java/trunk/datacat/src/main/java/org/hps/datacat/DatacatPrintRun.java (from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/DatacatPrintRun.java) ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/DatacatPrintRun.java (original) +++ java/trunk/datacat/src/main/java/org/hps/datacat/DatacatPrintRun.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.crawler; +package org.hps.datacat; import java.util.Map; import java.util.SortedSet; @@ -15,32 +15,8 @@ * Example of printing information from all files for a given run in the datacat. * @author jeremym */ -public class DatacatPrintRun { - - /* metadata fields that should be included in search results */ - private static final String[] METADATA_FIELDS = { - "BAD_EVENTS", - "BLINDED", - "END_EVENT_COUNT", - "END_TIMESTAMP", - "FILE", - "FIRST_HEAD_TIMESTAMP", - "FIRST_PHYSICS_EVENT", - "LAST_HEAD_TIMESTAMP", - "LAST_PHYSICS_EVENT", - "LED_COSMIC", - "PAIRS0", - "PAIRS1", - "PHYSICS_EVENTS", - "PULSER", - "SINGLES0", - "SINGLES1", - "TI_TIME_MAX_OFFSET", - "TI_TIME_MIN_OFFSET", - "TI_TIME_N_OUTLIERS", - "TRIGGER_RATE" - }; - +public final class DatacatPrintRun { + public static void main(String[] args) throws Exception { if (args.length == 0) { throw new RuntimeException("Missing run number argument."); @@ -61,7 +37,7 @@ "JLAB", "fileFormat eq 'EVIO' AND dataType eq 'RAW' AND runMin eq " + run, /* basic query */ new String[] {"FILE"}, /* sort on file number */ - METADATA_FIELDS /* metadata field values to return from query */ + DatacatConstants.EVIO_METADATA /* metadata field values to return from query */ ); /* print results including metadata */ Added: java/trunk/datacat/src/main/java/org/hps/datacat/DatacatUtilities.java ============================================================================= --- java/trunk/datacat/src/main/java/org/hps/datacat/DatacatUtilities.java (added) +++ java/trunk/datacat/src/main/java/org/hps/datacat/DatacatUtilities.java Thu Jul 7 15:52:41 2016 @@ -0,0 +1,166 @@ +package org.hps.datacat; + +import java.io.File; +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.srs.datacat.client.Client; +import org.srs.datacat.client.ClientBuilder; +import org.srs.datacat.model.DatasetModel; +import org.srs.datacat.model.DatasetResultSetModel; +import org.srs.datacat.model.DatasetView.VersionId; +import org.srs.datacat.model.dataset.DatasetWithViewModel; +import org.srs.datacat.shared.Dataset; +import org.srs.datacat.shared.Provider; + +/** + * Data Catalog utility functions. + * @author jeremym + */ +public class DatacatUtilities { + + private static final Logger LOGGER = Logger.getLogger(DatacatUtilities.class.getPackage().getName()); + + /** + * Add datasets to the data catalog or patch existing ones. + * + * @param datasets the list of datasets + * @param folder the target folder + * @param url the datacat URL + * @param patch <code>true</code> to allow patching existing datasets + */ + public static final void updateDatasets(List<DatasetModel> datasets, String folder, String url, boolean patch) { + int nUpdated = 0; + Client client = null; + try { + client = new ClientBuilder().setUrl(url).build(); + } catch (URISyntaxException e) { + throw new RuntimeException("Invalid datacat URL.", e); + } + for (DatasetModel dataset : datasets) { + try { + if (client.exists(folder + "/" + dataset.getName())) { + + // Throw an error if patching is not allowed. + if (!patch) { + throw new RuntimeException("Dataset " + folder + "/" + dataset.getName() + " already exists and patching is disabled."); + } + + LOGGER.info("patching existing dataset " + folder + "/" + dataset.getName()); + + String site = + ((DatasetWithViewModel) dataset).getViewInfo().getLocations().iterator().next().getSite(); + client.patchDataset(folder + "/" + dataset.getName(), "current", site, dataset); + + } else { + LOGGER.info("creating new dataset for " + folder + "/" + dataset.getName()); + client.createDataset(folder, dataset); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, e.getMessage(), e); + } + ++nUpdated; + } + LOGGER.info("Inserted or updated " + nUpdated + " datasets."); + } + + /** + * Create a dataset for insertion into the data catalog. + * + * @param file the file on disk + * @param metadata the metadata map + * @param folder the datacat folder + * @param site the datacat site + * @param dataType the data type + * @param fileFormat the file format + * @return the created dataset + */ + public static final DatasetModel createDataset( + File file, + Map<String, Object> metadata, + String folder, + String site, + String dataType, + String fileFormat) { + + LOGGER.info("creating dataset for " + file.getPath()); + + Provider provider = new Provider(); + Dataset.Builder datasetBuilder = provider.getDatasetBuilder(); + + // Set basic info on new dataset. + datasetBuilder.versionId(VersionId.valueOf("new")) + .master(true) + .name(file.getName()) + .resource(file.getPath()) + .dataType(dataType) + .fileFormat(fileFormat) + .site(site) + .scanStatus("OK"); + + // Set system metadata from the provided metadata map. + if (metadata.get("eventCount") != null) { + datasetBuilder.eventCount((Long) metadata.get("eventCount")); + } + if (metadata.get("checksum") != null) { + datasetBuilder.checksum((String) metadata.get("checksum")); + } + if (metadata.get("runMin") != null) { + datasetBuilder.runMin((Long) metadata.get("runMin")); + } + if (metadata.get("runMax") != null) { + datasetBuilder.runMax((Long) metadata.get("runMax")); + } + if (metadata.get("size") != null) { + datasetBuilder.size((Long) metadata.get("size")); + } + + // Create user metadata, leaving out system metadata fields. + Map<String, Object> userMetadata = new HashMap<String, Object>(); + for (Entry<String, Object> metadataEntry : metadata.entrySet()) { + if (!DatacatConstants.isSystemMetadata(metadataEntry.getKey())) { + userMetadata.put(metadataEntry.getKey(), metadataEntry.getValue()); + } + } + datasetBuilder.versionMetadata(userMetadata); + return datasetBuilder.build(); + } + + public static Client createDefaultClient() { + try { + return new ClientBuilder().setUrl(DatacatConstants.DATACAT_URL).build(); + } catch (URISyntaxException e) { + throw new RuntimeException("Error initializing datacat client.", e); + } + } + + public static DatasetResultSetModel findEvioDatasets(Client client, String folder, Site site, String[] metadata, String[] sort, int run) { + if (client == null) { + client = createDefaultClient(); + } + return client.searchForDatasets( + folder, + "current", /* dataset version */ + site.toString(), + "fileFormat eq 'EVIO' AND dataType eq 'RAW' AND runMin eq " + run, /* basic query */ + sort, /* sort on file number */ + metadata /* metadata field values to return from query */ + ); + } + + public static DatasetResultSetModel findEvioDatasets(int run) { + return findEvioDatasets( + null, + DatacatConstants.RAW_DATA_FOLDER, + DatacatConstants.DEFAULT_SITE, + DatacatConstants.EVIO_METADATA, + new String[] {"FILE"}, + run + ); + } +} Added: java/trunk/datacat/src/main/java/org/hps/datacat/FileEventRange.java ============================================================================= --- java/trunk/datacat/src/main/java/org/hps/datacat/FileEventRange.java (added) +++ java/trunk/datacat/src/main/java/org/hps/datacat/FileEventRange.java Thu Jul 7 15:52:41 2016 @@ -0,0 +1,67 @@ +package org.hps.datacat; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +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; + +/** + * Utility class for assocating a file in the datacat to its event ID range. + * @author jeremym + */ +public final class FileEventRange { + + private long startEvent; + private long endEvent; + private String path; + + FileEventRange(long startEvent, long endEvent, String path) { + this.startEvent = startEvent; + this.endEvent = endEvent; + this.path = path; + } + + public String getPath() { + return path; + } + + public long getStartEvent() { + return startEvent; + } + + public long getEndEvent() { + return endEvent; + } + + public boolean matches(long eventId) { + return eventId >= startEvent && eventId <= endEvent; + } + + public static List<FileEventRange> createEventRanges(DatasetResultSetModel results) { + List<FileEventRange> ranges = new ArrayList<FileEventRange>(); + for (DatasetModel ds : results) { + DatasetWithViewModel view = (DatasetWithViewModel) ds; + Map<String, Object> metadata = view.getMetadataMap(); + long firstPhysicsEvent = (Long) metadata.get("FIRST_PHYSICS_EVENT"); + long lastPhysicsEvent = (Long) metadata.get("LAST_PHYSICS_EVENT"); + DatasetLocation loc = (DatasetLocation) view.getViewInfo().getLocations().iterator().next(); + ranges.add(new FileEventRange(firstPhysicsEvent, lastPhysicsEvent, loc.getPath())); + } + return ranges; + } + + public static FileEventRange findEventRage(List<FileEventRange> ranges, long eventId) { + FileEventRange match = null; + for (FileEventRange range : ranges) { + if (range.matches(eventId)) { + match = range; + break; + } + } + return match; + } +} Copied: java/trunk/datacat/src/main/java/org/hps/datacat/FileFormat.java (from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/FileFormat.java) ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/FileFormat.java (original) +++ java/trunk/datacat/src/main/java/org/hps/datacat/FileFormat.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,7 @@ -package org.hps.crawler; +package org.hps.datacat; + +import java.util.HashMap; +import java.util.Map; /** @@ -28,7 +31,14 @@ * Testing only (do not use in production). */ TEST(null); - + + private static final Map<String, FileFormat> FORMAT_EXTENSIONS = new HashMap<String, FileFormat>(); + static { + for (final FileFormat format : FileFormat.values()) { + FORMAT_EXTENSIONS.put(format.extension(), format); + } + } + /** * The file extension of the format. */ @@ -58,4 +68,13 @@ public String extension() { return extension; } + + /** + * Find format by its extension. + * @param extension + * @return the format for the extension or <code>null</code> if does not exist + */ + public static FileFormat findFormat(String extension) { + return FORMAT_EXTENSIONS.get(extension); + } } Copied: java/trunk/datacat/src/main/java/org/hps/datacat/Site.java (from r4415, java/trunk/crawler/src/main/java/org/hps/crawler/Site.java) ============================================================================= --- java/trunk/crawler/src/main/java/org/hps/crawler/Site.java (original) +++ java/trunk/datacat/src/main/java/org/hps/datacat/Site.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.crawler; +package org.hps.datacat; /** * Site of a dataset (SLAC or JLAB). Modified: java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java Thu Jul 7 15:52:41 2016 @@ -29,7 +29,7 @@ import org.hps.record.LCSimEventBuilder; import org.hps.record.evio.EvioEventQueue; import org.hps.record.evio.EvioEventUtilities; -import org.hps.run.database.RunManager; +import org.hps.rundb.RunManager; import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.EvioEvent; import org.jlab.coda.jevio.EvioException; Modified: java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java Thu Jul 7 15:52:41 2016 @@ -17,7 +17,7 @@ import org.hps.record.triggerbank.SSPData; import org.hps.record.triggerbank.TDCData; import org.hps.record.triggerbank.TIData; -import org.hps.run.database.RunManager; +import org.hps.rundb.RunManager; import org.jlab.coda.jevio.EvioEvent; import org.lcsim.conditions.ConditionsEvent; import org.lcsim.event.EventHeader; Modified: java/trunk/evio/src/test/java/org/hps/evio/ScalersTest.java ============================================================================= --- java/trunk/evio/src/test/java/org/hps/evio/ScalersTest.java (original) +++ java/trunk/evio/src/test/java/org/hps/evio/ScalersTest.java Thu Jul 7 15:52:41 2016 @@ -15,7 +15,7 @@ import org.hps.record.scalers.ScalerData; import org.hps.record.scalers.ScalerUtilities; import org.hps.record.scalers.ScalerUtilities.LiveTimeIndex; -import org.hps.run.database.RunManager; +import org.hps.rundb.RunManager; import org.lcsim.event.EventHeader; import org.lcsim.util.Driver; import org.lcsim.util.cache.FileCache; Modified: java/trunk/job/src/main/java/org/hps/job/DatabaseConditionsManagerSetup.java ============================================================================= --- java/trunk/job/src/main/java/org/hps/job/DatabaseConditionsManagerSetup.java (original) +++ java/trunk/job/src/main/java/org/hps/job/DatabaseConditionsManagerSetup.java Thu Jul 7 15:52:41 2016 @@ -8,15 +8,13 @@ import org.hps.conditions.database.DatabaseConditionsManager; import org.hps.detector.svt.SvtDetectorSetup; -import org.hps.run.database.RunManager; +import org.hps.rundb.RunManager; import org.lcsim.conditions.ConditionsListener; import org.lcsim.job.DefaultConditionsSetup; /** * Provides setup for HPS specific conditions manager. - * - * @author Jeremy McCormick, SLAC - * + * @author jeremym */ public final class DatabaseConditionsManagerSetup extends DefaultConditionsSetup { Modified: java/trunk/parent/pom.xml ============================================================================= --- java/trunk/parent/pom.xml (original) +++ java/trunk/parent/pom.xml Thu Jul 7 15:52:41 2016 @@ -254,6 +254,11 @@ <artifactId>hps-integration-tests</artifactId> <version>3.10-SNAPSHOT</version> </dependency> + <dependency> + <groupId>org.hps</groupId> + <artifactId>hps-datacat</artifactId> + <version>3.10-SNAPSHOT</version> + </dependency> <!-- Next are external dependencies used in multiple modules. --> <dependency> <groupId>org.jlab.coda</groupId> @@ -298,7 +303,7 @@ <dependency> <groupId>srs</groupId> <artifactId>org-srs-datacat-client</artifactId> - <version>0.5-TEST3</version> + <version>0.5-SNAPSHOT</version> </dependency> </dependencies> </dependencyManagement> Modified: java/trunk/pom.xml ============================================================================= --- java/trunk/pom.xml (original) +++ java/trunk/pom.xml Thu Jul 7 15:52:41 2016 @@ -107,6 +107,7 @@ <module>analysis</module> <module>conditions</module> <module>crawler</module> + <module>datacat</module> <module>detector-data</module> <module>detector-model</module> <module>distribution</module> Copied: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigEvioProcessor.java (from r4415, java/trunk/record-util/src/main/java/org/hps/record/daqconfig/TriggerConfigEvioProcessor.java) ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/daqconfig/TriggerConfigEvioProcessor.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerConfigEvioProcessor.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.record.daqconfig; +package org.hps.record.triggerbank; import java.util.HashMap; import java.util.Map; @@ -8,7 +8,6 @@ import org.hps.record.evio.EvioBankTag; import org.hps.record.evio.EvioEventProcessor; import org.hps.record.evio.EvioEventUtilities; -import org.hps.record.triggerbank.TriggerConfigData; import org.hps.record.triggerbank.TriggerConfigData.Crate; import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.EvioEvent; @@ -91,29 +90,19 @@ // Add string data to map. stringData.put(crate, subBank.getStringData()[0]); LOGGER.info("Added crate " + crate.getCrateNumber() + " data ..." + '\n' + subBank.getStringData()[0]); - } /*else { - LOGGER.warning("The string bank has no data."); - }*/ + } } } catch (Exception e) { LOGGER.log(Level.SEVERE, "Error parsing DAQ config from crate " + crateNumber, e); e.printStackTrace(); } } - } /*else { - LOGGER.warning("Trigger config bank is missing string data."); - }*/ + } } } if (stringData != null) { LOGGER.info("Found " + stringData.size() + " config data strings in event " + evioEvent.getEventNumber()); - TriggerConfigData currentConfig = new TriggerConfigData(stringData, timestamp); - if (currentConfig.isValid()) { - triggerConfig = currentConfig; - LOGGER.info("Found valid DAQ config data in event num " + evioEvent.getEventNumber()); - } else { - LOGGER.warning("Skipping invalid DAQ config data in event num " + evioEvent.getEventNumber()); - } + triggerConfig = new TriggerConfigData(stringData, timestamp); } } Modified: java/trunk/run-database/pom.xml ============================================================================= --- java/trunk/run-database/pom.xml (original) +++ java/trunk/run-database/pom.xml Thu Jul 7 15:52:41 2016 @@ -20,6 +20,10 @@ <artifactId>hps-record-util</artifactId> </dependency> <dependency> + <groupId>org.hps</groupId> + <artifactId>hps-datacat</artifactId> + </dependency> + <dependency> <groupId>srs</groupId> <artifactId>org-srs-datacat-client</artifactId> </dependency> Copied: java/trunk/run-database/src/main/java/org/hps/rundb/DaoProvider.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/DaoProvider.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/DaoProvider.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/DaoProvider.java Thu Jul 7 15:52:41 2016 @@ -1,14 +1,13 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.SQLException; /** * Provider for creating database API objects for interacting with the run database. - * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -final class DaoProvider { +public final class DaoProvider { /** * The database connection. @@ -28,7 +27,7 @@ * * @param connection the database connection */ - DaoProvider(final Connection connection) { + public DaoProvider(final Connection connection) { if (connection == null) { throw new IllegalArgumentException("The connection is null."); } @@ -47,7 +46,7 @@ * * @return the EPICS DAO */ - EpicsDataDao getEpicsDataDao() { + public EpicsDataDao getEpicsDataDao() { if (epicsDao == null) { epicsDao = new EpicsDataDaoImpl(connection); } @@ -59,7 +58,7 @@ * * @return the EPICS variable DAO */ - EpicsVariableDao getEpicsVariableDao() { + public EpicsVariableDao getEpicsVariableDao() { if (epicsVariableDao == null) { epicsVariableDao = new EpicsVariableDaoImpl(connection); } @@ -71,7 +70,7 @@ * * @return the run summary DAO */ - RunSummaryDao getRunSummaryDao() { + public RunSummaryDao getRunSummaryDao() { if (runSummaryDao == null) { runSummaryDao = new RunSummaryDaoImpl(connection); } @@ -83,7 +82,7 @@ * * @return the scaler data DAO */ - ScalerDataDao getScalerDataDao() { + public ScalerDataDao getScalerDataDao() { if (scalerDao == null) { scalerDao = new ScalerDataDaoImpl(connection); } @@ -95,7 +94,7 @@ * * @return the SVT config DAO */ - SvtConfigDao getSvtConfigDao() { + public SvtConfigDao getSvtConfigDao() { if (svtDao == null) { svtDao = new SvtConfigDaoImpl(connection); } @@ -107,7 +106,7 @@ * * @return the trigger config DAO */ - TriggerConfigDao getTriggerConfigDao() { + public TriggerConfigDao getTriggerConfigDao() { if (configDao == null) { configDao = new TriggerConfigDaoImpl(connection); } Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDao.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.List; @@ -6,10 +6,9 @@ /** * Database Access Object (DAO) API for EPICS data from the run database. - * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -interface EpicsDataDao { +public interface EpicsDataDao { /** * Delete all EPICS data for a run from the database. Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsDataDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsDataDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.PreparedStatement; @@ -17,7 +17,7 @@ /** * Implementation of database operations for EPICS data. * - * @author Jeremy McCormick, SLAC + * @author jeremy */ final class EpicsDataDaoImpl implements EpicsDataDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsType.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsType.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsType.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsType.java Thu Jul 7 15:52:41 2016 @@ -1,14 +1,13 @@ -package org.hps.run.database; +package org.hps.rundb; import org.hps.record.epics.EpicsData; /** - * Enum for representing different types of EPICS data in the run database, of which there are currently two (2s and - * 20s). + * Enum for representing different types of EPICS data in the run database, of which there are currently two + * (2s and 20s). * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -// FIXME: move to record-util public enum EpicsType { /** Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariable.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariable.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariable.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariable.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; /** * Information about an EPICS variable including its name in the EPICS database, column name for the run database, @@ -7,9 +7,10 @@ * This class is used to represent data from the <i>epics_variables</i> table in the run database. * * @see EpicsType - * @see org.hps.run.database.EpicsVariableDao - * @see org.hps.run.database.EpicsVariableDaoImpl - * @author Jeremy McCormick, SLAC + * @see org.hps.rundb.EpicsVariableDao + * @see org.hps.rundb.EpicsVariableDaoImpl + * + * @author jeremym */ public final class EpicsVariable { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDao.java Thu Jul 7 15:52:41 2016 @@ -1,11 +1,11 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.List; /** * Database interface for EPICS variables. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ interface EpicsVariableDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EpicsVariableDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/EpicsVariableDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.PreparedStatement; @@ -11,7 +11,7 @@ /** * Implementation of database interface for EPICS variable information in the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ final class EpicsVariableDaoImpl implements EpicsVariableDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/RunManager.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunManager.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/RunManager.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/RunManager.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.SQLException; @@ -17,7 +17,7 @@ /** * Manages access to the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ public final class RunManager implements ConditionsListener { @@ -112,7 +112,7 @@ * Return the database connection. * @return the database connection */ - Connection getConnection() { + public Connection getConnection() { return this.connection; } @@ -208,7 +208,7 @@ * @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) { + public void updateRunSummary(RunSummary runSummary, boolean replaceExisting) { final RunSummaryDao runSummaryDao = factory.getRunSummaryDao(); RunManager runManager = new RunManager(); runManager.setRun(runSummary.getRun()); @@ -228,7 +228,7 @@ * @param triggerConfig the trigger config * @param replaceExisting <code>true</code> to allow an existing trigger to be replaced */ - void updateTriggerConfig(TriggerConfigData triggerConfig, boolean replaceExisting) { + public void updateTriggerConfig(TriggerConfigData triggerConfig, boolean replaceExisting) { final TriggerConfigDao configDao = factory.getTriggerConfigDao(); if (configDao.getTriggerConfig(run) != null) { if (replaceExisting) { @@ -244,7 +244,7 @@ * Create or replace EPICS data for the run. * @param epicsData the EPICS data */ - void updateEpicsData(List<EpicsData> epicsData) { + public void updateEpicsData(List<EpicsData> epicsData) { if (epicsData != null && !epicsData.isEmpty()) { factory.getEpicsDataDao().insertEpicsData(epicsData, this.run); } @@ -254,7 +254,7 @@ * Create or replace scaler data for the run. * @param scalerData the scaler data */ - void updateScalerData(List<ScalerData> scalerData) { + public void updateScalerData(List<ScalerData> scalerData) { if (scalerData != null) { factory.getScalerDataDao().insertScalerData(scalerData, this.run); } @@ -264,7 +264,7 @@ * Delete a run from the database. * @param run the run number */ - void deleteRun() { + public void deleteRun() { factory.getEpicsDataDao().deleteEpicsData(EpicsType.EPICS_2S, run); factory.getEpicsDataDao().deleteEpicsData(EpicsType.EPICS_20S, run); factory.getScalerDataDao().deleteScalerData(run); Copied: java/trunk/run-database/src/main/java/org/hps/rundb/RunSummary.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummary.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/RunSummary.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/RunSummary.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.Date; @@ -6,12 +6,13 @@ * This is an API for accessing run summary information which is persisted as a row in the <i>run_summaries</i> table. * <p> * All timestamp fields use the Unix convention (seconds since the epoch). - * - * @author Jeremy McCormick, SLAC + * * @see RunSummaryImpl * @see RunSummaryDao * @see RunSummaryDaoImpl * @see RunManager + * + * @author jeremym */ public interface RunSummary { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDao.java Thu Jul 7 15:52:41 2016 @@ -1,13 +1,13 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.List; /** * Database API for managing basic run summary information in the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -interface RunSummaryDao { +public interface RunSummaryDao { /** * Delete a run summary by run number. Copied: java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.PreparedStatement; @@ -11,7 +11,7 @@ /** * Implementation of database operations for {@link RunSummary} objects in the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ final class RunSummaryDaoImpl implements RunSummaryDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/RunSummaryImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/RunSummaryImpl.java Thu Jul 7 15:52:41 2016 @@ -1,13 +1,13 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.Date; /** * Implementation of {@link RunSummary} for retrieving information from the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -final class RunSummaryImpl implements RunSummary { +public final class RunSummaryImpl implements RunSummary { /** * Date this record was created. @@ -183,7 +183,7 @@ * * @param created the creation date */ - void setCreated(Date created) { + public void setCreated(Date created) { this.created = created; } @@ -192,7 +192,7 @@ * * @param endTimestamp the end timestamp */ - void setEndTimestamp(Integer endTimestamp) { + public void setEndTimestamp(Integer endTimestamp) { this.endTimestamp = endTimestamp; } @@ -201,7 +201,7 @@ * * @param goTimestamp the GO timestamp */ - void setGoTimestamp(Integer goTimestamp) { + public void setGoTimestamp(Integer goTimestamp) { this.goTimestamp = goTimestamp; } @@ -210,7 +210,7 @@ * * @param livetimeClock the clock livetime */ - void setLivetimeClock(Double livetimeClock) { + public void setLivetimeClock(Double livetimeClock) { this.livetimeClock = livetimeClock; } @@ -219,7 +219,7 @@ * * @param livetimeTdc the FCUP TDC livetime */ - void setLivetimeFcupTdc(Double livetimeTdc) { + public void setLivetimeFcupTdc(Double livetimeTdc) { this.livetimeTdc = livetimeTdc; } @@ -228,7 +228,7 @@ * * @param livetimeTrg the FCUP TRG livetime */ - void setLivetimeFcupTrg(Double livetimeTrg) { + public void setLivetimeFcupTrg(Double livetimeTrg) { this.livetimeTrg = livetimeTrg; } @@ -237,7 +237,7 @@ * * @param notes the notes */ - void setNotes(String notes) { + public void setNotes(String notes) { this.notes = notes; } @@ -246,7 +246,7 @@ * * @param prestartTimestamp the PRESTART timestamp */ - void setPrestartTimestamp(Integer prestartTimestamp) { + public void setPrestartTimestamp(Integer prestartTimestamp) { this.prestartTimestamp = prestartTimestamp; } @@ -255,7 +255,7 @@ * * @param target the target description */ - void setTarget(String target) { + public void setTarget(String target) { this.target = target; } @@ -264,7 +264,7 @@ * * @param tiTimeOffset the TIM time offset in ns */ - void setTiTimeOffset(Long tiTimeOffset) { + public void setTiTimeOffset(Long tiTimeOffset) { this.tiTimeOffset = tiTimeOffset; } @@ -273,7 +273,7 @@ * * @param totalEvents the total number of physics events in the run */ - void setTotalEvents(final Long totalEvents) { + public void setTotalEvents(final Long totalEvents) { this.totalEvents = totalEvents; } @@ -282,7 +282,7 @@ * * @param totalFiles the total number of EVIO files in the run */ - void setTotalFiles(final Integer totalFiles) { + public void setTotalFiles(final Integer totalFiles) { this.totalFiles = totalFiles; } @@ -291,7 +291,7 @@ * * @param triggerConfigName the trigger config file */ - void setTriggerConfigName(String triggerConfigName) { + public void setTriggerConfigName(String triggerConfigName) { this.triggerConfigName = triggerConfigName; } @@ -300,7 +300,7 @@ * * @param triggerRate the trigger rate in KHz */ - void setTriggerRate(Double triggerRate) { + public void setTriggerRate(Double triggerRate) { this.triggerRate = triggerRate; } @@ -309,7 +309,7 @@ * * @param updated the updated date */ - void setUpdated(Date updated) { + public void setUpdated(Date updated) { this.updated = updated; } Copied: java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDao.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.List; @@ -7,9 +7,9 @@ /** * Database Access Object (DAO) for scaler data in the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -interface ScalerDataDao { +public interface ScalerDataDao { /** * Delete scaler data for the run. Copied: java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/ScalerDataDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Connection; import java.sql.PreparedStatement; @@ -13,7 +13,7 @@ /** * Implementation of database API for {@link org.hps.record.scalers.ScalerData} in the run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ final class ScalerDataDaoImpl implements ScalerDataDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDao.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.util.List; @@ -7,9 +7,9 @@ /** * Database API for accessing SVT configuration in run database. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -interface SvtConfigDao { +public interface SvtConfigDao { /** * Insert SVT configurations. Copied: java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/SvtConfigDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/SvtConfigDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Clob; import java.sql.Connection; @@ -14,7 +14,7 @@ /** * Implementation of SVT configuration database operations. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ final class SvtConfigDaoImpl implements SvtConfigDao { Copied: java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDao.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDao.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDao.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDao.java Thu Jul 7 15:52:41 2016 @@ -1,13 +1,13 @@ -package org.hps.run.database; +package org.hps.rundb; import org.hps.record.triggerbank.TriggerConfigData; /** * Database interface for getting raw trigger config data and inserting into run db. * - * @author Jeremy McCormick, SLAC + * @author jeremym */ -interface TriggerConfigDao { +public interface TriggerConfigDao { /** * Get a trigger config by run number. Copied: java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDaoImpl.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDaoImpl.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/TriggerConfigDaoImpl.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/TriggerConfigDaoImpl.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb; import java.sql.Clob; import java.sql.Connection; @@ -11,6 +11,11 @@ import org.hps.record.triggerbank.TriggerConfigData; import org.hps.record.triggerbank.TriggerConfigData.Crate; +/** + * Implementation of trigger configuration database operations. + * + * @author jeremym + */ final class TriggerConfigDaoImpl implements TriggerConfigDao { private static final String INSERT = @@ -37,26 +42,23 @@ } this.connection = connection; } - @Override public void insertTriggerConfig(TriggerConfigData config, int run) { - if (!config.isValid()) { - throw new RuntimeException("The trigger config is not valid."); - } PreparedStatement preparedStatement = null; try { preparedStatement = connection.prepareStatement(INSERT); preparedStatement.setInt(1, run); preparedStatement.setInt(2, config.getTimestamp()); Map<Crate, String> data = config.getData(); - if (data.size() != TriggerConfigData.Crate.values().length) { - throw new IllegalArgumentException("The trigger config data has the wrong length."); - } preparedStatement.setBytes(3, data.get(TriggerConfigData.Crate.CONFIG1).getBytes()); preparedStatement.setBytes(4, data.get(TriggerConfigData.Crate.CONFIG2).getBytes()); preparedStatement.setBytes(5, data.get(TriggerConfigData.Crate.CONFIG3).getBytes()); - preparedStatement.setBytes(6, data.get(TriggerConfigData.Crate.CONFIG4).getBytes()); + if (data.get(TriggerConfigData.Crate.CONFIG4) != null) { + preparedStatement.setBytes(6, data.get(TriggerConfigData.Crate.CONFIG4).getBytes()); + } else { + preparedStatement.setObject(6, null); + } preparedStatement.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); Copied: java/trunk/run-database/src/main/java/org/hps/rundb/builder/AbstractRunBuilder.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/AbstractRunBuilder.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/AbstractRunBuilder.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/AbstractRunBuilder.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,6 @@ -package org.hps.run.database; +package org.hps.rundb.builder; + +import org.hps.rundb.RunSummaryImpl; /** * Class for incrementally building records for the run database. Added: java/trunk/run-database/src/main/java/org/hps/rundb/builder/BuilderCommandLine.java ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/rundb/builder/BuilderCommandLine.java (added) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/BuilderCommandLine.java Thu Jul 7 15:52:41 2016 @@ -0,0 +1,237 @@ +package org.hps.rundb.builder; + +import java.io.File; +import java.net.URISyntaxException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.logging.Logger; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; +import org.hps.conditions.database.ConnectionParameters; +import org.hps.rundb.DaoProvider; +import org.hps.rundb.RunManager; +import org.hps.rundb.RunSummaryDao; +import org.hps.rundb.RunSummaryImpl; +import org.srs.datacat.client.ClientBuilder; + +import org.hps.datacat.DatacatConstants; +import org.hps.datacat.Site; + +/** + * Creates a basic run database record from information in the data catalog + * as well as (optionally) a CSV dump of the run spreadsheet from Google Docs. + * + * @author jeremym + */ +public class BuilderCommandLine { + + private static final Logger LOGGER = + Logger.getLogger(BuilderCommandLine.class.getPackage().getName()); + + /** + * Command line options for the crawler. + */ + private static final Options OPTIONS = new Options(); + + /** + * Statically define the command options. + */ + static { + OPTIONS.addOption("h", "help", false, "print help and exit (overrides all other arguments)"); + OPTIONS.addOption("r", "run", true, "run to insert or update (required)"); + OPTIONS.getOption("r").setRequired(true); + OPTIONS.addOption("p", "connection-properties", true, "database connection properties file (required)"); + OPTIONS.getOption("p").setRequired(true); + OPTIONS.addOption("s", "spreadsheet", true, "path to run database spreadsheet CSV file (optional)"); + OPTIONS.addOption("u", "url", true, "data catalog URL (optional)"); + OPTIONS.addOption("S", "site", true, "data catalog site e.g. SLAC or JLAB (optional)"); + OPTIONS.addOption("f", "folder", true, "folder in datacat for dataset search (optional)"); + OPTIONS.addOption("D", "dry-run", false, "enable dry run with no db update (optional)"); + } + + /** + * Run the program from the command line. + * + * @param args the command line arguments + */ + public static void main(final String args[]) { + new BuilderCommandLine().parse(args).run(); + } + + /** + * Run number. + */ + private int run; + + /** + * Path to spreadsheet CSV file. + */ + private File spreadsheetFile = null; + + /** + * Data catalog site. + */ + private String site = Site.JLAB.toString(); + + /** + * Data catalog URL. + */ + private String url = DatacatConstants.DATACAT_URL; + + /** + * Default folder for file search. + */ + private String folder = DatacatConstants.RAW_DATA_FOLDER; + + /** + * Database connection parameters. + */ + private ConnectionParameters connectionParameters = null; + + /** + * <code>true</code> if database should not be updated. + */ + private boolean dryRun = false; + + /** + * Parse command line options and return reference to <code>this</code> object. + * + * @param args the command line arguments + * @return reference to this object + */ + private BuilderCommandLine parse(final String args[]) { + try { + final CommandLine cl = new PosixParser().parse(OPTIONS, args); + + // Print help and exit. + if (cl.hasOption("h") || args.length == 0) { + final HelpFormatter help = new HelpFormatter(); + help.printHelp("RunDatabaseCommandLine [options]", "", OPTIONS, ""); + System.exit(0); + } + + // Run number. + if (cl.hasOption("r")) { + run = Integer.parseInt(cl.getOptionValue("r")); + } else { + throw new RuntimeException("The run number is required."); + } + + // Run spreadsheet. + if (cl.hasOption("s")) { + this.spreadsheetFile = new File(cl.getOptionValue("s")); + if (!this.spreadsheetFile.exists()) { + throw new RuntimeException("The run spreadsheet " + this.spreadsheetFile.getPath() + " is inaccessible or does not exist."); + } + } + + // Data catalog URL. + if (cl.hasOption("u")) { + url = cl.getOptionValue("u"); + } + + // Site in the data catalog. + if (cl.hasOption("S")) { + site = cl.getOptionValue("S"); + } + + // Set folder for dataset search. + if (cl.hasOption("f")) { + folder = cl.getOptionValue("f"); + } + + // Database connection properties file. + if (cl.hasOption("p")) { + final String dbPropPath = cl.getOptionValue("p"); + final File dbPropFile = new File(dbPropPath); + if (!dbPropFile.exists()) { + throw new IllegalArgumentException("Connection properties file " + dbPropFile.getPath() + " does not exist."); + } + connectionParameters = ConnectionParameters.fromProperties(dbPropFile); + } else { + // Database connection properties file is required. + throw new RuntimeException("Connection properties are a required argument."); + } + + if (cl.hasOption("D")) { + this.dryRun = true; + } + + } catch (final ParseException e) { + throw new RuntimeException(e); + } + + return this; + } + + /** + * Configure the builder from command line options and run the job to update the database. + */ + private void run() { + + System.out.println("connecting to " + this.connectionParameters.getConnectionString() + " ..."); + + RunManager mgr = new RunManager(this.connectionParameters.createConnection()); + Connection connection = mgr.getConnection(); + try { + connection.setAutoCommit(true); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + mgr.setRun(run); + + RunSummaryImpl runSummary = new RunSummaryImpl(run); + + // build info from datacat + DatacatBuilder datacatBuilder = new DatacatBuilder(); + try { + datacatBuilder.setDatacatClient(new ClientBuilder().setUrl(url).build()); + } catch (URISyntaxException e) { + throw new RuntimeException("Datacat URL " + url + " is invalid.", e); + } + datacatBuilder.setFolder(folder); + datacatBuilder.setSite(site); + datacatBuilder.setRunSummary(runSummary); + datacatBuilder.build(); + + // build info from run spreadsheet + if (spreadsheetFile != null) { + SpreadsheetBuilder spreadsheetBuilder = new SpreadsheetBuilder(); + spreadsheetBuilder.setSpreadsheetFile(spreadsheetFile); + spreadsheetBuilder.setRunSummary(datacatBuilder.getRunSummary()); + spreadsheetBuilder.build(); + } else { + LOGGER.warning("No run spreadsheet provided with command line option!"); + } + + LOGGER.info(runSummary.toString()); + + // insert run summary + if (!dryRun) { + RunSummaryDao runSummaryDao = new DaoProvider(connection).getRunSummaryDao(); + if (mgr.runExists()) { + System.out.println("updating existing run summary ..."); + runSummaryDao.updateRunSummary(runSummary); + } else { + System.out.println("inserting new run summary ..."); + runSummaryDao.insertRunSummary(runSummary); + } + + try { + System.out.println("closing db connection ..."); + connection.close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } else { + LOGGER.info("Dry run enabled. Database was not updated!"); + } + + System.out.println("DONE!"); + } +} Copied: java/trunk/run-database/src/main/java/org/hps/rundb/builder/DatacatBuilder.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/DatacatBuilder.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/DatacatBuilder.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/DatacatBuilder.java Thu Jul 7 15:52:41 2016 @@ -1,8 +1,10 @@ -package org.hps.run.database; +package org.hps.rundb.builder; import java.io.File; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import org.hps.record.triggerbank.TiTimeOffsetCalculator; @@ -13,17 +15,24 @@ import org.srs.datacat.model.dataset.DatasetWithViewModel; import org.srs.datacat.shared.DatasetLocation; -final class DatacatBuilder extends AbstractRunBuilder { +/** + * Builds information for the run database from the EVIO data catalog entries. + * + * @author jeremym + */ +public final class DatacatBuilder extends AbstractRunBuilder { private static final Logger LOGGER = Logger.getLogger(DatacatBuilder.class.getPackage().getName()); private static final String[] METADATA_FIELDS = { - "TI_TIME_MIN_OFFSET", - "TI_TIME_MAX_OFFSET", - "TI_TIME_N_OUTLIERS", + "TI_TIME_MIN_OFFSET", + "TI_TIME_MAX_OFFSET", + "TI_TIME_N_OUTLIERS", "END_TIMESTAMP", "GO_TIMESTAMP", - "PRESTART_TIMESTAMP" + "PRESTART_TIMESTAMP", + "END_EVENT_COUNT", + "FILE" }; private Client datacatClient; @@ -31,7 +40,7 @@ private String folder; private List<File> files; - private static long calculateTiTimeOffset(DatasetResultSetModel results) { + private long calculateTiTimeOffset(DatasetResultSetModel results) { TiTimeOffsetCalculator calc = new TiTimeOffsetCalculator(); for (DatasetModel ds : results) { DatasetWithViewModel view = (DatasetWithViewModel) ds; @@ -48,18 +57,21 @@ } return calc.calculateTimeOffset(); } - - private static long getTotalEvents(DatasetResultSetModel results) { + + private long countEvents(DatasetResultSetModel results) { + LOGGER.info("Calculating total events from file event counts ..."); long totalEvents = 0; for (DatasetModel ds : results) { DatasetWithViewModel view = (DatasetWithViewModel) ds; - DatasetLocation loc = (DatasetLocation) view.getViewInfo().getLocations().iterator().next(); - totalEvents += loc.getEventCount(); - } + //Map<String, Object> metadata = view.getMetadataMap(); + long eventCount = ((DatasetLocation) view.getViewInfo().getLocations().iterator().next()).getEventCount(); + totalEvents += eventCount; + } + LOGGER.info("Calculated " + totalEvents + " total events from event counts."); return totalEvents; } - private static Integer getPrestartTimestamp(DatasetResultSetModel results) { + private Integer getPrestartTimestamp(DatasetResultSetModel results) { DatasetWithViewModel ds = (DatasetWithViewModel) results.getResults().get(0); if (ds.getMetadataMap().containsKey("PRESTART_TIMESTAMP")) { return (int) (long) ds.getMetadataMap().get("PRESTART_TIMESTAMP"); @@ -68,7 +80,7 @@ } } - private static Integer getEndTimestamp(DatasetResultSetModel results) { + private Integer getEndTimestamp(DatasetResultSetModel results) { DatasetWithViewModel ds = (DatasetWithViewModel) results.getResults().get(results.getResults().size() - 1); if (ds.getMetadataMap().containsKey("END_TIMESTAMP")) { return (int) (long) ds.getMetadataMap().get("END_TIMESTAMP"); @@ -78,7 +90,7 @@ } - private static Integer getGoTimestamp(DatasetResultSetModel results) { + private Integer getGoTimestamp(DatasetResultSetModel results) { DatasetWithViewModel ds = (DatasetWithViewModel) results.getResults().get(0); if (ds.getMetadataMap().containsKey("GO_TIMESTAMP")) { return (int) (long) ds.getMetadataMap().get("GO_TIMESTAMP"); @@ -87,7 +99,7 @@ } } - private static double calculateTriggerRate(Integer startTimestamp, Integer endTimestamp, long nEvents) { + private double calculateTriggerRate(Integer startTimestamp, Integer endTimestamp, long nEvents) { if (startTimestamp == null) { throw new IllegalArgumentException("The start timestamp is null."); } @@ -102,6 +114,18 @@ } double triggerRate = (double) nEvents / ((double) endTimestamp - (double) startTimestamp); return triggerRate; + } + + private long calculateTotalEvents(DatasetResultSetModel results) { + DatasetWithViewModel lastDataset = + (DatasetWithViewModel) results.getResults().get(results.getResults().size() - 1); + long totalEvents = 0; + if (lastDataset.getMetadataMap().containsKey("END_EVENT_COUNT")) { /* calculate from each file */ + totalEvents = (Long) lastDataset.getMetadataMap().get("END_EVENT_COUNT"); + } else { + totalEvents = countEvents(results); + } + return totalEvents; } void build() { @@ -127,32 +151,46 @@ throw new RuntimeException(e); } - files = DatacatUtilities.toFileList(results); + files = toFileList(results); if (results.getResults().isEmpty()) { throw new RuntimeException("No results found for datacat search."); } - - long tiTimeOffset = calculateTiTimeOffset(results); - getRunSummary().setTiTimeOffset(tiTimeOffset); - - long totalEvents = getTotalEvents(results); + + try { + long tiTimeOffset = calculateTiTimeOffset(results); + getRunSummary().setTiTimeOffset(tiTimeOffset); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Error calculating TI time offset.", e); + } + + long totalEvents = calculateTotalEvents(results); getRunSummary().setTotalEvents(totalEvents); int nFiles = results.getResults().size(); getRunSummary().setTotalFiles(nFiles); - int prestartTimestamp = getPrestartTimestamp(results); - getRunSummary().setPrestartTimestamp(prestartTimestamp); - - int goTimestamp = getGoTimestamp(results); - getRunSummary().setGoTimestamp(goTimestamp); - - int endTimestamp = getEndTimestamp(results); - getRunSummary().setEndTimestamp(endTimestamp); - - double triggerRate = calculateTriggerRate(prestartTimestamp, endTimestamp, totalEvents); - getRunSummary().setTriggerRate(triggerRate); + Integer prestartTimestamp = getPrestartTimestamp(results); + if (prestartTimestamp != null) { + getRunSummary().setPrestartTimestamp(prestartTimestamp); + } + + Integer goTimestamp = getGoTimestamp(results); + if (goTimestamp != null) { + getRunSummary().setGoTimestamp(goTimestamp); + } + + Integer endTimestamp = getEndTimestamp(results); + if (endTimestamp != null) { + getRunSummary().setEndTimestamp(endTimestamp); + } + + try { + double triggerRate = calculateTriggerRate(prestartTimestamp, endTimestamp, totalEvents); + getRunSummary().setTriggerRate(triggerRate); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Error calculating trigger rate.", e); + } } private DatasetResultSetModel findDatasets() { @@ -161,11 +199,11 @@ DatasetResultSetModel results = datacatClient.searchForDatasets( this.folder, - "current", + "current", /* dataset version */ this.site, - "fileFormat eq 'EVIO' AND dataType eq 'RAW' AND runMin eq " + getRun(), - new String[] {"FILE"}, - METADATA_FIELDS + "fileFormat eq 'EVIO' AND dataType eq 'RAW' AND runMin eq " + getRun(), /* basic query */ + new String[] {"FILE"}, /* sort on file number */ + METADATA_FIELDS /* metadata field values to return from query */ ); LOGGER.info("found " + results.getResults().size() + " EVIO datasets for run " + getRun()); @@ -188,4 +226,17 @@ List<File> getFileList() { return files; } + + static final List<File> toFileList(DatasetResultSetModel datasets) { + List<File> files = new ArrayList<File>(); + for (DatasetModel dataset : datasets.getResults()) { + String resource = + ((DatasetWithViewModel) dataset).getViewInfo().getLocations().iterator().next().getResource(); + if (resource.startsWith("/ss")) { + resource = "/cache" + resource; + } + files.add(new File(resource)); + } + return files; + } } Copied: java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataBuilder.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/EvioDataBuilder.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataBuilder.java Thu Jul 7 15:52:41 2016 @@ -1,29 +1,28 @@ -package org.hps.run.database; +package org.hps.rundb.builder; 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; +import org.hps.record.triggerbank.TriggerConfigData; +import org.hps.record.triggerbank.TriggerConfigEvioProcessor; /** - * Extracts lists of EPICS and scaler data in an EVIO file and insert - * them into the run database. + * Extracts EPICS data, scaler data and trigger configuration from an EVIO file. * * @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; + private TriggerConfigData triggerConfig; void setEvioFile(File evioFile) { this.evioFile = evioFile; @@ -37,6 +36,10 @@ return scalerData; } + TriggerConfigData getTriggerConfig() { + return triggerConfig; + } + @Override void build() { if (evioFile == null) { @@ -48,36 +51,12 @@ ScalersEvioProcessor scalersProcessor = new ScalersEvioProcessor(); scalersProcessor.setResetEveryEvent(false); EpicsRunProcessor epicsProcessor = new EpicsRunProcessor(); - loop.addProcessor(epicsProcessor); + loop.addProcessor(epicsProcessor); + TriggerConfigEvioProcessor configProcessor = new TriggerConfigEvioProcessor(); + loop.addProcessor(configProcessor); 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."); - } + this.triggerConfig = configProcessor.getTriggerConfigData(); } } Added: java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataCommandLine.java ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataCommandLine.java (added) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/EvioDataCommandLine.java Thu Jul 7 15:52:41 2016 @@ -0,0 +1,163 @@ +package org.hps.rundb.builder; + +import java.io.File; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; +import org.hps.conditions.database.ConnectionParameters; +import org.hps.record.evio.EvioFileUtilities; +import org.hps.rundb.RunManager; + +/** + * Extracts information from EVIO files and inserts into the run database. + * + * @author jeremym + */ +public class EvioDataCommandLine { + + private Logger LOGGER = Logger.getLogger(EvioDataCommandLine.class.getPackage().getName()); + + private boolean dryRun = false; + private ConnectionParameters connectionParameters = null; + private List<File> evioFiles = new ArrayList<File>(); + + /** + * Command line options for the crawler. + */ + private static final Options OPTIONS = new Options(); + + static { + OPTIONS.addOption("h", "help", false, "print help and exit (overrides all other arguments)"); + OPTIONS.addOption("p", "connection-properties", true, "database connection properties file (required)"); + OPTIONS.getOption("p").setRequired(true); + OPTIONS.addOption("D", "dry-run", false, "enable dry run with no db update (optional)"); + } + + public static void main(String[] args) { + new EvioDataCommandLine().parse(args).run(); + } + + private EvioDataCommandLine parse(String[] args) { + try { + final CommandLine cl = new PosixParser().parse(OPTIONS, args); + + if (cl.hasOption("h") || args.length == 0) { + final HelpFormatter help = new HelpFormatter(); + help.printHelp("EvioDataCommandLine [options] file1 file2 ...", "", OPTIONS, ""); + System.exit(0); + } + + if (cl.hasOption("D")) { + dryRun = true; + LOGGER.config("Dry run enabled; database will not be updated."); + } + + if (cl.hasOption("p")) { + final String dbPropPath = cl.getOptionValue("p"); + final File dbPropFile = new File(dbPropPath); + if (!dbPropFile.exists()) { + throw new IllegalArgumentException("Connection properties file " + dbPropFile.getPath() + + " does not exist."); + } + connectionParameters = ConnectionParameters.fromProperties(dbPropFile); + LOGGER.config("connection props set from " + dbPropFile.getPath()); + } else { + // Database connection properties file is required. + throw new RuntimeException("Connection properties are a required argument."); + } + + for (String arg : cl.getArgList()) { + evioFiles.add(new File(arg)); + LOGGER.config("adding file " + arg + " to job"); + } + + if (evioFiles.isEmpty()) { + throw new RuntimeException("No EVIO files were provided from the command line."); + } + + } catch (ParseException e) { + throw new RuntimeException("Error parsing command line arguments.", e); + } + return this; + } + + private void run() { + + RunManager runManager = new RunManager(this.connectionParameters.createConnection()); + Connection connection = runManager.getConnection(); + try { + connection.setAutoCommit(false); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + for (File evioFile : evioFiles) { + + LOGGER.info("Processing file " + evioFile.getPath() + " ..."); + + int run = EvioFileUtilities.getRunFromName(evioFile); + + EvioDataBuilder builder = new EvioDataBuilder(); + builder.setEvioFile(evioFile); + builder.build(); + + LOGGER.info("Found " + builder.getEpicsData().size() + " EPICS records."); + LOGGER.info("Found " + builder.getScalerData().size() + " scaler records."); + + LOGGER.info("Set run " + run + " from file " + evioFile); + + runManager.setRun(run); + + if (!dryRun) { + + try { + runManager.updateEpicsData(builder.getEpicsData()); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Problem updating EPICS data in db.", e); + } + + try { + runManager.updateScalerData(builder.getScalerData()); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Problem updating scaler data in db.", e); + } + + try { + if (builder.getTriggerConfig() != null) { + runManager.updateTriggerConfig(builder.getTriggerConfig(), false /* do not replace existing config */); + } else { + LOGGER.info("No valid trigger config data was found."); + } + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Problem updating trigger config data in db.", e); + } + } else { + LOGGER.info("Dry run is enabled; database will not be updated."); + } + + LOGGER.info("Done processing " + evioFile.getPath()); + } + + // Commit the transaction. + try { + connection.commit(); + } catch (SQLException e) { + throw new RuntimeException("Failed to commit db transaction.", e); + } + + try { + connection.close(); + } catch (SQLException e) { + LOGGER.log(Level.WARNING, "Error closing db connection.", e); + } + } +} Copied: java/trunk/run-database/src/main/java/org/hps/rundb/builder/LivetimeBuilder.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/LivetimeBuilder.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/LivetimeBuilder.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/LivetimeBuilder.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb.builder; import java.io.File; import java.io.IOException; @@ -13,6 +13,11 @@ import org.jlab.coda.jevio.EvioException; import org.jlab.coda.jevio.EvioReader; +/** + * Computes livetimes from a set of EVIO files. + * + * @author jeremym + */ public class LivetimeBuilder extends AbstractRunBuilder { private List<File> files; Copied: java/trunk/run-database/src/main/java/org/hps/rundb/builder/SpreadsheetBuilder.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/SpreadsheetBuilder.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/SpreadsheetBuilder.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/builder/SpreadsheetBuilder.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb.builder; import java.io.File; import java.util.logging.Logger; @@ -7,17 +7,11 @@ import org.hps.conditions.run.RunSpreadsheet.RunData; /** - * Builds a complete {@link RunSummary} object from various data sources, including the data catalog and the run - * spreadsheet, so that it is ready to be inserted into the run database using the DAO interfaces. This class also - * extracts EPICS data, scaler data, trigger config and SVT config information from all of the EVIO files in a run. - * <p> - * The setters and some other methods follow the builder pattern and so can be chained by the caller. + * Adds information to a {@link RunSummary} from the run spreadsheet. * - * @author Jeremy McCormick, SLAC - * @see RunSummary - * @see RunSummaryImpl + * @author jeremym */ -final class SpreadsheetBuilder extends AbstractRunBuilder { +public final class SpreadsheetBuilder extends AbstractRunBuilder { private static final Logger LOGGER = Logger.getLogger(SpreadsheetBuilder.class.getPackage().getName()); @@ -34,7 +28,7 @@ * @return this object */ @Override - void build() { + void build() { if (this.spreadsheetFile == null) { throw new IllegalStateException("The spreadsheet file was never set."); } Copied: java/trunk/run-database/src/main/java/org/hps/rundb/package-info.java (from r4415, java/trunk/run-database/src/main/java/org/hps/run/database/package-info.java) ============================================================================= --- java/trunk/run-database/src/main/java/org/hps/run/database/package-info.java (original) +++ java/trunk/run-database/src/main/java/org/hps/rundb/package-info.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ /** * API for accessing and updating the HPS run database. */ -package org.hps.run.database; +package org.hps.rundb; Copied: java/trunk/run-database/src/test/java/org/hps/rundb/builder/RunBuilderTest.java (from r4415, java/trunk/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java) ============================================================================= --- java/trunk/run-database/src/test/java/org/hps/run/database/RunBuilderTest.java (original) +++ java/trunk/run-database/src/test/java/org/hps/rundb/builder/RunBuilderTest.java Thu Jul 7 15:52:41 2016 @@ -1,4 +1,4 @@ -package org.hps.run.database; +package org.hps.rundb.builder; import java.io.File; import java.util.List; @@ -6,6 +6,8 @@ import junit.framework.TestCase; import org.hps.conditions.database.ConnectionParameters; +import org.hps.rundb.RunManager; +import org.hps.rundb.RunSummaryImpl; import org.srs.datacat.client.ClientBuilder; public class RunBuilderTest extends TestCase { @@ -38,12 +40,7 @@ livetimeBuilder.setRunSummary(runSummary); livetimeBuilder.setFiles(files); livetimeBuilder.build(); - - // trigger config - TriggerConfigBuilder configBuilder = new TriggerConfigBuilder(); - configBuilder.setFiles(files); - configBuilder.build(); - + // run spreadsheet SpreadsheetBuilder spreadsheetBuilder = new SpreadsheetBuilder(); spreadsheetBuilder.setSpreadsheetFile(new File(SPREADSHEET)); @@ -58,7 +55,6 @@ // 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()); } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java Thu Jul 7 15:52:41 2016 @@ -12,6 +12,7 @@ import java.util.TimeZone; import java.util.logging.Level; import java.util.logging.Logger; + import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; @@ -29,7 +30,7 @@ import org.hps.conditions.svt.SvtMotorPosition; import org.hps.conditions.svt.SvtMotorPosition.SvtMotorPositionCollection; import org.hps.conditions.svt.SvtTimingConstants; -import org.hps.run.database.RunManager; +import org.hps.rundb.RunManager; /** * @author Sho Uemura <[log in to unmask]> Modified: java/trunk/users/src/main/java/org/hps/users/spaul/FindBiasOnRange.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/FindBiasOnRange.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/FindBiasOnRange.java Thu Jul 7 15:52:41 2016 @@ -4,19 +4,18 @@ import java.io.PrintStream; import org.hps.record.epics.EpicsData; -import org.hps.run.database.EpicsType; import org.lcsim.event.EventHeader; import org.lcsim.util.Driver; public class FindBiasOnRange extends Driver{ - /*tab*//*tab*//*tab*/ + String svtBiasName = "SVT:bias:top:0:v_sens"; String outfile = "bias_on.txt"; @Override public void process(EventHeader event){ final EpicsData edata = EpicsData.read(event); - if (edata == null) + if (edata == null) return; System.out.println(edata.getKeys()); if(!edata.hasKey(svtBiasName))