Print

Print


Author: [log in to unmask]
Date: Tue Dec 16 17:01:27 2014
New Revision: 1769

Log:
Attempt to create a Clusterer by canonical class name if it is not found by its short name.

Modified:
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClustererFactory.java

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClustererFactory.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClustererFactory.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClustererFactory.java	Tue Dec 16 17:01:27 2014
@@ -4,11 +4,23 @@
 import org.lcsim.conditions.ConditionsManager;
 
 /**
- * This is a convenience class for creating different kinds of clustering algorithms.
+ * <p>
+ * This is a convenience class for creating different kinds of clustering algorithms via their name.
+ * <p>
+ * The currently available types include:
+ * <ul>
+ * <li>{@link LegacyClusterer}</li>
+ * <li>{@link SimpleClasInnerCalClusterer}</li>
+ * <li>{@link ClasInnerCalClusterer</li>
+ * </ul>
+ * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public final class ClustererFactory {
     
+    /**
+     * We don't want this class to be instantiated.
+     */
     private ClustererFactory() {        
     }
     
@@ -21,17 +33,29 @@
      */
     public static Clusterer create(String name, double[] cuts) {
         Clusterer clusterer;
-        System.out.println("simple name:" + LegacyClusterer.class.getSimpleName());
-        if (LegacyClusterer.class.getSimpleName().equals(name)) {            
+        if (LegacyClusterer.class.getSimpleName().equals(name)) {
+            // Test Run legacy clusterer.
             clusterer = new LegacyClusterer();
         } else if (SimpleClasInnerCalClusterer.class.getSimpleName().equals(name)) {
+            // Simple IC clusterer.
             clusterer = new SimpleClasInnerCalClusterer();
+        } else if (ClasInnerCalClusterer.class.getSimpleName().equals(name)) {
+            // Full IC algorithm.
+            clusterer = new ClasInnerCalClusterer();
         } else {
-            throw new IllegalArgumentException("Unknown clusterer type: " + name);
+            // Try to instantiate the class from the name argument, assuming it is a canonical class name.
+            try {
+                clusterer = fromCanonicalClassName(name);
+            } catch (Exception e) {
+                // Okay nothing worked, so we have a problem!
+                throw new IllegalArgumentException("Unknown Clusterer type " + name + " cannot be instantiated.", e);
+            }
         }
+        // Add the Clusterer as a conditions listener so it can set itself up via the conditions system.
         if (clusterer instanceof ConditionsListener) {
             ConditionsManager.defaultInstance().addConditionsListener((ConditionsListener) clusterer);
         }
+        // Set cuts if they were provided.
         if (cuts != null) {
             clusterer.setCuts(cuts);
         }
@@ -40,10 +64,32 @@
     
     /**
      * Create a clustering algorithm with default cut values.
+     * This is just a simple wrapper to {@link #create(String, double[])}.
      * @param name The name of the clustering algorithm.
      * @return The clustering algorithm.
      */
     public static Clusterer create(String name) {
         return create(name, null);
     }
+    
+    /**
+     * Attempt to create a Clusterer object from the canonical class name.
+     * @param canonicalName
+     * @return
+     * @throw IllegalArgumentException if the class does not implement the Clusterer interface.
+     */
+    private static Clusterer fromCanonicalClassName(String canonicalName) {
+        Clusterer clusterer = null;
+        try {
+            Class<?> clustererClass = Class.forName(canonicalName);
+            Object object = clustererClass.newInstance();
+            if (!(object instanceof Clusterer)) { 
+                throw new IllegalArgumentException("The class " + canonicalName + " does not implement the Clusterer interface.");
+            } 
+            clusterer = (Clusterer) object;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return clusterer;
+    }
 }