hps-java/src/main/java/org/lcsim/hps/recon/tracking
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);
+ }
+ }
}