lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/crux/itc
diff -u -r1.1 -r1.2
--- LayerData.java 29 Mar 2009 23:44:19 -0000 1.1
+++ LayerData.java 30 Mar 2009 05:41:21 -0000 1.2
@@ -6,15 +6,13 @@
import org.lcsim.geometry.IDDecoder;
import org.lcsim.contrib.onoprien.crux.geom.CalLayer;
-import org.lcsim.contrib.onoprien.crux.geom.CalModule;
-import org.lcsim.contrib.onoprien.crux.geom.CalGeometry;
/**
* An instance of this class stores various data structures used by {@link RosaryClusterer}
* that belong to a particular layer of a particular calorimeter module.
*
* @author D. Onoprienko
- * @version $Id: LayerData.java,v 1.1 2009/03/29 23:44:19 onoprien Exp $
+ * @version $Id: LayerData.java,v 1.2 2009/03/30 05:41:21 onoprien Exp $
*/
public class LayerData {
lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/crux/itc
diff -u -r1.1 -r1.2
--- RosaryClusterer.java 29 Mar 2009 23:44:19 -0000 1.1
+++ RosaryClusterer.java 30 Mar 2009 05:41:21 -0000 1.2
@@ -27,6 +27,9 @@
* <p>
* Methods that can be overridden to tune the algorithm:
* <dl>
+ * <dt>{@link #findDotsAndBeads() findDotsAndBeads(CruxHitMap)}</dt>
+ * <dd>Finds Dots and Beads in the calorimeter, and fills corresponding lists for each layer in
+ * the <tt>_layerDB</tt>.</dd>
* <dt>{@link #chooseSeedLayers()}</dt>
* <dd>Returns a list of calorimeter layers from which new rosaries can be started,
* in order in which they should be processed.</dd>
@@ -60,7 +63,7 @@
* </dl>
*
* @author D. Onoprienko
- * @version $Id: RosaryClusterer.java,v 1.1 2009/03/29 23:44:19 onoprien Exp $
+ * @version $Id: RosaryClusterer.java,v 1.2 2009/03/30 05:41:21 onoprien Exp $
*/
public class RosaryClusterer extends Driver implements Clusterer, JobEventListener {
@@ -77,8 +80,6 @@
private boolean _saveDotsBeads = false;
- protected DotAndBeadFinder _dotBeadFinder;
-
protected LayerDataBase _layerDB;
protected int _nLayers;
@@ -94,6 +95,7 @@
protected AcceptThreadedRosary _acceptThreadedRosary;
protected SelectRosaries _selectRosaries;
protected ComputeTrajectory _computeTrajectory;
+ protected FindDotsAndBeads _findDotsAndBeads;
// -- Constructors and initialization : ---------------------------------------
@@ -107,7 +109,6 @@
public void detectorChanged(JobEvent jEvent) {
_nLayers = -1;
- _dotBeadFinder = new DotAndBeadFinder();
}
// -- Set/Get plug-in algorithms : --------------------------------------------
@@ -124,6 +125,7 @@
public void setAcceptThreadedRosary(AcceptThreadedRosary plugin) {_acceptThreadedRosary = plugin;}
public void setSelectRosaries(SelectRosaries plugin) {_selectRosaries = plugin;}
public void setComputeTrajectory(ComputeTrajectory plugin) {_computeTrajectory = plugin;}
+ public void setFindDotsAndBeads(FindDotsAndBeads plugin) {_findDotsAndBeads = plugin;}
final public ChooseSeedLayers getChooseSeedLayers() {return _chooseSeedLayers;}
final public SeedFromTrack getSeedFromTrack() {return _seedFromTrack;}
@@ -137,6 +139,8 @@
final public AcceptThreadedRosary getAcceptThreadedRosary() {return _acceptThreadedRosary;}
final public SelectRosaries getSelectRosaries() {return _selectRosaries;}
final public ComputeTrajectory getComputeTrajectory() {return _computeTrajectory;}
+ final public FindDotsAndBeads getFindDotsAndBeads() {return _findDotsAndBeads;}
+
// -- Setters : ---------------------------------------------------------------
@@ -282,8 +286,6 @@
// -- Actual clustering algorithm : -------------------------------------------
public List<Cluster> createClusters(CruxHitMap hitMap) {
-
- _layerDB = new LayerDataBase();
if (_inParticles != null) {
for (CruxParticle p : _inParticles) {
@@ -294,10 +296,8 @@
// Find Dots and Beads in all layers :
- for (LayerData layerData : _layerDB) {
- CruxHitMap layerMap = hitMap.toMap(layerData.cruxLayer);
- _dotBeadFinder.findDotsAndBeads(layerMap, layerData.dots, layerData.beads);
- }
+ _layerDB = new LayerDataBase();
+ _findDotsAndBeads.findDotsAndBeads(hitMap);
_layerDB.initialize();
// Create Rosaries from tracks :
@@ -373,6 +373,10 @@
// -- Algorithm plug-in interfaces : ------------------------------------------
+ public interface FindDotsAndBeads {
+ void findDotsAndBeads(CruxHitMap hitMap);
+ }
+
public interface ChooseSeedLayers {
List<CalLayer> chooseSeedLayers();
}
lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/crux/itc
diff -N DotAndBeadFinder.java
--- DotAndBeadFinder.java 29 Mar 2009 23:44:19 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,56 +0,0 @@
-package org.lcsim.contrib.onoprien.crux.itc;
-
-import java.util.*;
-
-import org.lcsim.event.Cluster;
-import org.lcsim.recon.cluster.nn.NearestNeighborClusterer;
-import org.lcsim.recon.cluster.util.Clusterer;
-
-import org.lcsim.contrib.onoprien.util.job.JobManager;
-
-import org.lcsim.contrib.onoprien.crux.geom.CalLayer;
-import org.lcsim.contrib.onoprien.crux.geom.CalGeometry;
-import org.lcsim.contrib.onoprien.crux.infrastructure.*;
-
-/**
- * Clusterer that creates {@link Dot}s and {@link Beads} on a layer.
- *
- * @author D. Onoprienko
- * @version $Id: DotAndBeadFinder.java,v 1.1 2009/03/29 23:44:19 onoprien Exp $
- */
-public class DotAndBeadFinder {
-
-// -- Constructors and initialization : ---------------------------------------
-
- public DotAndBeadFinder() {
- _clusterer = new NearestNeighborClusterer(1, 1, 0, 0, 0.);
- _geom = JobManager.defaultInstance().get(CalGeometry.class);
- }
-
-
-// -- Dot finding : -----------------------------------------------------------
-
- /**
- * Fills the supplied lists with <tt>Dots</tt> and <tt>Beads</tt> created from hits in the
- * given map. The map should only contain hits on a single calorimeter layer.
- */
- public void findDotsAndBeads(CruxHitMap hitMap, ArrayList<Dot> dots, ArrayList<Bead> beads) {
- if (hitMap.isEmpty()) return;
- CalLayer layer = _geom.getLayer(hitMap.values().iterator().next());
- List<Cluster> clusters = _clusterer.createClusters(hitMap);
- for (Cluster cluster : clusters) {
- if (cluster.getSize() < 2) {
- dots.add(new Dot(layer, cluster));
- } else {
- beads.add(new Bead(layer, cluster));
- }
- }
- dots.trimToSize();
- beads.trimToSize();
- }
-
-// -- Private parts : ---------------------------------------------------------
-
- Clusterer _clusterer;
- CalGeometry _geom;
-}
lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/crux/itc/algorithms
diff -N FindDotsAndBeads_Basic.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ FindDotsAndBeads_Basic.java 30 Mar 2009 05:41:22 -0000 1.1
@@ -0,0 +1,127 @@
+package org.lcsim.contrib.onoprien.crux.itc.algorithms;
+
+import java.util.*;
+
+import org.lcsim.event.Cluster;
+import org.lcsim.recon.cluster.nn.NearestNeighborClusterer;
+import org.lcsim.recon.cluster.util.Clusterer;
+
+import org.lcsim.contrib.onoprien.util.NoSuchParameterException;
+import org.lcsim.contrib.onoprien.util.job.Driver;
+import org.lcsim.contrib.onoprien.util.job.JobManager;
+
+import org.lcsim.contrib.onoprien.crux.geom.CalLayer;
+import org.lcsim.contrib.onoprien.crux.geom.CalGeometry;
+import org.lcsim.contrib.onoprien.crux.infrastructure.CruxHitMap;
+import org.lcsim.contrib.onoprien.crux.itc.Bead;
+import org.lcsim.contrib.onoprien.crux.itc.Dot;
+import org.lcsim.contrib.onoprien.crux.itc.LayerData;
+import org.lcsim.contrib.onoprien.crux.itc.LayerDataBase;
+import org.lcsim.contrib.onoprien.crux.itc.RosaryClusterer;
+
+/**
+ * Implements findDotsAndBeads(CruxHitMap hitMap).
+ * <p>
+ * See methods javadoc for details on algorithms and implementations.
+ *
+ * @author D. Onoprienko
+ * @version $Id: FindDotsAndBeads_Basic.java,v 1.1 2009/03/30 05:41:22 onoprien Exp $
+ */
+public class FindDotsAndBeads_Basic implements RosaryClusterer.FindDotsAndBeads {
+
+// -- Private parts : ---------------------------------------------------------
+
+ RosaryClusterer _clusterer;
+ CalGeometry _geom;
+
+ Clusterer _layerClusterer;
+ int _dotSizeLimit;
+
+
+// -- Constructors and initialization : ---------------------------------------
+
+ public FindDotsAndBeads_Basic(RosaryClusterer clusterer) {
+
+ _clusterer = clusterer;
+ _geom = JobManager.defaultInstance().get(CalGeometry.class);
+
+ _layerClusterer = new NearestNeighborClusterer(1, 1, 0, 0, 0.);
+ _dotSizeLimit = 1;
+ }
+
+
+// -- Setters : ---------------------------------------------------------------
+
+ /**
+ * Set any parameter.
+ * The following parameters can be set with this method:
+ * <p><dl>
+ * <dt>"CLUSTERER"</dt> <dd>{@link Clusterer} to be used on each calorimeter layer.
+ * <br>Default: <tt>NearestNeighborClusterer(1, 1, 0, 0, 0.)</tt>.</dd>
+ * <dt>"DOT_SIZE_LIMIT"</dt> <dd>Integer value. Clusters with no more hits than this value
+ * will be considered Dots. All other clusters will be treated as Beads.
+ * <br>Default: 1.</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 number of values, or a value
+ * of incorrect type is supplied.
+ */
+ public void set(String name, Object... values) {
+ try {
+ if (name.equalsIgnoreCase("N")) {
+ _layerClusterer = (Clusterer) values[0];
+ } else if (name.equalsIgnoreCase("DOT_SIZE_LIMIT")) {
+ _dotSizeLimit = (Integer) values[0];
+ } else {
+ throw new NoSuchParameterException(name);
+ }
+ } catch (ClassCastException x) {
+ throw new IllegalArgumentException(Driver.ERR_VIT + name, x);
+ }
+ }
+
+
+// -- Algorithms : ------------------------------------------------------------
+
+ /**
+ * Finds Dots and Beads in the calorimeter, and fills corresponding lists for each layer in
+ * the {@link RosaryClusterer#getLayerDB()}.
+ * <p>
+ * Algorithm : use the specified {@link Clusterer} on each layer separately, then
+ * classify clusters into Dots and Beads depending on their size.
+ *
+ * @param hitMap Map of all calorimeter hits to be used in finding Dots and Beads.
+ */
+ public void findDotsAndBeads(CruxHitMap hitMap) {
+
+ LayerDataBase db = _clusterer.getLayerDB();
+
+ for (LayerData data : db) {
+
+ CalLayer layer = data.cruxLayer;
+ ArrayList<Dot> dots = data.dots;
+ ArrayList<Bead> beads = data.beads;
+
+ CruxHitMap layerMap = hitMap.toMap(layer);
+ if (layerMap.isEmpty()) return;
+
+ List<Cluster> clusters = _clusterer.createClusters(layerMap);
+ for (Cluster cluster : clusters) {
+ if (cluster.getSize() <= _dotSizeLimit) {
+ dots.add(new Dot(layer, cluster));
+ } else {
+ beads.add(new Bead(layer, cluster));
+ }
+ }
+ dots.trimToSize();
+ beads.trimToSize();
+
+ }
+
+ db.initialize();
+ }
+
+}