LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  August 2016

HPS-SVN August 2016

Subject:

r4464 - in /java/branches/brad-dev/tracking/src/main/java/org/hps/recon/tracking: ECAL_HelicalTrackHitDriver.java gbl/ECal_GBLRefitterDriver.java gbl/MakeGblTracks.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Fri, 12 Aug 2016 21:27:26 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (634 lines)

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

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use