3 added + 8 modified, total 11 files
lcsim/src/org/lcsim/contrib/onoprien/tracking
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
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
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
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
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
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
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
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
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<Sensor, ArrayList<TrackerCluster>></tt>).
+ * <br>Default: "TrackerClusters".</dd>
+ * <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of output collection of tracker hits
+ * (type <tt>HashMap<Sensor, ArrayList<TrackerHit>></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
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
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