Print

Print


Commit in lcsim/src/org/lcsim/contrib/onoprien/tracking on MAIN
ExampleDriver.java+36-31.11 -> 1.12
clustering/ClusteringDriver.java+2-71.5 -> 1.6
geom/ForwardingSegmenter.java+12-11.1 -> 1.2
    /RegionSegmenter.java+11-11.1 -> 1.2
    /SegmentationManager.java+37-71.7 -> 1.8
    /Segmenter.java+9-11.5 -> 1.6
geom/segmenters/DiskTrackerSegmenter.java+2-11.1 -> 1.2
               /DiskTrackerToWedgesSegmenter.java+2-11.3 -> 1.4
hitmaking/HitMakingDriver.java+161added 1.1
         /TrackerHitMaker.java+32added 1.1
hitmaking/hitmakers/TrackerHitMakerBasic.java+116added 1.1
+420-22
3 added + 8 modified, total 11 files


lcsim/src/org/lcsim/contrib/onoprien/tracking
ExampleDriver.java 1.11 -> 1.12
diff -u -r1.11 -r1.12
--- ExampleDriver.java	25 Sep 2007 03:16:31 -0000	1.11
+++ ExampleDriver.java	1 Oct 2007 20:36:25 -0000	1.12
@@ -1,7 +1,6 @@
 package org.lcsim.contrib.onoprien.tracking;
 
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.*;
 
 import hep.aida.*;
 import org.lcsim.event.EventHeader;
@@ -22,11 +21,16 @@
 import org.lcsim.contrib.onoprien.tracking.geom.segmenters.DiskTrackerToRingsSegmenter;
 import org.lcsim.contrib.onoprien.tracking.geom.segmenters.SubdetectorBasedSegmenter;
 import org.lcsim.contrib.onoprien.tracking.hit.DigiTrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.HitMakingDriver;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.TrackerHitMaker;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.hitmakers.TrackerHitMakerBasic;
 
 /**
  *
  * @author D.Onoprienko
- * @version $Id: ExampleDriver.java,v 1.11 2007/09/25 03:16:31 onoprien Exp $
+ * @version $Id: ExampleDriver.java,v 1.12 2007/10/01 20:36:25 onoprien Exp $
  */
 public class ExampleDriver extends Driver {
   
@@ -99,6 +103,15 @@
     clusteringDriver.set("INPUT_MAP_NAME","DigiTrackerHits");
     clusteringDriver.set("OUTPUT_MAP_NAME","TrackerClusters");
     add(clusteringDriver);
+    
+    // Hit making :
+    
+    TrackerHitMaker hitMaker = new TrackerHitMakerBasic();
+    HitMakingDriver hitMakingDriver = new HitMakingDriver(hitMaker);
+    hitMakingDriver.set("INPUT_MAP_NAME","TrackerClusters");
+    hitMakingDriver.set("OUTPUT_MAP_NAME","NewTrackerHits");
+    add(hitMakingDriver);
+    
   }
 
   public void process(EventHeader event) {
@@ -108,6 +121,26 @@
 
     super.process(event);
     
+    System.out.println(" ");
+    
+    int n = 0;
+    HashMap<Sensor, List<DigiTrackerHit>> digiMap = 
+            (HashMap<Sensor, List<DigiTrackerHit>>) event.get("DigiTrackerHits");
+    for (List<DigiTrackerHit> digiList : digiMap.values()) n += digiList.size();
+    System.out.println("Created " + n + " DigiTrackerHits on " + digiMap.keySet().size() + " sensors");
+    
+    n = 0;
+    HashMap<Sensor, List<TrackerCluster>> clusterMap = 
+            (HashMap<Sensor, List<TrackerCluster>>) event.get("TrackerClusters");
+    for (List<TrackerCluster> clusterList : clusterMap.values()) n += clusterList.size();
+    System.out.println("Created " + n + " TrackerClusters on " + clusterMap.keySet().size() + " sensors");
+    
+    n = 0;
+    HashMap<Sensor, List<TrackerHit>> hitMap = 
+            (HashMap<Sensor, List<TrackerHit>>) event.get("NewTrackerHits");
+    for (List<TrackerHit> hitList : hitMap.values()) n += hitList.size();
+    System.out.println("Created " + n + " TrackerHits on " + hitMap.keySet().size() + " sensors");
+    
   }
   
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/clustering
ClusteringDriver.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- ClusteringDriver.java	25 Sep 2007 03:45:53 -0000	1.5
+++ ClusteringDriver.java	1 Oct 2007 20:36:25 -0000	1.6
@@ -18,7 +18,7 @@
  * creates a map of clusters. 
  *
  * @author D.Onoprienko
- * @version $Id: ClusteringDriver.java,v 1.5 2007/09/25 03:45:53 onoprien Exp $
+ * @version $Id: ClusteringDriver.java,v 1.6 2007/10/01 20:36:25 onoprien Exp $
  */
 public class ClusteringDriver extends Driver {
 
@@ -39,7 +39,7 @@
    * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input collection of digitized hits
    *                 (type <tt>HashMap<Sensor, ArrayList<DigiTrackerHit>></tt>). 
    *                 Default: "DigiTrackerHit".</dd>
-   * <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of ouitput collection of clusters
+   * <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of output collection of clusters
    *             (type <tt>HashMap<Sensor, ArrayList<TrackerCluster>></tt>). 
    *             Default: "TrackerCluster".</dd></dl>
    * 
@@ -79,11 +79,6 @@
     event.put(_outMapName, outMap);
   }
 
-  /**
-   * Returns a list of found clusters on the sensor.
-   * Default implementation uses simple nearest neighbor clustering.
-   */
-
 // -- Private parts :  ---------------------------------------------------------
   
   protected String _inMapName;

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom
ForwardingSegmenter.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- ForwardingSegmenter.java	25 Sep 2007 03:16:32 -0000	1.1
+++ ForwardingSegmenter.java	1 Oct 2007 20:36:25 -0000	1.2
@@ -16,7 +16,7 @@
  * should be added to the parent segmenter through calls to {@link #addDaughterSegmenter}.
  *
  * @author D. Onoprienko
- * @version $Id: ForwardingSegmenter.java,v 1.1 2007/09/25 03:16:32 onoprien Exp $
+ * @version $Id: ForwardingSegmenter.java,v 1.2 2007/10/01 20:36:25 onoprien Exp $
  */
 abstract public class ForwardingSegmenter extends AbstractSegmenter {
   
@@ -80,6 +80,17 @@
     return _daughters.get(idToDaughterIndex(sensorID)).getSensor(sensorID);
   }
   
+  /**
+   * Returns a list of <tt>Sensors</tt> that might contain hits that should be combined
+   * with hits in the <tt>Sensor</tt> whose <tt>sensorID</tt> is supplied as an argument
+   * to form stereo pairs. 
+   * Default implementation forwards the call to the appropriate daughter segmenter. 
+   * Subclasses may override.
+   */
+  public List<Sensor> getStereoPartners(int sensorID) {
+    return _daughters.get(idToDaughterIndex(sensorID)).getStereoPartners(sensorID);
+  }
+  
 // -- Initialization :  --------------------------------------------------------
   
   /**

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom
RegionSegmenter.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- RegionSegmenter.java	25 Sep 2007 03:16:32 -0000	1.1
+++ RegionSegmenter.java	1 Oct 2007 20:36:25 -0000	1.2
@@ -28,7 +28,7 @@
  * dependent initialization is required.
  *
  * @author D. Onoprienko
- * @version $Id: RegionSegmenter.java,v 1.1 2007/09/25 03:16:32 onoprien Exp $
+ * @version $Id: RegionSegmenter.java,v 1.2 2007/10/01 20:36:25 onoprien Exp $
  */
 abstract public class RegionSegmenter extends AbstractSegmenter {
   
@@ -132,6 +132,16 @@
 //    System.out.println("Created " + (getMaxPostfix()+1) + " sensors");
   }
   
+  /**
+   * Returns a list of <tt>Sensors</tt> that might contain hits that should be combined
+   * with hits in the <tt>Sensor</tt> whose <tt>sensorID</tt> is supplied as an argument
+   * to form stereo pairs.
+   * Default implementation returns an empty list. Subclasses may override.
+   */
+  public List<Sensor> getStereoPartners(int sensorID) {
+    return Collections.emptyList();
+  }
+  
 // -- Handling prefixes and postfixes :  ---------------------------------------
   
   /**

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom
SegmentationManager.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- SegmentationManager.java	25 Sep 2007 03:16:32 -0000	1.7
+++ SegmentationManager.java	1 Oct 2007 20:36:25 -0000	1.8
@@ -36,7 +36,7 @@
  * method in the future.
  *
  * @author D.Onoprienko
- * @version $Id: SegmentationManager.java,v 1.7 2007/09/25 03:16:32 onoprien Exp $
+ * @version $Id: SegmentationManager.java,v 1.8 2007/10/01 20:36:25 onoprien Exp $
  */
 public class SegmentationManager implements ConditionsListener {
   
@@ -49,6 +49,8 @@
   public SegmentationManager(Segmenter segmenter) {
     _createSensorsOnDetectorChange = false;
     _sensorWeakMap = new HashMap<Integer, SoftReference<Sensor>>();
+    _cacheStereoRequests = true;
+    _stereoMap = new HashMap<Sensor, List<Sensor>>();
     _segmenter = segmenter;
   }
 
@@ -76,6 +78,7 @@
         _sensorWeakMap = new HashMap<Integer, SoftReference<Sensor>>();
         _sensorMap = null;
       }
+      if (_cacheStereoRequests) _stereoMap = new HashMap<Sensor, List<Sensor>>();
       _segmenter.detectorChanged(detector);
       if (_segmenter instanceof AbstractSegmenter) ((AbstractSegmenter)_segmenter).setPrefix(0);
       if (_createSensorsOnDetectorChange) {
@@ -87,10 +90,7 @@
     }
 //    } catch (ConditionsSetNotFoundException x) {}
   }
-  
-  /** Discard all {@link Sensor} objects. */
-  public void purge() {_sensorMap.clear();}
-  
+
 // -- Setters :  ---------------------------------------------------------------
 
   /**
@@ -101,7 +101,10 @@
    *            objects corresponding to all virtual segments are created whenever the 
    *            detector information becomes available (or changes), and are kept in memory
    *            until the end of the job. 
-   *            Default: <tt>false</tt>.</dd></dl>
+   *            Default: <tt>false</tt>.</dd>
+   * <dt>"CACHE_STEREO_REQUESTS"</dt> <dd>If set to <tt>true</tt>, the output of calls to
+   *            {@link #getStereoPartners} will be cached. 
+   *            Default: <tt>true</tt>.</dd></dl>
    * 
    * @param name   Name of parameter to be set. Case is ignored.
    * @param value  Value to be assigned to the parameter.
@@ -112,6 +115,8 @@
   public void set(String name, boolean value) {
     if (name.equalsIgnoreCase("MAKE_SENSORS_ON_DETECTOR_CHANGE")) {
       _createSensorsOnDetectorChange = value;
+    } else if (name.equalsIgnoreCase("CACHE_STEREO_REQUESTS")) {
+      _cacheStereoRequests = value;
     } else {
       throw new NoSuchParameterException(name, this.getClass());
     }
@@ -205,8 +210,30 @@
     }
     return sensorID;
   }
+
+// -- Getting info about Sensors :  --------------------------------------------
+
+  /**
+   * Returns a list of <tt>Sensors</tt> that might contain hits that should be combined
+   * with hits in the <tt>Sensor</tt> supplied as an argument to form stereo pairs. 
+   * If the <tt>Segmenter</tt> used by this <tt>SegmentationManager</tt> does not support 
+   * stereo partner lookup, an empty list is returned.
+   */  
+  public List<Sensor> getStereoPartners(Sensor sensor) {
+    List<Sensor> out;
+    if (_cacheStereoRequests) {
+      out = _stereoMap.get(sensor);
+      if (out == null) {
+        out = _segmenter.getStereoPartners(sensor.getID());
+        _stereoMap.put(sensor, out);
+      }
+    } else {
+      out = _segmenter.getStereoPartners(sensor.getID());
+    }
+    return out;
+  }
   
-// -- Static access to segmentation manager :  - -------------------------------
+// -- Static access to segmentation manager :  ---------------------------------
   
   /** 
    * Set default segmentation manager. 
@@ -239,4 +266,7 @@
   
   private boolean _createSensorsOnDetectorChange;
 
+  private boolean _cacheStereoRequests;
+  private HashMap<Sensor, List<Sensor>> _stereoMap;
+
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom
Segmenter.java 1.5 -> 1.6
diff -u -r1.5 -r1.6
--- Segmenter.java	25 Sep 2007 03:16:32 -0000	1.5
+++ Segmenter.java	1 Oct 2007 20:36:25 -0000	1.6
@@ -13,7 +13,7 @@
  * {@link AbstractSegmenter} for details.
  *
  * @author D. Onoprienko
- * @version $Id: Segmenter.java,v 1.5 2007/09/25 03:16:32 onoprien Exp $
+ * @version $Id: Segmenter.java,v 1.6 2007/10/01 20:36:25 onoprien Exp $
  */
 public interface Segmenter {
   
@@ -46,4 +46,12 @@
    */
   public void detectorChanged(Detector detector);
   
+  /**
+   * Returns a list of <tt>Sensors</tt> that might contain hits that should be combined
+   * with hits in the <tt>Sensor</tt> whose <tt>sensorID</tt> is supplied as an argument
+   * to form stereo pairs. 
+   * <tt>Segmenters</tt> that do not support stereo partner lookup should return empty list.
+   */
+  public List<Sensor> getStereoPartners(int sensorID);
+  
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom/segmenters
DiskTrackerSegmenter.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- DiskTrackerSegmenter.java	25 Sep 2007 03:16:33 -0000	1.1
+++ DiskTrackerSegmenter.java	1 Oct 2007 20:36:25 -0000	1.2
@@ -17,7 +17,7 @@
  * method that assigns segmenters to disks.
  *
  * @author D. Onoprienko
- * @version $Id: DiskTrackerSegmenter.java,v 1.1 2007/09/25 03:16:33 onoprien Exp $
+ * @version $Id: DiskTrackerSegmenter.java,v 1.2 2007/10/01 20:36:25 onoprien Exp $
  */
 abstract public class DiskTrackerSegmenter extends ForwardingSegmenter {
   
@@ -71,6 +71,7 @@
   public int getLayer(IDetectorElement de) {
     int index = _dElements.indexOf(de);
     int nLayers = _dElements.size()/2;
+    System.out.println("index " + index + " nLayers "+ nLayers + " layer "+ ((index < nLayers) ? nLayers-index-1 : index - nLayers));
     return (index < nLayers) ? nLayers-index-1 : index - nLayers;
   }
   

lcsim/src/org/lcsim/contrib/onoprien/tracking/geom/segmenters
DiskTrackerToWedgesSegmenter.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- DiskTrackerToWedgesSegmenter.java	25 Sep 2007 03:57:25 -0000	1.3
+++ DiskTrackerToWedgesSegmenter.java	1 Oct 2007 20:36:25 -0000	1.4
@@ -13,7 +13,7 @@
  *
  *
  * @author D. Onoprienko
- * @version $Id: DiskTrackerToWedgesSegmenter.java,v 1.3 2007/09/25 03:57:25 onoprien Exp $
+ * @version $Id: DiskTrackerToWedgesSegmenter.java,v 1.4 2007/10/01 20:36:25 onoprien Exp $
  */
 public class DiskTrackerToWedgesSegmenter extends DiskTrackerSegmenter {
   
@@ -38,6 +38,7 @@
       double radiusOuter = solid.getOuterRadius();
       nRadialSlices = (int)Math.round((radiusOuter - radiusInner)/_stripLength);
     } else {
+      System.out.println(" " + de.getName());
       nRadialSlices = _radialSlicesBySuperlayer[getSuperlayer(de)];
     }
     

lcsim/src/org/lcsim/contrib/onoprien/tracking/hitmaking
HitMakingDriver.java added at 1.1
diff -N HitMakingDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HitMakingDriver.java	1 Oct 2007 20:36:26 -0000	1.1
@@ -0,0 +1,161 @@
+package org.lcsim.contrib.onoprien.tracking.hitmaking;
+
+import java.util.*;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.recon.cat.util.NoSuchParameterException;
+import org.lcsim.util.Driver;
+
+import org.lcsim.contrib.onoprien.tracking.geom.Sensor;
+import org.lcsim.contrib.onoprien.tracking.geom.SensorType;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerHit;
+
+import static org.lcsim.contrib.onoprien.tracking.hitmaking.HitMakingDriver.UsedClusters;
+
+/**
+ * Driver that that constructs {@link TrackerHit} collection given {@link TrackerCluster}
+ * collection. 
+ *
+ * @author D. Onoprienko
+ * @version $Id: HitMakingDriver.java,v 1.1 2007/10/01 20:36:26 onoprien Exp $
+ */
+public class HitMakingDriver extends Driver {
+  
+// -- Constructors :  ----------------------------------------------------------
+  
+  public HitMakingDriver(TrackerHitMaker hitMaker) {
+    _clusterMapName = "INPUT_MAP_NAME";
+    _hitMapName= "OUTPUT_MAP_NAME";
+    _hitMaker = hitMaker;
+    _registerHitsWithClusters = false;
+    _usedClusters = UsedClusters.INCLUDE_NEW;
+    
+  }
+
+// -- Setters :  ---------------------------------------------------------------
+
+  /**
+   * Set any <tt>String</tt> parameter. 
+   * The following parameters can be set with this method:
+   * <p><dl>
+   * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input collection of tracker clusters
+   *       (type <tt>HashMap&lt;Sensor, ArrayList&lt;TrackerCluster&gt;&gt;</tt>). 
+   *       <br>Default: "TrackerClusters".</dd>
+   * <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of output collection of tracker hits
+   *       (type <tt>HashMap&lt;Sensor, ArrayList&lt;TrackerHit&gt;&gt;</tt>). 
+   *       <br>Default: "TrackerHits".</dd>
+   * <dt>"USED_CLUSTERS"</dt> <dd>Tell the driver what to do with <tt>Clusters</tt>
+   *       that already have <tt>TYrackerHits</tt> associated with them. Possible values:
+   *           <tt>"SKIP"</tt> - ignore used clusters;
+   *           <tt>"INCLUDE_OLD"</tt> - include existing <tt>TrackerHits</tt> associated with
+   *                                    used clusters into the output collection;
+   *           <tt>"INCLUDE_NEW"</tt> - produce new <tt>TrackerHits</tt> from used clusters,
+   *                                    and include them into output collection.
+   *           <br>Default: "INCLUDE_NEW".</dd></dl>
+   * 
+   * @param name   Name of parameter to be set. Case is ignored.
+   * @param value  Value to be assigned to the parameter.
+   * @throws NoSuchParameterException Thrown if the supplied parameter name is unknown.
+   *         Subclasses may catch this exception after a call to <tt>super.set()</tt>
+   *         and set their own parameters.
+   */
+  public void set(String name, String value) {
+    if (name.equalsIgnoreCase("INPUT_MAP_NAME")) {
+      _clusterMapName = value;
+    } else if (name.equalsIgnoreCase("OUTPUT_MAP_NAME")) {
+      _hitMapName = value;
+    } else if (name.equalsIgnoreCase("USED_CLUSTERS")) {
+      if (value.equalsIgnoreCase("SKIP")) {
+        _usedClusters = UsedClusters.SKIP;
+      } else if (value.equalsIgnoreCase("INCLUDE_OLD")) {
+        _usedClusters = UsedClusters.INCLUDE_OLD;
+      } else if (value.equalsIgnoreCase("INCLUDE_NEW")) {
+        _usedClusters = UsedClusters.INCLUDE_NEW;
+      } else if (value.equalsIgnoreCase("UPDATE_SKIP")) {
+        _usedClusters = UsedClusters.UPDATE_SKIP;
+        throw new IllegalArgumentException("Not yet implemented: set(" + name + ", " + value + ")");
+      } else if (value.equalsIgnoreCase("UPDATE_INCLUDE")) {
+        _usedClusters = UsedClusters.UPDATE_INCLUDE;
+        throw new IllegalArgumentException("Not yet implemented: set(" + name + ", " + value + ")");
+      } else {
+        throw new IllegalArgumentException("Illegal value: set(" + name + ", " + value + ")");
+      }
+    } else {
+      throw new NoSuchParameterException(name, this.getClass());
+    }
+  }
+
+  /**
+   * Set any <tt>boolean</tt> parameter. 
+   * The following parameters can be set with this method:
+   * <p><dl>
+   * <dt>"REGISTER_HITS_WITH_CLUSTERS"</dt> <dd>If set to <tt>true</tt>, newly created
+   *           tracker hits will be registered with clusters from which they were 
+   *           produced, and can be later accessed through a call to 
+   *           {@link TrackerCluster#getTrackerHits} method.
+   *           <br>Default: <tt>false</tt>.</dd></dl>
+   * 
+   * @param name   Name of parameter to be set. Case is ignored.
+   * @param value  Value to be assigned to the parameter.
+   * @throws NoSuchParameterException Thrown if the supplied parameter name is unknown.
+   *         Subclasses may catch this exception after a call to <tt>super.set()</tt>
+   *         and set their own parameters.
+   */
+  public void set(String name, boolean value) {
+    if (name.equalsIgnoreCase("REGISTER_HITS_WITH_CLUSTERS")) {
+      _registerHitsWithClusters = value;
+    } else {
+      throw new NoSuchParameterException(name, this.getClass());
+    }
+  }
+  
+// -- Event processing :  ------------------------------------------------------
+  
+  public void process(EventHeader event) {
+    
+//    System.out.println(" ");
+//    System.out.println("Starting TrackerHit making");
+    
+    super.process(event);
+    
+    HashMap<Sensor, ArrayList<TrackerCluster>> clusterMap = 
+            (HashMap<Sensor, ArrayList<TrackerCluster>>) event.get(_clusterMapName);
+    HashMap<Sensor, ArrayList<TrackerHit>> hitMap = new HashMap<Sensor, ArrayList<TrackerHit>>();
+
+    for (Sensor sensor : clusterMap.keySet()) {
+      List<TrackerCluster> clusterList = clusterMap.get(sensor);
+      ArrayList<TrackerHit> hitList = new ArrayList<TrackerHit>(clusterList.size());
+      for (TrackerCluster cluster : clusterList) {
+        List<TrackerHit> oldHits = cluster.getTrackerHits();
+        if (oldHits.isEmpty() || _usedClusters == UsedClusters.INCLUDE_NEW) {
+          TrackerHit hit = _hitMaker.make(cluster);
+          hitList.add(hit);
+          if (_registerHitsWithClusters) {
+            cluster.addTrackerHit(hit);
+          }
+        } else if (_usedClusters == UsedClusters.INCLUDE_OLD) {
+          hitList.addAll(oldHits);
+        }
+      }
+      if (! hitList.isEmpty()) {
+        hitList.trimToSize();
+        hitMap.put(sensor, hitList);
+      }
+    }
+
+    event.put(_hitMapName, hitMap);
+  }
+  
+// -- Private parts :  ---------------------------------------------------------
+  
+  private String _clusterMapName;
+  private String _hitMapName;
+  
+  protected boolean _registerHitsWithClusters;
+  
+  protected TrackerHitMaker _hitMaker;
+  
+  protected enum UsedClusters {SKIP, INCLUDE_OLD, INCLUDE_NEW, UPDATE_SKIP, UPDATE_INCLUDE}
+  protected UsedClusters _usedClusters;
+}

lcsim/src/org/lcsim/contrib/onoprien/tracking/hitmaking
TrackerHitMaker.java added at 1.1
diff -N TrackerHitMaker.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrackerHitMaker.java	1 Oct 2007 20:36:26 -0000	1.1
@@ -0,0 +1,32 @@
+package org.lcsim.contrib.onoprien.tracking.hitmaking;
+
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerHit;
+import org.lcsim.contrib.onoprien.tracking.track.TrackPoint;
+
+/**
+ * Interface to be conformed to by classes that implement algorithms for producing
+ * {@link TrackerHit} objects from {@link TrackerCluster} objects, possibly taking
+ * into account information from tracks associated with the hits.
+ *
+ * @author D.Onoprienko
+ * @version $Id: TrackerHitMaker.java,v 1.1 2007/10/01 20:36:26 onoprien Exp $
+ */
+public interface TrackerHitMaker {
+  
+  /**
+   * Makes a new <tt>TrackerHit</tt>.
+   */
+  public TrackerHit make(TrackerCluster cluster);
+  
+  /**
+   * Makes a new or updates an existing <tt>TrackerHit</tt>.
+   */
+  public TrackerHit make(TrackerCluster cluster, TrackPoint trackPoint);
+  
+  /**
+   * Update an existing <tt>TrackerHit</tt> using trajectory information.
+   */
+  public void update(TrackerHit hit, TrackPoint trackPoint);
+    
+}

lcsim/src/org/lcsim/contrib/onoprien/tracking/hitmaking/hitmakers
TrackerHitMakerBasic.java added at 1.1
diff -N TrackerHitMakerBasic.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrackerHitMakerBasic.java	1 Oct 2007 20:36:26 -0000	1.1
@@ -0,0 +1,116 @@
+package org.lcsim.contrib.onoprien.tracking.hitmaking.hitmakers;
+
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.*;
+
+import org.lcsim.units.clhep.SystemOfUnits;
+
+import org.lcsim.contrib.onoprien.tracking.geom.Sensor;
+import org.lcsim.contrib.onoprien.tracking.geom.SensorType;
+import org.lcsim.contrib.onoprien.tracking.hit.DigiTrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hit.base.TrackerHitPoint;
+import org.lcsim.contrib.onoprien.tracking.hit.base.TrackerHitSegment;
+import org.lcsim.contrib.onoprien.tracking.track.TrackPoint;
+
+/**
+ * Simplistic <tt>TrackerHitMaker</tt>.
+ * Trajectory is ignored by all methods.
+ * Hit position is calculated as signal-weighted average of all channels.
+ * For strips, the length and V-position of the hit are the length and V-position
+ * of the shortest strip.
+ *
+ * @author D. Onoprienko
+ * @version $Id: TrackerHitMakerBasic.java,v 1.1 2007/10/01 20:36:26 onoprien Exp $
+ */
+public class TrackerHitMakerBasic implements TrackerHitMaker {
+  
+// -- Constructors :  ----------------------------------------------------------
+  
+  public TrackerHitMakerBasic() {
+  }
+  
+// -- Making and updating hits :  ----------------------------------------------
+  
+  /**
+   * Makes a new <tt>TrackerHit</tt>.
+   */
+  public TrackerHit make(TrackerCluster cluster) {
+
+    Sensor sensor = cluster.getSensor();
+    SensorType sType = sensor.getType();
+    double signal = 0;
+    double[] minDim = new double[]{Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE};
+    int[] minDimChannel = new int[3];
+    double[] posMean = new double[3];
+    double[] pos2Mean = new double[3];
+    for (DigiTrackerHit digiHit : cluster.getDigiHits()) {
+      double s = digiHit.getSignal();
+      signal += s;
+      int channel = digiHit.getChannel();
+      double[] pos = sType.getChannelPosition(channel).v();
+      double[] dim = sType.getChannelDimensions(channel).v();
+      for (int i=0; i<3; i++) {
+        posMean[i] += pos[i]*s;
+        pos2Mean[i] += pos[i]*pos[i]*s;
+        if (dim[i] < minDim[i]) {
+          minDim[i] = dim[i];
+          minDimChannel[i] = channel;
+        }
+      }
+    }
+
+    double[] pos = new double[3];
+    double[] error = new double[3];
+    for (int i=0; i<3; i++) {
+      posMean[i] /= signal;
+      pos2Mean[i] /= signal;
+      double err2 = pos2Mean[i] - posMean[i]*posMean[i];
+      error[i] = (err2 > _err2Min) ? Math.sqrt(err2) : minDim[i]*_errFlat;
+      pos[i] = posMean[i];
+    }
+
+    TrackerHit hit;
+    SymmetricMatrix covMatrix = new SymmetricMatrix(3, new double[]{error[0], 0., error[1],0., 0., error[2]}, true);
+    if (sType.getHitDimension() == 1) { // Strips
+      pos[1] = sType.getChannelPosition(minDimChannel[1]).y();
+      hit = new TrackerHitSegment(cluster, new BasicHep3Vector(pos), minDim[1], covMatrix, true);
+    } else {  // Pixels
+      hit = new TrackerHitPoint(cluster, new BasicHep3Vector(pos), covMatrix, true);
+    }
+    return hit;
+  }
+  
+  /**
+   * Makes a new <tt>TrackerHit</tt>, taking into account associated track information.
+   * Ignores track information at the moment.
+   */
+  public TrackerHit make(TrackerCluster cluster, TrackPoint trackPoint) {
+    return make(cluster);
+  }
+  
+  /**
+   * Update an existing <tt>TrackerHit</tt> using trajectory information.
+   * Does nothing at the moment.
+   */
+  public void update(TrackerHit hit, TrackPoint trackPoint) {
+  }
+  
+// -- Helper methods:  ---------------------------------------------------------
+  
+  private Hep3Vector sqr(Hep3Vector v) {
+    double[] a = v.v();
+    for (int i=0; i<3; i++) a[i] = a[i]*a[i];
+    return new BasicHep3Vector(a);
+  }
+  
+// -- Private parts :  ---------------------------------------------------------
+  
+  private double _err2Min = (0.1 * SystemOfUnits.um) * (0.1 * SystemOfUnits.um);
+  private double _errFlat = 1./Math.sqrt(12.);
+  
+}
CVSspam 0.2.8