Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN | |||
SvtUtils.java | +162 | -67 | 1.9 -> 1.10 |
Rewrite to make compatible with new double layer SVT (Backwards compatible); Makes use of new DAQ Map format
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); + } + }
}
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