Author: [log in to unmask] Date: Fri Aug 12 14:27:22 2016 New Revision: 4464 Log: savepoint Added: java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/ECal_GBLRefitterDriver.java Modified: java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/ECAL_HelicalTrackHitDriver.java java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java Modified: java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/ECAL_HelicalTrackHitDriver.java ============================================================================= --- java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/ECAL_HelicalTrackHitDriver.java (original) +++ java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/ECAL_HelicalTrackHitDriver.java Fri Aug 12 14:27:22 2016 @@ -41,7 +41,13 @@ import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType; // For adding ECal hits to HelicalTrackHits -import org.hps.recon.tracking.ecal.HelicalTrack3DHit; +//import org.hps.recon.tracking.ecal.HelicalTrack3DHit; +import org.lcsim.fit.helicaltrack.HelicalTrackHit; +import org.lcsim.fit.helicaltrack.HelicalTrack3DHit; +import org.lcsim.geometry.subdetector.HPSEcal3; +import org.lcsim.geometry.subdetector.HPSEcal3.NeighborMap; +import org.lcsim.event.CalorimeterHit; +import org.lcsim.event.Cluster; /** * Driver used to create stereo hits from clusters. @@ -63,6 +69,7 @@ private double maxDt = -99; // max time difference between the two hits in a cross private double clusterAmplitudeCut = -99; // cluster amplitude cut private String _subdetectorName = "Tracker"; + // private String _subdetectorName2 = ""; private final Map<String, String> _stereomap = new HashMap<String, String>(); private List<SvtStereoLayer> stereoLayers = null; private final List<String> _colnames = new ArrayList<String>(); @@ -71,6 +78,10 @@ private final String _axialname = "AxialTrackHits"; private final String _axialmcrelname = "AxialTrackHitsMCRelations"; private boolean rejectGhostHits = false; + + // ECal cluster collection in event to create helicalTrackHits from + private final String _ecalclustername = "EcalClustersCorr"; + public enum LayerGeometryType { @@ -219,8 +230,8 @@ /////// For making HelicalTrackHits out of ECal hits //***** - List<HelicalTrack3DHit> ecalhits = new ArrayList<>(); - List<LCRelation> ecalmcrelations = new ArrayList<LCRelation>(); + List<HelicalTrack3DHit> helicalecalhits = new ArrayList<>(); + List<LCRelation> helicalecalmcrelations = new ArrayList<LCRelation>(); //***** //////////////// @@ -288,9 +299,9 @@ } else { // If not a 1D strip hit, make a pixel hit // This should be removed as it is never used. - HelicalTrackHit hit3d = this.makeDigi3DHit(hit); - helhits.add(hit3d); - hitrelations.add(new MyLCRelation(hit3d, hit)); + // HelicalTrackHit hit3d = this.makeDigi3DHit(hit); + // helhits.add(hit3d); + // hitrelations.add(new MyLCRelation(hit3d, hit)); } } @@ -460,23 +471,66 @@ System.out.printf("%s: added %d stereo hits from %s collection \n", this.getClass().getSimpleName(), helicalTrackCrosses.size(), _colname); } - /* + /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * * Look for ECal hits in the event to add to HelicalTrackHits * These are HelicalTrack3DHits rather than HelicalTrack2DHits * **/ - // if (!event.hasCollection(CalorimeterHit.class, _colname)) { - // if (_debug) { - // System.out.println("Event: " + event.getRunNumber() + " does not contain the collection " + _colname); - // } - // continue; - // } - - - - - - +// if (!event.hasCollection(Cluster.class, _colname)) { +// if (_debug) { +// System.out.println("Event: " + event.getRunNumber() + " does not contain the collection " + _colname); +// } +// continue; +// } + + // List<Cluster> clusters = event.get(Cluster.class, _colname); + +// List<Cluster> clusters = event.get(Cluster.class, _ecalclustername); +// if (_debug) { +// System.out.printf("%s: found %d Clusters\n", this.getClass().getSimpleName(), clusters.size()); +// } + +// for (Cluster EcalCluster : clusters) { + +// HelicalTrackHit ecal_hit3d = this.makeEcal3DHit(EcalCluster); +// helhits.add(ecal_hit3d); +// hitrelations.add(new MyLCRelation(ecal_hit3d, EcalCluster)); +// } + + + + /* + List<CalorimeterHit> ecalhitlist; + for (Cluster cluster : clusters) { + + if(cluster.getCalorimeterHits().size() != isEmpty()){ + + + + + } + } + List<CalorimeterHit> ecalhitlist = event.get(Cluster.class, _colname).getCalorimeterHits(); + // List<Cluster> ecalhitlist = event.get(Cluster.class, _colname); + if (_debug) { + System.out.printf("%s: found %d Clusters\n", this.getClass().getSimpleName(), ecalhitlist.size()); + } + + for (Cluster ecal_hit : ecalhitlist) { + + HelicalTrackHit ecal_hit3d = this.makeEcal3DHit(ecal_hit); + helhits.add(ecal_hit3d); + hitrelations.add(new MyLCRelation(ecal_hit3d, ecal_hit)); + } + */ + + /* + * + * ECAL HITS !!!!!!!!!!!!!!! + * + * + **/ @@ -570,6 +624,30 @@ } } + + /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * Make HelicalTrack3DHits from ECal Clusters + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +// private HelicalTrackHit makeEcal3DHit(Cluster c) { +//private void makeEcal3DHit(Cluster c) { + + // double z1 = h.getHitSegment().getEndPoint().x(); + // double z2 = h.getHitSegment().getStartPoint().x();//x is the non-bend direction in the JLAB frame + // double zmin = Math.min(z1, z2); TODO: DETERMINE WHAT THIS NEEDS TO BE SET TO, USING THE ACTUAL GEOMETRY CLASSES + // double zmax = Math.max(z1, z2); +// IDetectorElement de = c.getCalorimeterHits().get(0).getDetectorElement(); + +//HelicalTrack3DHit ecal_hit = new HelicalTrack3DHit(); +// HelicalTrackHit ecal_hit = new HelicalTrackHit(c.getCalorimeterHits().get(0).getPositionVec(), +// Matrix(c.getPositionError()), c.getEnergy(), c.getCalorimeterHits().get(0).getTime(), +// null, _ID.getName(de), _ID.getLayer(de), _ID.getBarrelEndcapFlag(de)); + +// return ecal_hit; +// } /* * Make HelicalTrack2DHits from SiTrackerHitStrip1D...note that these HelicalTrack2DHits Added: java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/ECal_GBLRefitterDriver.java ============================================================================= --- java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/ECal_GBLRefitterDriver.java (added) +++ java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/ECal_GBLRefitterDriver.java Fri Aug 12 14:27:22 2016 @@ -0,0 +1,184 @@ +package org.hps.recon.tracking.gbl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.commons.math3.util.Pair; +import org.hps.recon.tracking.MaterialSupervisor; +import org.hps.recon.tracking.MultipleScattering; +import org.hps.recon.tracking.TrackUtils; +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.BaseLCRelation; +import org.lcsim.geometry.Detector; +import org.lcsim.lcio.LCIOConstants; +import org.lcsim.util.Driver; + +// 4 ECal +import org.lcsim.event.Cluster; + + +/** + * A Driver which refits tracks using GBL w/ ECal measurements (taken from ECalClustersCorr). Does not require GBL collections to + * be present in the event. + */ +public class ECal_GBLRefitterDriver extends Driver { + + private String inputCollectionName = "MatchedTracks"; + private String ECalCollectionName = "EcalClustersCorr"; + private String outputCollectionName = "GBLTracks"; + private String trackRelationCollectionName = "MatchedToGBLTrackRelations"; + + private double bfield; + private final MultipleScattering _scattering = new MultipleScattering(new MaterialSupervisor()); + private boolean mergeTracks = false; + + public void setInputCollectionName(String inputCollectionName) { + this.inputCollectionName = inputCollectionName; + } + + public void setOutputCollectionName(String outputCollectionName) { + this.outputCollectionName = outputCollectionName; + } + + /** + * Merge tracks with overlapping hit content. Right now nothing actually + * happens to the merged tracks; this is just for testing. + * + * @param mergeTracks default to false + */ + public void setMergeTracks(boolean mergeTracks) { + this.mergeTracks = mergeTracks; + } + + @Override + protected void detectorChanged(Detector detector) { + bfield = Math.abs(TrackUtils.getBField(detector).magnitude()); + _scattering.getMaterialManager().buildModel(detector); + _scattering.setBField(bfield); // only absolute of B is needed as it's used for momentum calculation only + } + + @Override + protected void process(EventHeader event) { + if (!event.hasCollection(Track.class, inputCollectionName)) { + return; + } + + List<Track> tracks = event.get(Track.class, inputCollectionName); + + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + 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) { + + // If the event has ECal has ECal clusters, use them 4 track fitting! + if (event.hasCollection(Cluster.class, ECalCollectionName)) { + + List<Cluster> clusters = event.get(Cluster.class, ECalCollectionName); // Get Clusters from the event to use in GBL + + // alternate constructor to incorporate clusters into track refit + Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), clusters, 5, track.getType(), _scattering, bfield); + + refittedTracks.add(newTrack.getFirst()); + trackRelations.add(new BaseLCRelation(track, newTrack.getFirst())); + inputToRefitted.put(track, newTrack.getFirst()); + + kinkDataCollection.add(newTrack.getSecond()); + kinkDataRelations.add(new BaseLCRelation(newTrack.getSecond(), newTrack.getFirst())); + + + }else{ /*..and if no clusters are in the event, just do the standard GBL track fitting~*/ + + List<Cluster> clusters; + Pair<Track, GBLKinkData> newTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, track.getType(), _scattering, bfield); + + refittedTracks.add(newTrack.getFirst()); + trackRelations.add(new BaseLCRelation(track, newTrack.getFirst())); + inputToRefitted.put(track, newTrack.getFirst()); + + kinkDataCollection.add(newTrack.getSecond()); + kinkDataRelations.add(new BaseLCRelation(newTrack.getSecond(), newTrack.getFirst())); + + } +// newTrack.getFirst(). + } + + if (mergeTracks) { + List<Track> mergedTracks = new ArrayList<Track>(); + + for (Track track : refittedTracks) { + List<TrackerHit> trackHth = track.getTrackerHits(); + otherTrackLoop: + for (Track otherTrack : refittedTracks) { + if (track == otherTrack) { + continue; + } + + Set<TrackerHit> allHth = new HashSet<TrackerHit>(otherTrack.getTrackerHits()); + allHth.addAll(trackHth); +// if (allHth.size() == trackHth.size()) { +// continue; +// } + + boolean[] hasHit = new boolean[6]; + + for (TrackerHit hit : allHth) { + int layer = (TrackUtils.getLayer(hit) - 1) / 2; + if (hasHit[layer]) { + continue otherTrackLoop; + } + hasHit[layer] = true; + } + for (Track mergedTrack : mergedTracks) { + if (mergedTrack.getTrackerHits().containsAll(allHth)) { + continue otherTrackLoop; + } + } + + Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, track.getType(), _scattering, bfield); + mergedTracks.add(mergedTrack.getFirst()); +// System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2()); +// mergedTrackToTrackList.put(mergedTrack, new ArrayList<Track>()); + } + } + + for (Track mergedTrack : mergedTracks) { + List<Track> subTracks = new ArrayList<Track>(); + Set<TrackerHit> trackHth = new HashSet<TrackerHit>(mergedTrack.getTrackerHits()); + for (Track track : refittedTracks) { + if (trackHth.containsAll(track.getTrackerHits())) { + subTracks.add(track); + } + } + System.out.format("%f:\t", mergedTrack.getChi2()); + for (Track subTrack : subTracks) { + System.out.format("%f (%d)\t", subTrack.getChi2(), subTrack.getTrackerHits().size()); + } + System.out.println(); + } + } + // 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); + } +} Modified: java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java ============================================================================= --- java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java (original) +++ java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java Fri Aug 12 14:27:22 2016 @@ -38,6 +38,10 @@ import org.lcsim.fit.helicaltrack.HelixUtils; import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D; import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType; + +// 4 ECal +import org.lcsim.event.Cluster; + /** * Utilities that create track objects from fitted GBL trajectories. @@ -292,6 +296,7 @@ * (not covariance) * @param stripHits Strip hits to be used for the GBL fit. Does not need to * be in sorted order. + * @param clusters ECal clusters to be used in GBL fit * @param hth Stereo hits for the track's hit list (these are not used in * the GBL fit). Does not need to be in sorted order. * @param nIterations Number of times to iterate the GBL fit. @@ -299,6 +304,7 @@ * @param bfield B-field * @return The refitted track. */ +// Old refitTrack (still used if no clusters are present) public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, int trackType, MultipleScattering scattering, double bfield) { List<TrackerHit> allHthList = TrackUtils.sortHits(hth); List<TrackerHit> sortedStripHits = TrackUtils.sortHits(stripHits); @@ -312,6 +318,21 @@ return mergedTrack; } +// Overloaded to fit using ECal clusters via 'doGBLFit' + public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, List<Cluster> clusters, int nIterations, int trackType, MultipleScattering scattering, double bfield) { + List<TrackerHit> allHthList = TrackUtils.sortHits(hth); + List<TrackerHit> sortedStripHits = TrackUtils.sortHits(stripHits); + FittedGblTrajectory fit = doGBLFit(helix, sortedStripHits, scattering, bfield, 0); + for (int i = 0; i < nIterations; i++) { + Pair<Track, GBLKinkData> newTrack = makeCorrectedTrack(fit, helix, allHthList, trackType, bfield); + helix = TrackUtils.getHTF(newTrack.getFirst()); + fit = doGBLFit(helix, sortedStripHits, clusters, scattering, bfield, 0); + } + Pair<Track, GBLKinkData> mergedTrack = makeCorrectedTrack(fit, helix, allHthList, trackType, bfield); + return mergedTrack; + } + +// Old GBL fit public static FittedGblTrajectory doGBLFit(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double bfield, int debug) { List<GBLStripClusterData> stripData = makeStripData(htf, stripHits, _scattering, bfield, debug); double bfac = Constants.fieldConversion * bfield; @@ -320,6 +341,16 @@ return fit; } +// Overloaded GBL fit using ECal clusters via 'makeStripData' + public static FittedGblTrajectory doGBLFit(HelicalTrackFit htf, List<TrackerHit> stripHits, List<Cluster> clusters, MultipleScattering _scattering, double bfield, int debug) { + List<GBLStripClusterData> stripData = makeStripData(htf, stripHits, _scattering, bfield, debug); + double bfac = Constants.fieldConversion * bfield; + + FittedGblTrajectory fit = HpsGblRefitter.fit(stripData, bfac, debug > 0); + return fit; + } + +// Old makeStripData public static List<GBLStripClusterData> makeStripData(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double _B, int _debug) { List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>(); @@ -435,6 +466,185 @@ } return stripClusterDataList; } + +// Overloaded makeStripData to make "GBLStripClusterData" out of ECal clusters + public static List<GBLStripClusterData> makeStripData(HelicalTrackFit htf, List<TrackerHit> stripHits, List<Cluster> clusters, MultipleScattering _scattering, double _B, int _debug) { + List<GBLStripClusterData> stripClusterDataList = new ArrayList<GBLStripClusterData>(); + + // Find scatter points along the path + MultipleScattering.ScatterPoints scatters = _scattering.FindHPSScatterPoints(htf); + + if (_debug > 0) { + System.out.printf("perPar covariance matrix\n%s\n", htf.covariance().toString()); + } + + for (TrackerHit stripHit : stripHits) { + HelicalTrackStripGbl strip; + if (stripHit instanceof SiTrackerHitStrip1D) { + strip = new HelicalTrackStripGbl(makeDigiStrip((SiTrackerHitStrip1D) stripHit), true); + } else { + SiTrackerHitStrip1D newHit = new SiTrackerHitStrip1D(stripHit); + strip = new HelicalTrackStripGbl(makeDigiStrip(newHit), true); + } + + // find Millepede layer definition from DetectorElement + HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stripHit.getRawHits().get(0)).getDetectorElement(); + + int millepedeId = sensor.getMillepedeId(); + + if (_debug > 0) { + System.out.printf("layer %d millepede %d (DE=\"%s\", origin %s) \n", strip.layer(), millepedeId, sensor.getName(), strip.origin().toString()); + } + + //Center of the sensor + Hep3Vector origin = strip.origin(); + + //Find intercept point with sensor in tracking frame + Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(htf, strip, Math.abs(_B)); + if (trkpos == null) { + if (_debug > 0) { + System.out.println("Can't find track intercept; use sensor origin"); + } + trkpos = strip.origin(); + } + if (_debug > 0) { + System.out.printf("trkpos at intercept [%.10f %.10f %.10f]\n", trkpos.x(), trkpos.y(), trkpos.z()); + } + + //GBLDATA + GBLStripClusterData stripData = new GBLStripClusterData(millepedeId); + //Add to output list + stripClusterDataList.add(stripData); + + //path length to intercept + double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0); + double s3D = s / Math.cos(Math.atan(htf.slope())); + + //GBLDATA + stripData.setPath(s); + stripData.setPath3D(s3D); + + //GBLDATA + stripData.setU(strip.u()); + stripData.setV(strip.v()); + stripData.setW(strip.w()); + + //Print track direction at intercept + Hep3Vector tDir = HelixUtils.Direction(htf, s); + double phi = htf.phi0() - s / htf.R(); + double lambda = Math.atan(htf.slope()); + + //GBLDATA + stripData.setTrackDir(tDir); + stripData.setTrackPhi(phi); + stripData.setTrackLambda(lambda); + + //Print residual in measurement system + // start by find the distance vector between the center and the track position + Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin); + + // then find the rotation from tracking to measurement frame + Hep3Matrix trkToStripRot = getTrackToStripRotation(sensor); + + // then rotate that vector into the measurement frame to get the predicted measurement position + Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk); + + //GBLDATA + stripData.setMeas(strip.umeas()); + stripData.setTrackPos(trkpos_meas); + stripData.setMeasErr(strip.du()); + + if (_debug > 1) { + System.out.printf("rotation matrix to meas frame\n%s\n", VecOp.toString(trkToStripRot)); + System.out.printf("tPosGlobal %s origin %s\n", trkpos.toString(), origin.toString()); + System.out.printf("tDiff %s\n", vdiffTrk.toString()); + System.out.printf("tPosMeas %s\n", trkpos_meas.toString()); + } + + if (_debug > 0) { + System.out.printf("layer %d millePedeId %d uRes %.10f\n", strip.layer(), millepedeId, stripData.getMeas() - stripData.getTrackPos().x()); + } + + // find scattering angle + MultipleScattering.ScatterPoint scatter = scatters.getScatterPoint(((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement()); + double scatAngle; + + if (scatter != null) { + scatAngle = scatter.getScatterAngle().Angle(); + } else { + if (_debug > 0) { + System.out.printf("WARNING cannot find scatter for detector %s with strip cluster at %s\n", ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString()); + } + scatAngle = GblUtils.estimateScatter(sensor, htf, _scattering, _B); + } + + //GBLDATA + stripData.setScatterAngle(scatAngle); + } + + // *** Now loop over clusters and mock up GBLStripClusterData for them!~<3 *** + for (Cluster cluster : clusters) { + + // This sets a BS Millipede ID (0) for the ECal... + GBLStripClusterData ECal_stripData = new GBLStripClusterData(666); + //Add ECal strips to the output list + stripClusterDataList.add(ECal_stripData); + + + // TRANSLATE ALL THIS GBLStripClusterData STUFF INTO ECAL, USING CLUSTERS!!!! + + //path length to intercept + // double s = HelixUtils.PathToXPlane(htf, trkpos.x(), 0, 0).get(0); + // double s3D = s / Math.cos(Math.atan(htf.slope())); + + //GBLDATA + // ECal_stripData.setPath(s); + // ECal_stripData.setPath3D(s3D); + + double ecal_x = cluster.getPosition()[0]; + double ecal_y = cluster.getPosition()[1]; + double ecal_z = cluster.getPosition()[2]; + + // //GBLDATA + // ECal_stripData.setU(strip.u()); + // ECal_stripData.setV(strip.v()); + // ECal_stripData.setW(strip.w()); + + //Print track direction at intercept + // Hep3Vector tDir = HelixUtils.Direction(htf, s); + // double phi = htf.phi0() - s / htf.R(); + // double lambda = Math.atan(htf.slope()); + + // //GBLDATA + // ECal_stripData.setTrackDir(tDir); + // ECal_stripData.setTrackPhi(phi); + // ECal_stripData.setTrackLambda(lambda); + + //Print residual in measurement system + //Start by find the distance vector between the center and the track position + // Hep3Vector vdiffTrk = VecOp.sub(trkpos, origin); + + // then find the rotation from tracking to measurement frame + // Hep3Matrix trkToStripRot = getTrackToStripRotation(sensor); + + // then rotate that vector into the measurement frame to get the predicted measurement position + // Hep3Vector trkpos_meas = VecOp.mult(trkToStripRot, vdiffTrk); + + //GBLDATA + // ECal_stripData.setMeas(strip.umeas()); + // ECal_stripData.setTrackPos(trkpos_meas); + // ECal_stripData.setMeasErr(strip.du()); + + // No Scat for ECal + ECal_stripData.setScatterAngle(0); + + } + + + + return stripClusterDataList; + } + private static Hep3Matrix getTrackToStripRotation(SiSensor sensor) { // This function transforms the hit to the sensor coordinates