Print

Print


Author: [log in to unmask]
Date: Mon Mar 23 22:04:57 2015
New Revision: 2514

Log:
Fixes for first working version of reading EPICS data from events.

Modified:
    java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
    java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java

Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java	Mon Mar 23 22:04:57 2015
@@ -13,6 +13,8 @@
  */
 public final class EpicsEvioProcessor extends EvioEventProcessor {
 
+    EpicsScalarData data;
+    
     public void process(EvioEvent evio) {
         
         if (evio.getHeader().getTag() != EvioEventConstants.EPICS_EVENT_TAG) {
@@ -20,36 +22,27 @@
             return;
         }
 
-        System.out.println("Epics EVIO event " + evio.getEventNumber());
-        System.out.println("Dumping EPICS event ...");
-        System.out.println(evio.toXML());
-
         // Find the bank with the EPICS information.
         BaseStructure epicsBank = null;
         BaseStructure topBank = evio.getChildrenList().get(0);
-        System.out.println("got top bank: " + topBank.getHeader().getTag());
         for (BaseStructure childBank : topBank.getChildrenList()) {
-            System.out.println("found child bank tag: " + childBank.getHeader().getTag());
             if (childBank.getHeader().getTag() == EvioEventConstants.EPICS_BANK_TAG) {
-                System.out.println("found EPICS bank tag: " + childBank.getHeader().getTag());
                 epicsBank = childBank;
                 break;
             }
         }
 
         if (epicsBank != null) {
-            System.out.println("found EPICS bank with tag " + epicsBank.getHeader().getTag());
-            String epicsData = epicsBank.getStringData()[0];
-            System.out.println("dumping EPICS string data ...");
-            System.out.println(epicsData);
-
-            EpicsScalarData data = new EpicsScalarData();
+            String epicsData = epicsBank.getStringData()[0]; 
+            data = new EpicsScalarData();
             data.fromString(epicsData);
-
-            System.out.println("parsed EPICS data ...");
-            System.out.println(data.toString());
-        } else {
-            System.out.println("did not find EPICS data bank in event");
-        }
+            
+            //System.out.println("found EVIO data bank ...");
+            //System.out.println(data.toString());
+        } 
+    }
+    
+    public EpicsScalarData getEpicsScalarData() {
+        return data;
     }
 }

Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java	Mon Mar 23 22:04:57 2015
@@ -11,69 +11,75 @@
 import org.lcsim.event.GenericObject;
 
 /**
- * <p>
  * This is an API for reading and writing EPICS scalar data to LCIO events,
  * as well as parsing the scalar data from a CDATA section of an EVIO string
  * data bank.
- * <p>Sample data:<br/>
- * <pre>
- * 2010.350952  MBSY2C_energy
- * 0.000000  PSPECIRBCK
- * 2.190000  HPS:LS450_2:FIELD
- * -8974.000000  HPS:LS450_1:FIELD
- * 2400.000000  MTIRBCK
- * 3.882200  VCG2C21
- * 4.579233  VCG2C21A
- * 6.799115  VCG2C24A
- * 6.552529  VCG2H00A
- * 5.429465  VCG2H01A
- * 5.741360  VCG2H02A
- * -0.069630  scaler_calc1
- * 0.000000  scalerS12b
- * 0.000000  scalerS13b
- * 0.000000  scalerS14b
- * 0.000000  scalerS15b
- * 0.000000  hallb_IPM2C21A_XPOS
- * 0.000000  hallb_IPM2C21A_YPOS
- * 0.000000  hallb_IPM2C21A_CUR
- * 0.000000  hallb_IPM2C24A_XPOS
- * 0.000000  hallb_IPM2C24A_YPOS
- * 0.000000  hallb_IPM2C24A_CUR
- * 0.000000  hallb_IPM2H00_XPOS
- * 0.000000  hallb_IPM2H00_YPOS
- * 0.000000  hallb_IPM2H00_XPOS
- * 0.000000  hallb_IPM2H00_XPOS
- * 0.000000  hallb_IPM2H00_CUR
- * 0.000000  hallb_IPM2H02_YPOS
- * 0.000000  hallb_IPM2H02_XPOS
- * </pre>   
  * 
  * @author Jeremy McCormick <[log in to unmask]>
 */
-// TODO: This API needs to be accessible to recon and analysis modules.
-public final class EpicsScalarData extends LinkedHashMap<String, Double> {
+public final class EpicsScalarData {
     
     // Used in collection parameter map as name of the key list.
-    static final String EPICS_SCALAR_NAMES = "EPICS_SCALAR_NAMES";
+    public static final String EPICS_SCALAR_NAMES = "EPICS_SCALAR_NAMES";
     
     // Default collection name in the LCIO event.
-    static final String DEFAULT_COLLECTION_NAME = "EpicsScalarData";
+    public static final String DEFAULT_COLLECTION_NAME = "EpicsScalarData";
     
     // Dummy collection parameter maps to try and make LCIO happy.
     static final Map<String, int[]> DUMMY_INT_MAP = new HashMap<String, int[]>();    
     static final Map<String, float[]> DUMMY_FLOAT_MAP = new HashMap<String, float[]>();
-   
+    
+    // The map of scalar keys to values.
+    private Map<String, Double> dataMap = new LinkedHashMap<String, Double>();
+       
     /**
-     * Convert this object to a string.
+     * Write this object's data into a GenericObject collection in the LCIO event using 
+     * the default collection name.
+     * @param event The LCIO event.
      */
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        for (Entry<String, Double> entry : this.entrySet()) {
-            sb.append(entry.getKey() + " " + entry.getValue() + '\n');
+    public void write(EventHeader event) {
+        write(event, DEFAULT_COLLECTION_NAME);
+    }
+    
+    /**
+     * <p>
+     * Read data into this object from an LCIO event using the default collection name.
+     * <p>
+     * This is the primary method for users to read the EPICS data into their Drivers
+     * in the {@link org.lcsim.util.Driver#process(EventHeader)} method.
+     * @param event The LCIO event. 
+     * @return The EPICS data from the event.
+     */
+    public static EpicsScalarData read(EventHeader event) {
+        if (event.hasCollection(GenericObject.class, EpicsScalarData.DEFAULT_COLLECTION_NAME)) {
+            return read(event, DEFAULT_COLLECTION_NAME);
+        } else {
+            return null;
         }
-        return sb.toString();
     }
-
+    
+    /**
+     * Get a double value from the key.
+     * @return The value from the key.
+     */
+    public Double getValue(String key) {
+        return dataMap.get(key);
+    }
+    
+    /**
+     * Write this object into an LCIO event under the given collection name.
+     * @param event The LCIO event.
+     * @param collectionName The name of the collection in the event.
+     */
+    void write(EventHeader event, String collectionName) {
+        List<GenericObject> collection = new ArrayList<GenericObject>();
+        EpicsGenericObject object = toGenericObject();
+        collection.add(object);
+        Map<String, String[]> stringMap = new HashMap<String, String[]>();
+        stringMap.put(EPICS_SCALAR_NAMES, object.keys);
+        event.put(collectionName, collection, GenericObject.class, 0, DUMMY_INT_MAP, DUMMY_FLOAT_MAP, stringMap);
+    }    
+      
     /**
      * Parse a raw data string from the EVIO data bank and
      * turn it into a list of keys and values within this object. 
@@ -89,8 +95,7 @@
             String[] data = trimmed.split("  ");
             Double value = Double.parseDouble(data[0]);
             String key = data[1];
-            System.out.println("adding key, value: " + data[1] + " " + data[0]);
-            put(key, value);
+            dataMap.put(key, value);
         }
     }
 
@@ -101,12 +106,12 @@
      */
     EpicsGenericObject toGenericObject() {
         EpicsGenericObject newObject = new EpicsGenericObject();
-        newObject.keys = new String[this.size()];
-        newObject.values = new double[this.size()];
+        newObject.keys = new String[dataMap.size()];
+        newObject.values = new double[dataMap.size()];
         int index = 0;
-        for (String key : this.keySet()) {
+        for (String key : dataMap.keySet()) {
             newObject.keys[index] = key;
-            newObject.values[index] = this.get(key);
+            newObject.values[index] = dataMap.get(key);
             index++;
         }
         return newObject;
@@ -114,45 +119,25 @@
 
     /**
      * Given a list of keys, read the double values from the 
-     * {@link org.lcsim.event.GenericObject} into the map.
+     * {@link org.lcsim.event.GenericObject} into the data map
+     * of this object.
      * @param object
      * @param keys
      */
     void fromGenericObject(GenericObject object, String[] keys) {
-        for (int index = 0; index < keys.length; index++) {
-            this.put(keys[index], object.getDoubleVal(index));
+        for (int index = 0; index < keys.length; index++) {                      
+            dataMap.put(keys[index], object.getDoubleVal(index)); 
         }
     }
-
+        
     /**
-     * Write this object into an LCIO event under the given collection name.
-     * @param event The LCIO event.
-     * @param collectionName The name of the collection in the event.
-     */
-    void write(EventHeader event, String collectionName) {
-        List<GenericObject> collection = new ArrayList<GenericObject>();
-        EpicsGenericObject object = this.toGenericObject();
-        collection.add(object);
-        Map<String, String[]> stringMap = new HashMap<String, String[]>();
-        stringMap.put(EPICS_SCALAR_NAMES, object.keys);
-        event.put(collectionName, collection, GenericObject.class, 0, DUMMY_INT_MAP, DUMMY_FLOAT_MAP, stringMap);
-    }
-    
-    /**
-     * Write this object into an LCIO event using the default collection name.
-     * @param event The LCIO event.
-     */
-    void write(EventHeader event) {
-        write(event, DEFAULT_COLLECTION_NAME);
-    }
-
-    /**
-     * Read data into this object from an LCIO event from the given collection name.
+     * Read data into this object from a collection in the LCIO event
+     * with the given collection name.
      * @param event The LCIO event.
      * @param collectionName The collection name.
      * @return The EPICS data from the LCIO event.
      */
-    EpicsScalarData read(EventHeader event, String collectionName) {
+    static EpicsScalarData read(EventHeader event, String collectionName) {
         List<GenericObject> collection = event.get(GenericObject.class, collectionName);
         @SuppressWarnings("rawtypes")
         Map stringMap = event.getMetaData(collection).getStringParameters();
@@ -161,15 +146,15 @@
         data.fromGenericObject(collection.get(0), keys);
         return data;
     }
-    
+        
     /**
-     * Read data into this object from an LCIO event using the default collection name.
-     * This is the primary method for users to read the EPICS data into their Drivers
-     * in the <code>process</code> method.         
-     * @param event The LCIO event. 
-     * @return The EPICS data from the event.
+     * Convert this object to a string.
      */
-    public EpicsScalarData read(EventHeader event) {
-        return read(event, DEFAULT_COLLECTION_NAME);
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        for (Entry<String, Double> entry :  dataMap.entrySet()) {
+            sb.append(entry.getKey() + " " + entry.getValue() + '\n');
+        }
+        return sb.toString();
     }
 }