hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.5 -r1.6
--- HPSSVTData.java 25 Apr 2012 05:10:19 -0000 1.5
+++ HPSSVTData.java 28 Apr 2012 15:25:41 -0000 1.6
@@ -1,4 +1,3 @@
-
package org.lcsim.hps.recon.tracking;
//--- Constants ---//
@@ -9,187 +8,177 @@
import static org.lcsim.hps.recon.tracking.HPSSVTConstants.SAMPLE_MASK;
import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TEMP_MASK;
import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_NUMBER_OF_SAMPLES;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_APV25_CHANNELS;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_APV25_PER_HYBRID;
/**
- *
- *
+ *
+ *
* @author Omar Moreno <[log in to unmask]>
- * @version $Id: HPSSVTData.java,v 1.5 2012/04/25 05:10:19 omoreno Exp $
+ * @version $Id: HPSSVTData.java,v 1.6 2012/04/28 15:25:41 meeg Exp $
*/
public class HPSSVTData {
-
+
// 4x32
int[] data = new int[4];
-
// Time of the hit
int hitTime = 0;
-
-
+
/**
- *
+ *
* Creates an SVT data packet from
- *
- * @param hybridNumber
- * Hybrid number (0-3)
- * @param apvNumber
- * APV25 chip number (0-4)
- * @param channelNumber
- * Sensor strip number (0-127)
- * @param fpgaAddress
- * FPGA address
- * @param adc
- * ADC samples obtained by sampling the shaper output. Currently,
- * six samples are obtained per raw hit.
- */
- public HPSSVTData(int hybridNumber, int apvNumber,
- int channelNumber, int fpgaAddress, short[] adc)
- {
- this.createSVTDataPacket(hybridNumber, apvNumber,
- channelNumber, fpgaAddress, adc);
+ *
+ * @param hybridNumber Hybrid number (0-3)
+ * @param apvNumber APV25 chip number (0-4)
+ * @param channelNumber Sensor strip number (0-127)
+ * @param fpgaAddress FPGA address
+ * @param adc ADC samples obtained by sampling the shaper output. Currently,
+ * six samples are obtained per raw hit.
+ */
+ public HPSSVTData(int hybridNumber, int apvNumber,
+ int channelNumber, int fpgaAddress, short[] adc) {
+ this.createSVTDataPacket(hybridNumber, apvNumber,
+ channelNumber, fpgaAddress, adc);
}
-
+
/**
* Creates and SVT data packet from existing SVT data
- *
- * @param data
- * The packed data as int array of size 4
- */
- public HPSSVTData(int[] data)
- {
- if(data.length != 4)
+ *
+ * @param data The packed data as int array of size 4
+ */
+ public HPSSVTData(int[] data) {
+ if (data.length != 4) {
throw new RuntimeException("Data sample size is not valid!");
-
+ }
+
this.data = data;
}
-
+
/**
* Get the packed data for this sample
- * @return sample
- * The packed data as an int array of size 4.
+ *
+ * @return sample The packed data as an int array of size 4.
*/
public int[] getData() {
- return data;
+ return data;
}
-
-
+
/**
* Creates and SVT data packet
*/
- private void createSVTDataPacket(int hybridNumber, int apvNumber,
- int channelNumber, int fpgaAddress, short[] adc)
- {
+ private void createSVTDataPacket(int hybridNumber, int apvNumber,
+ int channelNumber, int fpgaAddress, short[] adc) {
/*
- * Sample Data consists of the following: Z[xx:xx] = Zeros, O[xx:xx] = Ones
- * data[0] = O[0], Z[0], Hybrid[1:0], Z[0], ApvChip[2:0], Z[0], Channel[6:0], FpgaAddress[15:0]
- * data[1] = Z[1:0], Sample1[13:0]], Z[1:0], Sample0[13:0]
- * data[2] = Z[1:0], Sample3[13:0]], Z[1:0], Sample2[13:0]
- * data[3] = Z[1:0], Sample5[13:0]], Z[1:0], Sample4[13:0]
- *
- */
-
+ * Sample Data consists of the following: Z[xx:xx] = Zeros, O[xx:xx] =
+ * Ones data[0] = O[0], Z[0], Hybrid[1:0], Z[0], ApvChip[2:0], Z[0],
+ * Channel[6:0], FpgaAddress[15:0] data[1] = Z[1:0], Sample1[13:0]],
+ * Z[1:0], Sample0[13:0] data[2] = Z[1:0], Sample3[13:0]], Z[1:0],
+ * Sample2[13:0] data[3] = Z[1:0], Sample5[13:0]], Z[1:0], Sample4[13:0]
+ *
+ */
+
//--- data[0] ---//
//-----------------//
-
+
// The most significant digit of data[0] is set to 1
data[0] |= 0x80000000;
-
+
// Insert the hybrid number
- data[0] = (data[0] &= ~(HYBRID_MASK << 28)) | ((hybridNumber & HYBRID_MASK) << 28);
-
+ data[0] = (data[0] &= ~(HYBRID_MASK << 28)) | ((hybridNumber & HYBRID_MASK) << 28);
+
// Insert the APV number
- data[0] = (data[0] &= ~(APV_MASK << 24)) | ((apvNumber & APV_MASK) << 24);
-
+ data[0] = (data[0] &= ~(APV_MASK << 24)) | ((apvNumber & APV_MASK) << 24);
+
// Insert the channel number
- data[0] = (data[0] &= ~(CHANNEL_MASK << 16)) | ((channelNumber & CHANNEL_MASK) << 16);
-
+ data[0] = (data[0] &= ~(CHANNEL_MASK << 16)) | ((channelNumber & CHANNEL_MASK) << 16);
+
// Insert the FPGA address
data[0] = (data[0] &= ~FPGA_MASK) | (fpgaAddress & FPGA_MASK);
-
-
+
+
//--- data[1] ----//
//------------------//
-
+
// Add data 0
data[1] = (data[1] &= ~SAMPLE_MASK) | (adc[0] & SAMPLE_MASK);
-
+
// Add data 1
data[1] = (data[1] &= ~(SAMPLE_MASK << 16)) | ((adc[1] & SAMPLE_MASK) << 16);
-
-
+
+
//--- data[2] ----//
//------------------//
-
+
// Add sample 2
data[2] = (data[2] &= ~SAMPLE_MASK) | (adc[2] & SAMPLE_MASK);
-
+
// Add sample 3
data[2] = (data[2] &= ~(SAMPLE_MASK << 16)) | ((adc[3] & SAMPLE_MASK) << 16);
-
+
//--- data[3] ----//
//------------------//
-
+
// Add sample 4
data[3] = (data[3] &= ~SAMPLE_MASK) | (adc[4] & SAMPLE_MASK);
-
+
// Add sample 5
data[3] = (data[3] &= ~(SAMPLE_MASK << 16)) | ((adc[5] & SAMPLE_MASK) << 16);
}
-
+
/**
* Get the hybrid number associated with this SVT data packet
+ *
* @return hybrid number (0-3)
*/
- public int getHybridNumber()
- {
+ public int getHybridNumber() {
return (data[0] >>> 28) & HYBRID_MASK;
}
-
+
/**
* Get the APV number associated with this SVT data packet
+ *
* @return APV number (0-4)
*/
- public int getAPVNumber()
- {
+ public int getAPVNumber() {
return (data[0] >>> 24) & APV_MASK;
}
-
+
/**
* Get the channel number associated with this SVT data packet
+ *
* @return channel number (0-127)
*/
- public int getChannelNumber()
- {
+ public int getChannelNumber() {
return (data[0] >>> 16) & CHANNEL_MASK;
}
-
+
/**
- * Get the FPGA address associated with this SVT data packet
+ * Get the FPGA address associated with this SVT data packet
+ *
* @return FPGA address
*/
- public int getFPGAAddress()
- {
+ public int getFPGAAddress() {
return data[0] & FPGA_MASK;
}
-
+
/**
* Get the nth SVT sample
- * @param n
- * The sample number of interest. Valid values are 0 to 5
+ *
+ * @param n The sample number of interest. Valid values are 0 to 5
* @throws RuntimeException if the sample number is out of range
* @return ADC value of the nth sample
- *
- *
+ *
+ *
*/
- public int getSample(int n)
- {
-
- switch(n) {
- case 0:
+ public int getSample(int n) {
+
+ switch (n) {
+ case 0:
return data[1] & SAMPLE_MASK;
case 1:
return (data[1] >>> 16) & SAMPLE_MASK;
@@ -197,7 +186,7 @@
return data[2] & SAMPLE_MASK;
case 3:
return (data[2] >>> 16) & SAMPLE_MASK;
- case 4:
+ case 4:
return data[3] & SAMPLE_MASK;
case 5:
return (data[3] >>> 16) & SAMPLE_MASK;
@@ -205,58 +194,73 @@
throw new RuntimeException("Invalid sample number! Valid range of values for n are from 0 - 5");
}
}
-
+
/**
- * Get all SVT samples
+ * Get all SVT samples
*
- * @return An array containing all SVT Shaper signal samples
+ * @return An array containing all SVT Shaper signal samples
*/
- public short[] getAllSamples()
- {
- short[] samples = new short[TOTAL_NUMBER_OF_SAMPLES];
-
- // Get all SVT Samples
- for(int index = 0; index < TOTAL_NUMBER_OF_SAMPLES; index++){
- samples[index] = (short) this.getSample(index);
- }
-
- return samples;
+ public short[] getAllSamples() {
+ short[] samples = new short[TOTAL_NUMBER_OF_SAMPLES];
+ // Get all SVT Samples
+ for (int index = 0; index < TOTAL_NUMBER_OF_SAMPLES; index++) {
+ samples[index] = (short) this.getSample(index);
+ }
+
+ return samples;
}
-
+
/**
* Get the hit time at which the hit occurred
- *
+ *
* @return The time at which the hit occurred with respect to the trigger
*/
- public int getHitTime()
- {
- return hitTime;
+ public int getHitTime() {
+ return hitTime;
}
-
+
/**
* Set the hit time at which the hit occurred
- *
- * @param hitTime : Time at which the hit occurred
+ *
+ * @param hitTime : Time at which the hit occurred
*/
- public void setHitTime(int hitTime)
- {
- this.hitTime = hitTime;
- }
-
- /**
- *
- */
- public static double[] getTemperature(int[] data)
- {
- double[] temperatures = new double[(data.length)*2];
-
- int tempIndex = 0;
- for(int index = 0; index < data.length; index++){
- temperatures[tempIndex] = data[index] & TEMP_MASK;
- temperatures[tempIndex+1] = (data[index] >>> 16) & TEMP_MASK;
- tempIndex+=2;
- }
-
- return temperatures;
+ public void setHitTime(int hitTime) {
+ this.hitTime = hitTime;
+ }
+
+ /**
+ *
+ */
+ public static double[] getTemperature(int[] data) {
+ double[] temperatures = new double[(data.length) * 2];
+
+ int tempIndex = 0;
+ for (int index = 0; index < data.length; index++) {
+ temperatures[tempIndex] = data[index] & TEMP_MASK;
+ temperatures[tempIndex + 1] = (data[index] >>> 16) & TEMP_MASK;
+ tempIndex += 2;
+ }
+
+ return temperatures;
+ }
+
+ /**
+ * Get the sensor (a k a physical) channel corresponding to a raw chip channel
+ *
+ * @param apv : APV25 chip number
+ * @param channel : APV25 raw channel number
+ *
+ * @return sensor channel number
+ */
+ public static int getSensorChannel(int apv, int channel) {
+ int sensorChannel = (TOTAL_APV25_PER_HYBRID - apv - 1) * TOTAL_APV25_CHANNELS + channel;
+ if (sensorChannel < 0 || sensorChannel >= TOTAL_APV25_PER_HYBRID * TOTAL_APV25_CHANNELS) {
+ throw new RuntimeException("sensor channel " + sensorChannel + " is outside of valid range! APV " + apv + ", channel " + channel);
+ }
+ return sensorChannel;
+ }
+
+ public int getSensorChannel() {
+ return getSensorChannel(this.getAPVNumber(), this.getChannelNumber());
}
}
hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.5 -r1.6
--- SVTDataToRawTrackerHitDriver.java 17 Apr 2012 23:44:53 -0000 1.5
+++ SVTDataToRawTrackerHitDriver.java 28 Apr 2012 15:25:41 -0000 1.6
@@ -2,6 +2,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
import org.lcsim.detector.tracker.silicon.SiSensor;
import org.lcsim.event.EventHeader;
@@ -13,68 +14,74 @@
public class SVTDataToRawTrackerHitDriver extends Driver {
- String svtDataCollectionName = "SVTData";
- String rawTrackerHitOutputCollectionName = "SVTRawTrackerHits";
- String readoutName = "TrackerHits";
-
- public SVTDataToRawTrackerHitDriver() {
- }
-
- public void setReadoutName(String readoutName) {
- this.readoutName = readoutName;
- }
-
- public void setSvtDataCollectionName(String svtDataCollectionName) {
- this.svtDataCollectionName = svtDataCollectionName;
- }
-
- public void setRawTrackerHitOutputCollectionName(String rawTrackerHitOutputCollectionName) {
- this.rawTrackerHitOutputCollectionName = rawTrackerHitOutputCollectionName;
- }
-
- public void process(EventHeader event) {
-
- if (!event.hasCollection(HPSSVTData.class, svtDataCollectionName)) {
- System.out.println(svtDataCollectionName + " does not exist; skipping event");
- return;
- }
-
- List<HPSSVTData> svtDataCollection = event.get(HPSSVTData.class, svtDataCollectionName);
- if (svtDataCollection.isEmpty()) {
- System.out.println(svtDataCollectionName + " is empty; skipping event");
- return;
- }
-
- List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
- for (HPSSVTData svtData : svtDataCollection) {
- Pair<Integer, Integer> daqPair = new Pair<Integer, Integer>(svtData.getHybridNumber(), svtData.getFPGAAddress());
- SiSensor sensor = HPSSVTDAQMaps.daqPairToSensor.get(daqPair);
-
- // Get the channel - hardcoded the number of channels per APV, but that should be okay
- int channelNumber = 128 * svtData.getAPVNumber() + svtData.getChannelNumber();
- if (channelNumber < 0 || channelNumber > 638) {
- System.out.printf("unexpected channel %d: APV %d, channel %d\n", channelNumber, svtData.getAPVNumber(), svtData.getChannelNumber());
- }
- //int channelNumber = svtData.getChannelNumber()*svtData.getAPVNumber();
-
- short[] data = new short[6];
- for (int index = 0; index < 6; index++) {
- data[index] = (short) svtData.getSample(index);
- }
-
- // No time yet
- int time = 0;
- long cell_id = sensor.makeStripId(channelNumber, 1).getValue();
-
- RawTrackerHit rawHit = new BaseRawTrackerHit(time, cell_id, data, null, sensor);
-
- hits.add(rawHit);
- }
-
- System.out.println(this.getClass().getSimpleName() + " made " + hits.size()
- + " RawTrackerHits with readoutName " + readoutName + " in collection" + rawTrackerHitOutputCollectionName);
-
- int flag = LCIOUtil.bitSet(0, 31, true); // Turn on 64-bit cell ID.
- event.put(rawTrackerHitOutputCollectionName, hits, RawTrackerHit.class, flag, readoutName);
- }
+ String svtDataCollectionName = "SVTData";
+ String rawTrackerHitOutputCollectionName = "SVTRawTrackerHits";
+ String readoutName = "TrackerHits";
+
+ public SVTDataToRawTrackerHitDriver() {
+ }
+
+ public void setReadoutName(String readoutName) {
+ this.readoutName = readoutName;
+ }
+
+ public void setSvtDataCollectionName(String svtDataCollectionName) {
+ this.svtDataCollectionName = svtDataCollectionName;
+ }
+
+ public void setRawTrackerHitOutputCollectionName(String rawTrackerHitOutputCollectionName) {
+ this.rawTrackerHitOutputCollectionName = rawTrackerHitOutputCollectionName;
+ }
+
+ public void process(EventHeader event) {
+
+ if (!event.hasCollection(HPSSVTData.class, svtDataCollectionName)) {
+ System.out.println(svtDataCollectionName + " does not exist; skipping event");
+ return;
+ }
+
+ List<HPSSVTData> svtDataCollection = event.get(HPSSVTData.class, svtDataCollectionName);
+ if (svtDataCollection.isEmpty()) {
+ System.out.println(svtDataCollectionName + " is empty; skipping event");
+ return;
+ }
+
+ List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>();
+ for (HPSSVTData svtData : svtDataCollection) {
+ Pair<Integer, Integer> daqPair = new Pair<Integer, Integer>(svtData.getHybridNumber(), svtData.getFPGAAddress());
+ SiSensor sensor = HPSSVTDAQMaps.daqPairToSensor.get(daqPair);
+ if (sensor == null) {
+ throw new RuntimeException("Unexpected DAQ address: FPGA " + svtData.getFPGAAddress() + ", hybrid " + svtData.getHybridNumber());
+ }
+
+ int sensorChannel = svtData.getSensorChannel();
+ if (sensorChannel >= HPSSVTConstants.TOTAL_STRIPS_PER_SENSOR) {
+ continue; //strip 639 exists as an APV channel but not as a sensor strip; drop it
+ }
+
+ // Get all shaper signal samples associated with this hit
+ short data[] = svtData.getAllSamples();
+
+ // Get the hit time (is 0)
+ int hitTime = svtData.getHitTime();
+
+ // Find the side number (is 1)
+ int sideNumber;
+ if (sensor.hasElectrodesOnSide(ChargeCarrier.HOLE)) {
+ sideNumber = ChargeCarrier.HOLE.charge();
+ } else {
+ sideNumber = ChargeCarrier.ELECTRON.charge();
+ }
+
+ long cell_id = sensor.makeStripId(sensorChannel, sideNumber).getValue();
+
+ hits.add(new BaseRawTrackerHit(hitTime, cell_id, data, null, sensor));
+ }
+
+ System.out.println(this.getClass().getSimpleName() + " made " + hits.size()
+ + " RawTrackerHits with readoutName " + readoutName + " in collection" + rawTrackerHitOutputCollectionName);
+
+ int flag = LCIOUtil.bitSet(0, 31, true); // Turn on 64-bit cell ID.
+ event.put(rawTrackerHitOutputCollectionName, hits, RawTrackerHit.class, flag, readoutName);
+ }
}