Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN
DataTrackerFakeHitDriver.java+98-581.4 -> 1.5
Separated out functionality into functions: finding org loc, finding unit vector of sensor plane.
Changed so that all fake hits will use the helix and plane intercept instead of z-position.

hps-java/src/main/java/org/lcsim/hps/recon/tracking
DataTrackerFakeHitDriver.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- DataTrackerFakeHitDriver.java	9 Nov 2012 01:42:13 -0000	1.4
+++ DataTrackerFakeHitDriver.java	15 Nov 2012 02:49:06 -0000	1.5
@@ -266,16 +266,18 @@
                 // Get the sensor position along the z direction
                 double zposition = sensor.getGeometry().getPosition().z();
 
-                // Extrapolate the track to the sensor
-                Hep3Vector trackPosAtSensor = extrapolator.extrapolateTrack(zposition);
+                // Get the position where the sensor and track intercept
+                Hep3Vector trackPosAtSensor = this.getHelixPlaneIntercept(sensor, wtrack);
+                
                 
                 if(debug) {
-                    System.out.println(this.getClass().getSimpleName() + ": track position at sensor ( z= " + zposition + ") = " + trackPosAtSensor.toString());
+                    System.out.printf("%s: track/plane intercept at %s\n",this.getClass().getSimpleName(),trackPosAtSensor.toString(),zposition);
                 }
 
                 // Check if the track lies within the sensor
                 boolean isHit = trackUtils.sensorContainsTrack(trackPosAtSensor, sensor);
                 
+               
                 
                 if(isHit) {
                     if(debug) System.out.println(this.getClass().getSimpleName() + ": make a tracker hit and add to this sensor");
@@ -291,7 +293,7 @@
                         hths.add(this.makeHelicalTrackHit(sensor, wtrack));
                     } else if(createSimTrackerHits){
                         // Create a SimTrackerHit at the intersect between a track and a sensor
-                        simHits.add(this.makeSimTrackerHit(sensor, trackPosAtSensor.v(), mcParticle));
+                        simHits.add(this.makeSimTrackerHit(sensor, trackPosAtSensor, mcParticle));
                     } else {
 
                         this.printDebug("Creating a SimTrackerHit at position: " + trackPosAtSensor);
@@ -493,32 +495,22 @@
        
     }
     
-    
-    
-    
-    private HelicalTrackHit makeHelicalTrackHit(SiSensor sensor, WTrack wtrack) {
-    //private SiTrackerHitStrip1D makeTrackerHit(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
-        //create fake raw tracker hit
-        
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": makeTrackerHit");
-        
-        List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
-        if(rth_cluster.size()!=1) {
-            System.out.println(this.getClass().getSimpleName() + ": the fake raw tracker hit cluster is different than one!? " + rth_cluster.size() );
-            System.exit(1);
-        }
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": created a fake raw tracker hit ");
-        RawTrackerHit raw_hit = rth_cluster.get(0);        
+    /**
+     * 
+     * Find the unit vector of a sensor
+     * @param sensor
+     * @return unit vector of the plane
+     */
+    private Hep3Vector getPlaneUnitVector(SiSensor sensor) {
+        /*
+         * Weird way of getting the unit vector by creating a fake raw tracker hit...must be simpler way?
+         */
+        RawTrackerHit raw_hit = this.makeRawTrackerFakeHit(sensor).get(0);
         IIdentifier id = raw_hit.getIdentifier();
-
         //Get the electrode objects
         SiTrackerIdentifierHelper _sid_helper = (SiTrackerIdentifierHelper) sensor.getIdentifierHelper();
         ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
         SiSensorElectrodes electrodes = ((SiSensor) raw_hit.getDetectorElement()).getReadoutElectrodes(carrier);
-        
-        
-        
-        
         ITransform3D local_to_global;
         if (coordinate_system == TrackerHitType.CoordinateSystem.GLOBAL) {
             local_to_global = new Transform3D();
@@ -529,46 +521,69 @@
         else {
             throw new RuntimeException(this.getClass().getSimpleName() + " problem with coord system " + coordinate_system.toString());
         }
-        
-        
         ITransform3D electrodes_to_global = electrodes.getLocalToGlobal();
         ITransform3D global_to_hit = local_to_global.inverse();
         ITransform3D electrodes_to_hit = Transform3D.multiply(global_to_hit,electrodes_to_global);
             
         Hep3Vector u= electrodes_to_hit.rotated(electrodes.getMeasuredCoordinate(0));
         Hep3Vector v= electrodes_to_hit.rotated(electrodes.getUnmeasuredCoordinate(0));
-        Hep3Vector w = VecOp.cross(u, v);    
+        Hep3Vector w = VecOp.cross(u, v);  
+        Hep3Vector eta = VecOp.mult(detToTrk, w);
+        return eta;
+        
+    }
+    
+    
+     /**
+     * 
+     * Find the origin of the sensor plane
+     * @param sensor
+     * @return origin position of the plane
+     */
+    private Hep3Vector getOrgLoc(SiSensor sensor) {
+        /*
+         * Weird way of getting the org location by creating a fake raw tracker hit...must be simpler way?
+         */
+         List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
+        if(rth_cluster.size()!=1) {
+            System.out.println(this.getClass().getSimpleName() + ": the fake raw tracker hit cluster is different than one!? " + rth_cluster.size() );
+            System.exit(1);
+        }
+        //Get the electrode objects
+        IIdentifier id = rth_cluster.get(0).getIdentifier();
+        SiTrackerIdentifierHelper _sid_helper = (SiTrackerIdentifierHelper) sensor.getIdentifierHelper();
+        ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
+        SiSensorElectrodes electrodes = ((SiSensor) rth_cluster.get(0).getDetectorElement()).getReadoutElectrodes(carrier);
+        ITransform3D local_to_global;
+        if (coordinate_system == TrackerHitType.CoordinateSystem.GLOBAL) {
+            local_to_global = new Transform3D();
+        }
+        else if (coordinate_system == TrackerHitType.CoordinateSystem.SENSOR) {
+            local_to_global = sensor.getGeometry().getLocalToGlobal();
+        }
+        else {
+            throw new RuntimeException(this.getClass().getSimpleName() + " problem with coord system " + coordinate_system.toString());
+        }
+        ITransform3D electrodes_to_global = electrodes.getLocalToGlobal();
         Hep3Vector _orgloc = new BasicHep3Vector(0., 0., 0.);
         electrodes_to_global.transformed(_orgloc);
-        if(debug) {
-            System.out.println(this.getClass().getSimpleName() + ": electrodes  u " + u.toString());
-            System.out.println(this.getClass().getSimpleName() + ": electrodes  v " + v.toString());
-            System.out.println(this.getClass().getSimpleName() + ": electrodes  w " + w.toString() + "( " + w.magnitude() + ")");
-        }
-
         electrodes_to_global.getTranslation().translate(_orgloc);
         if(debug) System.out.print(this.getClass().getSimpleName() + ": orgloc " + _orgloc.toString() + "  -> ");
         _orgloc = VecOp.mult(detToTrk, _orgloc);
         if(debug) System.out.println(_orgloc.toString());
         
+        return _orgloc;
         
-        
-        
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": Try to find the interception point");
-        
-        //B-field must go along Z direction
+    }
+    
+    
+    private Hep3Vector getHelixPlaneIntercept(SiSensor sensor, WTrack wtrack) {
+        Hep3Vector eta = this.getPlaneUnitVector(sensor);   
+        Hep3Vector _orgloc = this.getOrgLoc(sensor);
         Hep3Vector h = new BasicHep3Vector(_bfield.x(),_bfield.y(),Math.abs(_bfield.z()));
         h = VecOp.unit(h);
-        //Rotate into tracking frame
-        Hep3Vector eta = VecOp.mult(detToTrk, w);
-
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": eta  " + eta.toString());
-        
         Hep3Vector position = wutils.getHelixAndPlaneIntercept(wtrack, _orgloc, eta, h);
-                
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": found interception point at position " + position.toString());
-        
-        if(debug) {
+         if(debug) {
             HelicalTrackFit htf = wtrack._htf;
             List<Double> s = HelixUtils.PathToXPlane(htf, position.x(), 0, 0);
             Hep3Vector posOnHelix = HelixUtils.PointOnHelix(htf, s.get(0));
@@ -576,7 +591,6 @@
             System.out.println(this.getClass().getSimpleName() + ": Path length to position " + position.toString() + ": s = " + s.get(0));
             System.out.println(this.getClass().getSimpleName() + ": Difference between W and helixutils: diffpos " + posdiff.toString() + " ( " + position.toString() + " posOnHelix " + posOnHelix.toString() + " R=" + htf.R());
         }
-        
         //Fill some debug stuff
         List<Double> deltas = wutils.getDeltas();
         this._delta_itercount.get(sensor).fill(deltas.size());
@@ -587,6 +601,23 @@
         }
         _prf_final_deltas.fill(deltas.size(), deltas.get(deltas.size()-1));
         
+        return position;  
+    }
+    
+    
+    private HelicalTrackHit makeHelicalTrackHit(SiSensor sensor, WTrack wtrack) {
+    //private SiTrackerHitStrip1D makeTrackerHit(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
+        //create fake raw tracker hit
+        
+        if(debug) System.out.println(this.getClass().getSimpleName() + ": makeTrackerHit");
+        
+        List<RawTrackerHit> rth_cluster = this.makeRawTrackerFakeHit(sensor);
+        
+        if(debug) System.out.println(this.getClass().getSimpleName() + ": Try to find the interception point");
+        
+        Hep3Vector position = this.getHelixPlaneIntercept(sensor, wtrack);
+ 
+        
         //Fill dummy covariance matrix with minimal uncertainties
         //SymmetricMatrix covariance = this.getCovariance(rth_cluster, electrodes);
         SymmetricMatrix covariance = new SymmetricMatrix(3);
@@ -631,17 +662,21 @@
      * @param particle : MC particle associated with the track containing the hit
      * @return SimTrackerHit
      */
-    private SimTrackerHit makeSimTrackerHit(SiSensor sensor, double[] trkPositionAtSensor, MCParticle particle){
-        
+    private SimTrackerHit makeSimTrackerHit(SiSensor sensor, Hep3Vector trkPositionAtSensor, MCParticle particle){
+        Hep3Vector trkPositionAtSensorDet = VecOp.mult(VecOp.inverse(detToTrk),trkPositionAtSensor);
+        if(this.debug) {
+            System.out.printf("%s: makeSimTrackerHit for sensor %s at position %s in JLab coord (from %s) for MCp pvec=%s \n",this.getClass().getSimpleName(),sensor.getName(),trkPositionAtSensorDet.toString(),trkPositionAtSensor.toString(),particle.getMomentum().toString());
+            
+        }
         double dEdx = 24000/* MIP */*DopedSilicon.ENERGY_EHPAIR;
         double[] momentum = particle.getMomentum().v();
         double pathLength = 0;
         double time = 0;
         int cellID = (int) TrackerHitUtils.makeSimTrackerHitId(sensor).getValue();
         // Create a new SimTrackerHit
-        SimTrackerHit simHit = new BaseSimTrackerHit(trkPositionAtSensor, dEdx, momentum, pathLength, time, cellID, particle, null, sensor);
+        SimTrackerHit simHit = new BaseSimTrackerHit(trkPositionAtSensorDet.v(), dEdx, momentum, pathLength, time, cellID, particle, null, sensor);
         // Add it to the sensor readout
-        //sensor.getReadout().addHit(simHit);
+        sensor.getReadout().addHit(simHit);
         return simHit;
     }
     
@@ -721,16 +756,20 @@
     
   
     
-    
+    /**
+     * Creates a raw tracker hit at a dummy channel
+     * @param sensor that will get the hit
+     * @return lsit of a single raw tracker hit
+     */
     
     public List<RawTrackerHit> makeRawTrackerFakeHit(SiSensor sensor)
     {
      
-        if(debug) System.out.println(this.getClass().getSimpleName() + ": makeRawTrackerFakeHit for sensor " + sensor.getName());
+        //if(debug) System.out.println(this.getClass().getSimpleName() + ": makeRawTrackerFakeHit for sensor " + sensor.getName());
         List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
         
         // Get SimTrackerHits
-        IReadout ro = sensor.getReadout();
+        //IReadout ro = sensor.getReadout();
        
 
         // Loop over electrodes and digitize with readout chip
@@ -739,7 +778,7 @@
             if (sensor.hasElectrodesOnSide(carrier))
             {
 
-                if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
+                //if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
                 //SortedMap<Integer,List<Integer>> digitized_hits = _readout_chip.readout(electrode_data.get(carrier),sensor.getReadoutElectrodes(carrier));
                 //if(debug) System.out.println(this.getClass().getSimpleName() + ": creating a dummy hit for sensor " + sensor.getName());
                 
@@ -754,9 +793,10 @@
                 }
                 IDetectorElement detector_element = sensor;
                 RawTrackerHit raw_hit = new BaseRawTrackerHit(time,cell_id,adc_values,new ArrayList<SimTrackerHit>(),detector_element);
-                ro.addHit(raw_hit);
+                //ro.addHit(raw_hit);
                 raw_hits.add(raw_hit);
                 
+                
             }
             
         }
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1