Commit in lcsim/src/org/lcsim/contrib/onoprien/vsegment on MAIN
mctruth/MCTruth.java+10-21.3 -> 1.4
process/HelicalTrackHitConverter.java+273added 1.1
       /ClusteringDriver.java+3-31.3 -> 1.4
ExampleTrackingDriver.java+52added 1.1
+338-5
2 added + 2 modified, total 4 files
Converter to HelicalTrackHit and an example tracking driver

lcsim/src/org/lcsim/contrib/onoprien/vsegment/mctruth
MCTruth.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- MCTruth.java	21 Oct 2008 00:53:47 -0000	1.3
+++ MCTruth.java	24 Oct 2008 04:09:13 -0000	1.4
@@ -20,7 +20,7 @@
  * be added to the processing chain (usually as the first driver).
  *
  * @author D. Onoprienko
- * @version $Id: MCTruth.java,v 1.3 2008/10/21 00:53:47 onoprien Exp $
+ * @version $Id: MCTruth.java,v 1.4 2008/10/24 04:09:13 onoprien Exp $
  */
 public class MCTruth {
   
@@ -85,9 +85,17 @@
     }
   }
 
-// -- Getting MCParticles :  ---------------------------------------------------
   
+// -- Getting MCParticles :  ---------------------------------------------------
   
+  public List<MCParticle> getMCParticles(VSTrackerHit hit) {
+    List<SimTrackerHit> simHits = getSimTrackerHits(hit);
+    HashSet<MCParticle> mcSet = new HashSet<MCParticle>();
+    for (SimTrackerHit simHit : simHits) mcSet.add(simHit.getMCParticle());
+    return new ArrayList<MCParticle> (mcSet);
+  }
+
+
 // -- Looking up tracking objects by MCParticle :  -----------------------------
 
   

lcsim/src/org/lcsim/contrib/onoprien/vsegment/process
HelicalTrackHitConverter.java added at 1.1
diff -N HelicalTrackHitConverter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HelicalTrackHitConverter.java	24 Oct 2008 04:09:13 -0000	1.1
@@ -0,0 +1,273 @@
+package org.lcsim.contrib.onoprien.vsegment.process;
+
+import java.util.*;
+
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.digisim.MyLCRelation;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrack2DHit;
+import org.lcsim.fit.helicaltrack.HelicalTrack3DHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
+import org.lcsim.fit.helicaltrack.HitIdentifier;
+import org.lcsim.fit.helicaltrack.HitUtils;
+import org.lcsim.fit.helicaltrack.StereoHitMaker;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+import org.lcsim.spacegeom.SpacePointVector;
+
+import org.lcsim.contrib.onoprien.vsegment.geom.SegmentationManager;
+import org.lcsim.contrib.onoprien.vsegment.geom.Sensor;
+import org.lcsim.contrib.onoprien.vsegment.geom.SensorType;
+import org.lcsim.contrib.onoprien.vsegment.geom.sensortype.Cylinder;
+import org.lcsim.contrib.onoprien.vsegment.hit.ITrackerHit;
+import org.lcsim.contrib.onoprien.vsegment.hit.TrackerHitMap;
+import org.lcsim.contrib.onoprien.vsegment.hit.VSTrackerHit;
+import org.lcsim.contrib.onoprien.vsegment.mctruth.MCTruth;
+import org.lcsim.contrib.onoprien.vsegment.transform.ConstHep3Vector;
+import org.lcsim.contrib.onoprien.vsegment.transform.IRefFrame;
+
+/**
+ * Driver that converts <tt>VSTrackerHits</tt> into <tt>HelicalTrackHits</tt> 
+ * required by <tt>seedtracker</tt> package.
+ *
+ * @author D. Onoprienko
+ * @version $Id: HelicalTrackHitConverter.java,v 1.1 2008/10/24 04:09:13 onoprien Exp $
+ */
+public class HelicalTrackHitConverter extends VSDriver {
+  
+// -- Constructor :  -----------------------------------------------------------
+    
+    public HelicalTrackHitConverter() {}
+  
+// -- Setters :  ---------------------------------------------------------------
+  
+  /** 
+   * Set any parameter. 
+   * The following parameters can be set with this method:
+   * <p><dl>
+   * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap&lt;Sensor,VSTrackerHit&gt;</tt>.<br>
+   *             Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
+   * <dt>"OUTPUT_LIST_NAME"</dt> <dd>Name of output list of hits.
+   *             If a list with this name already exists in the event record, the newly created hits will
+   *             be added to it.<br>
+   *             Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
+   * <dt>"HIT_RELATION_NAME"</dt> <dd>Name of a collection of <tt>LCRelations</tt> between created
+   *             <tt>HelicalTrackHits</tt> and the original <tt>VSTrackerHits</tt>.<br>
+   *             Default: <tt>null</tt> (no collection will be saved).</dd>
+   * <dt>"MC_RELATION_NAME"</dt> <dd>Name of a collection of <tt>LCRelations</tt> between created
+   *             <tt>HelicalTrackHits</tt> and <tt>MCParticles</tt>.<br>
+   *             Default: <tt>null</tt> (no collection will be saved).</dd>
+   * <dt>"STEREO_HIT_MAKER"</dt> <dd>{@link StereoHitMaker} object to be used by this converter to
+   *             create hits from strips in stereo layers.<br>
+   *             Default: <tt>null</tt> (must be specified before this driver can be used).</dd></dl>
+   *
+   * @param name   Name of parameter to be set. Case is ignored.
+   * @param values  List of values to be used for setting the parameter.
+   * @throws NoSuchParameterException Thrown if the supplied parameter name is unknown.
+   * @throws IllegalArgumentException Thrown if incorrect nunber of values, or a value
+   *                                  of incorrect type is supplied.
+   */
+  public void set(String name, Object... values) {
+    Object value = values.length == 0 ? null : values[0];
+    try {
+      if (name.equalsIgnoreCase("INPUT_MAP_NAME")) {
+        _inMapName = (String) value;
+      } else if (name.equalsIgnoreCase("OUTPUT_LIST_NAME")) {
+        _outListName = (String) value;
+      } else if (name.equalsIgnoreCase("HIT_RELATION_NAME")) {
+        _hitRelName = (String) value;
+      } else if (name.equalsIgnoreCase("MC_RELATION_NAME")) {
+        _mcRelName = (String) value;
+      } else if (name.equalsIgnoreCase("STEREO_HIT_MAKER")) {
+        _crosser = (StereoHitMaker) value;
+      } else {
+        super.set(name, values);
+      }
+    } catch (ClassCastException x) {
+      throw new IllegalArgumentException(ERR_VIT, x);
+    }
+  }
+  
+  
+// -- Event processing :  ------------------------------------------------------
+    
+    /**
+     * Process event.
+     */
+    public void process(EventHeader event) {
+      
+        super.process(event);
+        
+        if (_segman == null) _segman = (SegmentationManager) event.get("SegmentationManager");
+        _mcTruth = (MCTruth) event.get("MCTruth");
+
+        //  Initialize the list of HelicalTrackHits and vector with local z direction
+        List<HelicalTrackHit> helhits = new ArrayList<HelicalTrackHit>();
+        Hep3Vector lz = new BasicHep3Vector(0., 0., 1.);
+        
+        //  Create a List of LCRelations to relate HelicalTrackHits to the original hits
+        List<LCRelation> hitRelations = new ArrayList<LCRelation>();
+        
+        //  Make a mapping between the stereo strips and corresponding hits
+        Map<HelicalTrackStrip,VSTrackerHit> stripmap = new HashMap<HelicalTrackStrip,VSTrackerHit>();
+        
+        //  Get the hit map that gives the list of hits on a particular sensor
+        TrackerHitMap<Sensor,VSTrackerHit> hitmap = (TrackerHitMap<Sensor, VSTrackerHit>) event.get(_inMapName);
+        
+        for (Sensor sensor : hitmap.keySet()) {
+          List<Sensor> stereoPartners = _segman.getStereoPartners(sensor);
+          List<VSTrackerHit> sensorhits = hitmap.get(sensor);
+          for (VSTrackerHit hit : sensorhits) {
+            if (hit.getType() == ITrackerHit.Type.STRIP) {
+              if (stereoPartners == null) { // Isolated axial hit - convert it and add to the hit list
+                HelicalTrackHit axialhit = MakeAxialHit(hit);
+                if (axialhit != null) {
+                  hitRelations.add(new MyLCRelation(axialhit, hit));
+                  helhits.add(axialhit);
+                }
+              } else {              //  Stereo hit - convert it and add it to the list of stereo strips
+                HelicalTrackStrip strip = MakeStrip(hit);
+                stripmap.put(strip, hit);
+              }
+            } else {                                 //  Pixel hit - convert it and add to the hit list
+              HelicalTrackHit pixelhit = MakePixelHit(hit);
+              hitRelations.add(new MyLCRelation(pixelhit, hit));
+              helhits.add(pixelhit);
+            }
+          }
+        }
+        
+        //  Make the stereo hits
+        List<HelicalTrackStrip> striplist = new ArrayList<HelicalTrackStrip>(stripmap.keySet());
+        List<HelicalTrackCross> stereohits = _crosser.MakeHits(striplist);
+        for (HelicalTrackCross hit : stereohits) {
+          for (HelicalTrackStrip strip : hit.getStrips()) {
+            hitRelations.add(new MyLCRelation(hit, stripmap.get(strip)));
+          }
+          helhits.add(hit);
+        }
+        
+        
+        //  Create the LCRelations between HelicalTrackHits and MC particles
+        if (_mcRelName != null) {
+          List<LCRelation> mcrelations = new ArrayList<LCRelation>();
+          for (HelicalTrackHit hit : helhits) {
+            for (MCParticle mcp : hit.getMCParticles()) {
+              mcrelations.add(new MyLCRelation(hit, mcp));
+            }
+          }
+          event.put(_mcRelName, mcrelations, LCRelation.class, 0);
+        }
+        
+        //  Put the HelicalTrackHits back into the event
+        event.put(_outListName, helhits, HelicalTrackHit.class, 0);
+        if (_hitRelName != null) event.put(_hitRelName, hitRelations, LCRelation.class, 0);
+        
+        // Cleanup
+        _mcTruth = null;
+    }
+    
+    private HelicalTrackHit MakeAxialHit(VSTrackerHit hit) {
+      HelicalTrackStrip strip = MakeStrip(hit);
+      if (VecOp.cross(strip.v(), ConstHep3Vector.V001).magnitude() > _eps) return null;
+      double zmin = VecOp.add(HitUtils.StripCenter(strip), VecOp.mult(strip.vmin(), strip.v())).z();
+      double zmax = VecOp.add(HitUtils.StripCenter(strip), VecOp.mult(strip.vmax(), strip.v())).z();
+      HelicalTrackHit axialhit = new HelicalTrack2DHit(strip.origin(), HitUtils.StripCov(strip),
+              strip.dEdx(), strip.time(), strip.rawhits(), strip.detector(), strip.layer(), strip.BarrelEndcapFlag(),
+              zmin, zmax);
+      List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+      for (MCParticle mcp : mcplist) {
+        axialhit.addMCParticle(mcp);
+      }
+      return axialhit;
+    }
+
+    private HelicalTrackStrip MakeStrip(VSTrackerHit hit) {
+      Hep3Vector u;
+      Hep3Vector v;
+      Hep3Vector org;
+      double umeas;
+      double du;
+      double vmin;
+      double vmax;
+      Sensor sensor = hit.getSensor();
+      SensorType sType = sensor.getType();
+      IRefFrame hitFrame= hit.getRefFrame();
+      if  (sType instanceof Cylinder) {
+        v = hitFrame.v();
+        org = hit.getPosition(IRefFrame.GLOBAL);
+        Hep3Vector r = new BasicHep3Vector(org.x(), org.y(), 0.0);
+        u = VecOp.unit(VecOp.cross(v, r));
+        umeas = 0.;
+        du = hit.getLocalErrors().x();
+        vmax = hit.getLength()/2.;
+        vmin = -vmax;
+      } else {
+        org = hitFrame.getOrigin();
+        u = hitFrame.u();
+        v = hitFrame.v();
+        umeas = hit.getLocalPosition().x();
+        du = hit.getLocalErrors().x();
+        Hep3Vector local = hit.getLocalPosition();
+        double len2 = hit.getLength()/2.;
+        vmin = local.y() - len2;
+        vmax = local.y() + len2;
+      }
+      
+      double dEdx = hit.getdEdx();
+      double time = hit.getTime();
+      IDetectorElement de = sensor.getDetectorElement();
+      String det = ID.getName(de);
+      int lyr = ID.getLayer(de);
+      if (_segman.getStereoPartners(sensor) != null) lyr = lyr / 2;
+      BarrelEndcapFlag beflag = ID.getBarrelEndcapFlag(de);
+      
+      HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, null,
+              det, lyr, beflag);
+      List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+      for (MCParticle mcp : mcplist) {
+        strip.addMCParticle(mcp);
+      }
+      return strip;
+    }
+    
+    private HelicalTrackHit MakePixelHit(VSTrackerHit hit) {
+        IDetectorElement de = hit.getSensor().getDetectorElement();
+        HelicalTrackHit pixel = new HelicalTrack3DHit(hit.getPosition(IRefFrame.GLOBAL), hit.getCovMatrix(IRefFrame.GLOBAL), hit.getdEdx(),
+                hit.getTime(), null, ID.getName(de), ID.getLayer(de), ID.getBarrelEndcapFlag(de));
+        List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+        for (MCParticle mcp : mcplist) {
+            pixel.addMCParticle(mcp);
+        }
+        
+        return pixel;
+    }
+  
+// -- Private parts :  ---------------------------------------------------------
+
+  private StereoHitMaker _crosser;
+  private HitIdentifier ID = new HitIdentifier();
+  private double _eps = 1.0e-6;
+
+  protected SegmentationManager _segman;
+  
+  protected String _inMapName;
+  protected String _outListName;
+  protected String _hitRelName;
+  protected String _mcRelName;
+  
+  private MCTruth _mcTruth;
+}

lcsim/src/org/lcsim/contrib/onoprien/vsegment/process
ClusteringDriver.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- ClusteringDriver.java	21 Oct 2008 00:53:47 -0000	1.3
+++ ClusteringDriver.java	24 Oct 2008 04:09:13 -0000	1.4
@@ -18,7 +18,7 @@
  * Driver that handles clustering of tracker pulses.
  *
  * @author D. Onoprienko
- * @version $Id: ClusteringDriver.java,v 1.3 2008/10/21 00:53:47 onoprien Exp $
+ * @version $Id: ClusteringDriver.java,v 1.4 2008/10/24 04:09:13 onoprien Exp $
  */
 public class ClusteringDriver extends VSDriver implements VSEventListener {
 
@@ -51,10 +51,10 @@
    * Set any parameter. 
    * The following parameters can be set with this method:
    * <p><dl>
-   * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap&lt;Sensor,VSTrackerData&gt;</tt>.<br>
+   * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap&lt;Sensor,VSTrackerPulse&gt;</tt>.<br>
    *             Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
    * <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of output collection of hist
-   *             (type <tt>TrackerHitMap<Sensor,ITrackerData></tt>).<br>
+   *             (type <tt>TrackerHitMap<Sensor,VSTrackerHit></tt>).<br>
    *             If a map with this name already exists in the event record, it will be overwritten. 
    *             If the name is <tt>null</tt> or an empty string, the map will not be saved into the event.<br>
    *             Default: <tt>null</tt> (must be specified before this driver can be used).</dd>

lcsim/src/org/lcsim/contrib/onoprien/vsegment
ExampleTrackingDriver.java added at 1.1
diff -N ExampleTrackingDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ExampleTrackingDriver.java	24 Oct 2008 04:09:13 -0000	1.1
@@ -0,0 +1,52 @@
+package org.lcsim.contrib.onoprien.vsegment;
+
+import java.util.*;
+
+import org.lcsim.fit.helicaltrack.StereoHitMaker;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
+import org.lcsim.recon.tracking.seedtracker.SeedTracker;
+import org.lcsim.recon.tracking.seedtracker.StrategyXMLUtils;
+
+import org.lcsim.contrib.onoprien.vsegment.process.HelicalTrackHitConverter;
+import org.lcsim.contrib.onoprien.vsegment.process.VSDriver;
+
+/**
+ *
+ *
+ * @author D. Onoprienko
+ * @version $Id: ExampleTrackingDriver.java,v 1.1 2008/10/24 04:09:13 onoprien Exp $
+ */
+public class ExampleTrackingDriver extends VSDriver {
+  
+// -- Constructors :  ----------------------------------------------------------
+  
+  public ExampleTrackingDriver() {
+    
+    // Virtual segmentation and hit processing
+
+    add(new ExampleDriverSiD02());
+    
+    // Conversion to HelicalTrackHits
+    
+    HelicalTrackHitConverter converter = new HelicalTrackHitConverter();
+    converter.set("INPUT_MAP_NAME", "VSTrackerClusters");
+    converter.set("OUTPUT_LIST_NAME", "HelicalTrackHits");
+    converter.set("HIT_RELATION_NAME", "HelicalTrackHitRelations");
+    converter.set("MC_RELATION_NAME", "HelicalTrackMCRelations");
+    converter.set("STEREO_HIT_MAKER", new StereoHitMaker(10., 10.));
+    add(converter);
+    
+    // Track finding and fitting
+    
+    List<SeedStrategy> stratlist =
+                StrategyXMLUtils.getStrategyListFromResource(
+                StrategyXMLUtils.getDefaultStrategiesPrefix() + "autogen_ttbar_sid02_vs.xml");
+        
+    SeedTracker seedTracker = new SeedTracker(stratlist);
+    add(seedTracker);
+
+  }
+  
+// -- Private parts :  ---------------------------------------------------------
+  
+}
CVSspam 0.2.8