Author: [log in to unmask] Date: Fri Oct 2 16:25:44 2015 New Revision: 3756 Log: extrapolation stuff Added: java/trunk/users/src/main/java/org/hps/users/phansson/TrackExtrapolationTestDriver.java Added: java/trunk/users/src/main/java/org/hps/users/phansson/TrackExtrapolationTestDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/TrackExtrapolationTestDriver.java (added) +++ java/trunk/users/src/main/java/org/hps/users/phansson/TrackExtrapolationTestDriver.java Fri Oct 2 16:25:44 2015 @@ -0,0 +1,162 @@ +/** + * + */ +package org.hps.users.phansson; + + +import hep.aida.IAnalysisFactory; +import hep.aida.IHistogram1D; +import hep.aida.IHistogram2D; +import hep.aida.IPlotter; +import hep.aida.IPlotterStyle; +import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Vector; +import hep.physics.vec.VecOp; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.hps.recon.tracking.TrackUtils; +import org.hps.util.BasicLogFormatter; +import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.event.EventHeader; +import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.Track; +import org.lcsim.event.TrackState; +import org.lcsim.event.TrackerHit; +import org.lcsim.fit.helicaltrack.HelicalTrackHit; +import org.lcsim.geometry.Detector; +import org.lcsim.geometry.FieldMap; +import org.lcsim.geometry.compact.converter.HPSTrackerBuilder; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; +import org.lcsim.util.log.LogUtil; + +/** + * @author Per Hansson Adrian <[log in to unmask]> + * + */ +public class TrackExtrapolationTestDriver extends Driver { + private static Logger logger = LogUtil.create(TrackExtrapolationTestDriver.class.getName(), new BasicLogFormatter(), Level.INFO); + private AIDA aida = AIDA.defaultInstance(); + IHistogram1D res_trackPos_Y; + IHistogram1D res_trackPos_X; + IHistogram2D res_trackPos_Y_vs_p; + IHistogram2D res_trackPos_X_vs_p; + private FieldMap bFieldMap; + private double stepSize = 1.0; //mm + /** + * + */ + public TrackExtrapolationTestDriver() { + // TODO Auto-generated constructor stub + } + + @Override + protected void detectorChanged(Detector arg0) { + + // Get the field map from the detector object + bFieldMap = arg0.getFieldMap(); + + + aida.tree().cd("/"); + IAnalysisFactory fac = aida.analysisFactory(); + IPlotter plotter; + plotter = fac.createPlotterFactory().create("Residual"); + IPlotterStyle style = plotter.style(); + style.dataStyle().fillStyle().setColor("yellow"); + style.dataStyle().errorBarStyle().setVisible(false); + plotter.createRegions(2, 2); + res_trackPos_Y = aida.histogram1D("res_trackPos_Y", 50, -0.1, 0.1); + res_trackPos_X = aida.histogram1D("res_trackPos_X", 50, -2.5, 2.5); + res_trackPos_Y_vs_p = aida.histogram2D("res_trackPos_Y_vs_p", 50,0.1, 1.4, 50, -0.1, 0.1); + res_trackPos_X_vs_p = aida.histogram2D("res_trackPos_X_vs_p", 50,0.1, 1.4, 50, -2.5, 2.5); + plotter.region(0).plot(res_trackPos_Y); + plotter.region(1).plot(res_trackPos_X); + plotter.region(2).plot(res_trackPos_Y_vs_p); + plotter.region(3).plot(res_trackPos_X_vs_p); + plotter.show(); + } + + protected void process(EventHeader event) { + + if(!event.hasCollection(Track.class)) + return; + + List<List<Track>> trackCollections = event.get(Track.class); + + for(List<Track> tracks : trackCollections) { + + for (Track track : tracks) { + + if(track.getTrackerHits().size() != 6) + continue; + + + + + // find hit on each layer + Map<Integer, TrackerHit> hits = new HashMap<Integer, TrackerHit>(); + for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { + RawTrackerHit rawhit = (RawTrackerHit) rotatedStereoHit.getRawHits().get(0); + HpsSiSensor sensor = (HpsSiSensor) rawhit.getDetectorElement(); + int layer = HPSTrackerBuilder.getLayerFromVolumeName(sensor.getName()); + hits.put(layer, rotatedStereoHit); + } + + Map<Integer, Hep3Vector> layerTrackPos = new HashMap<Integer, Hep3Vector>(); + Map<Integer, Hep3Vector> layerTrackPos3DField = new HashMap<Integer, Hep3Vector>(); + + for(Map.Entry<Integer, TrackerHit> entry : hits.entrySet()) { + int layer = entry.getKey(); + Hep3Vector stereoHitPosition = ((HelicalTrackHit) entry.getValue()).getCorrectedPosition(); + Hep3Vector prevStereoHitPosition = null; + if( hits.containsKey(layer-1)) { + prevStereoHitPosition = ((HelicalTrackHit) hits.get(layer -1)).getCorrectedPosition(); + } + Hep3Vector trackPosition = TrackUtils.extrapolateHelixToXPlane(track, stereoHitPosition.x()); + Hep3Vector trackPosition3DField = null; + TrackState trackState3DField = null; + if( prevStereoHitPosition != null) { + trackState3DField = TrackUtils.extrapolateTrackUsingFieldMap(track, prevStereoHitPosition.x(), stereoHitPosition.x(), stepSize, bFieldMap); + trackPosition3DField = new BasicHep3Vector(trackState3DField.getReferencePoint()); + } + layerTrackPos.put(layer, trackPosition); + layerTrackPos3DField.put(layer, trackPosition3DField); + + logger.fine("layer " + layer + " stereohitposition " + stereoHitPosition.toString()); + if( prevStereoHitPosition != null) + logger.fine("prevStereoHitPosition " + prevStereoHitPosition.toString()); + logger.fine("trackPos " + layerTrackPos.get(layer).toString()); + if( trackPosition3DField != null) { + logger.fine("trackPosition3DField " + trackPosition3DField.toString()); + } else { + logger.fine("trackPosition3DField no prev layer "); + } + + if(layer == 6 ) { + res_trackPos_Y.fill(VecOp.sub(trackPosition, trackPosition3DField).z()); + res_trackPos_X.fill(VecOp.sub(trackPosition, trackPosition3DField).y()); + res_trackPos_Y_vs_p.fill(track.getTrackStates().get(0).getMomentum()[0], VecOp.sub(trackPosition, trackPosition3DField).z()); + res_trackPos_X_vs_p.fill(track.getTrackStates().get(0).getMomentum()[0], VecOp.sub(trackPosition, trackPosition3DField).y()); + } + } + + + + + + } + + + + + } + + + } + +}