Print

Print


Author: [log in to unmask]
Date: Wed May 27 19:05:29 2015
New Revision: 3048

Log:
Add command line tool for importing SVT timing constants from run spreadsheet CSV file.

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java

Added: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtTimingConstantsLoader.java	Wed May 27 19:05:29 2015
@@ -0,0 +1,168 @@
+package org.    hps.conditions.svt;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.hps.conditions.api.ConditionsRecord;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.run.RunRange;
+import org.hps.conditions.run.RunSpreadsheet;
+import org.hps.conditions.svt.SvtTimingConstants.SvtTimingConstantsCollection;
+
+/**
+ * Load SVT timing constant data from the run spreadsheet and insert into the conditions database.
+ * <p>
+ * Be very careful about running this, because it will create many new conditions records that may 
+ * already be present in the database.  In fact, don't run this at all without talking to me first. :-) 
+ * 
+ * @author Jeremy McCormick
+ */
+public final class SvtTimingConstantsLoader {
+    
+    /**
+     * Setup conditions.     
+     */
+    private static final DatabaseConditionsManager MANAGER = DatabaseConditionsManager.getInstance();
+    
+    /**
+     * The fields from the run spreadsheet for SVT timing constants.
+     */
+    private static final Set<String> FIELDS = new HashSet<String>();
+    static {
+        FIELDS.add("svt_offset_phase");
+        FIELDS.add("svt_offset_time");
+    }
+    
+    /**
+     * Load the SVT timing constants for time and phase offsets into the conditions database.
+     * 
+     * @param args the command line arguments (requires one argument which is CSV file name)
+     */
+    public static void main(String[] args) {
+        
+        // Load in CSV records from the exported run spreadsheet.
+        String path = args[0];
+        RunSpreadsheet runSheet = new RunSpreadsheet(new File(path));
+        
+        // Find the run ranges that have the same fields values.
+        List<RunRange> ranges = RunRange.findRunRanges(runSheet, FIELDS);
+        
+        // Get the unique field values for inserting new conditions collections.
+        List<Collection<String>> uniqueValues = RunRange.getUniqueValues(ranges);
+        
+        /*
+        System.out.println("unique values ...");
+        for (Collection<String> collection : uniqueValues) {
+            for (String value : collection) {
+                System.out.print(value + " ");                
+            }
+            System.out.println();
+        } 
+        */      
+               
+        // Create a new collection for each unique combination set of timing constants.
+        List<SvtTimingConstantsCollection> collections = createCollections(uniqueValues); 
+        
+        // Create a new collection for each of the unique combinations of values.
+        for (SvtTimingConstantsCollection collection : collections) {
+            int collectionId = 0;
+            try {
+                collectionId = MANAGER.addCollection(
+                        "svt_timing_constants",
+                        "SVT timing constants added by " + System.getProperty("user.name"),
+                        "timing constants from run spreadsheet");
+                collection.setCollectionId(collectionId);
+                collection.insert();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }            
+        } 
+                
+        // Create the conditions records for the run ranges.
+        for (RunRange range : ranges) {
+            
+            System.out.println(range);
+            
+            // Get the data values from the run range.
+            int offsetPhase = Integer.parseInt(range.getValue("svt_offset_phase"));
+            int offsetTime = Integer.parseInt(range.getValue("svt_offset_time"));
+
+            // Find the matching timing constants collection to use.
+            SvtTimingConstantsCollection collection = findCollection(collections, offsetPhase, offsetTime);
+            if (collection != null) {
+                System.out.println("offset_phase : " + collection.get(0).getOffsetPhase() + ", offset_time: " + collection.get(0).getOffsetTime());
+            }
+                        
+            // Create a new conditions record with the run range.
+            ConditionsRecord condi = new ConditionsRecord();
+            condi.setFieldValue("run_start", range.getRunStart());
+            condi.setFieldValue("run_end", range.getRunEnd());
+            condi.setFieldValue("name", "svt_timing_constants");
+            condi.setFieldValue("table_name", "svt_timing_constants");
+            condi.setFieldValue("notes", "timing constants from run spreadsheet");
+            condi.setFieldValue("created", new Date());
+            condi.setFieldValue("created_by", System.getProperty("user.name"));
+            
+            condi.setFieldValue("collection_id", collection.getCollectionId());
+
+            try {
+                condi.insert();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }            
+            
+            System.out.print(condi);            
+            System.out.println();
+        }
+    }
+    
+    /**
+     * Create the conditions collections from the unique values found in the spreadsheet.
+     * 
+     * @param uniqueValues the list of unique raw values
+     * @return the new conditions collections
+     */
+    private static List<SvtTimingConstantsCollection> createCollections(List<Collection<String>> uniqueValues) {
+        List<SvtTimingConstantsCollection> collections = new ArrayList<SvtTimingConstantsCollection>();        
+        for (Collection<String> values : uniqueValues) {
+            
+            SvtTimingConstants timing = new SvtTimingConstants();
+            Iterator<String> it = values.iterator();            
+            Integer offsetPhase = Integer.parseInt(it.next());
+            Integer offsetTime = Integer.parseInt(it.next());
+            
+            timing.setFieldValue("offset_phase", offsetPhase);
+            timing.setFieldValue("offset_time", offsetTime);
+            
+            SvtTimingConstantsCollection collection = new SvtTimingConstantsCollection();
+            collection.add(timing);
+            collections.add(collection);
+        }
+        return collections;
+    }
+     
+    /**
+     * Find a timing constants collection from offset phase and time. 
+     * <p>
+     * Each collection has a single object in it.
+     * 
+     * @param timingConstantsList the list of collections
+     * @param offsetPhase the offset phase
+     * @param offsetTime the offset time
+     * @return the matching collection or <code>null</code> if not found
+     */
+    private static SvtTimingConstantsCollection findCollection(List<SvtTimingConstantsCollection> timingConstantsList, int offsetPhase, int offsetTime) {
+        for (SvtTimingConstantsCollection collection : timingConstantsList) {
+            if (collection.find(offsetPhase, offsetTime) != null) {
+                return collection;
+            }
+        }
+        return null;
+    }
+}