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
|