Print

Print


Commit in java/trunk/tracking/src/main/java/org/hps/recon/tracking on MAIN
TrackDataDriver.java+223-165905 -> 906
compute strip isolation distance in first 2 layers, save in new GenericObject collection

java/trunk/tracking/src/main/java/org/hps/recon/tracking
TrackDataDriver.java 905 -> 906
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	2014-08-19 23:05:30 UTC (rev 905)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	2014-08-21 01:21:59 UTC (rev 906)
@@ -1,6 +1,7 @@
 package org.hps.recon.tracking;
 
 import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -17,184 +18,241 @@
 import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
 import org.lcsim.geometry.Detector;
 import org.lcsim.util.Driver;
-import org.hps.recon.tracking.TrackTimeData;
-import org.hps.recon.tracking.TrackResidualsData;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.base.BaseRelationalTable;
 
 /**
- * 
+ *
  * @author Omar Moreno <[log in to unmask]>
  * @version $Id$
- * 
+ *
  */
 public class TrackDataDriver extends Driver {
 
-	// Collection Names
-	String trackCollectionName = "MatchedTracks";
-	// TODO: Change this to match whatever track name is decided on
-	String trackTimeDataCollectionName = "TrackTimeData";
-	String trackResidualsCollectionName = "TrackResiduals";
-	String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
-	String trackTimeDataRelationsColName = "TrackTimeDataRelations";
-	String trackResidualsRelationsColName = "TrackResidualsRelations";
+    // Collection Names
+    String trackCollectionName = "MatchedTracks";
+    // TODO: Change this to match whatever track name is decided on
+    String trackTimeDataCollectionName = "TrackTimeData";
+    String trackResidualsCollectionName = "TrackResiduals";
+    String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
+    String rotatedHthCollectionName = "RotatedHelicalTrackHits";
+    String trackTimeDataRelationsColName = "TrackTimeDataRelations";
+    String trackResidualsRelationsColName = "TrackResidualsRelations";
 
-	public TrackDataDriver() {}
+    public TrackDataDriver() {
+    }
 
-	protected void detectorChanged(Detector detector){
-		
-		// TODO: Add plots of all track data variables
-		
-	}
-	
-	protected void process(EventHeader event) {
+    protected void detectorChanged(Detector detector) {
 
-		// If the event doesn't contain a collection of tracks, skip it.
-		if (!event.hasCollection(Track.class, trackCollectionName))
-			return;
+        // TODO: Add plots of all track data variables
+    }
 
-		// Get the collection of tracks from the event
-		List<Track> tracks = event.get(Track.class, trackCollectionName);
-		
-		// Get the collection of LCRelations relating RotatedHelicalTrackHits to
-		// HelicalTrackHits
-		List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName);
+    protected void process(EventHeader event) {
 
-		// Create a collection to hold the track time and t0 residual data
-		List<TrackTimeData> timeDataCollection = new ArrayList<TrackTimeData>(); 
+        // If the event doesn't contain a collection of tracks, skip it.
+        if (!event.hasCollection(Track.class, trackCollectionName)) {
+            return;
+        }
 
-		// Create a collection of LCRelations between a track and the t0 residual data
-		List<LCRelation> trackToTrackTimeDataRelations = new ArrayList<LCRelation>();
-		
-		// Create a collection to hold the track residuals
-		List<TrackResidualsData> trackResidualsCollection = new ArrayList<TrackResidualsData>();
-		
-		// Create a collection of LCRelations between a track and the track residuals
-		List<LCRelation> trackToTrackResidualsRelations = new ArrayList<LCRelation>();
-		
-		double totalT0 = 0;
-		double totalHits = 0;
-		double trackTime = 0;
-		double t0Residual = 0;
-		double xResidual = 0;
-		double yResidual = 0;
-		float trackerVolume = -1; 
-		
-		
-		boolean isFirstHit = true;
-		
-		HpsSiSensor sensor = null; 
-		Hep3Vector stereoHitPosition = null;
-		Hep3Vector trackPosition = null;
-		HelicalTrackHit helicalTrackHit = null;
-		
-		List<Double>  t0Residuals = new ArrayList<Double>(); 
-		List<Double>  trackResidualsX = new ArrayList<Double>();
-		List<Float>   trackResidualsY = new ArrayList<Float>();
-		List<Integer> sensorLayers = new ArrayList<Integer>();
-		List<Integer> stereoLayers = new ArrayList<Integer>(); 
-		
-		
-		// Loop over all the tracks in the event
-		for (Track track : tracks) {
-						
-			totalT0 = 0; 
-			totalHits = 0;
-			t0Residuals.clear();
-			sensorLayers.clear();
-			trackResidualsX.clear();
-			trackResidualsY.clear();
-			stereoLayers.clear();
-			
-			//
-			// Calculate the track time and track residuals. Also, change the 
-			// position of a HelicalTrackHit to be the corrected one.
-			//
-			
-			// Loop over all stereo hits comprising a track
-			for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
-			
-				// Add the stereo layer number associated with the track residual
-				stereoLayers.add(((HelicalTrackHit) rotatedStereoHit).Layer());
-				
-				// Extrapolate the track to the stereo hit position and calculate 
-				// track residuals
-				stereoHitPosition = ((HelicalTrackHit) rotatedStereoHit).getCorrectedPosition();
-				trackPosition = TrackUtils.extrapolateTrack(track, stereoHitPosition.x());
-				xResidual = trackPosition.x() - stereoHitPosition.y();
-				yResidual = trackPosition.y() - stereoHitPosition.z(); 
-				trackResidualsX.add(xResidual);
-				trackResidualsY.add((float) yResidual);
+        // Get the collection of tracks from the event
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
 
-				//
-				// Change the persisted position of both RotatedHelicalTrackHits 
-				// and HelicalTrackHits to the corrected position.
-				//
-				
-				// Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit
-				// associated with a track
-				for(LCRelation relation : rotatedHthToHthRelations){
-					if(relation.getTo().equals(rotatedStereoHit)){
-						helicalTrackHit = (HelicalTrackHit) relation.getFrom(); 
-						break;
-					}
-				}
-				((HelicalTrackHit) rotatedStereoHit).setPosition(stereoHitPosition.v());
-				stereoHitPosition = CoordinateTransformations.transformVectorToDetector(stereoHitPosition);
-				helicalTrackHit.setPosition(stereoHitPosition.v());
-				
-				
-				// Loop over the clusters comprising the stereo hit
-				for(HelicalTrackStrip cluster : ((HelicalTrackCross) rotatedStereoHit).getStrips()){
-					
-					totalT0 += cluster.time();
-					totalHits++;
-				}
-			}
-			
-			// The track time is the mean t0 of hits on a track
-			trackTime = totalT0/totalHits;
-	
-			
-			//
-			// Calculate the t0 residuals
-			//
-			
-			isFirstHit = true;
-			// Loop over all stereo hits comprising a track
-			for (TrackerHit stereoHit : track.getTrackerHits()) {
-				// Loop over the clusters comprising the stereo hit
-				for(HelicalTrackStrip cluster : ((HelicalTrackCross) stereoHit).getStrips()){
+        // Get the collection of LCRelations relating RotatedHelicalTrackHits to
+        // HelicalTrackHits
+        List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName);
+        BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
+        hthToRotatedHth.addRelations(rotatedHthToHthRelations);
 
-					if(isFirstHit){
-						sensor = (HpsSiSensor) ((RawTrackerHit) cluster.rawhits().get(0)).getDetectorElement(); 
-						if(sensor.isTopLayer()) trackerVolume = 0; 
-						else if(sensor.isBottomLayer()) trackerVolume = 1;
-					}
-				
-					// Add the layer number associated with this residual to the list of layers
-					sensorLayers.add(sensor.getLayerNumber()); 
-					
-					// Find the t0 residual and add it to the list of residuals
-					t0Residual = trackTime - cluster.time(); 
-					// Apply correction to t0 residual
-					t0Residual /= Math.sqrt((totalHits - 1)/totalHits);
-					t0Residuals.add(t0Residual);
-				}
-			}
-		
-			TrackTimeData timeData = new TrackTimeData(trackerVolume, trackTime, sensorLayers, t0Residuals);
-			timeDataCollection.add(timeData);
-			trackToTrackTimeDataRelations.add(new BaseLCRelation(timeData, track));
-			
-			TrackResidualsData trackResiduals = new TrackResidualsData((int) trackerVolume, stereoLayers, trackResidualsX, trackResidualsY);
-			trackResidualsCollection.add(trackResiduals);
-			trackToTrackResidualsRelations.add(new BaseLCRelation(trackResiduals, track));
-		
-		}
-		
-		event.put(trackTimeDataCollectionName, timeDataCollection, TrackTimeData.class, 0);
-		event.put(trackTimeDataRelationsColName, trackToTrackTimeDataRelations, LCRelation.class, 0);
-		event.put(trackResidualsCollectionName, trackResidualsCollection, TrackResidualsData.class, 0);
-		event.put(trackResidualsRelationsColName, trackToTrackResidualsRelations, LCRelation.class, 0);
-		
-	}
+        List<HelicalTrackHit> rotatedHths = event.get(HelicalTrackHit.class, rotatedHthCollectionName);
+
+        // Create a collection to hold the track time and t0 residual data
+        List<TrackTimeData> timeDataCollection = new ArrayList<TrackTimeData>();
+
+        // Create a collection of LCRelations between a track and the t0 residual data
+        List<LCRelation> trackToTrackTimeDataRelations = new ArrayList<LCRelation>();
+
+        // Create a collection to hold the track residuals
+        List<TrackResidualsData> trackResidualsCollection = new ArrayList<TrackResidualsData>();
+
+        // Create a collection of LCRelations between a track and the track residuals
+        List<LCRelation> trackToTrackResidualsRelations = new ArrayList<LCRelation>();
+
+        // Create a collection to hold the track residuals
+        List<TrackQualityData> trackQualityCollection = new ArrayList<TrackQualityData>();
+
+        // Create a collection of LCRelations between a track and the track residuals
+        List<LCRelation> trackQualityDataToTrackRelations = new ArrayList<LCRelation>();
+
+        double totalT0 = 0;
+        double totalHits = 0;
+        double trackTime = 0;
+        double t0Residual = 0;
+        double xResidual = 0;
+        double yResidual = 0;
+        float trackerVolume = -1;
+
+        boolean isFirstHit = true;
+
+        HpsSiSensor sensor = null;
+        Hep3Vector stereoHitPosition = null;
+        Hep3Vector trackPosition = null;
+        HelicalTrackHit helicalTrackHit = null;
+
+        List<Double> t0Residuals = new ArrayList<Double>();
+        List<Double> trackResidualsX = new ArrayList<Double>();
+        List<Float> trackResidualsY = new ArrayList<Float>();
+        List<Integer> sensorLayers = new ArrayList<Integer>();
+        List<Integer> stereoLayers = new ArrayList<Integer>();
+
+        // Loop over all the tracks in the event
+        for (Track track : tracks) {
+
+            totalT0 = 0;
+            totalHits = 0;
+            t0Residuals.clear();
+            sensorLayers.clear();
+            trackResidualsX.clear();
+            trackResidualsY.clear();
+            stereoLayers.clear();
+
+            //
+            // Calculate the track time and track residuals. Also, change the 
+            // position of a HelicalTrackHit to be the corrected one.
+            //
+            // Loop over all stereo hits comprising a track
+            for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
+
+                // Add the stereo layer number associated with the track residual
+                stereoLayers.add(((HelicalTrackHit) rotatedStereoHit).Layer());
+
+                // Extrapolate the track to the stereo hit position and calculate 
+                // track residuals
+                stereoHitPosition = ((HelicalTrackHit) rotatedStereoHit).getCorrectedPosition();
+                trackPosition = TrackUtils.extrapolateTrack(track, stereoHitPosition.x());
+                xResidual = trackPosition.x() - stereoHitPosition.y();
+                yResidual = trackPosition.y() - stereoHitPosition.z();
+                trackResidualsX.add(xResidual);
+                trackResidualsY.add((float) yResidual);
+
+                //
+                // Change the persisted position of both RotatedHelicalTrackHits 
+                // and HelicalTrackHits to the corrected position.
+                //
+                // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit
+                // associated with a track
+                helicalTrackHit = (HelicalTrackHit) hthToRotatedHth.from(rotatedStereoHit);
+                ((HelicalTrackHit) rotatedStereoHit).setPosition(stereoHitPosition.v());
+                stereoHitPosition = CoordinateTransformations.transformVectorToDetector(stereoHitPosition);
+                helicalTrackHit.setPosition(stereoHitPosition.v());
+
+                // Loop over the clusters comprising the stereo hit
+                for (HelicalTrackStrip cluster : ((HelicalTrackCross) rotatedStereoHit).getStrips()) {
+
+                    totalT0 += cluster.time();
+                    totalHits++;
+                }
+            }
+
+            // The track time is the mean t0 of hits on a track
+            trackTime = totalT0 / totalHits;
+
+            //
+            // Calculate the t0 residuals
+            //
+            isFirstHit = true;
+            // Loop over all stereo hits comprising a track
+            for (TrackerHit stereoHit : track.getTrackerHits()) {
+                // Loop over the clusters comprising the stereo hit
+                for (HelicalTrackStrip cluster : ((HelicalTrackCross) stereoHit).getStrips()) {
+
+                    if (isFirstHit) {
+                        sensor = (HpsSiSensor) ((RawTrackerHit) cluster.rawhits().get(0)).getDetectorElement();
+                        if (sensor.isTopLayer()) {
+                            trackerVolume = 0;
+                        } else if (sensor.isBottomLayer()) {
+                            trackerVolume = 1;
+                        }
+                    }
+
+                    // Add the layer number associated with this residual to the list of layers
+                    sensorLayers.add(sensor.getLayerNumber());
+
+                    // Find the t0 residual and add it to the list of residuals
+                    t0Residual = trackTime - cluster.time();
+                    // Apply correction to t0 residual
+                    t0Residual /= Math.sqrt((totalHits - 1) / totalHits);
+                    t0Residuals.add(t0Residual);
+                }
+            }
+
+            double l1Isolation = 99999999.0;
+            double l2Isolation = 99999999.0;
+            // Loop over all stereo hits comprising a track
+            for (TrackerHit stereoHit : track.getTrackerHits()) {
+                // Loop over the clusters comprising the stereo hit
+                for (HelicalTrackStrip cluster : ((HelicalTrackCross) stereoHit).getStrips()) {
+//                    System.out.println(cluster.layer());
+                    if (cluster.layer() == 1) {
+                        l1Isolation = getNearestDistance(cluster, rotatedHths);
+                    } else if (cluster.layer() == 2) {
+                        l2Isolation = getNearestDistance(cluster, rotatedHths);
+                    }
+                }
+            }
+
+            TrackTimeData timeData = new TrackTimeData(trackerVolume, trackTime, sensorLayers, t0Residuals);
+            timeDataCollection.add(timeData);
+            trackToTrackTimeDataRelations.add(new BaseLCRelation(timeData, track));
+
+            TrackResidualsData trackResiduals = new TrackResidualsData((int) trackerVolume, stereoLayers, trackResidualsX, trackResidualsY);
+            trackResidualsCollection.add(trackResiduals);
+            trackToTrackResidualsRelations.add(new BaseLCRelation(trackResiduals, track));
+
+            double qualityArray[] = {l1Isolation, l2Isolation};
+            TrackQualityData qualityData = new TrackQualityData(qualityArray);
+            trackQualityCollection.add(qualityData);
+            trackQualityDataToTrackRelations.add(new BaseLCRelation(qualityData, track));
+        }
+
+        event.put(trackTimeDataCollectionName, timeDataCollection, TrackTimeData.class, 0);
+        event.put(trackTimeDataRelationsColName, trackToTrackTimeDataRelations, LCRelation.class, 0);
+        event.put(trackResidualsCollectionName, trackResidualsCollection, TrackResidualsData.class, 0);
+        event.put(trackResidualsRelationsColName, trackToTrackResidualsRelations, LCRelation.class, 0);
+        event.put(TrackQualityData.QUALITY_COLLECTION, trackQualityCollection, TrackResidualsData.class, 0);
+        event.put(TrackQualityData.QUALITY_RELATION_COLLECTION, trackQualityDataToTrackRelations, LCRelation.class, 0);
+
+    }
+
+    private static Double getNearestDistance(HelicalTrackStrip cl, List<HelicalTrackHit> toththits) {
+        Hep3Vector corigin = cl.origin();
+        Hep3Vector uvec = VecOp.mult(cl.umeas(), cl.u());
+        Hep3Vector clvec = VecOp.add(corigin, uvec);
+        int layer = cl.layer();
+//        HelicalTrackStrip nearest = null;
+//        Hep3Vector nearestvec = null;
+        Double mindist = 99999999.0;
+        for (HelicalTrackHit hth : toththits) {
+            HelicalTrackCross cross = (HelicalTrackCross) hth;
+            for (HelicalTrackStrip str : cross.getStrips()) {
+                if (layer == str.layer() && str != cl) {
+                    Hep3Vector strorigin = str.origin();
+                    Hep3Vector struvec = VecOp.mult(str.umeas(), str.u());
+                    Hep3Vector strvec = VecOp.add(strorigin, struvec);
+                    double origindist = VecOp.sub(corigin, strorigin).magnitude();
+                    double dist = VecOp.sub(clvec, strvec).magnitude();
+                    if (origindist == 0.0 && dist != 0.0 && dist < Math.abs(mindist)) {
+                        mindist = VecOp.sub(clvec, strvec).magnitude();
+                        if (Math.abs(clvec.z()) > Math.abs(strvec.z())) {
+                            mindist = -mindist;
+                        }
+//                        nearest = str;
+//                        nearestvec = strvec;
+                    }
+                }
+            }
+        }
+//        System.out.println(clvec);
+//        System.out.println(nearestvec);
+        return mindist;
+    }
 }
SVNspam 0.1