Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN
HPSDataProcessingModule.java+88-771.11 -> 1.12
Maps now make use of SiSensor; Raw channel numbers are now used

hps-java/src/main/java/org/lcsim/hps/recon/tracking
HPSDataProcessingModule.java 1.11 -> 1.12
diff -u -r1.11 -r1.12
--- HPSDataProcessingModule.java	10 Apr 2012 01:00:13 -0000	1.11
+++ HPSDataProcessingModule.java	21 Apr 2012 07:32:25 -0000	1.12
@@ -10,7 +10,6 @@
 
 //--- org.lcsim ---//
 import java.util.Set;
-import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.IReadout;
 import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.EventHeader;
@@ -20,39 +19,55 @@
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
 
+//--- Constants ---//
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.SVT_TOTAL_FPGAS;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_APV25_CHANNELS;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_APV25_PER_HYBRID;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_HYBRIDS_PER_FPGA;
+
 /**
  *
  * @author Omar Moreno <[log in to unmask]>
- * @version $Id: HPSDataProcessingModule.java,v 1.11 2012/04/10 01:00:13 meeg Exp $
+ * @version $Id: HPSDataProcessingModule.java,v 1.12 2012/04/21 07:32:25 omoreno Exp $
  */
 public class HPSDataProcessingModule extends Driver {
+	
+	// A map relating a sensor to all sample blocks collected from that sensor
+	Map<SiSensor, Map<Integer, List<Double>>> sensorToSamplesMap;
 
-	Map<Long, Map<Integer, List<Double>>> sensorToBlocksMap;
 	// Relate a channel to its six samples
 	Map<Integer, List<Double>> channelToBlock;
+	
 	// Relate a sensor Identifier to the actual sensor
 	Map<Long, SiSensor> sensorMap = new HashMap<Long, SiSensor>();
+	
 	// Collection of all sensors
 	Set<SiSensor> sensorSet = new HashSet<SiSensor>();
+	
 	// Collections of RawTrackerHits
 	List<RawTrackerHit> rawHits;        // Cuts are applied
-	List<RawTrackerHit> rawHitsNoCuts;     // No cuts are applied to samples
+	List<RawTrackerHit> rawHitsNoCuts;  // No cuts are applied to samples
+	
 	// Collection of all SVT data
 	List<HPSSVTData> svtData;
 	List<HPSSVTData> svtFpgaData;
-	// 1-5 rms noise [ADC Counts] <--- This is going to change
-//    int[] noiseThreshold = {1657, 1675, 1692, 1709, 1728}; 
+	List<Double> samples;
+
 	int numberOfSamples = 0;        // Total number of APV25 samples
 	int nSamplesAboveThresh = 3;    // Number of samples above noise threshold
 	int pedestal = 1638;            // [ADC counts] For now, all channels have the same pedestal
 	int flags = 0;                  //
 	int noise = 18;                 // [ADC Counts] RMS noise 
 	int noiseThreshold = 3;         // Units of RMS noise
+	int physicalChannel;
+	
 	private boolean thresholdCut = false;       // Apply threshold cut?
 	private boolean tailCut = false;            // Apply tail cut?
-	private boolean noiseSuppression = false;   // Apply noise supression?
+	private boolean noiseSuppression = false;   // Apply noise suppression?
+	boolean debug = true;
+	
 	double[] apv25DataStream;
-	List<Double> samples;
+	
 	String RawTrackerHitsCollectionName = "RawTrackerHits";
 	String RawTrackerHitsNoCutsCollectionName = "RawTrackerHitsNoCuts";
 	String svtCollectionName = "SVTData";
@@ -62,7 +77,7 @@
 	 */
 	public HPSDataProcessingModule() {
 		channelToBlock = new HashMap<Integer, List<Double>>();
-		sensorToBlocksMap = new HashMap<Long, Map<Integer, List<Double>>>();
+		sensorToSamplesMap = new HashMap<SiSensor, Map<Integer, List<Double>>>();
 		rawHits = new ArrayList<RawTrackerHit>();
 		rawHitsNoCuts = new ArrayList<RawTrackerHit>();
 		svtData = new ArrayList<HPSSVTData>();
@@ -75,20 +90,9 @@
 	@Override
 	public void detectorChanged(Detector detector) {
 
-		// Get the tracker
-		IDetectorElement tracker = detector.getDetectorElement().findDetectorElement("Tracker");
-
-		// Fill the collection of sensors
-		sensorSet.addAll(tracker.findDescendants(SiSensor.class));
-
-		for (SiSensor sensor : sensorSet) {
-
-			// Map a sensor to its identifier
-			sensorMap.put(sensor.getIdentifier().getValue(), sensor);
-
+		for (SiSensor sensor : HPSSVTDAQMaps.sensors) {
 			// Map a sensor to its corresponding samples
-			sensorToBlocksMap.put(sensor.getIdentifier().getValue(),
-					new HashMap<Integer, List<Double>>());
+			sensorToSamplesMap.put(sensor, new HashMap<Integer, List<Double>>());
 		}
 	}
 
@@ -159,43 +163,37 @@
 	 *      A map relating a sensor to the digital samples readout from the 
 	 *      sensor
 	 */
-	public void addSample(Map<Long, Map<Integer, double[]>> sensorToDigitalMap) {
+	public void addSample(Map<SiSensor, Map<Integer, double[]>> sensorToDigitalMap) {
 
 		/*
-		 * Long:     Sensor Identifier
 		 * Integer:  Chip Number
-		 * double[]: APV25 Data Stream 
+		 * double[]: APV25 Data Analog Data 
 		 */
 
-		int channelN = 0;
+		int physicalChannel;
 
 		// Loop through the list of all sensors
-		for (Map.Entry<Long, Map<Integer, double[]>> sensor : sensorToDigitalMap.entrySet()) {
+		for (Map.Entry<SiSensor, Map<Integer, double[]>> sensor : sensorToDigitalMap.entrySet()) {
 
 			// Loop through all APV25s
-			for (Map.Entry<Integer, double[]> sample : sensor.getValue().entrySet()) {
+			for (Map.Entry<Integer, double[]> chipData : sensor.getValue().entrySet()) {
 
 				// Copy the sample to avoid concurrent modification
-				apv25DataStream = sample.getValue();
+				apv25DataStream = chipData.getValue();
 
 				// Strip the APV25 data stream of all header information
-				// This needs to change so that the real chip address can be 
-				// extracted ...
 				apv25DataStream = Arrays.copyOfRange(apv25DataStream, 12, apv25DataStream.length - 1);
 
 				// Loop through all channels
 				for (int channel = 0; channel < apv25DataStream.length; channel++) {
 
-					channelN = channel + sample.getKey() * 128;
+					physicalChannel = channel + chipData.getKey() * 128;
 
-					// Check if a block has been created for this channel. If
-					// not create it
-					if (!sensorToBlocksMap.get(sensor.getKey()).containsKey(channelN)) {
-						sensorToBlocksMap.get(sensor.getKey()).put(channelN, new ArrayList<Double>(6));
+					// Check if a block has been created for this channel. If not create it
+					if (!sensorToSamplesMap.get(sensor.getKey()).containsKey(physicalChannel)) {
+						sensorToSamplesMap.get(sensor.getKey()).put(physicalChannel, new ArrayList<Double>(6));
 					}
-
-					sensorToBlocksMap.get(sensor.getKey()).get(channelN).add(apv25DataStream[channel]);
-
+					sensorToSamplesMap.get(sensor.getKey()).get(physicalChannel).add(apv25DataStream[channel]);
 				}
 			}
 		}
@@ -208,76 +206,89 @@
 	 */
 	public void findHits() {
 
-		int fpgaAddress = 0;
-		int hybridNumber = 0;
-		int apvNumber = 0;
-
+		int fpgaNumber, hybridNumber, apvNumber, rawChannel;
+		
 		// Clear the list of raw tracker hits
 		rawHits.clear();
 		rawHitsNoCuts.clear();
 		svtData.clear();
 
 		// Loop through all sensors and the corresponding blocks
-		for (Map.Entry<Long, Map<Integer, List<Double>>> sensor : sensorToBlocksMap.entrySet()) {
-
-			// Get the FPGA address
-			fpgaAddress = HPSSVTDAQMaps.sensorToDAQPair.get(sensorMap.get(sensor.getKey())).getSecondElement();
+		for (Map.Entry<SiSensor, Map<Integer, List<Double>>> sensor : sensorToSamplesMap.entrySet()) {
 
-			for (Map.Entry<Integer, List<Double>> block : sensor.getValue().entrySet()) {
+			// Get the FPGA number
+			fpgaNumber = HPSSVTDAQMaps.sensorToDAQPair.get(sensor.getKey()).getSecondElement();
+			if(fpgaNumber > SVT_TOTAL_FPGAS || fpgaNumber < 0)
+				throw new RuntimeException("FPGA Number out of range!");
+			if(debug) System.out.println(this.getClass().getSimpleName() + ": FPGA Number: " + fpgaNumber);
+			
+			for (Map.Entry<Integer, List<Double>> samples : sensor.getValue().entrySet()) {
 				short[] adc = new short[6];
 
 				// Convert ADC value to a short
-				for (int index = 0; index < adc.length; index++) {
-					adc[index] = block.getValue().get(index).shortValue();
-				}
+				for (int index = 0; index < adc.length; index++) 
+					adc[index] = samples.getValue().get(index).shortValue();
 
-				// Create RawTrackerHits from all hits before applying cuts
-				RawTrackerHit newHit = makeRawTrackerHit(block.getKey(), sensorMap.get(sensor.getKey()), adc);
-				rawHitsNoCuts.add(newHit);
-
-				// Check if a block has the appropriate number of blocks above
-				// threshold
+				// If a strip had any charge deposited on it, create a RawTrackerHit
+				if(!(samplesAboveThreshold(adc) >= 1)){
+					samples.getValue().clear();
+					continue;
+				}
+					
+				RawTrackerHit rawHit = makeRawTrackerHit(samples.getKey(), sensor.getKey(), adc);
+				rawHitsNoCuts.add(rawHit);
+				
+				// Check if a block has the appropriate number of blocks above threshold
 				if (thresholdCut && !(samplesAboveThreshold(adc) >= nSamplesAboveThresh)) {
-					block.getValue().clear();
+					samples.getValue().clear();
 					continue;
 				}
 
 				// Apply the tail cut
 				if (tailCut && !tailCut(adc)) {
-					block.getValue().clear();
+					samples.getValue().clear();
 					continue;
 				}
 
 				// Apply noise suppression cut
 				if (noiseSuppression && !noiseSuppressionCut(adc)) {
-					block.getValue().clear();
+					samples.getValue().clear();
 					continue;
 				}
 
 				// If all cuts are satisfied, add the hit to the list of hits to be saved
-				rawHits.add(newHit);
+				rawHits.add(rawHit);
 
 				// Get the hybrid number
-				hybridNumber = HPSSVTDAQMaps.sensorToDAQPair.get(sensorMap.get(sensor.getKey())).getFirstElement();
-
-				// Find the APV number
-				apvNumber = (int) Math.floor(block.getKey() / 128);
-
+				hybridNumber = HPSSVTDAQMaps.sensorToDAQPair.get(sensor.getKey()).getFirstElement();
+				if(hybridNumber > TOTAL_HYBRIDS_PER_FPGA || hybridNumber < 0)
+					throw new RuntimeException("Hybrid number is out of range!");
+				if(debug) System.out.println(this.getClass().getSimpleName() + ": Hybrid Number: " + hybridNumber);
+
+				// Find the APV number. Note that strip numbering is from 639 to 0
+				apvNumber = (TOTAL_APV25_PER_HYBRID - 1) - (int) Math.floor(samples.getKey()/128);
+				if(apvNumber > TOTAL_APV25_PER_HYBRID || apvNumber < 0) 
+					throw new RuntimeException("APV25 Number out of range!");
+				if(debug) System.out.println(this.getClass().getSimpleName() + ": APV Number: " + apvNumber);
+
+				// Find the raw channel number from the physical channel
+				rawChannel = samples.getKey() - (TOTAL_APV25_CHANNELS*TOTAL_APV25_PER_HYBRID - 1) 
+						+ apvNumber*TOTAL_APV25_CHANNELS + (TOTAL_APV25_CHANNELS - 1); 
+				if(rawChannel > TOTAL_APV25_CHANNELS || rawChannel < 0)
+					throw new RuntimeException("APV25 Channel " + rawChannel + " out of range!");
+				if(debug) System.out.println(this.getClass().getSimpleName() + ": Raw Channel Number: " + rawChannel);
+				
 				// Create an svtData packet
-				svtData.add(new HPSSVTData(hybridNumber, apvNumber, block.getKey() % 128, fpgaAddress, adc));
-				svtFpgaData.add(new HPSSVTData(hybridNumber, apvNumber, block.getKey() % 128, fpgaAddress, adc));
-
-				block.getValue().clear();
+				svtData.add(new HPSSVTData(hybridNumber, apvNumber, rawChannel , fpgaNumber, adc));
+				
+				samples.getValue().clear();
 			}
 
-			HPSSVTDataBuffer.addToBuffer(svtFpgaData, fpgaAddress);
-
-			// Clear data buffer.
-			svtFpgaData.clear();
+			HPSSVTDataBuffer.addToBuffer(svtData, fpgaNumber);
 		}
-		System.out.println(this.getClass().getName() + ": Total RawTrackerHits before cuts: " + rawHitsNoCuts.size());
-		System.out.println(this.getClass().getName() + ": Total RawTrackerHits: " + rawHits.size());
-		System.out.println(this.getClass().getName() + ": Total SVTData: " + svtData.size());
+		if(debug) System.out.println(this.getClass().getName() + ": Total RawTrackerHits before cuts: " + rawHitsNoCuts.size());
+		if(debug) System.out.println(this.getClass().getName() + ": Total RawTrackerHits: " + rawHits.size());
+		if(debug) System.out.println(this.getClass().getName() + ": Total SVTData: " + svtData.size());
 	}
 
 	/**
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