LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  December 2014

HPS-SVN December 2014

Subject:

r1815 - in /java/trunk/conditions/src: main/java/org/hps/conditions/ main/java/org/hps/conditions/api/ main/java/org/hps/conditions/beam/ main/java/org/hps/conditions/database/ main/java/org/hps/conditions/ecal/ main/java/org/hps/conditions/svt/ main/resources/org/hps/conditions/config/ test/java/org/hps/conditions/ test/java/org/hps/conditions/api/ test/java/org/hps/conditions/database/ test/java/org/hps/conditions/ecal/ test/java/org/hps/conditions/svt/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Wed, 31 Dec 2014 00:44:59 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (3763 lines)

Author: [log in to unmask]
Date: Tue Dec 30 16:44:44 2014
New Revision: 1815

Log:
Revise conditions system to use annotations and other improvements.  HPSJAVA-372

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_engrun.xml
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_prod.xml
    java/trunk/conditions/src/test/java/org/hps/conditions/database/
    java/trunk/conditions/src/test/java/org/hps/conditions/database/ConverterRegistryTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/database/TableRegistryTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java
      - copied, changed from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/EcalDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java
      - copied, changed from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/SvtDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java
      - copied, changed from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/TestRunSvtDetectorSetupTest.java
Removed:
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamConverterRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConverterRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConverterRegistry.java
    java/trunk/conditions/src/test/java/org/hps/conditions/EcalDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/SvtDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/TestRunSvtDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/api/
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalConditionsConverterTest.java
Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableConstants.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_testrun_2012.xml
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalLedTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	Tue Dec 30 16:44:44 2014
@@ -18,11 +18,12 @@
  * <pre>
  * {@code
  * <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver">
- *     <freeze>true</freeze>
  *     <detectorName>HPS-TestRun-v5</detectorName>
+ *     <runNumber>1351</runNumber>
+ *     <xmlConfigResource>/org/hps/conditions/config/conditions_database_testrun_2012.xml</xmlConfigResource>
  *     <ecalName>Ecal</ecalName>
  *     <svtName>Tracker</svtName>
- *     <runNumber>1351</runNumber>
+ *     <freeze>true</freeze>
  * </driver>
  * }
  * </pre> 
@@ -39,10 +40,12 @@
  */
 public class ConditionsDriver extends Driver {
 
+    DatabaseConditionsManager conditionsManager;
     String detectorName = null;
     String ecalName = null;
     String svtName = null;
     String tag = null;
+    String xmlConfigResource = null;
     int runNumber = 0;
     boolean freeze;    
     
@@ -50,12 +53,11 @@
      * Default constructor.
      */
     public ConditionsDriver() {
-        new DatabaseConditionsManager();
+        conditionsManager = new DatabaseConditionsManager();
     }
     
     /**
      * Set the name of the detector to use.
-     * 
      * @param detectorName The name of the detector.
      */
     public void setDetectorName(String detectorName) {
@@ -67,7 +69,6 @@
      * detector name and run number are set.  When frozen, the conditions system
      * will ignore subsequent calls to {@link org.lcsim.conditions.ConditionsManager#setDetector(String, int)}
      * and instead use the user supplied detector and run for the whole job.
-     * 
      * @param freeze True to freeze the conditions system after it is setup.
      */
     public void setFreeze(boolean freeze) {
@@ -82,7 +83,6 @@
      * 
      * The method {@link #setDetectorName(String)} needs to be called before this one
      * or an exception will be thrown.
-     * 
      * @param runNumber The user supplied run number for the job.
      */
     public void setRunNumber(int runNumber) {
@@ -116,11 +116,23 @@
     }
     
     /**
+     * Set an XML configuration resource.
+     * @param xmlConfigResource The XML configuration resource.
+     */
+    public void setXmlConfigResource(String xmlConfigResource) {
+        this.xmlConfigResource = xmlConfigResource;
+    }
+    
+    /**
      * Setup the conditions system based on the Driver parameters.
      * @throws RuntimeException If there is a problem setting up the conditions system.
      */
     public void initialize() {
-        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        if (xmlConfigResource != null) {
+            // Set a custom XML configuration resource.
+            conditionsManager.setXmlConfig(xmlConfigResource);
+        }
+
         if (ecalName != null) {
             // Set custom ECAL name.
             conditionsManager.setEcalName(ecalName);
@@ -134,7 +146,7 @@
             conditionsManager.setTag(tag);
         }
         if (detectorName != null) {
-            // The manager can only be initialized if there is a user supplied detector name.
+            // The manager can only be initialized here if there is a user supplied detector name.
             try {
                 // Initialize the conditions manager.
                 conditionsManager.setDetector(detectorName, runNumber);

Added: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,101 @@
+package org.hps.conditions.api;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
+
+import javassist.Modifier;
+
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.Table;
+import org.reflections.Reflections;
+
+/**
+ * This is a collection of utility methods for {@link ConditionsObject}.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public final class ConditionsObjectUtilities {
+    
+    private ConditionsObjectUtilities() {       
+    }
+    
+    /**
+     * Get the list of table names for the class.
+     * @param type The class.
+     * @return The list of table names.
+     */
+    public static String[] getTableNames(Class<? extends ConditionsObject> type) {
+        Table tableAnnotation = type.getAnnotation(Table.class);
+        if (tableAnnotation != null) {
+            return tableAnnotation.names(); 
+        } else {
+            return new String[]{};
+        }
+    }
+    
+    /**
+     * Get the list of database field names for the class.
+     * @param type The class.
+     * @return The list of field names.
+     */
+    public static Set<String> getFieldNames(Class<? extends ConditionsObject> type) {
+        Set<String> fieldNames = new HashSet<String>();
+        for (Method method : type.getMethods()) {
+            if (!method.getReturnType().equals(Void.TYPE)) {
+                for (Annotation annotation : method.getAnnotations()) {
+                    if (annotation.annotationType().equals(Field.class)) {
+                        if (!Modifier.isPublic(method.getModifiers())) {
+                            throw new RuntimeException("The method " + type.getName() + "." + method.getName() + " has a Field annotation but is not public.");
+                        }
+                        Field field = (Field) annotation;
+                        for (String fieldName : field.names()) {
+                            if (fieldName != null && !fieldName.equals("")) {
+                                fieldNames.add(fieldName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return fieldNames;
+    }
+    
+    /**
+     * Get the class for the collection of the ConditionsObject type.
+     * @param type The class of the ConditionsObject.
+     * @return The class of the collection.
+     */
+    @SuppressWarnings("unchecked")
+    public static Class<? extends AbstractConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(Class<? extends ConditionsObject> type) {
+        String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
+        Class<?> rawCollectionClass;
+        try {
+            rawCollectionClass = Class.forName(collectionClassName);
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException("The type does not define a nested collection class.", e);
+        }
+        if (!AbstractConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
+            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
+        return (Class<? extends AbstractConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
+    }
+    
+    /**
+     * Find all available classes that extend ConditionsObject.
+     * @return The set of all available classes that extend ConditionsObject.
+     */
+    public static Set<Class<? extends ConditionsObject>> findConditionsObjectTypes() {
+        Reflections reflections = new Reflections("org.hps.conditions");    
+        Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
+        for (Class<? extends ConditionsObject> objectType : reflections.getSubTypesOf(ConditionsObject.class)) {
+            if (Modifier.isAbstract(objectType.getModifiers())) {
+                continue;
+            }
+            if (objectType.getAnnotation(Table.class) == null) {
+                continue;
+            }
+            objectTypes.add(objectType);
+        }
+        return objectTypes;
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Tue Dec 30 16:44:44 2014
@@ -8,8 +8,12 @@
 import java.util.List;
 import java.util.Set;
 
+import org.hps.conditions.database.ConditionsRecordConverter;
+import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.database.Field;
 import org.hps.conditions.database.QueryBuilder;
+import org.hps.conditions.database.Table;
 import org.hps.conditions.database.TableMetaData;
 
 /**
@@ -19,6 +23,8 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"conditions"})
+@Converter(converter = ConditionsRecordConverter.class)
 public final class ConditionsRecord extends AbstractConditionsObject {
     
     /**
@@ -157,7 +163,7 @@
     public void insert() throws ConditionsObjectException {
         if (fieldValues.size() == 0)
             throw new ConditionsObjectException("There are no field values to insert.");
-        TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(ConditionsRecordCollection.class).get(0);
+        TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData("conditions");
         String query = QueryBuilder.buildInsert(tableMetaData.getTableName(), this.getFieldValues());
         //System.out.println(query);
         List<Integer> keys = DatabaseConditionsManager.getInstance().updateQuery(query);
@@ -171,6 +177,7 @@
      * Get the starting run number.
      * @return The starting run number.
      */
+    @Field(names = {"run_start"})
     public int getRunStart() {
         return getFieldValue("run_start");
     }
@@ -179,6 +186,7 @@
      * Get the ending run number.
      * @return The ending run number.
      */
+    @Field(names = {"run_end"})
     public int getRunEnd() {
         return getFieldValue("run_end");
     }
@@ -187,6 +195,7 @@
      * Get the date this record was last updated.
      * @return The date this record was updated.
      */
+    @Field(names = {"updated"})
     public Date getUpdated() {
         return getFieldValue("updated");
     }
@@ -195,6 +204,7 @@
      * Get the date this record was created.
      * @return The date this record was created.
      */
+    @Field(names = {"created"})
     public Date getCreated() {
         return getFieldValue("created");
     }
@@ -203,6 +213,7 @@
      * Get the name of the user who created this record.
      * @return The name of the person who created the record.
      */
+    @Field(names = {"created_by"})
     public String getCreatedBy() {
         return getFieldValue("created_by");
     }
@@ -211,6 +222,7 @@
      * Get the notes.
      * @return The notes about this condition.
      */
+    @Field(names = {"notes"})
     public String getNotes() {
         return getFieldValue("notes");
     }
@@ -221,6 +233,7 @@
      * "table name".
      * @return The name of the conditions.
      */
+    @Field(names = {"name"})
     public String getName() {
         return getFieldValue("name");
     }
@@ -229,6 +242,7 @@
      * Get the name of the table containing the actual raw conditions data.
      * @return The name of the table with the conditions data.
      */
+    @Field(names = {"table_name"})
     public String getTableName() {
         return getFieldValue("table_name");
     }
@@ -237,6 +251,7 @@
      * Get the collection ID, overriding this method from the parent class.
      * @return The collection ID.
      */
+    @Field(names = {"collection_id"})
     public int getCollectionId() {
         return getFieldValue("collection_id");
     }
@@ -245,6 +260,7 @@
      * Get the string tag associated with these conditions.
      * @return The string tag.
      */
+    @Field(names = {"tag"})
     public String getTag() {
         return getFieldValue("tag");
     }
@@ -268,4 +284,4 @@
         buff.append("notes: " + getNotes() + '\n');
         return buff.toString();
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	Tue Dec 30 16:44:44 2014
@@ -2,11 +2,17 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
- * This class is a simple data holder for the integrated beam current condition.
+ * This class is a conditions object for integrated beam current values.
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"beam_current"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class BeamCurrent extends AbstractConditionsObject {
 
     public static class BeamCurrentCollection extends AbstractConditionsObjectCollection<BeamCurrent> {
@@ -16,7 +22,8 @@
      * Get the integrated beam current.
      * @return The integrated beam current.
      */
-    double getIntegratedBeamCurrent() {
+    @Field(names = {"beam_current"})
+    public double getIntegratedBeamCurrent() {
         return getFieldValue("beam_current");
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java	Tue Dec 30 16:44:44 2014
@@ -3,7 +3,6 @@
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
@@ -27,78 +26,91 @@
  */
 public abstract class ConditionsObjectConverter<T> implements ConditionsConverter<T> {
 
-    // This is the strategy used for disambiguating multiple overlapping conditions sets.
-    enum MultipleRecordsStrategy {
-        LAST_UPDATED,
-        LAST_CREATED,
-        LATEST_RUN_START,
-        COMBINE,
-        ERROR
-    }
-    
-    MultipleRecordsStrategy multiStrat = MultipleRecordsStrategy.LAST_UPDATED;
+    MultipleCollectionsAction multipleCollections;
     
     public ConditionsObjectConverter() {
     }
     
-    public void setMultipleRecordsStrategy(MultipleRecordsStrategy multiStrat) {
-        this.multiStrat = multiStrat;
-    }
-
-    /**
-     * Child classes must extend this method to specify what type the converter handles.
-     * @return The Class that this converter handles.
+    /**
+     * Set the action that the converter will use to disambiguate when multiple 
+     * conditions sets are found.
+     * @param multipleCollections The multiple collections action.
+     */
+    void setMultipleCollectionsAction(MultipleCollectionsAction multipleCollections) {
+        this.multipleCollections = multipleCollections;
+    }
+    
+    /** 
+     * Get the multiple collections action.
+     * @return The multiple collections action.
+     */
+    public MultipleCollectionsAction getMultipleCollectionsAction() {
+        return this.multipleCollections;
+    }
+    
+    /**
+     * Get the specific type converted by this class.
+     * @return The class that this converter handles.
      */
     public abstract Class<T> getType();
 
+    /**
+     * Get the conditions data based on the name, e.g. "ecal_channels".
+     * The table information is found using the type handled by the Converter.
+     * @return The conditions data.
+     */
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public T getData(ConditionsManager conditionsManager, String name) {
-        
+                
         // Get the DatabaseConditionsManager which is required for using this converter.
-        DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
-        
-        // Get the table meta data from the key given by the caller.
-        TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(name);
-        if (tableMetaData == null)
-            throw new RuntimeException("Table meta data for " + name + " was not found.");
-
+        DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) conditionsManager;
+        
+        // Get the TableMetaData for the type.
+        TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(getType());    
+        
         // Get the ConditionsRecordCollection with the run number assignments.
         ConditionsRecordCollection conditionsRecords = databaseConditionsManager.findConditionsRecords(name);
-        
-        // By default use all conditions records, which works if there is a single one, or if the COMBINE strategy is being used.
+                
+        // The records to use will be added to this collection, which may depend on multiple record disambiguation.
         ConditionsRecordCollection filteredConditionsRecords = new ConditionsRecordCollection();
-        filteredConditionsRecords.addAll(conditionsRecords);
         
         // Now we need to determine which ConditionsRecord objects to use according to configuration.
         if (conditionsRecords.size() == 0) {
             // No conditions records were found for the key.
-            throw new RuntimeException("No conditions were found with key " + name);
-        } else {           
-            if (multiStrat.equals(MultipleRecordsStrategy.LAST_UPDATED)) {
+            throw new RuntimeException("No conditions were found with key: " + name);
+        } else if (conditionsRecords.size() > 1) {           
+            if (multipleCollections.equals(MultipleCollectionsAction.LAST_UPDATED)) {
                 // Use the conditions set with the latest updated date.
-                filteredConditionsRecords = conditionsRecords.sortedByUpdated();
-            } else if (multiStrat.equals(MultipleRecordsStrategy.LAST_CREATED)){
+                filteredConditionsRecords.add(conditionsRecords.sortedByUpdated().get(conditionsRecords.size() - 1));
+            } else if (multipleCollections.equals(MultipleCollectionsAction.LAST_CREATED)){
                 // Use the conditions set with the latest created date.
-                filteredConditionsRecords = conditionsRecords.sortedByCreated();                
-            } else if (multiStrat.equals(MultipleRecordsStrategy.LATEST_RUN_START)) {
+                filteredConditionsRecords.add(conditionsRecords.sortedByCreated().get(conditionsRecords.size() - 1));
+            } else if (multipleCollections.equals(MultipleCollectionsAction.LATEST_RUN_START)) {
                 // Use the conditions set with the greatest run start value.
-                filteredConditionsRecords = conditionsRecords.sortedByRunStart();
-            } else if (multiStrat.equals(MultipleRecordsStrategy.ERROR)) {            
+                filteredConditionsRecords.add(conditionsRecords.sortedByRunStart().get(conditionsRecords.size() - 1));
+            } else if (multipleCollections.equals(MultipleCollectionsAction.COMBINE)) {
+                // Combine all the records.
+                filteredConditionsRecords.addAll(conditionsRecords);                
+            } else if (multipleCollections.equals(MultipleCollectionsAction.ERROR)) {            
                 // The converter has been configured to throw an error when this happens!
                 throw new RuntimeException("Multiple ConditionsRecord object found for conditions key " + name);
             }           
-        }             
-        
-        // Create a collection of objects to to return.        
-        AbstractConditionsObjectCollection collection = null;
-        
-        try {
-            ConditionsRecord conditionsRecord = null;
+        } else {
+            // Single record was found.
+            filteredConditionsRecords.addAll(conditionsRecords);
+        }
+                
+        // Create a collection of objects to to return.
+        AbstractConditionsObjectCollection collection = null;        
+        try {
+            // If there is a single ConditionsRecord, then it can be assigned to the collection.
+            ConditionsRecord collectionConditionsRecord = null;
             if (filteredConditionsRecords.size() == 1) {
-                // If there is a single ConditionsRecord, then it can be assigned to the collection.
-                conditionsRecord = filteredConditionsRecords.get(0);
+                collectionConditionsRecord = filteredConditionsRecords.get(0);
             }
-            collection = createCollection(conditionsRecord, tableMetaData);
+            
+            // Create the collection with a ConditionsRecord that might be null.
+            collection = createCollection(collectionConditionsRecord, tableMetaData);
         } catch (ConditionsObjectException e) {
             throw new RuntimeException(e);
         }
@@ -108,7 +120,7 @@
         
         // Loop over all records, which could just be a single one.
         for (ConditionsRecord conditionsRecord : filteredConditionsRecords) {
-        
+                    
             // Get the table name.
             String tableName = conditionsRecord.getTableName();
 
@@ -137,13 +149,20 @@
             // Close the Statement and the ResultSet.
             DatabaseUtilities.cleanup(resultSet);
         }
-                
+        
         // Close the database connection.
         databaseConditionsManager.closeConnection();
         
         return (T) collection;
     }
     
+    /**
+     * Create a conditions object.
+     * @param resultSet The database record.
+     * @param tableMetaData The table data for the object.
+     * @return The conditions object.
+     * @throws SQLException If there is a problem using the database.
+     */
     static final ConditionsObject createConditionsObject(ResultSet resultSet, TableMetaData tableMetaData) throws SQLException {
         ResultSetMetaData metaData = resultSet.getMetaData();
         int rowId = resultSet.getInt(1);
@@ -167,6 +186,13 @@
         return newObject;
     }
     
+    /**
+     * Create a conditions object collection.
+     * @param conditionsRecord The conditions record. 
+     * @param tableMetaData The table data.
+     * @return The conditions object collection.
+     * @throws ConditionsObjectException If there is a problem creating the collection.
+     */
     static final AbstractConditionsObjectCollection<?> createCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) throws ConditionsObjectException {
         AbstractConditionsObjectCollection<?> collection;
         try {
@@ -181,4 +207,9 @@
         }
         return collection;
     }  
-}
+    
+    public String toString() {
+        return "ConditionsObjectConverter: type = " + this.getType() + 
+                ", multipleCollectionsAction = " + this.getMultipleCollectionsAction().toString();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	Tue Dec 30 16:44:44 2014
@@ -12,7 +12,7 @@
  * Read ConditionsRecord objects from the conditions database and cache the conditions set.
  * @author Jeremy McCormick <[log in to unmask]>
  */
-class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
+public class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
 
     /**
      * Get the ConditionsRecords for a run based on current configuration of the

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	Tue Dec 30 16:44:44 2014
@@ -49,6 +49,7 @@
      *         which type inferred from target variable.
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
+    // FIXME: This should take a type name to enforce that all collections returned are of the same class.
     public ConditionsSeries createSeries(String conditionsKey) {
         
         conditionsManager.openConnection();

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,30 @@
+package org.hps.conditions.database;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for providing converter configuration for {@link org.hps.conditions.api.ConditionsObject} classes.
+ * 
+ * @see ConditionsObjectConverter
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE) 
+public @interface Converter {
+    /**
+     * Get the action to perform in the converter when multiple conditions are found for the current configuration
+     * of run number, detector and tag in the manager.
+     * @return The multiple collections action.
+     */
+    MultipleCollectionsAction multipleCollectionsAction() default MultipleCollectionsAction.ERROR;
+    
+    /**
+     * Get a custom converter class for the type.  (Optional)
+     * @return The custom converter for the type.
+     */
+    Class<?> converter() default ConditionsObjectConverter.class;
+}

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,90 @@
+package org.hps.conditions.database;
+
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import javassist.Modifier;
+
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObject;
+import org.hps.conditions.api.ConditionsObjectUtilities;
+import org.reflections.Reflections;
+
+/**
+ * This is a registry of all available conditions converters.
+ * These classes are found using reflection.  Only converters
+ * with a {@link Table} annotation are loaded, and the class
+ * must not be abstract.
+ * 
+ * @see ConditionsObjectConverter
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class ConverterRegistry extends HashMap<Class<? extends ConditionsObject>, ConditionsObjectConverter> {
+    
+    private ConverterRegistry() {
+    }
+    
+    /**
+     * Automatically create converters for all conditions object classes.
+     * @return The registry of converters.
+     */
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public static ConverterRegistry create() {
+        ConverterRegistry registry = new ConverterRegistry();
+        Reflections reflections = new Reflections("org.hps.conditions");
+        Set<Class<? extends ConditionsObject>> objectTypes = reflections.getSubTypesOf(ConditionsObject.class);
+        for (Class<? extends ConditionsObject> objectType : objectTypes) {
+            if (Modifier.isAbstract(objectType.getModifiers())) {
+                continue;
+            }
+            if (objectType.getAnnotation(Table.class) == null) {
+                continue;
+            }
+            MultipleCollectionsAction multipleCollectionsAction = MultipleCollectionsAction.ERROR;
+            Class<?> converterClass = null;
+            Converter converterAnnotation = objectType.getAnnotation(Converter.class);
+            if (converterAnnotation != null) {
+                multipleCollectionsAction = converterAnnotation.multipleCollectionsAction();
+                if (!converterAnnotation.converter().equals(ConditionsObjectConverter.class)) {
+                    converterClass = converterAnnotation.converter();
+                }
+            }
+            
+            final Class<? extends AbstractConditionsObjectCollection<? extends ConditionsObject>> collectionType = 
+                    ConditionsObjectUtilities.getCollectionType(objectType);
+            
+            ConditionsObjectConverter converter = null;
+            if (converterClass == null) {
+                converter = new ConditionsObjectConverter() {
+                    @Override
+                    public Class getType() {
+                        return collectionType;
+                    }
+                };
+            } else {
+                try {
+                    Object object = converterClass.newInstance();
+                    if (!(object instanceof ConditionsObjectConverter)) {
+                        throw new RuntimeException("The Converter has the wrong type: " + object.getClass().getCanonicalName());
+                    }
+                    converter = (ConditionsObjectConverter) object;
+                } catch (InstantiationException | IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            converter.setMultipleCollectionsAction(multipleCollectionsAction);
+            registry.put(converter.getType(), converter);
+        }        
+        return registry;
+    }
+    
+    public String toString() {
+        StringBuffer buff = new StringBuffer();
+        for (Entry<Class<? extends ConditionsObject>, ConditionsObjectConverter> entry : entrySet()) {
+            buff.append(entry.getValue().toString());
+        }
+        return buff.toString();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	Tue Dec 30 16:44:44 2014
@@ -16,7 +16,6 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.logging.Level;
@@ -29,16 +28,19 @@
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.hps.conditions.api.ConditionsSeries;
 import org.hps.conditions.ecal.EcalConditions;
+import org.hps.conditions.ecal.EcalConditionsConverter;
 import org.hps.conditions.ecal.EcalDetectorSetup;
+import org.hps.conditions.ecal.TestRunEcalConditionsConverter;
 import org.hps.conditions.svt.SvtConditions;
+import org.hps.conditions.svt.SvtConditionsConverter;
 import org.hps.conditions.svt.SvtDetectorSetup;
 import org.hps.conditions.svt.TestRunSvtConditions;
+import org.hps.conditions.svt.TestRunSvtConditionsConverter;
 import org.hps.conditions.svt.TestRunSvtDetectorSetup;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
-import org.lcsim.conditions.ConditionsConverter;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.conditions.ConditionsManagerImplementation;
 import org.lcsim.geometry.Detector;
@@ -47,14 +49,16 @@
 
 /**
  * <p>
- * This class should be used as the top-level ConditionsManager for database
- * access to conditions data.
- * </p>
+ * This class provides the top-level API for accessing database conditions,
+ * as well as configuring the database connection, initializing all
+ * required components, and loading required converters and table meta data.
+ * It is registered as the global <code>ConditionsManager</code> in the 
+ * constructor.
  * <p>
- * In general, this will be overriding the
- * <code>LCSimConditionsManagerImplementation</code> which is setup from within
- * <code>LCSimLoop</code>.
- * </p>
+ * Differences between Test Run and Engineering Run configurations are handled
+ * automatically.
+ * 
+ * @see org.lcsim.conditions.ConditionsManager
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
@@ -62,7 +66,7 @@
 public class DatabaseConditionsManager extends ConditionsManagerImplementation {
 
     protected static final String CONNECTION_PROPERTY = "org.hps.conditions.connection.file";
-    protected static final String DEFAULT_CONFIG = "/org/hps/conditions/config/conditions_dev.xml";
+    protected static final String DEFAULT_CONFIG = "/org/hps/conditions/config/conditions_database_prod.xml";
     protected static final String TEST_RUN_CONFIG = "/org/hps/conditions/config/conditions_database_testrun_2012.xml";
     protected static final int TEST_RUN_MAX_RUN = 1365;
     
@@ -75,26 +79,40 @@
     protected static Logger logger = LogUtil.create(DatabaseConditionsManager.class);
     
     protected String detectorName;
-    protected List<TableMetaData> tableMetaData;
-    protected List<ConditionsConverter> converters;
+    protected String ecalName = "Ecal";
+    protected String svtName = "Tracker";
+    protected EcalDetectorSetup ecalLoader = new EcalDetectorSetup();
+    protected TestRunSvtDetectorSetup testRunSvtloader = new TestRunSvtDetectorSetup();
+    protected SvtDetectorSetup svtLoader = new SvtDetectorSetup();
+    
+    protected ConverterRegistry converters = ConverterRegistry.create();
+    protected ConditionsSeriesConverter conditionsSeriesConverter = new ConditionsSeriesConverter(this);
+    protected TableRegistry tableRegistry = TableRegistry.create();
+    
     protected File connectionPropertiesFile;
     protected ConnectionParameters connectionParameters;
     protected Connection connection;
     protected boolean isConnected = false;
-    protected ConditionsSeriesConverter conditionsSeriesConverter = new ConditionsSeriesConverter(this);
-    protected boolean isInitialized = false;
+    protected boolean loggedConnectionParameters = false;
+    
+    protected String tag = null;
+
     protected String resourceConfig = null;
     protected File fileConfig = null;
-    protected String ecalName = "Ecal";
-    protected String svtName = "Tracker";
+
+    protected boolean isInitialized = false;
     protected boolean isFrozen = false;
-    protected EcalDetectorSetup ecalLoader = new EcalDetectorSetup();
-    protected TestRunSvtDetectorSetup testRunSvtloader = new TestRunSvtDetectorSetup();
-    protected SvtDetectorSetup svtLoader = new SvtDetectorSetup();
-    protected String tag = null;
-        
+    
+    // Configuration from XML settings.
+    protected boolean setupSvtDetector = true;
+    protected boolean setupEcalDetector = true;
+    protected boolean freezeAfterInitialize = false;
+    protected boolean cacheAllConditions = false;
+            
     /**
      * Class constructor.
+     * Calling this will automatically register this
+     * manager as the global default.
      */
     public DatabaseConditionsManager() {
         logger.setLevel(Level.FINER);
@@ -102,17 +120,21 @@
         setupConnectionFromSystemProperty();
         ConditionsManager.setDefaultConditionsManager(this);
         this.setRun(-1);
-    }
-
-    /**
-     * Get the static instance of this class, which must have been registered
-     * first from a call to {@link #register()}.
+        for (ConditionsObjectConverter converter : converters.values()) {
+            logger.config("registering converter for " + converter.getType());
+            this.registerConditionsConverter(converter);
+        }
+    }
+    
+    /**
+     * Get the static instance of this class.
      * @return The static instance of the manager.
      */
     public static DatabaseConditionsManager getInstance() {
 
-        // Perform default setup if necessary.
+        // Is there no manager installed yet?
         if (!ConditionsManager.isSetup()) {
+            // Perform default setup if necessary.
             new DatabaseConditionsManager();
         }
 
@@ -136,21 +158,21 @@
                 connectionParameters = ConnectionParameters.fromResource(chooseConnectionPropertiesResource());
             }
             
-            // Print out connection info to the log.
-            logger.config("opening connection to " + connectionParameters.getConnectionString());
-            logger.config("host " + connectionParameters.getHostname());
-            logger.config("port " + connectionParameters.getPort());
-            logger.config("user " + connectionParameters.getUser());
-            logger.config("database " + connectionParameters.getDatabase());
+            if (!this.loggedConnectionParameters) {
+                // Print out detailed info to the log on first connection.
+                logger.config("opening connection to " + connectionParameters.getConnectionString());
+                logger.config("host " + connectionParameters.getHostname());
+                logger.config("port " + connectionParameters.getPort());
+                logger.config("user " + connectionParameters.getUser());
+                logger.config("database " + connectionParameters.getDatabase());
+                this.loggedConnectionParameters = true;
+            }
 
             // Create the connection using the parameters.
             connection = connectionParameters.createConnection();
-            
-            logger.config("successfuly created connection");
             isConnected = true;
-        } else {
-            logger.info("using existing connection");
-        }
+        } 
+        logger.info("connection opened");
         return connection;
     }
 
@@ -158,14 +180,11 @@
      * Close the database connection.
      */
     public void closeConnection() {
-        logger.info("closing connection");
         if (connection != null) {
             try {
                 if (!connection.isClosed()) {
                     connection.close();
-                } else {
-                    logger.info("connection was already closed");
-                }
+                } 
             } catch (SQLException e) {
                 throw new RuntimeException(e);
             }
@@ -187,13 +206,13 @@
     }
 
     /**
-     * Get a given collection of the given type from the conditions database.
-     * @param type Class type
-     * @return A collection of objects of the given type from the conditions
-     *         database
+     * Get a given collection of the given type from the conditions database
+     * using the default table name.
+     * @param type The type of the conditions data.
+     * @return A collection of objects of the given type from the conditions database
      */
     public <CollectionType extends AbstractConditionsObjectCollection> CollectionType getCollection(Class<CollectionType> type) {
-        TableMetaData metaData = this.findTableMetaData(type).get(0);
+        TableMetaData metaData = tableRegistry.findByCollectionType(type);
         if (metaData == null) {
             throw new RuntimeException("Table name data for condition of type " + type.getSimpleName() + " was not found.");
         }
@@ -203,10 +222,10 @@
     }
 
     /**
-     * This method catches changes to the detector name and run number. It is
-     * actually called every time an lcsim event is created, so it has internal
-     * logic to figure out if the conditions system actually needs to be
-     * updated.
+     * This method handles changes to the detector name and run number.
+     * It is called every time an LCSim event is created, and so it has 
+     * internal logic to figure out if the conditions system actually
+     * needs to be updated.
      */
     @Override
     public void setDetector(String detectorName, int runNumber) throws ConditionsNotFoundException {
@@ -215,22 +234,22 @@
             throw new IllegalArgumentException("The detectorName argument is null.");
         }
         
-        logger.finest("setDetector - detector " + detectorName + " and run #" + runNumber);
+        //logger.finest("setDetector - detector " + detectorName + " and run #" + runNumber);
         
         if (!isInitialized || !detectorName.equals(this.getDetector()) || runNumber != this.getRun()) {
-            if (!isInitialized) {
-                logger.fine("first time initialization");
-            }
+            //if (!isInitialized) {
+            //    logger.fine("first time initialization");
+            //}
             if (!this.isFrozen) {
-                if (!detectorName.equals(this.getDetector())) {
-                    logger.finest("detector name is different");
-                }
-                if (runNumber != this.getRun()) {
-                    logger.finest("run number is different");
-                }            
+                //if (!detectorName.equals(this.getDetector())) {
+                //    logger.finest("detector name is different");
+                //}
+                //if (runNumber != this.getRun()) {
+                //    logger.finest("run number is different");
+                //}            
                 logger.info("new detector " + detectorName + " and run #" + runNumber);
-                logger.fine("old detector " + this.getDetector() + " and run #" + this.getRun());
-                
+                //logger.fine("old detector " + this.getDetector() + " and run #" + this.getRun());
+             
                 initialize(detectorName, runNumber);
             } else {
                 logger.finest("Conditions changed but will be ignored because manager is frozen.");
@@ -238,83 +257,120 @@
         }
     }
     
+    /**
+     * Utility method to determine if a run number is from the 2012 Test Run.
+     * @param runNumber The run number.
+     * @return True if run number is from the Test Run.
+     */
     public static boolean isTestRun(int runNumber) {
         return runNumber > 0 && runNumber <= TEST_RUN_MAX_RUN;
     }
     
+    /**
+     * True if the current run number is from the Test Run.
+     * @return True if current run is from the Test Run.
+     */
     public boolean isTestRun() {
         return isTestRun(this.getRun());
     }
     
     /**
      * Perform all necessary initialization, including setup of the XML
-     * configuration and opening a connection to the database.
+     * configuration and loading of conditions onto the Detector.
      */
     protected void initialize(String detectorName, int runNumber) throws ConditionsNotFoundException {
 
-        logger.config("initializing " + getClass().getSimpleName() + " with detector " + detectorName + " and run number " + runNumber);
-
-        // Did the user not specify a config?
+        logger.config("initializing with detector " + detectorName + " and run number " + runNumber);
+
+        // Did the user not specify a specific configuration?
         if (resourceConfig == null && fileConfig == null) {
-            // We will try to pick a reasonable config based on the run number...
+            // We will try to pick a reasonable configuration based on the run number.
             if (runNumber > 0 && runNumber <= TEST_RUN_MAX_RUN) {
-                // This looks like the Test Run so use the custom config for it.
+                // This looks like the Test Run so use the custom configuration for it.
                 this.resourceConfig = DatabaseConditionsManager.TEST_RUN_CONFIG;
                 logger.config("using test run XML config " + this.resourceConfig);
             } else { 
-                // This is probably the Engineering Run or later so use the default config.
+                // This is probably the Engineering Run or later so use the default configuration.
                 this.resourceConfig = DatabaseConditionsManager.DEFAULT_CONFIG;
                 logger.config("using default XML config " + this.resourceConfig);
             }
         }
         
+        // Is there both a resource and file configuration specified?
         if (resourceConfig != null && fileConfig != null) {
+            // It is an error if both of these have been set externally.
             throw new RuntimeException("Both resource and file configuration are set.");
         }
                 
         if (this.resourceConfig != null) {
+            // Load the resource configuration.
             this.configure(getClass().getResourceAsStream(this.resourceConfig));
         } else if (this.fileConfig != null) {
             try {
+                // Load the file configuration.
                 this.configure(new FileInputStream(this.fileConfig));
             } catch (FileNotFoundException e) {
                 throw new RuntimeException(e);
             }
         }
         
-        // Open the database connection.
-        if (!isConnected()) {
-            openConnection();
+        // Is this run number from the Test Run?
+        if (isTestRun(runNumber)) {
+            // Load Test Run specific converters.
+            this.registerConditionsConverter(new TestRunSvtConditionsConverter());
+            this.registerConditionsConverter(new TestRunEcalConditionsConverter());
         } else {
-            logger.config("using existing connection " + connectionParameters.getConnectionString());
-        }
-        
+            // Load the default converters.
+            this.registerConditionsConverter(new SvtConditionsConverter());
+            this.registerConditionsConverter(new EcalConditionsConverter());
+        }
+                
         // Call the super class's setDetector method to construct the detector object.
         super.setDetector(detectorName, runNumber);
         
-        // Load conditions onto the ECAL subdetector object. 
-        try {
-            setupEcal();
-        } catch (Exception e) {
-            e.printStackTrace();
-            logger.log(Level.WARNING, "Error loading ECAL conditions onto detector.", e);
-        }
-        
-        // Load conditions onto the SVT subdetector object.
-        try {
-            setupSvt(runNumber);
-        } catch (Exception e) {
-            e.printStackTrace();
-            logger.log(Level.WARNING, "Error loading SVT conditions onto detector.", e);
-        }                       
+        // Should all conditions sets be pre-cached?
+        if (this.cacheAllConditions) {
+            // Cache the conditions sets of all registered converters.
+            logger.info("precaching all conditions sets ...");
+            this.cacheConditionsSets();
+        }
+        
+        // Should the ECAL detector be setup with conditions data?
+        if (this.setupEcalDetector) {
+            try {
+                // Load conditions onto the ECAL subdetector object. 
+                setupEcal();
+            } catch (Exception e) {
+                e.printStackTrace();
+                logger.log(Level.WARNING, "Error loading ECAL conditions onto detector.", e);
+            }
+        }
+        
+        // Should the SVT detector be setup with conditions data? 
+        if (this.setupSvtDetector) {
+            try {
+                // Load conditions onto the SVT subdetector object.
+                setupSvt(runNumber);
+            } catch (Exception e) {
+                e.printStackTrace();
+                logger.log(Level.WARNING, "Error loading SVT conditions onto detector.", e);
+            }                 
+        }
                        
         this.isInitialized = true;
 
-        logger.config(getClass().getSimpleName() + " is initialized");
-    }
-    
-    /**
-     * Get the current lcsim compact <code>Detector</code> object.
+        logger.config("conditions system initialized successfully");
+        
+        // Should the conditions system be frozen now?
+        if (this.freezeAfterInitialize) {
+            logger.info("executing freeze after initialize");
+            // Freeze the conditions system so subsequent updates will be ignored.
+            this.freeze();
+        }
+    }
+    
+    /**
+     * Get the current LCSim compact <code>Detector</code> object.
      * @return The detector object.
      */
     public Detector getDetectorObject() {
@@ -365,7 +421,7 @@
     }
     
     /**
-     * Set the connection parameters to the conditions database.
+     * Set the connection parameters of the conditions database.
      * @param connectionParameters The connection parameters.
      */
     public void setConnectionParameters(ConnectionParameters connectionParameters) {
@@ -386,9 +442,8 @@
      * @param tableName The name of the table.
      * @return The next collection ID.
      */
-    // TODO: If there are no records in the table, this method should simply return 1.  (for first collection)
     public int getNextCollectionID(String tableName) {
-        TableMetaData tableData = findTableMetaData(tableName);
+        TableMetaData tableData = tableRegistry.findByTableName(tableName);
         if (tableData == null)
             throw new IllegalArgumentException("There is no meta data for table " + tableName);
         ResultSet resultSet = selectQuery("SELECT MAX(collection_id)+1 FROM " + tableName);
@@ -431,44 +486,7 @@
             return false;
         }
     }
-
-    /**
-     * Get the list of table meta data.
-     * @return The list of table meta data.
-     */
-    public List<TableMetaData> getTableMetaDataList() {
-        return tableMetaData;
-    }
-
-    /**
-     * Find a table's meta data by key.
-     * @param name The name of the table.
-     * @return The table's meta data or null if does not exist.
-     */
-    public TableMetaData findTableMetaData(String name) {
-        for (TableMetaData meta : tableMetaData) {
-            if (meta.getKey().equals(name)) {
-                return meta;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Find meta data by collection class type.
-     * @param type The collection class.
-     * @return The table meta data.
-     */
-    public List<TableMetaData> findTableMetaData(Class type) {
-        List<TableMetaData> metaDataList = new ArrayList<TableMetaData>();
-        for (TableMetaData meta : tableMetaData) {
-            if (meta.getCollectionClass().equals(type)) {
-                metaDataList.add(meta);
-            }
-        }
-        return metaDataList;
-    }
-
+   
     /**
      * This method can be used to perform a database SELECT query.
      * @param query The SQL query string.
@@ -536,7 +554,7 @@
      * @return The set of matching conditions records.
      */
     public ConditionsRecordCollection findConditionsRecords(String name) {
-        ConditionsRecordCollection runConditionsRecords = getConditionsData(ConditionsRecordCollection.class, TableConstants.CONDITIONS_RECORD);
+        ConditionsRecordCollection runConditionsRecords = this.getCollection(ConditionsRecordCollection.class);
         logger.fine("searching for condition " + name + " in " + runConditionsRecords.size() + " records");
         ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();
         for (ConditionsRecord record : runConditionsRecords) {
@@ -555,45 +573,82 @@
         }
         return foundConditionsRecords;
     }
-    
+
+    /**
+     * Get a list of all the ConditionsRecord objects.
+     * @return The list of all the ConditionsRecord objects.
+     */
     public ConditionsRecordCollection getConditionsRecords() {
         ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
-        for (TableMetaData tableMetaData : this.getTableMetaDataList()) {
-            ConditionsRecordCollection foundConditionsRecords = findConditionsRecords(tableMetaData.getKey());
-            conditionsRecords.addAll(foundConditionsRecords); 
+        for (TableMetaData tableMetaData : tableRegistry.values()) {
+            try {
+                ConditionsRecordCollection foundConditionsRecords = findConditionsRecords(tableMetaData.getKey());
+                conditionsRecords.addAll(foundConditionsRecords); 
+            } catch (Exception e) {
+                logger.warning(e.getMessage());
+            }
         }        
         return conditionsRecords;
     }
     
+    /**
+     * This method can be called to "freeze" the conditions system so that
+     * any subsequent updates to run number or detector name will be ignored.
+     */
     public void freeze() {
         if (this.getDetector() != null && this.getRun() != -1) {
             this.isFrozen = true;
-            logger.config("The conditions manager has been frozen and will ignore subsequent updates until unfrozen.");
+            logger.config("The conditions system has been frozen and will ignore subsequent updates.");
         } else {
-            logger.warning("The conditions manager cannot be frozen now because detector or run number are not valid.");
-        }
-    }
-    
+            logger.warning("The conditions system cannot be frozen now because it is not initialized yet.");
+        }
+    }
+    
+    /**
+     * Un-freeze the conditions system so that updates will be received again.
+     */
     public void unfreeze() {
         this.isFrozen = false;
     }
     
+    /**
+     * True if conditions system is frozen.
+     * @return True if conditions system is frozen.
+     */
     public boolean isFrozen() {
         return this.isFrozen;
     }
     
+    /**
+     * Set the name of the ECAL sub-detector.
+     * @param ecalName The name of the ECAL.
+     */
     public void setEcalName(String ecalName) {
         this.ecalName = ecalName;
     }
     
+    /**
+     * Set the name of the SVT sub-detector.
+     * @param svtName The name of the SVT.
+     */
     public void setSvtName(String svtName) {
         this.svtName = svtName;
     }
     
+    /**
+     * Set a tag used to filter ConditionsRecords.
+     * @param tag The tag value used to filter ConditionsRecords.
+     */
     public void setTag(String tag) {
         this.tag = tag;
     }
 
+    /**
+     * Insert a collection of ConditionsObjects into the database.
+     * @param collection The collection to insert.
+     * @throws SQLException If there is a database error.
+     * @throws ConditionsObjectException If there is a problem with the ConditionsObjects.
+     */
     public <ObjectType extends ConditionsObject> void insertCollection(AbstractConditionsObjectCollection<ObjectType> collection) throws SQLException, ConditionsObjectException {
                 
         if (collection == null) {
@@ -605,15 +660,8 @@
 
         TableMetaData tableMetaData = collection.getTableMetaData();
         if (tableMetaData == null) {            
-            List<TableMetaData> tableMetaDataList = this.findTableMetaData(collection.getClass()); 
-            if (tableMetaDataList.size() == 0) {
-                throw new ConditionsObjectException("The conditions object collection is missing table meta data and none could be found by the conditions manager.");
-            } else {
-                // Use a default meta data object from the manager.
-                tableMetaData = tableMetaDataList.get(0);
-                collection.setTableMetaData(tableMetaData);
-                logger.fine("using default table meta data with table " + tableMetaData.getTableName() + " for collection of type " + collection.getClass().getCanonicalName());
-            }
+            tableMetaData = tableRegistry.findByCollectionType(collection.getClass()); 
+            logger.fine("using default table meta data with table " + tableMetaData.getTableName() + " for collection of type " + collection.getClass().getCanonicalName());
         }
         if (collection.getCollectionId() == -1) {
             try {
@@ -667,25 +715,66 @@
         closeConnection();
     }
     
+    /**
+     * Check if connected to the database.
+     * @return true if connected
+     */
+    public boolean isConnected() {
+        return isConnected;
+    }
+    
+    /**
+     * Get the default detector name for the Test Run.
+     * @return The default detector name for the Test Run.
+     */
+    public static String getDefaultTestRunDetectorName() {
+        return DEFAULT_TEST_RUN_DETECTOR;
+    }
+    
+    /**
+     * Get the default detector name for the Engineering Run.
+     * @return The default detector name for the Engineering Run.
+     */
+    public static String getDefaultEngRunDetectorName() {
+        return DEFAULT_ENG_RUN_DETECTOR;
+    }
+        
+    /**
+     * Get the Logger for this class, which can be used by related sub-classes
+     * if they do not have their own logger.
+     * @return The Logger for this class.
+     */
+    public Logger getLogger() {
+        return logger;
+    }
+    
+    /**
+     * Find table information from the name.
+     * @param name The name of the table.
+     * @return The table information or null if does not exist.
+     */
+    public TableMetaData findTableMetaData(String name) {
+        return this.tableRegistry.findByTableName(name);
+    }
+    
+    /**
+     * Find table information from the collection type.
+     * @param type The collection type.
+     * @return The table information or null if does not exist.
+     */
+    public TableMetaData findTableMetaData(Class<?> type) {
+        return this.tableRegistry.findByCollectionType(type);
+    }
+
     /*
-    public void selectCollection(AbstractConditionsObjectCollection collection) throws ConditionsObjectException {
-        int collectionId = collection.getCollectionId();
-        if (collectionId == -1) {
-            throw new ConditionsObjectException("Missing collection ID for select query.");
-        }
-        TableMetaData tableMetaData = collection.getTableMetaData();
-        String tableName = null;
-        if (tableMetaData != null) {
-            tableName = tableMetaData.getTableName();
-        } else {
-            List<TableMetaData> metaList = this.findTableMetaData(collection.getClass());
-            if (metaList.size() == 0) {
-                throw new ConditionsObjectException("Could not find meta data for collection with type " + collection.getClass().getCanonicalName());
-            }
-        }  
-    }
-    */
+     *******************************
+     * Private methods below here. *
+     *******************************
+     */
                       
+    /**
+     * Setup the ECAL subdetector with conditions information.
+     */
     private void setupEcal() {
         logger.config("setting up ECAL conditions on detector");
         EcalConditions conditions = getCachedConditions(EcalConditions.class, ECAL_CONDITIONS).getCachedData();
@@ -693,6 +782,10 @@
         logger.fine("done setting up ECAL conditions on detector");
     }
     
+    /**
+     * Set the SVT subdetector with conditions information.
+     * @param runNumber The run number.
+     */
     private void setupSvt(int runNumber) {
         if (isTestRun(runNumber)) {
             logger.config("loading Test Run SVT detector conditions");
@@ -707,29 +800,25 @@
     }
     
     /**
-     * Check if connected to the database.
-     * @return true if connected
-     */
-    public boolean isConnected() {
-        return isConnected;
-    }
-    
-    public static String getDefaultTestRunDetectorName() {
-        return DEFAULT_TEST_RUN_DETECTOR;
-    }
-    
-    public static String getDefaultEngRunDetectorName() {
-        return DEFAULT_ENG_RUN_DETECTOR;
-    }
-    
-    public void addTableMetaData(TableMetaData tableMetaData) {
-        this.tableMetaData.add(tableMetaData);
-    }
-    
-    public Logger getLogger() {
-        return logger;
-    }
-        
+     * Cache conditions sets for all known tables.
+     */
+    private void cacheConditionsSets() {
+        for (TableMetaData meta : tableRegistry.values()) {
+            try {
+                logger.fine("caching conditions " + meta.key + " with type "+ meta.collectionClass.getCanonicalName());
+                this.getCachedConditions(meta.collectionClass, meta.key);
+            } catch (Exception e) {
+                logger.warning("could not cache conditions " + meta.key);
+            }
+        }
+     }
+        
+    /**
+     * Choose whether to use the JLAB or SLAC external database
+     * and return a connection properties resource with the appropriate
+     * connection information.
+     * @return The connection properties resource.
+     */
     private String chooseConnectionPropertiesResource() {
         String connectionName = "slac";
         try {
@@ -757,14 +846,10 @@
 
         // Create XML document from stream.
         Document config = createDocument(in);
-
-        // Load the table meta data.
-        loadTableMetaData(config);
-
-        // Load the converter classes.
-        loadConverters(config);
-    }
-
+        
+        loadConfiguration(config);
+    }
+    
     /**
      * Create an XML document from an <code>InputStream</code>.
      * @param in The InputStream.
@@ -780,41 +865,7 @@
             throw new RuntimeException(e);
         }
         return config;
-    }
-
-    /**
-     * Load data converters from an XML document.
-     * @param config The XML document.
-     */
-    private void loadConverters(Document config) {
-
-        if (this.converters != null) {
-            this.converters.clear();
-        }
-
-        // Load the list of converters from the "converters" section of the config document.
-        loadConditionsConverters(config.getRootElement().getChild("converters"));
-
-        // Register the list of converters with this manager.
-        for (ConditionsConverter converter : converters) {
-            registerConditionsConverter(converter);
-            logger.config("registered converter " + converter.getClass().getSimpleName());
-        }
-    }
-
-    /**
-     * Load table meta data configuration from an XML document.
-     * @param config The XML document.
-     */
-    private void loadTableMetaData(Document config) {
-
-        if (this.tableMetaData != null) {
-            this.tableMetaData.clear();
-        }
-
-        // Load table meta data from the "tables" section of the config document.
-        loadTableMetaData(config.getRootElement().getChild("tables"));
-    }
+    }    
 
     /**
      * Setup the database connection from a file specified by a Java system
@@ -833,83 +884,34 @@
     }
 
     /**
-     * Load table meta data from the XML list.
-     * @param element The XML node containing a list of table elements.
-     */
-    @SuppressWarnings("unchecked")
-    void loadTableMetaData(Element element) {
-
-        tableMetaData = new ArrayList<TableMetaData>();
-
-        for (Iterator<?> iterator = element.getChildren("table").iterator(); iterator.hasNext();) {
-            Element tableElement = (Element) iterator.next();
-            String tableName = tableElement.getAttributeValue("name");
-            String key = tableElement.getAttributeValue("key");
-
-            Element classesElement = tableElement.getChild("classes");
-            Element classElement = classesElement.getChild("object");
-            Element collectionElement = classesElement.getChild("collection");
-
-            String className = classElement.getAttributeValue("class");
-            String collectionName = collectionElement.getAttributeValue("class");
-
-            Class<? extends ConditionsObject> objectClass;
-            Class<?> rawObjectClass;
-            try {
-                rawObjectClass = Class.forName(className);
-                if (!ConditionsObject.class.isAssignableFrom(rawObjectClass)) {
-                    throw new RuntimeException("The class " + rawObjectClass.getSimpleName() + " does not extend ConditionsObject.");
-                }
-                objectClass = (Class<? extends ConditionsObject>) rawObjectClass;
-            } catch (ClassNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-
-            Class<? extends AbstractConditionsObjectCollection<?>> collectionClass;
-            Class<?> rawCollectionClass;
-            try {
-                rawCollectionClass = Class.forName(collectionName);
-                if (!AbstractConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
-                    throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
-                collectionClass = (Class<? extends AbstractConditionsObjectCollection<?>>) rawCollectionClass;
-            } catch (ClassNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-
-            TableMetaData tableData = new TableMetaData(key, tableName, objectClass, collectionClass);
-            Element fieldsElement = tableElement.getChild("fields");
-            for (Iterator<?> fieldsIterator = fieldsElement.getChildren("field").iterator(); fieldsIterator.hasNext();) {
-                Element fieldElement = (Element) fieldsIterator.next();
-                String fieldName = fieldElement.getAttributeValue("name");
-                tableData.addField(fieldName);
-            }
-
-            tableMetaData.add(tableData);
-        }
-    }
-
-    /**
-     * Load conditions converters from the XML list.
-     * @param element The node with a list of child converter elements.
-     */
-    private void loadConditionsConverters(Element element) {
-        converters = new ArrayList<ConditionsConverter>();
-        for (Iterator iterator = element.getChildren("converter").iterator(); iterator.hasNext();) {
-            Element converterElement = (Element) iterator.next();
-            try {
-                Class converterClass = Class.forName(converterElement.getAttributeValue("class"));
-                if (ConditionsConverter.class.isAssignableFrom(converterClass)) {
-                    try {
-                        converters.add((ConditionsConverter) converterClass.newInstance());
-                    } catch (InstantiationException | IllegalAccessException e) {
-                        throw new RuntimeException(e);
-                    }
-                } else {
-                    throw new RuntimeException("The converter class " + converterClass.getSimpleName() + " does not extend the correct base type.");
-                }
-            } catch (ClassNotFoundException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-}
+     * Load configuration information from an XML document.
+     * @param document The XML document.
+     */
+    private void loadConfiguration(Document document) {
+        
+        Element node = document.getRootElement().getChild("configuration");
+        
+        if (node == null)
+            return;
+        
+        Element element = node.getChild("setupSvtDetector");
+        if (element != null) {
+            this.setupSvtDetector = Boolean.parseBoolean(element.getText());
+        }
+        
+        element = node.getChild("setupEcalDetector");
+        if (element != null) {
+            this.setupEcalDetector = Boolean.parseBoolean(element.getText());
+        }
+        
+        element = node.getChild("freezeAfterInitialize");
+        if (element != null) {
+            this.freezeAfterInitialize = Boolean.parseBoolean(element.getText());
+        }
+        
+        element = node.getChild("cacheAllCondition");
+        if (element != null) {
+            this.cacheAllConditions = Boolean.parseBoolean(element.getText());
+        }
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java	Tue Dec 30 16:44:44 2014
@@ -3,8 +3,20 @@
 import java.sql.ResultSet;
 import java.sql.Statement;
 
+/**
+ * Database utility methods.
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
 public final class DatabaseUtilities {
+    
+    private DatabaseUtilities() {        
+    }
         
+    /**
+     * Cleanup a JDBC <code>ResultSet</code> by closing it and its <code>Statement</code>
+     * @param resultSet The database ResultSet.
+     */
     static void cleanup(ResultSet resultSet) {
         Statement statement = null;
         try {

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,21 @@
+package org.hps.conditions.database;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This is a java <code>Annotation</code> for assigning a "get" method 
+ * to one or more database table columns.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD) 
+public @interface Field {
+    
+    /**
+     * The names of the table columns associated with this method.
+     * @return The names of the table column associated with this method.
+     */
+    String[] names() default "";
+}

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,14 @@
+package org.hps.conditions.database;
+
+/**
+ * This is the action that should be taken if there are multiple conditions sets
+ * returned from a query on type and name.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public enum MultipleCollectionsAction {
+    LAST_UPDATED,
+    LAST_CREATED,
+    LATEST_RUN_START,
+    COMBINE,
+    ERROR
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java	Tue Dec 30 16:44:44 2014
@@ -17,11 +17,7 @@
 
     private QueryBuilder() {
     }
-    
-    //static String buildSelect(TableMetaData tableMetaData, int collectionId) {  
-    //    return null;
-    //}
-    
+        
     static String buildSelect(String tableName, int collectionId, String[] fields, String order) {
         StringBuffer buff = new StringBuffer();
         buff.append("SELECT ");

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,23 @@
+package org.hps.conditions.database;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation can be used to assign a class to one
+ * or more database tables.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE) 
+public @interface Table {
+    
+    /**
+     * Get the names of the tables.
+     * @return The names of the tables.
+     */
+    public String[] names() default "";
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableConstants.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableConstants.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableConstants.java	Tue Dec 30 16:44:44 2014
@@ -6,23 +6,16 @@
  * values for conditions data. The actual table names for the conditions data
  * are defined externally in an XML configuration file read by the
  * {@link DatabaseConditionsManager}.
- * </p>
  * <p>
  * It is possible that the key and table names are defined differently in the
  * XML configuration, e.g. if the name of the key is not exactly the same as the
  * table name, but usually they are the same value.
- * </p>
  */
-// FIXME: This should really be called something like "ConditionsKeys" as the
-// table names
-// are found in the XML configuration only.
+// TODO: This should be removed as these names are all used by default and can be overridden if needed.
 public final class TableConstants {
 
     private TableConstants() {
     }
-
-    /** Conditions key for ConditionsRecord. */
-    public static final String CONDITIONS_RECORD = "conditions_records";
 
     /** Conditions key for combined ECal conditions. */
     public static final String ECAL_CONDITIONS = "ecal_conditions";

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	Tue Dec 30 16:44:44 2014
@@ -1,22 +1,24 @@
 package org.hps.conditions.database;
 
+import java.util.ArrayList;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * <p>
  * This class provides meta data about a conditions table, including a list of
  * conditions data fields. The list of fields does not include the collection ID
  * or row ID, which are implicitly assumed to exist.
- * </p>
  * <p>
  * It also has references to the implementation classes which are used to map
- * the data onto {@link ConditionsObject} and {@link AbstractConditionsObjectCollection}
- * s.
- * </p>
+ * the data onto {@link ConditionsObject} and {@link AbstractConditionsObjectCollection}.
+ * 
+ * @see org.hps.conditions.api.ConditionsObject
+ * @see org.hps.conditions.api.AbstractConditionsObjectCollection
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  * 
@@ -41,7 +43,15 @@
         this.objectClass = objectClass;
         this.collectionClass = collectionClass;
     }
-
+    
+    public TableMetaData(String key, String tableName, Class<? extends ConditionsObject> objectClass, Class<? extends AbstractConditionsObjectCollection<?>> collectionClass, Set<String> fieldNames) {
+        this.key = key;
+        this.tableName = tableName;
+        this.objectClass = objectClass;
+        this.collectionClass = collectionClass;
+        this.fieldNames = fieldNames;
+    }
+    
     /**
      * Get the type of object this table maps onto.
      * @return The type of object.
@@ -71,10 +81,11 @@
      * @param name The name of the field.
      */
     void addField(String name) {
-        if (fieldNames.contains(name)) {
-            throw new RuntimeException("The table meta data already has a field called " + name);
-        }
         fieldNames.add(name);
+    }
+    
+    void addFields(List<String> names) {
+        fieldNames.addAll(names);
     }
 
     /**
@@ -84,7 +95,7 @@
     public String getTableName() {
         return tableName;
     }
-
+    
     /**
      * Get the key of this conditions type. May be different from table name but
      * is usually the same.
@@ -93,4 +104,33 @@
     public String getKey() {
         return key;
     }
+    
+    static public List<TableMetaData> findByObjectType(List<TableMetaData> tableMetaDataList, Class<? extends ConditionsObject> objectType) {
+        System.out.println("findByObjectType - " + objectType.getCanonicalName());
+        List<TableMetaData> list = new ArrayList<TableMetaData>();
+        for (TableMetaData tableMetaData : tableMetaDataList) {
+            System.out.println("comparing to " + tableMetaData.getObjectClass().getCanonicalName());
+            if (tableMetaData.getObjectClass().equals(objectType)) {
+                System.out.println("found match");
+                list.add(tableMetaData);
+            } else {
+                System.out.println("does not match");
+            }
+        }
+        return list;
+    }
+    
+    public String toString() {
+        StringBuffer buff = new StringBuffer();
+        buff.append("tableMetaData: tableName = " + this.getTableName());  
+        buff.append(", objectClass = " + this.getObjectClass().getCanonicalName());
+        buff.append(", collectionClass = " + this.getCollectionClass().getCanonicalName());
+        buff.append(", fieldNames = ");
+        for (String field : this.getFieldNames()) {
+            buff.append(field + " ");
+        }
+        buff.setLength(buff.length() - 1);
+        buff.append('\n');
+        return buff.toString();
+    }
 }

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,60 @@
+package org.hps.conditions.database;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObject;
+import org.hps.conditions.api.ConditionsObjectUtilities;
+
+/**
+ * This is a registry providing a map between tables and their meta-data.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public final class TableRegistry extends HashMap<String, TableMetaData> {
+    
+    protected Map<Class<? extends ConditionsObject>, TableMetaData> objectTypeMap =
+            new HashMap<Class<? extends ConditionsObject>, TableMetaData>();
+    
+    protected Map<Class<? extends AbstractConditionsObjectCollection<?>>, TableMetaData> collectionTypeMap =
+            new HashMap<Class<? extends AbstractConditionsObjectCollection<?>>, TableMetaData>();
+    
+    private TableRegistry() {
+    }
+    
+    public static TableRegistry create() {
+        TableRegistry registry = new TableRegistry();
+        for (Class<? extends ConditionsObject> objectType : ConditionsObjectUtilities.findConditionsObjectTypes()) {
+            String name = ConditionsObjectUtilities.getTableNames(objectType)[0];
+            Class<? extends AbstractConditionsObjectCollection<?>> collectionType = 
+                    ConditionsObjectUtilities.getCollectionType(objectType);
+            Set<String> fieldNames = ConditionsObjectUtilities.getFieldNames(objectType);
+            TableMetaData data = new TableMetaData(name, name, objectType, collectionType, fieldNames); 
+            registry.put(name, data);
+            registry.objectTypeMap.put(objectType, data);
+            registry.collectionTypeMap.put(collectionType, data);
+        }
+        return registry;
+    }
+    
+    public TableMetaData findByObjectType(Class<? extends ConditionsObject> objectType) {
+        return objectTypeMap.get(objectType);
+    }
+    
+    public TableMetaData findByCollectionType(Class<?> collectionType) {
+        return collectionTypeMap.get(collectionType);
+    }
+    
+    public TableMetaData findByTableName(String name) {
+        return this.get(name);
+    }
+    
+    public String toString() {  
+        StringBuffer buff = new StringBuffer();
+        for (TableMetaData tableMetaData : this.values()) {
+            buff.append(tableMetaData.toString());
+        }
+        return buff.toString();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	Tue Dec 30 16:44:44 2014
@@ -2,18 +2,28 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * This class represents an ECAL channel that is considered "bad" which means it
  * should not be used in reconstruction.
  */
+@Table(names = {"ecal_bad_channels"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.COMBINE)
 public final class EcalBadChannel extends AbstractConditionsObject {
 
     public static class EcalBadChannelCollection extends AbstractConditionsObjectCollection<EcalBadChannel> {
     }
 
-    int getChannelId() {
+    /**
+     * Get the channel ID of the bad channel.
+     * @return The channel ID of the bad channel.
+     */
+    @Field(names = {"ecal_channel_id"})
+    public int getChannelId() {
         return getFieldValue("ecal_channel_id");
     }
-
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	Tue Dec 30 16:44:44 2014
@@ -2,6 +2,10 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * This class is a simplistic representation of ECal pedestal and noise values
@@ -12,6 +16,8 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"ecal_calibrations"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class EcalCalibration extends AbstractConditionsObject {
 
     public static class EcalCalibrationCollection extends AbstractConditionsObjectCollection<EcalCalibration> {
@@ -30,6 +36,7 @@
      * Get the channel ID.
      * @return The channel ID.
      */
+    @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
         return getFieldValue("ecal_channel_id");
     }
@@ -39,6 +46,7 @@
      * digitized pre-amp output.
      * @return The gain value.
      */
+    @Field(names = {"pedestal"})
     public double getPedestal() {
         return getFieldValue("pedestal");
     }
@@ -48,6 +56,7 @@
      * deviation of the digitized pre-amp output.
      * @return The noise value.
      */
+    @Field(names = {"noise"})
     public double getNoise() {
         return getFieldValue("noise");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	Tue Dec 30 16:44:44 2014
@@ -10,6 +10,10 @@
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.AbstractIdentifier;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
 import org.lcsim.detector.identifier.IExpandedIdentifier;
 import org.lcsim.detector.identifier.IIdentifierHelper;
@@ -20,6 +24,8 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"ecal_channels"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
 public final class EcalChannel extends AbstractConditionsObject {
 
     /**
@@ -244,7 +250,9 @@
     /**
      * Get the crate number of the channel.
      * @return The crate number.
-     */
+     * 
+     */
+    @Field(names = {"crate"})
     public int getCrate() {
         return getFieldValue("crate");
     }
@@ -253,6 +261,7 @@
      * Get the slot number of the channel.
      * @return The slot number.
      */
+    @Field(names = {"slot"})
     public int getSlot() {
         return getFieldValue("slot");
     }
@@ -261,6 +270,7 @@
      * Get the channel number of the channel.
      * @return The channel number.
      */
+    @Field(names = {"channel"})
     public int getChannel() {
         return getFieldValue("channel");
     }
@@ -269,6 +279,7 @@
      * Get the x value of the channel.
      * @return The x value.
      */
+    @Field(names = {"x"})
     public int getX() {
         return getFieldValue("x");
     }
@@ -277,6 +288,7 @@
      * Get the y value of the channel.
      * @return The y value.
      */
+    @Field(names = {"y"})
     public int getY() {
         return getFieldValue("y");
     }
@@ -285,6 +297,7 @@
      * Get the ID of the channel.
      * @return The ID of the channel.
      */
+    @Field(names = {"channel_id"})
     public int getChannelId() {
         return getFieldValue("channel_id");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	Tue Dec 30 16:44:44 2014
@@ -2,9 +2,6 @@
 
 import java.util.logging.Logger;
 
-import org.lcsim.conditions.ConditionsConverter;
-import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.util.log.LogUtil;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.ecal.EcalBadChannel.EcalBadChannelCollection;
 import org.hps.conditions.ecal.EcalCalibration.EcalCalibrationCollection;
@@ -13,6 +10,9 @@
 import org.hps.conditions.ecal.EcalGain.EcalGainCollection;
 import org.hps.conditions.ecal.EcalTimeShift.EcalTimeShiftCollection;
 import org.hps.conditions.svt.AbstractSvtConditionsConverter;
+import org.lcsim.conditions.ConditionsConverter;
+import org.lcsim.conditions.ConditionsManager;
+import org.lcsim.util.log.LogUtil;
 
 /**
  * This class loads all ECal conditions into an {@link EcalConditions} object
@@ -22,19 +22,39 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
-public final class EcalConditionsConverter implements ConditionsConverter<EcalConditions> {
+public class EcalConditionsConverter implements ConditionsConverter<EcalConditions> {
 
     static Logger logger = LogUtil.create(AbstractSvtConditionsConverter.class);
     
+    protected EcalChannelCollection getEcalChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(EcalChannelCollection.class);
+    }
+    
+    protected EcalGainCollection getEcalGainCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(EcalGainCollection.class);
+    }
+    
+    protected EcalBadChannelCollection getEcalBadChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(EcalBadChannelCollection.class);
+    }
+    
+    protected EcalCalibrationCollection getEcalCalibrationCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(EcalCalibrationCollection.class);
+    }
+    
+    protected EcalTimeShiftCollection getEcalTimeShiftCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(EcalTimeShiftCollection.class);
+    }
+        
     /**
      * Create ECAL conditions object containing all data for the current run.
      */
     public EcalConditions getData(ConditionsManager manager, String name) {
 
-        DatabaseConditionsManager dbConditionsManager = (DatabaseConditionsManager) manager;
+        DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) manager;
 
         // Get the ECal channel map from the conditions database
-        EcalChannelCollection channels = dbConditionsManager.getCollection(EcalChannelCollection.class);
+        EcalChannelCollection channels = getEcalChannelCollection(databaseConditionsManager);
 
         // Create the ECal conditions object that will be used to encapsulate
         // ECal conditions collections
@@ -45,7 +65,7 @@
 
         // Get the ECal gains from the conditions database and add them to the
         // conditions set
-        EcalGainCollection gains = dbConditionsManager.getCollection(EcalGainCollection.class);
+        EcalGainCollection gains = getEcalGainCollection(databaseConditionsManager);
         for (EcalGain gain : gains) {
             ChannelId channelId = new ChannelId(new int[] { gain.getChannelId() });
             EcalChannel channel = channels.findChannel(channelId);
@@ -53,20 +73,26 @@
         }
 
         // Get the ECal bad channels and add them to the conditions set
+        EcalBadChannelCollection badChannels = null;
         try {
-            EcalBadChannelCollection badChannels = dbConditionsManager.getCollection(EcalBadChannelCollection.class);
+            badChannels = getEcalBadChannelCollection(databaseConditionsManager);
+        } catch (RuntimeException e) {
+            databaseConditionsManager.getLogger().warning(e.getMessage());
+        }
+        if (badChannels != null) {
             for (EcalBadChannel badChannel : badChannels) {
+                if (badChannel == null) {
+                    throw new RuntimeException("The badChannel points to null.");
+                }
                 ChannelId channelId = new ChannelId(new int[] { badChannel.getChannelId() });
                 EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setBadChannel(true);
             }
-        } catch (RuntimeException e) {
-            logger.warning("A set of bad channels were not found.");
         }
 
         // Get the ECal calibrations from the conditions database and add them
         // to the conditions set.
-        EcalCalibrationCollection calibrations = dbConditionsManager.getCollection(EcalCalibrationCollection.class);
+        EcalCalibrationCollection calibrations = getEcalCalibrationCollection(databaseConditionsManager);
         for (EcalCalibration calibration : calibrations) {
             ChannelId channelId = new ChannelId(new int[] { calibration.getChannelId() });
             EcalChannel channel = channels.findChannel(channelId);
@@ -75,9 +101,9 @@
 
         // Get the ECal time shifts from the conditions database and add them to
         // the conditions set.
-        EcalTimeShiftCollection timeShifts = dbConditionsManager.getCollection(EcalTimeShiftCollection.class);
+        EcalTimeShiftCollection timeShifts = getEcalTimeShiftCollection(databaseConditionsManager);
         for (EcalTimeShift timeShift : timeShifts) {
-            ChannelId channelId = new ChannelId(new int[] { timeShift.getChannelId() });
+            ChannelId channelId = new ChannelId(new int[] {timeShift.getChannelId()});
             EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setTimeShift(timeShift);
         }
@@ -93,5 +119,4 @@
     public Class<EcalConditions> getType() {
         return EcalConditions.class;
     }
-
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	Tue Dec 30 16:44:44 2014
@@ -2,12 +2,18 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * A simplistic representation of gain values from the ECal conditions database.
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"ecal_gains", "test_run_ecal_gains"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class EcalGain extends AbstractConditionsObject {
 
     public static class EcalGainCollection extends AbstractConditionsObjectCollection<EcalGain> {
@@ -17,6 +23,7 @@
      * Get the gain value in units of MeV/ADC count.
      * @return The gain value.
      */
+    @Field(names = {"gain"})
     public double getGain() {
         return getFieldValue("gain");
     }
@@ -25,6 +32,7 @@
      * Get the ECal channel ID.
      * @return The ECal channel ID.
      */
+    @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
         return getFieldValue("ecal_channel_id");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	Tue Dec 30 16:44:44 2014
@@ -2,12 +2,18 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * A conditions class for representing the setup of the LED system in the ECAL
  * for one channel.
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = "ecal_leds")
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
 public class EcalLed extends AbstractConditionsObject {
 
     /**
@@ -20,6 +26,7 @@
      * Get the ECAL channel ID.
      * @return The ECAL channel ID.
      */
+    @Field(names = {"ecal_channel_id"})
     public int getEcalChannelId() {
         return getFieldValue("ecal_channel_id");
     }
@@ -28,6 +35,7 @@
      * Get the crate number assigned to this crystal.
      * @return The crate number.
      */
+    @Field(names = {"crate"})
     public int getCrateNumber() {
         return getFieldValue("crate");
     }
@@ -36,6 +44,7 @@
      * Get the LED number assigned to this crystal.
      * @return The LED number.
      */
+    @Field(names = {"number"})
     public int getLedNumber() {
         return getFieldValue("number");
     }
@@ -44,6 +53,7 @@
      * Get the time delay of this channel.
      * @return The time delay.
      */
+    @Field(names = {"time_delay"})
     public double getTimeDelay() {
         return getFieldValue("time_delay");
     }
@@ -52,6 +62,7 @@
      * Get the amplitude high setting.
      * @return The amplitude high setting.
      */
+    @Field(names = {"amplitude_high"})
     public double getAmplitudeHigh() {
         return getFieldValue("amplitude_high");
     }
@@ -60,6 +71,7 @@
      * Get the amplitude low setting.
      * @return The amplitude low setting.
      */
+    @Field(names = {"amplitude_low"})
     public double getAmplitudeLow() {
         return getFieldValue("amplitude_low");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	Tue Dec 30 16:44:44 2014
@@ -2,11 +2,17 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * This class represents a time shift calibration value for an ECAL channel.
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"ecal_time_shifts", "test_run_ecal_time_shifts"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class EcalTimeShift extends AbstractConditionsObject {
 
     /**
@@ -19,6 +25,7 @@
      * Get the channel ID.
      * @return The ECAL channel ID.
      */
+    @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
         return getFieldValue("ecal_channel_id");
     }
@@ -27,6 +34,7 @@
      * Get the time shift in nanoseconds.
      * @return The time shift in nanoseconds.
      */
+    @Field(names = {"time_shift"})
     public double getTimeShift() {
         return getFieldValue("time_shift");
     }

Added: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,39 @@
+package org.hps.conditions.ecal;
+
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.ecal.EcalBadChannel.EcalBadChannelCollection;
+import org.hps.conditions.ecal.EcalCalibration.EcalCalibrationCollection;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalGain.EcalGainCollection;
+import org.hps.conditions.ecal.EcalTimeShift.EcalTimeShiftCollection;
+
+/**
+ * This class loads all ECal conditions into an {@link EcalConditions} object
+ * from the database, based on the current run number known by the conditions
+ * manager.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Omar Moreno <[log in to unmask]>
+ */
+public final class TestRunEcalConditionsConverter extends EcalConditionsConverter {
+    
+    protected EcalChannelCollection getEcalChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(EcalChannelCollection.class, "test_run_ecal_channels").getCachedData();
+    }
+    
+    protected EcalGainCollection getEcalGainCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(EcalGainCollection.class, "test_run_ecal_gains").getCachedData();
+    }
+    
+    protected EcalBadChannelCollection getEcalBadChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(EcalBadChannelCollection.class, "test_run_ecal_bad_channels").getCachedData();
+    }
+    
+    protected EcalCalibrationCollection getEcalCalibrationCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(EcalCalibrationCollection.class, "test_run_ecal_calibrations").getCachedData();
+    }
+    
+    protected EcalTimeShiftCollection getEcalTimeShiftCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(EcalTimeShiftCollection.class, "test_run_ecal_time_shifts").getCachedData();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java	Tue Dec 30 16:44:44 2014
@@ -1,21 +1,21 @@
 /**
+ * <p>
  * The classes in this package represent detector conditions in the HPS ECAL subsystem.
- * 
+ * <p>
  * Each {@link EcalChannel} represents one physical crystal in the detector.
- * 
+ * <p>
  * The {@link EcalBadChannel} is a channel that is malfunctioning or dead and should not 
  * be used for reconstruction.  It is up to the reconstruction Drivers to filter out 
  * these channels.
- * 
+ * <p>
  * The {@link EcalCalibration} contains the pedestal and noise values for a channel, 
  * which are the mean and the standard deviation of the digitized pre-amp output.
- * 
+ * <p>
  * The {@link EcalGain} is the channel gain in units of MeV/ADC counts.
- * 
- * The energy of a hit is reconstructed by multipling the gain by the pedestal-subtracted
+ * <p>
+ * The energy of a hit is reconstructed by multiplying the gain by the pedestal-subtracted
  * ADC integral (e.g. in Test Run 2012 data). 
  * 
  * @author Jeremy McCormick <[log in to unmask]>
- * @author Sho Uemura <[log in to unmask]>
  */
 package org.hps.conditions.ecal;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	Tue Dec 30 16:44:44 2014
@@ -6,6 +6,7 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
 
 /**
@@ -79,6 +80,7 @@
      * 
      * @return The channel ID.
      */
+    @Field(names = {"channel_id"})
     public int getChannelID() {
         return getFieldValue("channel_id");
     }
@@ -88,8 +90,8 @@
      * 
      * @return The channel number.
      */
+    @Field(names = {"channel"})
     public int getChannel() {
         return getFieldValue("channel");
     }
-
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	Tue Dec 30 16:44:44 2014
@@ -24,6 +24,22 @@
     protected T conditions;
     static Logger logger = LogUtil.create(AbstractSvtConditionsConverter.class);
 
+    protected SvtShapeFitParametersCollection getSvtShapeFitParametersCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(SvtShapeFitParametersCollection.class);
+    }
+    
+    protected SvtBadChannelCollection getSvtBadChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(SvtBadChannelCollection.class);
+    }
+    
+    protected SvtCalibrationCollection getSvtCalibrationCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(SvtCalibrationCollection.class);
+    }
+    
+    protected SvtGainCollection getSvtGainCollection(DatabaseConditionsManager manager) {
+        return manager.getCollection(SvtGainCollection.class);
+    }
+    
     /**
      * Create and return the SVT conditions object.
      * @param manager The current conditions manager.
@@ -33,26 +49,23 @@
 
         DatabaseConditionsManager dbConditionsManager = (DatabaseConditionsManager) manager;
 
-        // Get the SVT calibrations (baseline, noise) from the conditions
-        // database
-        SvtCalibrationCollection calibrations = dbConditionsManager.getCollection(SvtCalibrationCollection.class);
+        // Get the SVT calibrations (baseline, noise) from the conditions database
+        SvtCalibrationCollection calibrations = getSvtCalibrationCollection(dbConditionsManager);
         for (SvtCalibration calibration : calibrations) {
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(calibration.getChannelID());
             conditions.getChannelConstants(channel).setCalibration(calibration);
         }
 
         // Get the Channel pulse fit parameters from the conditions database
-        SvtShapeFitParametersCollection shapeFitParametersCollection = dbConditionsManager.getCollection(SvtShapeFitParametersCollection.class);
+        SvtShapeFitParametersCollection shapeFitParametersCollection = getSvtShapeFitParametersCollection(dbConditionsManager);
         for (SvtShapeFitParameters shapeFitParameters : shapeFitParametersCollection) {
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(shapeFitParameters.getChannelID());
             conditions.getChannelConstants(channel).setShapeFitParameters(shapeFitParameters);
         }
 
-        // Get the bad channels from the conditions database. If there aren't
-        // any bad channels,
-        // notify the user and move on.
+        // Get the bad channels from the conditions database. If there aren't any bad channels, notify the user and move on.
         try {
-            SvtBadChannelCollection badChannels = dbConditionsManager.getCollection(SvtBadChannelCollection.class);
+            SvtBadChannelCollection badChannels = getSvtBadChannelCollection(dbConditionsManager);
             for (SvtBadChannel badChannel : badChannels) {
                 AbstractSvtChannel channel = conditions.getChannelMap().findChannel(badChannel.getChannelId());
                 conditions.getChannelConstants(channel).setBadChannel(true);
@@ -62,7 +75,7 @@
         }
 
         // Get the gains and offsets from the conditions database
-        SvtGainCollection channelGains = dbConditionsManager.getCollection(SvtGainCollection.class);
+        SvtGainCollection channelGains = getSvtGainCollection(dbConditionsManager);
         for (SvtGain channelGain : channelGains) {
             int channelId = channelGain.getChannelID();
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(channelId);
@@ -71,4 +84,4 @@
 
         return conditions;
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	Tue Dec 30 16:44:44 2014
@@ -1,9 +1,10 @@
 package org.hps.conditions.svt;
 
-import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 
 /**
  * This abstract class provides some of the basic functionality used to access
@@ -47,14 +48,17 @@
 
     }
 
+    @Field(names = {"svt_half"})
     public String getSvtHalf() {
         return getFieldValue("svt_half");
     }
 
+    @Field(names = {"layer"})
     public int getLayerNumber() {
         return getFieldValue("layer");
     }
 
+    @Field(names = {"orientation"})
     public String getOrientation() {
         return getFieldValue("orientation");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	Tue Dec 30 16:44:44 2014
@@ -2,6 +2,7 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
 
 /**
@@ -30,6 +31,7 @@
      * 
      * @return The t0 shift.
      */
+    @Field(names = {"t0_shift"})
     public double getT0Shift() {
         return getFieldValue("t0_shift");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	Tue Dec 30 16:44:44 2014
@@ -2,25 +2,29 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * <p>
  * Encapsulates an SVT alignment constant, which is an encoded key plus a double
  * value.
- * </p>
  * <p>
  * The format of the keys is ABCDE where:<br>
  * A == half == [1,2]<br>
  * B == alignment type == [1,2]<br>
  * C == unit axis == [1,2,3]<br>
  * DE == module number == [1,10]
- * </p>
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-public class SvtAlignmentConstant extends AbstractConditionsObject {
+@Table(names = "svt_alignments")
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
+public final class SvtAlignmentConstant extends AbstractConditionsObject {
 
-    public static class SvtAlignmentCollection extends AbstractConditionsObjectCollection<SvtAlignmentConstant> {
+    public static class SvtAlignmentConstantCollection extends AbstractConditionsObjectCollection<SvtAlignmentConstant> {
     }
 
     /** Top or bottom half. */
@@ -72,6 +76,7 @@
      * Get the alignment constant's full key with the encoded information.
      * @return the alignment constant's key
      */
+    @Field(names = {"parameter"})
     public String getParameter() {
         return getFieldValue("parameter");
     }
@@ -80,6 +85,7 @@
      * Get the the alignment constant's value which is always a single double.
      * @return the alignment constant's value as a double
      */
+    @Field(names = {"value"})
     public double getValue() {
         return getFieldValue("value");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	Tue Dec 30 16:44:44 2014
@@ -2,18 +2,25 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
+@Table(names = {"svt_bad_channels", "test_run_svt_bad_channels"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.COMBINE)
 public final class SvtBadChannel extends AbstractConditionsObject {
 
     public static class SvtBadChannelCollection extends AbstractConditionsObjectCollection<SvtBadChannel> {
     }
 
+    @Field(names = {"svt_channel_id"})
     public int getChannelId() {
         return getFieldValue("svt_channel_id");
     }
 
+    @Field(names = {"notes"})
     public int getNote() {
         return getFieldValue("notes");
     }
-
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	Tue Dec 30 16:44:44 2014
@@ -2,6 +2,10 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 import static org.hps.conditions.svt.SvtChannel.MAX_NUMBER_OF_SAMPLES;
 
@@ -11,6 +15,8 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"svt_calibrations", "test_run_svt_calibrations"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
 public final class SvtCalibration extends AbstractConditionsObject {
 
     public static class SvtCalibrationCollection extends AbstractConditionsObjectCollection<SvtCalibration> {
@@ -20,6 +26,7 @@
      * Get the channel ID.
      * @return The channel ID.
      */
+    @Field(names = {"svt_channel_id"})
     public int getChannelID() {
         return getFieldValue("svt_channel_id");
     }
@@ -28,9 +35,10 @@
      * Get the noise value.
      * @return The noise value.
      */
+    @Field(names = {"noise_0", "noise_1", "noise_2", "noise_3", "noise_4", "noise_5"})
     public double getNoise(int sample) {
         if (sample < 0 || sample > MAX_NUMBER_OF_SAMPLES) {
-            throw new RuntimeException("Sample number is not within range.");
+            throw new IllegalArgumentException("Sample number is not within range.");
         }
         return getFieldValue(Double.class, "noise_" + Integer.toString(sample));
     }
@@ -39,9 +47,10 @@
      * Get the pedestal value.
      * @return The pedestal value.
      */
+    @Field(names = {"pedestal_0", "pedestal_1", "pedestal_2", "pedestal_3", "pedestal_4", "pedestal_5"})
     public double getPedestal(int sample) {
         if (sample < 0 || sample > MAX_NUMBER_OF_SAMPLES) {
-            throw new RuntimeException("Sample number is not within range.");
+            throw new IllegalArgumentException("Sample number is not within range.");
         }
         return getFieldValue(Double.class, "pedestal_" + Integer.toString(sample));
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java	Tue Dec 30 16:44:44 2014
@@ -4,6 +4,10 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 
 /**
@@ -13,6 +17,8 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"svt_channels"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
 public final class SvtChannel extends AbstractSvtChannel {
 
     public static class SvtChannelCollection extends AbstractSvtChannel.AbstractSvtChannelCollection<SvtChannel> {
@@ -40,6 +46,7 @@
      * Get the FEB ID.
      * @return The FEB ID.
      */
+    @Field(names = {"feb_id"})
     public int getFebID() {
         return getFieldValue("feb_id");
     }
@@ -48,6 +55,7 @@
      * Get the FEB hybrid ID.
      * @return The FEB hybrid ID.
      */
+    @Field(names = {"feb_hybrid_id"})
     public int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	Tue Dec 30 16:44:44 2014
@@ -7,6 +7,10 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.jdom.Document;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
@@ -16,6 +20,8 @@
 /**
  * This is a simple class for getting an SVT XML configuration file.
  */
+@Table(names = {"svt_configurations"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
 public class SvtConfiguration extends AbstractConditionsObject {
 
     public static class SvtConfigurationCollection extends AbstractConditionsObjectCollection<SvtConfiguration> {
@@ -25,8 +31,14 @@
      * Get the filename associated with this configuration.
      * @return The filename associated with the configuration.
      */
+    @Field(names = {"filename"})
     public String getFileName() {
         return getFieldValue("filename");
+    }
+    
+    @Field(names = {"content"})
+    public byte[] getContent() {
+        return getFieldValue("content");
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	Tue Dec 30 16:44:44 2014
@@ -1,7 +1,10 @@
 package org.hps.conditions.svt;
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
-
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 
 /**
@@ -10,6 +13,8 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"svt_daq_map"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
 public class SvtDaqMapping extends AbstractSvtDaqMapping {
 
     public static class SvtDaqMappingCollection extends AbstractSvtDaqMappingCollection<SvtDaqMapping> {
@@ -95,15 +100,18 @@
         }
     }
 
+    @Field(names = {"feb_id"})
     public int getFebID() {
         return getFieldValue("feb_id");
     }
 
+    @Field(names = {"feb_hybrid_id"})
     public int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }
 
+    @Field(names = {"side"})
     public String getSide() {
         return getFieldValue("side");
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	Tue Dec 30 16:44:44 2014
@@ -2,11 +2,17 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * This class represents gain measurements for a single SVT channel.
  * @author Jeremy McCormick <[log in to unmask]>
  */
+@Table(names = {"svt_gains", "test_run_svt_gains"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class SvtGain extends AbstractConditionsObject {
 
     public static class SvtGainCollection extends AbstractConditionsObjectCollection<SvtGain> {
@@ -16,6 +22,7 @@
      * Get the channel ID.
      * @return The channel ID.
      */
+    @Field(names = {"svt_channel_id"})
     public int getChannelID() {
         return getFieldValue(Integer.class, "svt_channel_id");
     }
@@ -24,6 +31,7 @@
      * Get the gain.
      * @return The gain value.
      */
+    @Field(names = {"gain"})
     public double getGain() {
         return getFieldValue(Double.class, "gain");
     }
@@ -32,6 +40,7 @@
      * Get the offset.
      * @return The offset value.
      */
+    @Field(names = {"offset"})
     public double getOffset() {
         return getFieldValue(Double.class, "offset");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	Tue Dec 30 16:44:44 2014
@@ -2,6 +2,10 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 
 /**
  * This class encapsulates the shape fit parameters for an SVT channel.
@@ -9,6 +13,8 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"svt_shape_fit_parameters", "test_run_svt_shape_fit_parameters"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class SvtShapeFitParameters extends AbstractConditionsObject {
 
     public static class SvtShapeFitParametersCollection extends AbstractConditionsObjectCollection<SvtShapeFitParameters> {
@@ -18,7 +24,8 @@
      * Get the SVT channel ID.
      * @return The SVT channel ID.
      */
-    int getChannelID() {
+    @Field(names = {"svt_channel_id"})
+    public int getChannelID() {
         return getFieldValue(Integer.class, "svt_channel_id");
     }
 
@@ -26,7 +33,8 @@
      * Get the amplitude.
      * @return The amplifude.
      */
-    double getAmplitude() {
+    @Field(names = {"amplitude"})
+    public double getAmplitude() {
         return getFieldValue(Double.class, "amplitude");
     }
 
@@ -34,7 +42,8 @@
      * Get t0.
      * @return t0.
      */
-    double getT0() {
+    @Field(names = {"t0"})
+    public double getT0() {
         return getFieldValue(Double.class, "t0");
     }
 
@@ -42,7 +51,8 @@
      * Get tp.
      * @return tp.
      */
-    double getTp() {
+    @Field(names = {"tp"})
+    public double getTp() {
         return getFieldValue(Double.class, "tp");
     }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	Tue Dec 30 16:44:44 2014
@@ -1,5 +1,9 @@
 package org.hps.conditions.svt;
 
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 
 /**
@@ -9,6 +13,8 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"svt_t0_shifts"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class SvtT0Shift extends AbstractSvtT0Shift {
 
     public static class SvtT0ShiftCollection extends AbstractSvtT0Shift.AbstractSvtT0ShiftCollection<SvtT0Shift> {
@@ -38,7 +44,8 @@
      * 
      * @return The FEB ID.
      */
-    int getFebID() {
+    @Field(names = {"feb_id"})
+    public int getFebID() {
         return getFieldValue("feb_id");
     }
 
@@ -47,7 +54,8 @@
      *
      * @return The FEB hybrid ID.
      */
-    int getFebHybridID() {
+    @Field(names = {"feb_hybrid_id"})
+    public int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	Tue Dec 30 16:44:44 2014
@@ -4,8 +4,14 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 
+@Table(names = {"test_run_svt_channels"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
 public final class TestRunSvtChannel extends AbstractSvtChannel {
 
     public static class TestRunSvtChannelCollection extends AbstractSvtChannel.AbstractSvtChannelCollection<TestRunSvtChannel> {
@@ -29,6 +35,7 @@
      * 
      * @return The FPGA ID
      */
+    @Field(names = {"fpga"})
     public int getFpgaID() {
         return getFieldValue("fpga");
     }
@@ -38,6 +45,7 @@
      * 
      * @return The hybrid ID.
      */
+    @Field(names = {"hybrid"})
     public int getHybridID() {
         return getFieldValue("hybrid");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	Tue Dec 30 16:44:44 2014
@@ -17,7 +17,7 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @author Omar Moreno <[log in to unmask]>
  */
-public class TestRunSvtConditions extends AbstractSvtConditions {
+public final class TestRunSvtConditions extends AbstractSvtConditions {
 
     /**
      * Get the {@link TestRunSvtDaqMappingCollection} associated with these

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditionsConverter.java	Tue Dec 30 16:44:44 2014
@@ -2,6 +2,10 @@
 
 import org.lcsim.conditions.ConditionsManager;
 import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.svt.SvtBadChannel.SvtBadChannelCollection;
+import org.hps.conditions.svt.SvtCalibration.SvtCalibrationCollection;
+import org.hps.conditions.svt.SvtGain.SvtGainCollection;
+import org.hps.conditions.svt.SvtShapeFitParameters.SvtShapeFitParametersCollection;
 import org.hps.conditions.svt.TestRunSvtChannel.TestRunSvtChannelCollection;
 import org.hps.conditions.svt.TestRunSvtDaqMapping.TestRunSvtDaqMappingCollection;
 import org.hps.conditions.svt.TestRunSvtT0Shift.TestRunSvtT0ShiftCollection;
@@ -10,6 +14,22 @@
 
     public TestRunSvtConditionsConverter() {
         this.conditions = new TestRunSvtConditions();
+    }
+    
+    protected SvtShapeFitParametersCollection getSvtShapeFitParametersCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(SvtShapeFitParametersCollection.class, "test_run_svt_shape_fit_parameters").getCachedData();
+    }
+    
+    protected SvtBadChannelCollection getSvtBadChannelCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(SvtBadChannelCollection.class, "test_run_svt_bad_channels").getCachedData();
+    }
+    
+    protected SvtCalibrationCollection getSvtCalibrationCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(SvtCalibrationCollection.class, "test_run_svt_calibrations").getCachedData();
+    }
+    
+    protected SvtGainCollection getSvtGainCollection(DatabaseConditionsManager manager) {
+        return manager.getCachedConditions(SvtGainCollection.class, "test_run_svt_gains").getCachedData();
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	Tue Dec 30 16:44:44 2014
@@ -1,16 +1,21 @@
 package org.hps.conditions.svt;
 
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
+import org.hps.util.Pair;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor;
-
-import org.hps.util.Pair;
 
 /**
  * This class encapsulates the Test run SVT DAQ map.
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
-public class TestRunSvtDaqMapping extends AbstractSvtDaqMapping {
+@Table(names = {"test_run_svt_daq_map"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
+public final class TestRunSvtDaqMapping extends AbstractSvtDaqMapping {
 
     public static class TestRunSvtDaqMappingCollection extends AbstractSvtDaqMappingCollection<TestRunSvtDaqMapping> {
 
@@ -91,10 +96,12 @@
         }
     }
 
+    @Field(names = {"fpga"})
     public int getFpgaID() {
         return getFieldValue("fpga");
     }
 
+    @Field(names = {"hybrid"})
     public int getHybridID() {
         return getFieldValue("hybrid");
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	Tue Dec 30 16:44:44 2014
@@ -1,5 +1,9 @@
 package org.hps.conditions.svt;
 
+import org.hps.conditions.database.Converter;
+import org.hps.conditions.database.Field;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 
 /**
@@ -8,6 +12,8 @@
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
+@Table(names = {"test_run_svt_t0_shifts"})
+@Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class TestRunSvtT0Shift extends AbstractSvtT0Shift {
 
     public static class TestRunSvtT0ShiftCollection extends AbstractSvtT0Shift.AbstractSvtT0ShiftCollection<TestRunSvtT0Shift> {
@@ -39,7 +45,8 @@
      * 
      * @return The FPGA ID.
      */
-    int getFpgaID() {
+    @Field(names = {"fpga"})
+    public int getFpgaID() {
         return getFieldValue("fpga");
     }
 
@@ -48,7 +55,8 @@
      * 
      * @return The hybrid ID.
      */
-    int getHybridID() {
+    @Field(names = {"hybrid"})
+    public int getHybridID() {
         return getFieldValue("hybrid");
     }
 }

Added: java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_engrun.xml
 =============================================================================
--- java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_engrun.xml	(added)
+++ java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_engrun.xml	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,8 @@
+<conditions_database>
+    <configuration>
+        <setupSvtDetector>false</setupSvtDetector>
+        <setupEcalDetector>true</setupEcalDetector>
+        <cacheAllConditions>false</cacheAllConditions>
+        <freezeAfterInitialize>false</freezeAfterInitialize>
+    </configuration>
+</conditions_database>

Added: java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_prod.xml
 =============================================================================
--- java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_prod.xml	(added)
+++ java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_prod.xml	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,8 @@
+<conditions_database>
+    <configuration>
+        <setupSvtDetector>true</setupSvtDetector>
+        <setupEcalDetector>true</setupEcalDetector>
+        <cacheAllConditions>false</cacheAllConditions>
+        <freezeAfterInitialize>false</freezeAfterInitialize>
+    </configuration>
+</conditions_database>

Modified: java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_testrun_2012.xml
 =============================================================================
--- java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_testrun_2012.xml	(original)
+++ java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_testrun_2012.xml	Tue Dec 30 16:44:44 2014
@@ -1,217 +1,8 @@
-<conditions_database name="hps_conditions_test" version="1.0" author="jeremym">
-      
-    <converters>
-
-        <!-- ConditionsRecord converter -->
-        <converter class="org.hps.conditions.database.ConditionsRecordConverter"/>
-
-        <!-- SVT converters -->
-        <converter class="org.hps.conditions.svt.TestRunSvtConditionsConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$TestRunSvtChannelConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$TestRunSvtDaqMappingConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$TestRunSvtT0ShiftConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$SvtCalibrationConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$SvtShapeFitParametersConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$SvtGainConverter"/>
-        <converter class="org.hps.conditions.svt.SvtConverterRegistry$SvtBadChannelConverter"/>
-
-        <!-- ECal converters -->
-        <converter class="org.hps.conditions.ecal.EcalConditionsConverter"/>
-        <converter class="org.hps.conditions.ecal.EcalConverterRegistry$EcalBadChannelConverter"/>
-        <converter class="org.hps.conditions.ecal.EcalConverterRegistry$EcalChannelConverter"/>
-        <converter class="org.hps.conditions.ecal.EcalConverterRegistry$EcalGainConverter"/>
-        <converter class="org.hps.conditions.ecal.EcalConverterRegistry$EcalCalibrationConverter"/>
-        <converter class="org.hps.conditions.ecal.EcalConverterRegistry$EcalTimeShiftConverter"/>
-
-        <!-- Beam conditions converter -->
-        <converter class="org.hps.conditions.beam.BeamConverterRegistry$BeamCurrentConverter"/>
-    </converters>
-
-    <tables>
-    
-        <table key="conditions_records" name="conditions">
-            <classes> 
-                <object class="org.hps.conditions.api.ConditionsRecord"/>
-                <collection class="org.hps.conditions.api.ConditionsRecord$ConditionsRecordCollection"/>
-            </classes>
-            <fields>
-                <field name="run_start" />
-                <field name="run_end" />
-                <field name="updated" />
-                <field name="created" />
-                <field name="created_by" />
-                <field name="notes" />
-                <field name="name" />
-                <field name="table_name" />
-                <field name="collection_id" />
-            </fields>
-        </table>
-
-        <table key="test_run_svt_channels" name="test_run_svt_channels">
-            <classes>
-                <object class="org.hps.conditions.svt.TestRunSvtChannel"/>
-                <collection class="org.hps.conditions.svt.TestRunSvtChannel$TestRunSvtChannelCollection"/>
-            </classes>
-            <fields>
-                <field name="channel_id" />
-                <field name="fpga" />
-                <field name="hybrid" />
-                <field name="channel" />
-            </fields>
-        </table>
-    
-        <table key="test_run_svt_calibrations" name="test_run_svt_calibrations">
-            <classes>
-                <object class="org.hps.conditions.svt.SvtCalibration"/>
-                <collection class="org.hps.conditions.svt.SvtCalibration$SvtCalibrationCollection"/>
-            </classes>
-            <fields>
-                <field name="svt_channel_id" />
-                <field name="pedestal_0" />
-                <field name="pedestal_1" />
-                <field name="pedestal_2" />
-                <field name="pedestal_3" />
-                <field name="pedestal_4" />
-                <field name="pedestal_5" />
-                <field name="noise_0" />
-                <field name="noise_1" />
-                <field name="noise_2" />
-                <field name="noise_3" />
-                <field name="noise_4" />
-                <field name="noise_5" />
-            </fields>        
-        </table>
-
-        <table key="test_run_svt_shape_fit_parameters" name="test_run_svt_shape_fit_parameters">
-            <classes>
-                <object class="org.hps.conditions.svt.SvtShapeFitParameters"/>
-                <collection class="org.hps.conditions.svt.SvtShapeFitParameters$SvtShapeFitParametersCollection"/>
-            </classes>
-            <fields>
-                <field name="svt_channel_id"    />
-                <field name="amplitude"         />
-                <field name="t0"                />
-                <field name="tp"                />
-            </fields>        
-        </table>
-
-        <table key="test_run_svt_gains" name="test_run_svt_gains">
-            <classes>
-                <object class="org.hps.conditions.svt.SvtGain"/> 
-                <collection class="org.hps.conditions.svt.SvtGain$SvtGainCollection"/>
-            </classes>            
-            <fields>
-                <field name="svt_channel_id" />
-                <field name="gain" />
-                <field name="offset" />
-            </fields>
-        </table>       
-         
-        <table key="test_run_svt_t0_shifts" name="test_run_svt_t0_shifts">
-            <classes>
-                <object class="org.hps.conditions.svt.TestRunSvtT0Shift"/>
-                <collection class="org.hps.conditions.svt.TestRunSvtT0Shift$TestRunSvtT0ShiftCollection"/>
-            </classes>
-            <fields>
-                <field name="fpga"        />
-                <field name="hybrid" />
-                <field name="t0_shift"      />
-            </fields>        
-        </table>
-         
-        <table key="test_run_svt_bad_channels" name="test_run_svt_bad_channels">
-            <classes>
-                <object class="org.hps.conditions.svt.SvtBadChannel"/>
-                <collection class="org.hps.conditions.svt.SvtBadChannel$SvtBadChannelCollection"/>
-            </classes>
-            <fields>
-                <field name="svt_channel_id" />
-            </fields>        
-        </table>
-       
-       <table key="test_run_svt_daq_map" name="test_run_svt_daq_map">
-            <classes>
-                <object class="org.hps.conditions.svt.TestRunSvtDaqMapping"/>
-                <collection class="org.hps.conditions.svt.TestRunSvtDaqMapping$TestRunSvtDaqMappingCollection"/>
-            </classes>
-            <fields>
-                <field name="fpga" />
-                <field name="hybrid" />
-                <field name="svt_half" />
-                <field name="layer" />
-                <field name="orientation" />
-            </fields>  
-        </table>   
-        
-        <table key="test_run_ecal_bad_channels" name="test_run_ecal_bad_channels">
-            <classes>
-                <object class="org.hps.conditions.ecal.EcalBadChannel"/>
-                <collection class="org.hps.conditions.ecal.EcalBadChannel$EcalBadChannelCollection"/>
-            </classes>
-            <fields>
-                <field name="ecal_channel_id" />
-            </fields>  
-        </table>
-        
-        <table key="test_run_ecal_gains" name="test_run_ecal_gains">
-            <classes>
-                <object class="org.hps.conditions.ecal.EcalGain"/>
-                <collection class="org.hps.conditions.ecal.EcalGain$EcalGainCollection"/>
-            </classes>
-            <fields>
-                <field name="ecal_channel_id" />
-                <field name="gain" />
-            </fields>  
-        </table>
-        
-        <table key="test_run_ecal_calibrations" name="test_run_ecal_calibrations">
-            <classes>
-                <object class="org.hps.conditions.ecal.EcalCalibration"/>
-                <collection class="org.hps.conditions.ecal.EcalCalibration$EcalCalibrationCollection"/>
-            </classes>
-            <fields>
-                <field name="ecal_channel_id" />
-                <field name="noise" />
-                <field name="pedestal" />
-            </fields>  
-        </table>
-        
-        <table key="test_run_ecal_channels" name="test_run_ecal_channels">
-            <classes>
-                <object class="org.hps.conditions.ecal.EcalChannel"/>
-                <collection class="org.hps.conditions.ecal.EcalChannel$EcalChannelCollection"/>
-            </classes>
-            <fields>
-                <field name="channel_id" />                
-                <field name="crate" />
-                <field name="slot" />
-                <field name="channel" />
-                <field name="x" />
-                <field name="y" />
-            </fields>  
-        </table>
-        
-        <table key="test_run_ecal_time_shifts" name="test_run_ecal_time_shifts">
-            <classes>
-                <object class="org.hps.conditions.ecal.EcalTimeShift"/>
-                <collection class="org.hps.conditions.ecal.EcalTimeShift$EcalTimeShiftCollection"/>
-            </classes>
-            <fields>
-                <field name="ecal_channel_id" />
-                <field name="time_shift" />
-            </fields>  
-        </table>
-        
-        <table key="beam_current" name="beam_current">
-            <classes>
-                <object class="org.hps.conditions.beam.BeamCurrent"/>
-                <collection class="org.hps.conditions.beam.BeamCurrent$BeamCurrentCollection"/>
-            </classes>
-            <fields>
-                <field name="beam_current" />
-            </fields>
-        </table>
-                       
-    </tables>
-
+<conditions_database>
+    <configuration>
+        <setupSvtDetector>true</setupSvtDetector>
+        <setupEcalDetector>true</setupEcalDetector>
+        <cacheAllConditions>false</cacheAllConditions>
+        <freezeAfterInitialize>false</freezeAfterInitialize>
+    </configuration>
 </conditions_database>

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsDriverTest.java	Tue Dec 30 16:44:44 2014
@@ -37,7 +37,6 @@
         loop.add(new EventMarkerDriver());
         loop.add(new CheckDriver());
         loop.loop(-1);
-        
     }
     
     static class CheckDriver extends Driver {

Added: java/trunk/conditions/src/test/java/org/hps/conditions/database/ConverterRegistryTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/database/ConverterRegistryTest.java	(added)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/database/ConverterRegistryTest.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,12 @@
+package org.hps.conditions.database;
+
+import junit.framework.TestCase;
+
+public class ConverterRegistryTest extends TestCase {
+    
+    public void testConverterRegistry() {
+        ConverterRegistry converterRegistry = ConverterRegistry.create();
+        System.out.println(converterRegistry.toString());
+    }
+
+}

Added: java/trunk/conditions/src/test/java/org/hps/conditions/database/TableRegistryTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/database/TableRegistryTest.java	(added)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/database/TableRegistryTest.java	Tue Dec 30 16:44:44 2014
@@ -0,0 +1,11 @@
+package org.hps.conditions.database;
+
+import junit.framework.TestCase;
+
+public class TableRegistryTest extends TestCase {
+
+    public void testTableRegistry() {
+        TableRegistry registry = TableRegistry.create();
+        System.out.println(registry.toString());
+    }
+}

Copied: java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java (from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/EcalDetectorSetupTest.java)
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/EcalDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java	Tue Dec 30 16:44:44 2014
@@ -1,4 +1,4 @@
-package org.hps.conditions;
+package org.hps.conditions.ecal;
 
 import java.util.List;
 

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalLedTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalLedTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalLedTest.java	Tue Dec 30 16:44:44 2014
@@ -17,31 +17,20 @@
           
 
     DatabaseConditionsManager conditionsManager;
-	  public void setUp() {
-	        conditionsManager = DatabaseConditionsManager.getInstance();
-	        try {
-	            conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 2000);
-	        } catch (ConditionsNotFoundException e) {
-	            throw new RuntimeException(e);
-	        }
-	    }
+    public void setUp() {
+        conditionsManager = DatabaseConditionsManager.getInstance();
+        try {
+            conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 2000);
+        } catch (ConditionsNotFoundException e) {
+            throw new RuntimeException(e);
+        }
+    }
 	
-    
-    
     public void testEcalLed() {
         DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         EcalLedCollection collection = manager.getConditionsData(EcalLedCollection.class, TableConstants.ECAL_LEDS);
-        for (EcalLed led : collection) {
-        	
+        for (EcalLed led : collection) {    	
         	System.out.println(led);
-            //System.out.println("ECAL LED info ...");
-            //System.out.println("ecal_channel_id: " + led.getEcalChannelId());
-            //System.out.println("crate: " + led.getCrateNumber());
-            //System.out.println("number: " + led.getLedNumber());
-            //System.out.println("time_delay: " + led.getTimeDelay());
-            //System.out.println("amplitude_low: " + led.getAmplitudeLow());
-            //System.out.println("amplitude_high: " + led.getAmplitudeHigh());
-            //System.out.println();
         }
     }
 }

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	Tue Dec 30 16:44:44 2014
@@ -14,7 +14,7 @@
  */
 public class SvtDaqMappingTest extends TestCase {
 
-    // --- Constants ---//
+    // --- Constants ---// 
     // -----------------//
 
     // Total number of SVT sensors
@@ -30,7 +30,7 @@
         DatabaseConditionsManager conditionsManager = new DatabaseConditionsManager();
         conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 0);
 
-        TableMetaData metaData = conditionsManager.findTableMetaData(SvtDaqMappingCollection.class).get(0);
+        TableMetaData metaData = conditionsManager.findTableMetaData(SvtDaqMappingCollection.class);
         SvtDaqMappingCollection daqMappingCollection = conditionsManager.getConditionsData(SvtDaqMappingCollection.class, metaData.getTableName());
 
         int totalSensors = 0;

Copied: java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java (from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/SvtDetectorSetupTest.java)
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/SvtDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java	Tue Dec 30 16:44:44 2014
@@ -1,4 +1,4 @@
-package org.hps.conditions;
+package org.hps.conditions.svt;
 
 import java.util.List;
 

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	Tue Dec 30 16:44:44 2014
@@ -37,7 +37,7 @@
         conditionsManager.setXmlConfig("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
         conditionsManager.setDetector("HPS-TestRun-v5", 1351);
 
-        metaData = conditionsManager.findTableMetaData(TestRunSvtDaqMappingCollection.class).get(0);
+        metaData = conditionsManager.findTableMetaData(TestRunSvtDaqMappingCollection.class);
         TestRunSvtDaqMappingCollection daqMappingCollection = conditionsManager.getConditionsData(TestRunSvtDaqMappingCollection.class, metaData.getTableName());
 
         int totalSensors = 0;

Copied: java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java (from r1808, java/trunk/conditions/src/test/java/org/hps/conditions/TestRunSvtDetectorSetupTest.java)
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/TestRunSvtDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java	Tue Dec 30 16:44:44 2014
@@ -1,4 +1,4 @@
-package org.hps.conditions;
+package org.hps.conditions.svt;
 
 import java.util.List;
 

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use