Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN
SvtUtils.java+162-671.9 -> 1.10
Rewrite to make compatible with new double layer SVT (Backwards compatible); Makes use of new DAQ Map format

hps-java/src/main/java/org/lcsim/hps/recon/tracking
SvtUtils.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- SvtUtils.java	18 Sep 2012 19:56:58 -0000	1.9
+++ SvtUtils.java	21 Nov 2012 08:30:15 -0000	1.10
@@ -1,14 +1,19 @@
 package org.lcsim.hps.recon.tracking;
 
 //--- java ---//
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringTokenizer;
 
 //--- org.lcsim ---//
 import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.conditions.ConditionsSet;
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.identifier.IIdentifier;
 import org.lcsim.detector.identifier.IIdentifierHelper;
@@ -19,40 +24,58 @@
 //--- hps-java ---//
 import org.lcsim.hps.util.Pair;
 
+
 /**
- * 
+ *
  * @author Omar Moreno
- * @version $Id: SvtUtils.java,v 1.9 2012/09/18 19:56:58 meeg Exp $
+ * @version $Id: SvtUtils.java,v 1.10 2012/11/21 08:30:15 omoreno Exp $
  */
 public class SvtUtils {
 
-    // Use eager Singleton initialization since an instance will always be needed
-    private static final SvtUtils INSTANCE = new SvtUtils();
+    private static SvtUtils INSTANCE = null;
     // Set of sensors
     private Set<SiSensor> sensors = new HashSet<SiSensor>();
     // Map from Sensor to Hybrid/FPGA pair
-    private Map<SiSensor /* Sensor */, Pair<Integer /* Hybrid */, Integer /* FPGA */>> sensorToDAQPair = new HashMap<SiSensor, Pair<Integer, Integer>>();
+    private Map<SiSensor /* sensor */, Pair<Integer /* FPGA */, Integer /* Hybrid */>> sensorToDaqPair 
+        = new HashMap<SiSensor, Pair<Integer, Integer>>();
     // Map from Hybrid/FPGA pair
-    private Map<Pair<Integer /* Hybrid */, Integer /* FPGA */>, SiSensor /* Sensor*/> daqPairToSensor = new HashMap<Pair<Integer, Integer>, SiSensor>();
+    private Map<Pair<Integer /* FPGA */, Integer /* Hybrid */>, SiSensor /* Sensor*/> daqPairToSensor 
+        = new HashMap<Pair<Integer, Integer>, SiSensor>();
     // Map from SVT top layer to Hybrid/FPGA pair
-    private Map<Integer /* Layer # */, Pair<Integer /* Hybrid */, Integer /* FPGA */>> topLayerToDAQ = new HashMap<Integer, Pair<Integer, Integer>>();
+    private Map<Integer /* Layer */, List<Pair<Integer /* FPGA */, Integer /* Hybrid */>>> topLayerDaqMap 
+        = new HashMap<Integer, List<Pair<Integer, Integer>>>();
     // Map from SVT bottom layer to Hybrid/FPGA pair
-    private Map<Integer /* Layer # */, Pair<Integer /* Hybrid */, Integer /* FPGA */>> bottomLayerToDAQ = new HashMap<Integer, Pair<Integer, Integer>>();
+    private Map<Integer /* Layer # */, List<Pair<Integer /* FPGA */, Integer /* Hybrid */>>> bottomLayerDaqMap 
+        = new HashMap<Integer, List<Pair<Integer, Integer>>>();
     // Map sensor to an SVT top layer
-    private Map<SiSensor /* Sensor */, Integer /* Layer */> sensorToTopLayer = new HashMap<SiSensor, Integer>();
+    private Map<SiSensor /* Sensor */, Integer /* Layer */> sensorToTopLayer 
+        = new HashMap<SiSensor, Integer>();
     // Map sensor to an SVT bottom layer
-    private Map<SiSensor /* Sensor */, Integer /* Layer */> sensorToBottomLayer = new HashMap<SiSensor, Integer>();
+    private Map<SiSensor /* Sensor */, Integer /* Layer */> sensorToBottomLayer 
+        = new HashMap<SiSensor, Integer>();
     // Map sensor to descriptor
-    private Map<SiSensor /* Sensor */, String /* Description */> sensorToDescriptor = new HashMap<SiSensor, String>();
-    private Map<Integer /* Layer */, SiSensor /* Sensor */> topLayerToSensor = new HashMap<Integer, SiSensor>();
-    private Map<Integer /* Layer */, SiSensor /* Sensor */> bottomLayerToSensor = new HashMap<Integer, SiSensor>();
-    private SiSensor[][] sensorArray = new SiSensor[2][12];
+    private Map<SiSensor /* Sensor */, String /* Description */> sensorToDescriptor 
+        = new HashMap<SiSensor, String>();
+    // Map layer to top SVT sensor 
+    private Map<Integer /* Layer */, List<SiSensor> /* Sensor */> topLayerToSensor 
+        = new HashMap<Integer, List<SiSensor>>();
+    // Map layer to bottom SVT sensor
+    private Map<Integer /* Layer */, List<SiSensor> /* Sensor */> bottomLayerToSensor 
+        = new HashMap<Integer, List<SiSensor>>();
+    private SiSensor[][] sensorArray;
     private IIdentifierHelper helper;
+    String subdetectorName = "Tracker";
+    ConditionsManager manager = ConditionsManager.defaultInstance();
+    
+    int maxModuleNumber = 0;
+    int maxLayerNumber = 0;
+    
     private boolean isSetup = false;
     boolean debug = false;
-    String subdetectorName = "Tracker";
-    ConditionsManager mgr = ConditionsManager.defaultInstance();
 
+    /*
+     * Private ctor to keep user from instantiating 
+     */
     private SvtUtils() {
     }
 
@@ -60,6 +83,11 @@
      * 
      */
     public static SvtUtils getInstance() {
+        
+        // Use lazy instantiation
+        if(INSTANCE == null){
+            INSTANCE = new SvtUtils();
+        }
         return INSTANCE;
     }
 
@@ -123,26 +151,25 @@
      * 
      */
     public SiSensor getSensor(Pair<Integer, Integer> daqPair) {
-        return this.daqPairToSensor.get(daqPair);
+        return daqPairToSensor.get(daqPair);
     }
 
     /**
      * 
      */
-    public SiSensor getTopSensor(int layer) {
-        return this.topLayerToSensor.get(layer);
+    public SiSensor getTopSensor(int layer, int sensor) {
+        return topLayerToSensor.get(layer).get(sensor);
     }
 
     /**
      * 
      */
-    public SiSensor getBottomSensor(int layer) {
-        return this.bottomLayerToSensor.get(layer);
+    public SiSensor getBottomSensor(int layer, int sensor) {
+        return bottomLayerToSensor.get(layer).get(sensor);
     }
 
     /**
      * 
-     * @return
      */
     public Set<SiSensor> getSensors() {
         return sensors;
@@ -152,23 +179,26 @@
      * 
      */
     public int getFPGA(SiSensor sensor) {
-        return this.sensorToDAQPair.get(sensor).getSecondElement();
+        return sensorToDaqPair.get(sensor).getFirstElement();
     }
 
     /**
      * 
      */
     public int getHybrid(SiSensor sensor) {
-        return this.sensorToDAQPair.get(sensor).getFirstElement();
+        return sensorToDaqPair.get(sensor).getSecondElement();
     }
 
     /**
      * 
      */
     public Pair<Integer, Integer> getDaqPair(SiSensor sensor) {
-        return this.sensorToDAQPair.get(sensor);
+        return sensorToDaqPair.get(sensor);
     }
 
+    /**
+     * 
+     */
     public IIdentifierHelper getHelper() {
         return helper;
     }
@@ -189,41 +219,32 @@
             throw new RuntimeException("The subdetector name was not set!");
         }
 
-        // Get the SVT DAQ Maps
-        ConditionsSet topSvtDaqMap = mgr.getConditions("daqmap/SVTDAQMapTop");
-        ConditionsSet bottomSvtDaqMap = mgr.getConditions("daqmap/SVTDAQMapBottom");
-        String[] daqPair;
-
-        // Loop over the top layers and fill the DAQ map
-        for (Object topLayer : topSvtDaqMap.keySet()) {
-            daqPair = topSvtDaqMap.getString(topLayer.toString()).split(" ");
-            if (debug) {
-                System.out.println("Layer: " + topLayer.toString() + " FPGA: " + daqPair[1] + " Hybrid: " + daqPair[0]);
-            }
-            topLayerToDAQ.put(Integer.parseInt(topLayer.toString()), new Pair<Integer, Integer>(Integer.parseInt(daqPair[0]), Integer.parseInt(daqPair[1])));
-        }
-
-        // Loop over the bottom layers and fill the DAQ Map
-        for (Object bottomLayer : bottomSvtDaqMap.keySet()) {
-            daqPair = bottomSvtDaqMap.getString(bottomLayer.toString()).split(" ");
-            if (debug) {
-                System.out.println("Layer: " + bottomLayer.toString() + " FPGA: " + daqPair[1] + " Hybrid: " + daqPair[0]);
-            }
-            bottomLayerToDAQ.put(Integer.parseInt(bottomLayer.toString()), new Pair<Integer, Integer>(Integer.parseInt(daqPair[0]), Integer.parseInt(daqPair[1])));
+        this.printDebug("Detector: " + detector.getDetectorName());
+        
+        BufferedReader reader; 
+        
+        // Load the DAQ Map from the conditions database
+        String filePath = "daqmap/svt_default.daqmap";
+        try{ 
+            reader = new BufferedReader(manager.getRawConditions(filePath).getReader());
+            this.loadSvtDaqMap(reader);
+        } catch(IOException exception){
+            throw new RuntimeException("Unable to load DAQ Map from " + filePath, exception);
         }
+        
+        sensorArray = new SiSensor[maxModuleNumber+1][maxLayerNumber]; 
 
         // Get the SVT
         IDetectorElement detectorElement = detector.getDetectorElement().findDetectorElement(subdetectorName);
-
         helper = detectorElement.getIdentifierHelper();
 
         // Get all SVT sensors
         sensors.addAll(detectorElement.findDescendants(SiSensor.class));
+        this.printDebug("Total number of sensors: " + sensors.size());
 
         IIdentifier sensorIdent;
         SiTrackerIdentifierHelper sensorHelper;
         String description;
-
         // Create the maps
         for (SiSensor sensor : sensors) {
 
@@ -236,26 +257,44 @@
             int layerNumber = sensorHelper.getLayerValue(sensorIdent);
             int moduleNumber = sensorHelper.getModuleValue(sensorIdent);
             sensorArray[moduleNumber][layerNumber - 1] = sensor;
-
-            if (moduleNumber == 0) {
-                sensorToTopLayer.put(sensor, layerNumber);
-                sensorToDAQPair.put(sensor, this.topLayerToDAQ.get(layerNumber));
-                topLayerToSensor.put(layerNumber, sensor);
-                daqPairToSensor.put(topLayerToDAQ.get(layerNumber), sensor);
-                description = "Top Layer " + layerNumber;
-                sensorToDescriptor.put(sensor, description);
-            } else if (moduleNumber == 1) {
-                sensorToBottomLayer.put(sensor, layerNumber);
-                sensorToDAQPair.put(sensor, this.bottomLayerToDAQ.get(layerNumber));
-                bottomLayerToSensor.put(layerNumber, sensor);
-                daqPairToSensor.put(bottomLayerToDAQ.get(layerNumber), sensor);
-                description = "Bottom Layer " + layerNumber;
-                sensorToDescriptor.put(sensor, description);
-            } else {
-                throw new RuntimeException("Invalid Module Number: " + sensorHelper.getModuleValue(sensorIdent));
+            int listPosition = 0;
+            
+            switch(moduleNumber%2){
+                case 0: 
+                    listPosition = moduleNumber/2;
+                    this.printDebug("FPGA: " + topLayerDaqMap.get(layerNumber).get(listPosition).getFirstElement()
+                            + ", Hybrid: " + topLayerDaqMap.get(layerNumber).get(listPosition).getSecondElement());
+                    sensorToTopLayer.put(sensor, layerNumber);
+                    sensorToDaqPair.put(sensor, topLayerDaqMap.get(layerNumber).get(listPosition));
+                    if(!topLayerToSensor.containsKey(layerNumber)) 
+                        topLayerToSensor.put(layerNumber, new ArrayList<SiSensor>());
+                    topLayerToSensor.get(layerNumber).add(listPosition, sensor);
+                    daqPairToSensor.put(topLayerDaqMap.get(layerNumber).get(listPosition), sensor);
+                    this.printDebug(daqPairToSensor.get(topLayerDaqMap.get(layerNumber).get(listPosition)).getName());
+                    description = "Top Layer " + layerNumber + " - Sensor " + listPosition;
+                    this.printDebug("Description: " + description);
+                    sensorToDescriptor.put(sensor, description);
+                    break;
+                case 1: 
+                    listPosition = (moduleNumber -1)/2;
+                    this.printDebug("FPGA: " + bottomLayerDaqMap.get(layerNumber).get(listPosition).getFirstElement()
+                            + ", Hybrid: " + bottomLayerDaqMap.get(layerNumber).get(listPosition).getSecondElement());
+                    sensorToBottomLayer.put(sensor, layerNumber);
+                    sensorToDaqPair.put(sensor, bottomLayerDaqMap.get(layerNumber).get(listPosition));
+                    if(!bottomLayerToSensor.containsKey(layerNumber))
+                        bottomLayerToSensor.put(layerNumber, new ArrayList<SiSensor>());
+                    bottomLayerToSensor.get(layerNumber).add(listPosition, sensor);
+                    daqPairToSensor.put(bottomLayerDaqMap.get(layerNumber).get(listPosition), sensor);
+                    this.printDebug(daqPairToSensor.get(bottomLayerDaqMap.get(layerNumber).get(listPosition)).getName());
+                    description = "Bottom Layer " + layerNumber + " - Sensor " + listPosition;
+                    this.printDebug("Description: " + description);
+                    sensorToDescriptor.put(sensor, description);
+                    break;
+                default: 
+                    throw new RuntimeException("Invalid module number: " + moduleNumber);
             }
         }
-
+        
         for (int module = 0; module < 2; module++) {
             for (int layer = 0; layer < 10; layer++) {
                 if (sensorArray[module][layer] == null) {
@@ -265,4 +304,60 @@
         }
         isSetup = true;
     }
+    
+    /**
+     * Load the SVT DAQ Map from the conditions database
+     */
+    private void loadSvtDaqMap(Reader reader){
+        BufferedReader daqMapReader = new BufferedReader(reader);
+        String line = null;
+        try{ 
+            while((line = daqMapReader.readLine()) != null){
+                // If the line is a comment,skip it
+                if(line.indexOf("#") != -1) continue;
+                StringTokenizer stringTok = new StringTokenizer(line);
+                int listPosition = 0;
+                
+                while(stringTok.hasMoreTokens()){
+                    int layer  = Integer.valueOf(stringTok.nextToken());
+                    int module = Integer.valueOf(stringTok.nextToken());
+                    int fpga   = Integer.valueOf(stringTok.nextToken());
+                    int hybrid = Integer.valueOf(stringTok.nextToken());
+                    Pair<Integer, Integer> daqPair = new Pair<Integer, Integer>(fpga, hybrid);
+                    maxModuleNumber = Math.max(maxModuleNumber, module);
+                    maxLayerNumber = Math.max(maxLayerNumber, layer);
+                    switch(module%2){
+                        case 0:
+                            listPosition = module/2;
+                            if(!topLayerDaqMap.containsKey(layer))
+                                topLayerDaqMap.put(layer, new ArrayList<Pair<Integer, Integer>>());
+                            this.printDebug("Adding FPGA: " + daqPair.getFirstElement() + ", Hybrid: " + daqPair.getSecondElement() + " to position: " + listPosition);
+                            topLayerDaqMap.get(layer).add(listPosition, daqPair);
+                            break;
+                        case 1: 
+                            listPosition = (module - 1)/2;
+                            if(!bottomLayerDaqMap.containsKey(layer))
+                                bottomLayerDaqMap.put(layer, new ArrayList<Pair<Integer, Integer>>());
+                            this.printDebug("Adding FPGA: " + daqPair.getFirstElement() + ", Hybrid: " + daqPair.getSecondElement() + " to position: " + listPosition);
+                            bottomLayerDaqMap.get(layer).add(listPosition, daqPair);
+                            break;
+                        default: 
+                            throw new RuntimeException("Invalid module number: " + module);
+                    }
+                }
+            }
+        } catch(IOException exception){
+            throw new RuntimeException("Unable to parse SVT DAQ Map", exception);
+        }
+    }
+    
+    /**
+     * Print a debug message 
+     * @param debugMessage : message to be printed
+     */
+    private void printDebug(String debugMessage){
+        if(debug){
+            System.out.println(this.getClass().getSimpleName() + ": " + debugMessage);
+        }
+    }
 }
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1