hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.3 -r1.4
--- DataTrackerFakeHitDriver.java 17 Oct 2012 22:53:35 -0000 1.3
+++ DataTrackerFakeHitDriver.java 9 Nov 2012 01:42:13 -0000 1.4
@@ -17,15 +17,20 @@
import org.lcsim.detector.identifier.IIdentifier;
import org.lcsim.detector.tracker.silicon.*;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
import org.lcsim.event.RawTrackerHit;
import org.lcsim.event.SimTrackerHit;
import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.event.base.BaseSimTrackerHit;
import org.lcsim.fit.helicaltrack.HelicalTrackFit;
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.fit.helicaltrack.HelixUtils;
import org.lcsim.fit.helicaltrack.HitIdentifier;
+import org.lcsim.fit.helicaltrack.HitUtils;
import org.lcsim.geometry.Detector;
import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+import org.lcsim.hps.recon.tracking.apv25.SvtReadout;
+import org.lcsim.hps.users.omoreno.SimpleSvtTrigger;
import org.lcsim.hps.users.phansson.WTrack;
import org.lcsim.hps.users.phansson.WTrackUtils;
import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHit;
@@ -52,19 +57,28 @@
TrackerHitType trackerType = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL, TrackerHitType.MeasurementType.STRIP_1D);
CoordinateSystem coordinate_system = trackerType.getCoordinateSystem();
private HitIdentifier _ID = new HitIdentifier();
+
private boolean _doHth = false;
- private String trackCollectionName = "MCParticle_HelicalTrackFit";
+ boolean createSimTrackerHits = false;
-
+ // Collections
+ List<SimTrackerHit> simHits = null;
+ List<SiTrackerHit> stripHits1D = null;
+ List<HelicalTrackHit> hths = null;
+ String trackCollectionName = "MCParticle_HelicalTrackFit";
+ String stripHitOutputCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+ String hthOutputCollectionName = "RotatedHelicalTrackHits";
+ String simTrackerHitCollectionName = "FakeTrackerHits";
+
// Subdetector name.
private String subdetectorName = "Tracker";
- // Name of StripHit1D output collection.
- private String stripHitOutputCollectionName = "StripClusterer_SiTrackerHitStrip1D";
- private String hthOutputCollectionName = "RotatedHelicalTrackHits";
+
+
// Various data lists required by digitization.
private List<String> processPaths = new ArrayList<String>();
private List<IDetectorElement> processDEs = new ArrayList<IDetectorElement>();
private Set<SiSensor> processSensors = new HashSet<SiSensor>();
+
//Visualization
private boolean hideFrame = false;
@@ -99,6 +113,13 @@
public void setDoHth(boolean debug) {
this._doHth = debug;
}
+
+ /**
+ * Enable/disable the creation of SimTrackerHits
+ */
+ public void setCreateSimTrackerHits(boolean createSimTrackerHits){
+ this.createSimTrackerHits = createSimTrackerHits;
+ }
// public void setReadoutCollectionName(String readoutCollectionName) {
// this.readoutCollectionName = readoutCollectionName;
@@ -156,12 +177,8 @@
for (IDetectorElement detectorElement : processDEs) {
processSensors.addAll(detectorElement.findDescendants(SiSensor.class));
-
-
}
-
-
// Set the detector to process.
processPaths.add(subdetectorName);
@@ -175,33 +192,43 @@
@Override
public void process(EventHeader event) {
-
- //Make new tracks based on the MC particles
- List<HelicalTrackFit> tracks = new ArrayList<HelicalTrackFit>();
-
- if(event.hasCollection(HelicalTrackFit.class, trackCollectionName)) {
- tracks = event.get(HelicalTrackFit.class, trackCollectionName);
+ // Obtain the tracks from the event
+ if(!event.hasCollection(HpsHelicalTrackFit.class, trackCollectionName)){
+ this.printDebug("No HpsHelicalTrackFits were found, skipping event");
+ simHits = null;
+ return;
}
-
-
+ List<HpsHelicalTrackFit> tracks = event.get(HpsHelicalTrackFit.class, trackCollectionName);
if(debug) System.out.println(this.getClass().getSimpleName() + ": found " + tracks.size() + " tracks (" + this.trackCollectionName + ")");
+
+ // Instantiate the list of interest
+ if(this._doHth){
+ this.printDebug("Creating HelicalTrackHits...");
+ hths = new ArrayList<HelicalTrackHit>();
+ } else if(createSimTrackerHits){
+ this.printDebug("Creating SimTrackerHits...");
+ simHits = new ArrayList<SimTrackerHit>();
+ } else {
+ // Create StripHit1Ds by default
+ this.printDebug("Creating StripHit1D...");
+ stripHits1D = new ArrayList<SiTrackerHit>();
+ }
- //if(tracks.isEmpty()) return;
-
- // Make new lists for output.
+ /*// Make new lists for output.
List<SiTrackerHit> stripHits1D = new ArrayList<SiTrackerHit>();
- List<HelicalTrackHit> hths = new ArrayList<HelicalTrackHit>();
+ List<HelicalTrackHit> hths = new ArrayList<HelicalTrackHit>(); */
if(debug) System.out.println(this.getClass().getSimpleName() + ": Add hits for " + tracks.size() + " tracks (" + this.trackCollectionName + ")");
-
- for(HelicalTrackFit helix : tracks) {
+ for(HpsHelicalTrackFit helix : tracks) {
if(debug) System.out.println(this.getClass().getSimpleName() + ": trying to add hits for this track");
- List<SiTrackerHit> stripHits1D_for_track = new ArrayList<SiTrackerHit>();
- List<HelicalTrackHit> hths_for_track = new ArrayList<HelicalTrackHit>();
+ //List<SiTrackerHit> stripHits1D_for_track = new ArrayList<SiTrackerHit>();
+ //List<HelicalTrackHit> hths_for_track = new ArrayList<HelicalTrackHit>();
+ // Get the MC Particle associated with this track
+ MCParticle mcParticle = helix.getMCParticle();
if(debug) {
System.out.println(this.getClass().getSimpleName() + helix.toString());
@@ -230,21 +257,23 @@
if(debug) System.out.println(this.getClass().getSimpleName() + ": add hits to sensor " + sensor.getName() + " at position " + sensor.getGeometry().getPosition().toString());
+ // When creating stereo hits, skip the even sensors
if(this._doHth && _ID.getLayer(sensor)%2==0) {
if(debug) System.out.println(this.getClass().getSimpleName() + ": this was an even sensor -> skip for HTH production");
continue;
}
+ // Get the sensor position along the z direction
double zposition = sensor.getGeometry().getPosition().z();
+ // Extrapolate the track to the sensor
Hep3Vector trackPosAtSensor = extrapolator.extrapolateTrack(zposition);
if(debug) {
System.out.println(this.getClass().getSimpleName() + ": track position at sensor ( z= " + zposition + ") = " + trackPosAtSensor.toString());
}
-
-
-
+
+ // Check if the track lies within the sensor
boolean isHit = trackUtils.sensorContainsTrack(trackPosAtSensor, sensor);
@@ -259,16 +288,19 @@
isBotTrack=true;
}
if(this._doHth) {
- hths_for_track.add(this.makeHelicalTrackHit(sensor, wtrack));
+ hths.add(this.makeHelicalTrackHit(sensor, wtrack));
+ } else if(createSimTrackerHits){
+ // Create a SimTrackerHit at the intersect between a track and a sensor
+ simHits.add(this.makeSimTrackerHit(sensor, trackPosAtSensor.v(), mcParticle));
} else {
- stripHits1D_for_track.add(this.makeTrackerHit(sensor, wtrack));
-
+
+ this.printDebug("Creating a SimTrackerHit at position: " + trackPosAtSensor);
+ stripHits1D.add(this.makeTrackerHit(sensor, wtrack));
}
} else {
if(debug) System.out.println(this.getClass().getSimpleName() + ": this helix didn't pass within the sensor so no hit was added");
}
-
}
if(isTopTrack) this._h_nstriphits_top.fill(n_hits_top);
@@ -278,22 +310,39 @@
System.exit(1);
}
+ /*
stripHits1D.addAll(stripHits1D_for_track);
hths.addAll(hths_for_track);
+ */
}
+
if (debug) {
- System.out.println(this.getClass().getSimpleName() + ": Produced " + stripHits1D.size() + " hits for collection " + this.stripHitOutputCollectionName);
- System.out.println(this.getClass().getSimpleName() + ": Produced " + hths.size() + " hits for collection " + this.hthOutputCollectionName);
+ if(stripHits1D != null){
+ System.out.println(this.getClass().getSimpleName() + ": Produced " + stripHits1D.size() + " hits for collection " + this.stripHitOutputCollectionName);
+ }
+ if(hths != null){
+ System.out.println(this.getClass().getSimpleName() + ": Produced " + hths.size() + " hits for collection " + this.hthOutputCollectionName);
+ }
}
- // Put output hits into collection.
- int flag = LCIOUtil.bitSet(0, 31, true); // Turn on 64-bit cell ID.
-// event.put(this.rawTrackerHitOutputCollectionName, rawHits, RawTrackerHit.class, flag, toString());
- event.put(this.stripHitOutputCollectionName, stripHits1D, SiTrackerHitStrip1D.class, 0, toString());
- event.put("RotatedHelicalTrackHits", hths, HelicalTrackHit.class, 0);
+
+ //int flag = LCIOUtil.bitSet(0, 31, true); // Turn on 64-bit cell ID.
+ //event.put(this.rawTrackerHitOutputCollectionName, rawHits, RawTrackerHit.class, flag, toString());
+ // Put the collection of interest into the event
+
+ if(_doHth){
+ event.put(hthOutputCollectionName, hths, HelicalTrackHit.class, 0);
+ } else if(createSimTrackerHits){
+ event.put(simTrackerHitCollectionName, simHits, SimTrackerHit.class, 0);
+ this.printDebug("SimTrackerHits created: " + simHits.size());
+ } else {
+ event.put(stripHitOutputCollectionName, stripHits1D, SiTrackerHitStrip1D.class, 0, toString());
+ }
//event.put("RotatedHelicalTrackHits", rotatedhits, HelicalTrackHit.class, 0);
+
+ /*
if (debug) {
if(event.hasCollection(HelicalTrackHit.class, "RotatedHelicalTrackHits")) {
System.out.println(this.getClass().getSimpleName() + ": has hths:");
@@ -310,7 +359,7 @@
counts[mod][layer] += SvtUtils.getInstance().getSensor(mod, layer).getReadout().getHits(SiTrackerHit.class).size();
}
}
- }
+ }*/
}
@@ -574,7 +623,27 @@
}
-
+ /**
+ * Create a SimTrackerHit and add it to the corresponding readout
+ *
+ * @param sensor : sensor on which the hit will be created on
+ * @param trkPositionAtSensor : the position at which the SimTrackerHit will be created at
+ * @param particle : MC particle associated with the track containing the hit
+ * @return SimTrackerHit
+ */
+ private SimTrackerHit makeSimTrackerHit(SiSensor sensor, double[] trkPositionAtSensor, MCParticle particle){
+
+ double dEdx = 24000/* MIP */*DopedSilicon.ENERGY_EHPAIR;
+ double[] momentum = particle.getMomentum().v();
+ double pathLength = 0;
+ double time = 0;
+ int cellID = (int) TrackerHitUtils.makeSimTrackerHitId(sensor).getValue();
+ // Create a new SimTrackerHit
+ SimTrackerHit simHit = new BaseSimTrackerHit(trkPositionAtSensor, dEdx, momentum, pathLength, time, cellID, particle, null, sensor);
+ // Add it to the sensor readout
+ //sensor.getReadout().addHit(simHit);
+ return simHit;
+ }
@@ -730,11 +799,11 @@
plotter_iter = af.createPlotterFactory().create();
- plotter_iter.createRegions(5,4);
+ plotter_iter.createRegions(6,4);
plotter_iter.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
plotter_iter.style().statisticsBoxStyle().setVisible(false);
plotter_itercount = af.createPlotterFactory().create();
- plotter_itercount.createRegions(5,4);
+ plotter_itercount.createRegions(6,4);
plotter_nstripclusters = af.createPlotterFactory().create();
plotter_nstripclusters.createRegions(2, 2);
@@ -766,6 +835,16 @@
}
}
+ /**
+ * print debug statement
+ *
+ * @param debugStatement : debug statement
+ */
+ public void printDebug(String debugStatement){
+ if(!debug) return;
+ System.out.println(this.getClass().getSimpleName() + ": " + debugStatement);
+ }
+
@Override
public void endOfData() {