hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -N HPSSVTRawTrackerHitMaker.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ HPSSVTRawTrackerHitMaker.java 25 Apr 2012 05:06:46 -0000 1.1
@@ -0,0 +1,130 @@
+package org.lcsim.hps.recon.tracking;
+
+//--- Java --//
+import java.util.List;
+import java.util.ArrayList;
+
+//--- org.lcsim ---//
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOUtil;
+
+//--- hps-java ---//
+import org.lcsim.hps.util.Pair;
+
+//--- Constants ---//
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_STRIPS_PER_SENSOR;
+import static org.lcsim.hps.recon.tracking.HPSSVTConstants.TOTAL_APV25_CHANNELS;
+
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSSVTRawTrackerHitMaker.java,v 1.1 2012/04/25 05:06:46 omoreno Exp $
+ */
+public class HPSSVTRawTrackerHitMaker extends Driver {
+
+ String svtDataCollectionName = "SVTData";
+ String svtRawTrackerHitCollectionName = "SVTRawTrackerHits";
+ String readoutName = "TrackerHits";
+
+ public HPSSVTRawTrackerHitMaker(){}
+
+ /**
+ *
+ */
+ public void process(EventHeader event)
+ {
+
+ // If the SVT data collection does not exist skip the event
+ if(!event.hasCollection(HPSSVTData.class, svtDataCollectionName)){
+ System.out.println(this.getClass().getSimpleName() + ": " + svtDataCollectionName + " does not exist; skipping event!");
+ return;
+ }
+
+ // If the SVT data collection is empty skip the event
+ List<HPSSVTData> svtData = event.get(HPSSVTData.class, svtDataCollectionName);
+ if(svtData.isEmpty()){
+ System.out.println(this.getClass().getSimpleName() + ": " + svtDataCollectionName + " is empty; skipping event!");
+ return;
+ }
+
+ // Create RawTrackerHits
+ List<RawTrackerHit> rawHits = this.makeRawTrackerHits(svtData);
+
+ // Turn on 64-bit cell ID
+ int flag = LCIOUtil.bitSet(0, 31, true);
+
+ // Place the RawTrackerHits collection into the event
+ event.put(svtRawTrackerHitCollectionName, rawHits, RawTrackerHit.class, flag, readoutName);
+ System.out.println("Created " + rawHits.size() + " RawTrackerHits");
+ }
+
+ /**
+ * Converts a list of HPSSVTData to a list of RawTrackerHits
+ *
+ * @param svtData : List of HPSSVTData to be converted
+ *
+ * @return List of RawTrackerHits
+ */
+ public List<RawTrackerHit> makeRawTrackerHits(List<HPSSVTData> svtData)
+ {
+ // Lost of RawTrackerHits
+ List<RawTrackerHit> rawHits = new ArrayList<RawTrackerHit>();
+
+ for(HPSSVTData svtDatum : svtData){
+
+ // Get the sensor associated with this hit
+ Pair<Integer, Integer> daqPair
+ = new Pair<Integer, Integer>(svtDatum.getHybridNumber(), svtDatum.getFPGAAddress());
+ SiSensor sensor = HPSSVTDAQMaps.daqPairToSensor.get(daqPair);
+
+ // Get the physical channel
+ int physicalChannel
+ = this.getPhysicalChannel(svtDatum.getAPVNumber(), svtDatum.getChannelNumber());
+ if(physicalChannel < 0 || physicalChannel > 638)
+ throw new RuntimeException("Channel " + physicalChannel + " is outside of invalid range!");
+
+ // Get all shaper signal samples associated with this hit
+ short data[] = svtDatum.getAllSamples();
+
+ // Get the hit time
+ int hitTime = svtDatum.getHitTime();
+
+// System.out.println("Channel: " + svtDatum.getChannelNumber() + ": APV: " + svtDatum.getAPVNumber());
+// System.out.println(this.getClass().getSimpleName() + ": Charge: " + ChargeCarrier.HOLE.charge());
+// System.out.println(this.getClass().getSimpleName() + ": " + sensor.hasElectrodesOnSide(ChargeCarrier.HOLE));
+
+ // Find the side number
+ int sideNumber;
+ if(sensor.hasElectrodesOnSide(ChargeCarrier.HOLE)) sideNumber = ChargeCarrier.HOLE.charge();
+ else sideNumber = ChargeCarrier.ELECTRON.charge();
+
+ // Get cell ID
+ long cellID = sensor.makeStripId(physicalChannel, sideNumber).getValue();
+
+ // Create a RawTrackerHit
+ rawHits.add(new BaseRawTrackerHit(hitTime, cellID, data, null, sensor));
+ }
+
+ return rawHits;
+ }
+
+ /**
+ * Get the physical channel corresponding to a raw chip channel
+ *
+ * @param apv : APV25 chip number
+ * @param channel : APV25 raw channel number
+ *
+ * @return physical channel number
+ */
+ public int getPhysicalChannel(int apv, int channel)
+ {
+ return TOTAL_STRIPS_PER_SENSOR - (apv*TOTAL_APV25_CHANNELS
+ + (TOTAL_APV25_CHANNELS - 1) - channel);
+ }
+}