Author: [log in to unmask] Date: Fri Aug 21 17:42:33 2015 New Revision: 3396 Log: Formatting and documentation. Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java Fri Aug 21 17:42:33 2015 @@ -1,7 +1,6 @@ package org.hps.recon.tracking; import hep.physics.vec.Hep3Vector; -import hep.physics.vec.VecOp; import java.util.ArrayList; import java.util.List; @@ -21,51 +20,45 @@ import org.lcsim.util.Driver; /** + * Driver used to persist additional {@link Track} information via a {@link GenericObject}. * - * @author Omar Moreno <[log in to unmask]> - * @author Sho Uemura <[log in to unmask]> - * + * @author <a href="mailto:[log in to unmask]">Omar Moreno</a> + * @author <a href="[log in to unmask]">Sho Uemura</a> */ -public class TrackDataDriver extends Driver { - - // Collection Names - String trackCollectionName = "MatchedTracks"; - String trackResidualsCollectionName = "TrackResiduals"; - String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations"; - String rotatedHthCollectionName = "RotatedHelicalTrackHits"; - String trackResidualsRelationsColName = "TrackResidualsRelations"; +public final class TrackDataDriver extends Driver { + + /** Collection Names */ + private String trackResidualsCollectionName = "TrackResiduals"; + private String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations"; + private String rotatedHthCollectionName = "RotatedHelicalTrackHits"; + private String trackResidualsRelationsColName = "TrackResidualsRelations"; /** Default constructor */ public TrackDataDriver() { } - - public void setTrackCollectionName(String name) { - this.trackCollectionName = name; - } - + + /** + * Method called by the framework to process the event. + * + * @param event : LCSim event + */ protected void process(EventHeader event) { - // Check if the event contains a collection of the type Track. If it + // Check if the event contains a collection of the type Track. If it // doesn't skip the event. - if (!event.hasCollection(Track.class)) return; - - // If the event doesn't contain a collection of tracks, skip it. - //if (!event.hasCollection(Track.class, trackCollectionName)) { - // return; - //} - - // Get all collections of the type Track from the event. This is + if (!event.hasCollection(Track.class)) + return; + + // Get all collections of the type Track from the event. This is // required since the event contains a track collection for each of the // different tracking strategies. List<List<Track>> trackCollections = event.get(Track.class); - - // 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); - BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); + BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, + RelationalTable.Weighting.UNWEIGHTED); hthToRotatedHth.addRelations(rotatedHthToHthRelations); RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); @@ -83,7 +76,8 @@ // 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 + // Create a collection of LCRelations between a track and the track + // residuals List<LCRelation> trackToTrackResidualsRelations = new ArrayList<LCRelation>(); double xResidual = 0; @@ -109,134 +103,103 @@ List<Integer> stereoLayers = new ArrayList<Integer>(); // Loop over each of the track collections retrieved from the event - for (List<Track> tracks : trackCollections) { - - // 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(); - isFirstHit = true; - - // - // 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); + for (List<Track> tracks : trackCollections) { + + // 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(); + isFirstHit = true; // - // Change the persisted position of both RotatedHelicalTrackHits - // and HelicalTrackHits to the corrected position. + // Change the position of a HelicalTrackHit to be the corrected + // one. + // FIXME: Now that multiple track collections are being used, + // which track should be used to apply the correction? + // The best track from each of the collections? + // How is the "best track" defined? --OM // - // 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++; - - if (isFirstHit) { - sensor = (HpsSiSensor) ((RawTrackerHit) cluster.rawhits().get(0)).getDetectorElement(); - if (sensor.isTopLayer()) { - trackerVolume = 0; - } else if (sensor.isBottomLayer()) { - trackerVolume = 1; + // 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++; + + if (isFirstHit) { + sensor = (HpsSiSensor) ((RawTrackerHit) cluster.rawhits().get(0)).getDetectorElement(); + if (sensor.isTopLayer()) { + trackerVolume = 0; + } else if (sensor.isBottomLayer()) { + trackerVolume = 1; + } + isFirstHit = false; } - isFirstHit = false; } } + + // The track time is the mean t0 of hits on a track + trackTime = totalT0 / totalHits; + + // Calculate the track isolation constants for each of the + // layers + Double[] isolations = TrackUtils.getIsolations(track, hitToStrips, hitToRotated); + double qualityArray[] = new double[isolations.length]; + for (int i = 0; i < isolations.length; i++) { + qualityArray[i] = isolations[i] == null ? -99999999.0 : isolations[i]; + } + + // Create a new TrackData object and add it to the event + TrackData trackData = new TrackData(trackerVolume, trackTime, qualityArray); + trackDataCollection.add(trackData); + trackDataRelations.add(new BaseLCRelation(trackData, track)); + + // Create a new TrackResidualsData object and add it to the event + TrackResidualsData trackResiduals = new TrackResidualsData((int) trackerVolume, stereoLayers, + trackResidualsX, trackResidualsY); + trackResidualsCollection.add(trackResiduals); + trackToTrackResidualsRelations.add(new BaseLCRelation(trackResiduals, track)); } - - // The track time is the mean t0 of hits on a track - trackTime = totalT0 / totalHits; - Double[] isolations = TrackUtils.getIsolations(track, hitToStrips, hitToRotated); - -// 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); -// } -// } -// } - double qualityArray[] = new double[isolations.length]; - for (int i = 0; i < isolations.length; i++) { - qualityArray[i] = isolations[i] == null ? -99999999.0 : isolations[i]; - } - TrackData trackData = new TrackData(trackerVolume, trackTime, qualityArray); - trackDataCollection.add(trackData); - trackDataRelations.add(new BaseLCRelation(trackData, track)); - - TrackResidualsData trackResiduals = new TrackResidualsData((int) trackerVolume, stereoLayers, trackResidualsX, trackResidualsY); - trackResidualsCollection.add(trackResiduals); - trackToTrackResidualsRelations.add(new BaseLCRelation(trackResiduals, track)); } - } + + // Add all collections to the event event.put(TrackData.TRACK_DATA_COLLECTION, trackDataCollection, TrackTimeData.class, 0); event.put(TrackData.TRACK_DATA_RELATION_COLLECTION, trackDataRelations, LCRelation.class, 0); event.put(trackResidualsCollectionName, trackResidualsCollection, TrackResidualsData.class, 0); event.put(trackResidualsRelationsColName, trackToTrackResidualsRelations, 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; -// } }