Author: [log in to unmask] Date: Wed Dec 9 14:48:02 2015 New Revision: 4035 Log: add relation, use new GBL refitter Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim Wed Dec 9 14:48:02 2015 @@ -51,7 +51,6 @@ ReconstructedParticle types are properly set. --> <driver name="MergeTrackCollections"/> - <driver name="GBLOutputDriver" /> <driver name="GBLRefitterDriver" /> <driver name="TrackDataDriver" /> <driver name="ReconParticleDriver" /> @@ -134,8 +133,7 @@ <ecalClusterCollectionName>EcalClustersCorr</ecalClusterCollectionName> <trackCollectionNames>MatchedTracks GBLTracks</trackCollectionNames> </driver> - <driver name="GBLOutputDriver" type="org.hps.recon.tracking.gbl.GBLOutputDriver"/> - <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.HpsGblRefitter"/> + <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.GBLRefitterDriver"/> <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver"> <outputFilePath>${outputFile}.slcio</outputFilePath> </driver> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC.lcsim Wed Dec 9 14:48:02 2015 @@ -53,7 +53,6 @@ ReconstructedParticle types are properly set. --> <driver name="MergeTrackCollections"/> - <driver name="GBLOutputDriver" /> <driver name="GBLRefitterDriver" /> <driver name="TrackDataDriver" /> <driver name="ReconParticleDriver" /> @@ -119,8 +118,7 @@ <rmsTimeCut>8.0</rmsTimeCut> </driver> <driver name="MergeTrackCollections" type="org.hps.recon.tracking.MergeTrackCollections" /> - <driver name="GBLOutputDriver" type="org.hps.recon.tracking.gbl.GBLOutputDriver"/> - <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.HpsGblRefitter"/> + <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.GBLRefitterDriver"/> <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> <ecalCollectionName>EcalCalHits</ecalCollectionName> <fixShapeParameter>true</fixShapeParameter> 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 Wed Dec 9 14:48:02 2015 @@ -16,7 +16,6 @@ import org.lcsim.event.TrackState; import org.lcsim.event.TrackerHit; import org.lcsim.event.base.BaseLCRelation; -import org.lcsim.event.base.BaseRelationalTable; import org.lcsim.fit.helicaltrack.HelicalTrackCross; import org.lcsim.fit.helicaltrack.HelicalTrackHit; import org.lcsim.fit.helicaltrack.HelicalTrackStrip; @@ -34,7 +33,7 @@ public final class TrackDataDriver extends Driver { /** logger **/ - private static Logger LOGGER = Logger.getLogger(TrackDataDriver.class.getPackage().getName()); + private static final Logger LOGGER = Logger.getLogger(TrackDataDriver.class.getPackage().getName()); /** The B field map */ @@ -107,6 +106,7 @@ * * @param detector LCSim {@link Detector} geometry */ + @Override protected void detectorChanged(Detector detector) { // Get the field map from the detector object @@ -121,6 +121,7 @@ * * @param event : LCSim event */ + @Override protected void process(EventHeader event) { // Check if the event contains a collection of the type Track. If it @@ -135,15 +136,11 @@ // Get the collection of LCRelations relating RotatedHelicalTrackHits to // HelicalTrackHits - List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, ROTATED_HTH_REL_COL_NAME); - BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, - RelationalTable.Weighting.UNWEIGHTED); - hthToRotatedHth.addRelations(rotatedHthToHthRelations); RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); - List<HelicalTrackHit> rotatedHths = event.get(HelicalTrackHit.class, ROTATED_HTH_COL_NAME); +// List<HelicalTrackHit> rotatedHths = event.get(HelicalTrackHit.class, ROTATED_HTH_COL_NAME); // Create a container that will be used to store all TrackData objects. List<TrackData> trackDataCollection = new ArrayList<TrackData>(); @@ -159,21 +156,21 @@ // residuals List<LCRelation> trackToTrackResidualsRelations = new ArrayList<LCRelation>(); - double xResidual = 0; - double yResidual = 0; - - float totalT0 = 0; - float totalHits = 0; - float trackTime = 0; + double xResidual; + double yResidual; + + float totalT0; + float totalHits; + float trackTime; int trackerVolume = -1; - boolean isFirstHit = true; - - HpsSiSensor sensor = null; - Hep3Vector stereoHitPosition = null; - Hep3Vector trackPosition = null; - HelicalTrackHit helicalTrackHit = null; + boolean isFirstHit; + + HpsSiSensor sensor; + Hep3Vector stereoHitPosition; + Hep3Vector trackPosition; + HelicalTrackHit helicalTrackHit; List<Double> t0Residuals = new ArrayList<Double>(); List<Double> trackResidualsX = new ArrayList<Double>(); @@ -198,7 +195,10 @@ stereoLayers.clear(); isFirstHit = true; - // +// TrackState trackStateForResiduals = TrackUtils.getTrackStateAtLocation(track, TrackState.AtLastHit); +// if (trackStateForResiduals == null ) trackStateForResiduals= TrackUtils.getTrackStateAtLocation(track, TrackState.AtIP); + TrackState trackStateForResiduals = TrackUtils.getTrackStateAtLocation(track, TrackState.AtIP); + // Change the position of a HelicalTrackHit to be the corrected // one. // FIXME: Now that multiple track collections are being used, @@ -216,7 +216,7 @@ // Extrapolate the track to the stereo hit position and // calculate track residuals stereoHitPosition = ((HelicalTrackHit) rotatedStereoHit).getCorrectedPosition(); - trackPosition = TrackUtils.extrapolateTrack(track, stereoHitPosition.x()); + trackPosition = TrackUtils.extrapolateTrack(trackStateForResiduals, stereoHitPosition.x()); xResidual = trackPosition.x() - stereoHitPosition.y(); yResidual = trackPosition.y() - stereoHitPosition.z(); trackResidualsX.add(xResidual); @@ -230,7 +230,7 @@ // Get the HelicalTrackHit corresponding to the // RotatedHelicalTrackHit associated with a track - helicalTrackHit = (HelicalTrackHit) hthToRotatedHth.from(rotatedStereoHit); + helicalTrackHit = (HelicalTrackHit) hitToRotated.from(rotatedStereoHit); ((HelicalTrackHit) rotatedStereoHit).setPosition(stereoHitPosition.v()); stereoHitPosition = CoordinateTransformations.transformVectorToDetector(stereoHitPosition); helicalTrackHit.setPosition(stereoHitPosition.v()); @@ -261,18 +261,7 @@ // Extrapolate the track to the face of the Ecal and get the TrackState if( TrackType.isGBL(track.getType())) { - TrackState stateLast = null; - TrackState stateIP = null; - for(int ist= 0; ist < track.getTrackStates().size(); ist++) { - if( track.getTrackStates().get(ist).getLocation() == TrackState.AtLastHit ) - stateLast = track.getTrackStates().get(ist); - if( track.getTrackStates().get(ist).getLocation() == TrackState.AtIP ) - stateIP = track.getTrackStates().get(ist); - } - if( stateLast == null) - throw new RuntimeException("last hit track state for GBL track was not found"); -// TrackState stateEcal = TrackUtils.extrapolateTrackUsingFieldMap(stateLast, extStartPos, ecalPosition, stepSize, bFieldMap); -// track.getTrackStates().add(stateEcal); + TrackState stateIP = TrackUtils.getTrackStateAtLocation(track, TrackState.AtIP); if( stateIP == null) throw new RuntimeException("IP track state for GBL track was not found"); TrackState stateEcalIP = TrackUtils.extrapolateTrackUsingFieldMap(stateIP, extStartPos, ecalPosition, stepSize, bFieldMap); Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Wed Dec 9 14:48:02 2015 @@ -1306,15 +1306,25 @@ return new Line(r0, phi, lambda); } - public static TrackState getTrackStateAtECal(Track trk) { + /** + * Port of Track.getTrackState(int location) from the C++ LCIO API. + * @param trk A track. + * @param location A TrackState location constant + * @return The first matching TrackState; null if none is found. + */ + public static TrackState getTrackStateAtLocation(Track trk, int location) { for (TrackState state : trk.getTrackStates()) { - if (state.getLocation() == TrackState.AtCalorimeter) { + if (state.getLocation() == location) { return state; } } return null; } + public static TrackState getTrackStateAtECal(Track trk) { + return getTrackStateAtLocation(trk, TrackState.AtCalorimeter); + } + public static Hep3Vector getBField(Detector detector) { return detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 500.0)); } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java Wed Dec 9 14:48:02 2015 @@ -13,11 +13,9 @@ import java.util.logging.Logger; import org.lcsim.event.EventHeader; -import org.lcsim.event.LCRelation; import org.lcsim.event.RelationalTable; import org.lcsim.event.Track; import org.lcsim.event.TrackerHit; -import org.lcsim.event.base.BaseRelationalTable; import org.lcsim.event.base.BaseTrack; import org.lcsim.fit.helicaltrack.HelicalTrackHit; import org.lcsim.geometry.Detector; @@ -65,7 +63,7 @@ private double rmsTimeCut = -1; private boolean rejectUncorrectedHits = true; private boolean rejectSharedHits = false; - + public TrackerReconDriver() { } @@ -165,8 +163,9 @@ // // 1) Driver to run Seed Tracker. // - if (!strategyResource.startsWith("/")) + if (!strategyResource.startsWith("/")) { strategyResource = "/org/hps/recon/tracking/strategies/" + strategyResource; + } List<SeedStrategy> sFinallist = StrategyXMLUtils.getStrategyListFromInputStream(this.getClass().getResourceAsStream(strategyResource)); SeedTracker stFinal = new SeedTracker(sFinallist, this._useHPSMaterialManager, this.includeMS); stFinal.setApplySectorBinning(_applySectorBinning); @@ -177,14 +176,16 @@ stFinal.setInputCollectionName(stInputCollectionName); stFinal.setTrkCollectionName(trackCollectionName); stFinal.setBField(bfield); - if (debug) + if (debug) { stFinal.setDiagnostics(new SeedTrackerDiagnostics()); + } // stFinal.setSectorParams(false); //this doesn't actually seem to do anything stFinal.setSectorParams(1, 10000); add(stFinal); - if (rmsTimeCut > 0) + if (rmsTimeCut > 0) { stFinal.setTrackCheck(new HitTimeTrackCheck(rmsTimeCut)); + } } /** @@ -198,10 +199,11 @@ // Debug printouts. if (debug) { - if (event.hasCollection(HelicalTrackHit.class, stInputCollectionName)) + if (event.hasCollection(HelicalTrackHit.class, stInputCollectionName)) { System.out.println(this.getClass().getSimpleName() + ": The HelicalTrackHit collection " + stInputCollectionName + " has " + event.get(HelicalTrackHit.class, stInputCollectionName).size() + " hits."); - else + } else { System.out.println(this.getClass().getSimpleName() + ": No HelicalTrackHit collection for this event"); + } // Check for Tracks. List<Track> tracks = event.get(Track.class, trackCollectionName); System.out.println(this.getClass().getSimpleName() + ": The Track collection " + trackCollectionName + " has " + tracks.size() + " tracks."); @@ -236,27 +238,13 @@ } if (rejectSharedHits) { - - RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); - List<LCRelation> hitrelations = event.get(LCRelation.class, "HelicalTrackHitRelations"); - for (LCRelation relation : hitrelations) { - if (relation != null && relation.getFrom() != null && relation.getTo() != null) { - hittostrip.add(relation.getFrom(), relation.getTo()); - } - } - - RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); - List<LCRelation> rotaterelations = event.get(LCRelation.class, "RotatedHelicalTrackHitRelations"); - for (LCRelation relation : rotaterelations) { - if (relation != null && relation.getFrom() != null && relation.getTo() != null) { - hittorotated.add(relation.getFrom(), relation.getTo()); - } - } + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); Map<TrackerHit, List<Track>> stripsToTracks = new HashMap<TrackerHit, List<Track>>(); for (Track track : tracks) { for (TrackerHit hit : track.getTrackerHits()) { - Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit)); + Collection<TrackerHit> htsList = hitToStrips.allFrom(hitToRotated.from(hit)); for (TrackerHit strip : htsList) { List<Track> sharedTracks = stripsToTracks.get(strip); if (sharedTracks == null) { @@ -272,7 +260,7 @@ while (iter.hasNext()) { Track track = iter.next(); for (TrackerHit hit : track.getTrackerHits()) { - Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit)); + Collection<TrackerHit> htsList = hitToStrips.allFrom(hitToRotated.from(hit)); for (TrackerHit strip : htsList) { List<Track> sharedTracks = stripsToTracks.get(strip); if (sharedTracks.size() > 1) { @@ -304,8 +292,9 @@ * @param tracks The list of <code>Track</code> objects. */ private void setTrackType(List<Track> tracks) { - for (Track track : tracks) + for (Track track : tracks) { ((BaseTrack) track).setTrackType(BaseTrack.TrackType.Y_FIELD.ordinal()); + } } @Override Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java Wed Dec 9 14:48:02 2015 @@ -28,6 +28,7 @@ private String inputCollectionName = "MatchedTracks"; private String outputCollectionName = "GBLTracks"; + private String trackRelationCollectionName = "MatchedToGBLTrackRelations"; private double bfield; private final MultipleScattering _scattering = new MultipleScattering(new MaterialSupervisor()); @@ -68,16 +69,17 @@ RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); List<Track> refittedTracks = new ArrayList<Track>(); + List<LCRelation> trackRelations = new ArrayList<LCRelation>(); + List<GBLKinkData> kinkDataCollection = new ArrayList<GBLKinkData>(); - List<LCRelation> kinkDataRelations = new ArrayList<LCRelation>(); Map<Track, Track> inputToRefitted = new HashMap<Track, Track>(); for (Track track : tracks) { - Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, track.getType(), _scattering, bfield - ); + Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, track.getType(), _scattering, bfield); // newTrack.getFirst(). refittedTracks.add(newTrack.getFirst()); + trackRelations.add(new BaseLCRelation(track, newTrack.getFirst())); inputToRefitted.put(track, newTrack.getFirst()); kinkDataCollection.add(newTrack.getSecond()); @@ -141,6 +143,7 @@ // Put the tracks back into the event and exit int flag = 1 << LCIOConstants.TRBIT_HITS; event.put(outputCollectionName, refittedTracks, Track.class, flag); + event.put(trackRelationCollectionName, trackRelations, LCRelation.class, 0); event.put(GBLKinkData.DATA_COLLECTION, kinkDataCollection, GBLKinkData.class, 0); event.put(GBLKinkData.DATA_RELATION_COLLECTION, kinkDataRelations, LCRelation.class, 0); }