Print

Print


Commit in lcsim/src/org/lcsim/contrib/onoprien/tracking on MAIN
ExampleDriver.java+10-171.9 -> 1.10
digitization/DigitizationDriver.java+43-271.6 -> 1.7
digitization/diagnostics/DigitizerTest.java+188-221.1 -> 1.2
digitization/digitizers/DigitizerSmear.java+3-61.3 -> 1.4
+244-72
4 modified files


lcsim/src/org/lcsim/contrib/onoprien/tracking
ExampleDriver.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- ExampleDriver.java	14 Jul 2007 14:43:35 -0000	1.9
+++ ExampleDriver.java	15 Jul 2007 23:24:02 -0000	1.10
@@ -12,6 +12,7 @@
 import org.lcsim.contrib.onoprien.tracking.clustering.ClusteringDriver;
 import org.lcsim.contrib.onoprien.tracking.digitization.DigitizationDriver;
 import org.lcsim.contrib.onoprien.tracking.digitization.Digitizer;
+import org.lcsim.contrib.onoprien.tracking.digitization.diagnostics.DigitizerTest;
 import org.lcsim.contrib.onoprien.tracking.digitization.digitizers.DigitizerSmear;
 import org.lcsim.contrib.onoprien.tracking.geom.SegmentationManager;
 import org.lcsim.contrib.onoprien.tracking.geom.Sensor;
@@ -23,7 +24,7 @@
 /**
  *
  * @author D.Onoprienko
- * @version $Id: ExampleDriver.java,v 1.9 2007/07/14 14:43:35 onoprien Exp $
+ * @version $Id: ExampleDriver.java,v 1.10 2007/07/15 23:24:02 onoprien Exp $
  */
 public class ExampleDriver extends Driver {
   
@@ -64,15 +65,20 @@
     SegmentationManager.setDefaultInstance(segmentationManager);
     
     // Digitization :
-    
+
     Digitizer digitizer = new DigitizerSmear();
 
     DigitizationDriver digitizationDriver = new DigitizationDriver(digitizer);
-    digitizationDriver.setOutputCollection("DigiHits");
+    digitizationDriver.set("OUTPUT_MAP_NAME", "DigiHits");
     add(digitizationDriver);
     
-    //digitizationDriver.setHistogramLevel(HLEVEL_FULL);
+    // Digitizer diagnostics :
     
+//    digitizationDriver.set("DIAGNOSTIC_MAP_NAME", "SimToDigiGroups");
+//    DigitizerTest digitizerTest = new DigitizerTest();
+//    digitizerTest.set("DIAGNOSTIC_MAP_NAME", "SimToDigiGroups");
+//    add(digitizerTest);
+
     // Clustering :
     
     ClusteringDriver clusteringDriver = new ClusteringDriver();
@@ -88,19 +94,6 @@
 
     super.process(event);
     
-    // Print statistics on digi hits :
-    
-//    HashMap<Sensor, ArrayList<DigiTrackerHit>> dhMap 
-//            = (HashMap<Sensor, ArrayList<DigiTrackerHit>>) event.get("DigiHits");
-//    
-//    for (Sensor sensor : dhMap.keySet()) {
-//      ArrayList<DigiTrackerHit> dList = dhMap.get(sensor);
-//      System.out.println(" ");
-//      System.out.println("Sensor "+sensor.getID()+" Number of hits : " + dList.size());
-//      for (DigiTrackerHit hit : dList) {
-//        System.out.println("Channel "+hit.getChannel()+" comp = "+hit.isComposite()+" size: "+hit.getElementalHits().size());
-//      }
-//    }
   }
   
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/digitization
DigitizationDriver.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- DigitizationDriver.java	14 Jul 2007 14:42:01 -0000	1.6
+++ DigitizationDriver.java	15 Jul 2007 23:24:03 -0000	1.7
@@ -35,7 +35,7 @@
  * in the constructor.
  *
  * @author D.Onoprienko
- * @version $Id: DigitizationDriver.java,v 1.6 2007/07/14 14:42:01 onoprien Exp $
+ * @version $Id: DigitizationDriver.java,v 1.7 2007/07/15 23:24:03 onoprien Exp $
  */
 public class DigitizationDriver extends Driver {
   
@@ -60,20 +60,6 @@
   /** Returns currently used {@link Digitizer} object. */
   public void setDigitizer(Digitizer digitizer) {_digitizer = digitizer;}
   
-  /** Add a name of {@link SimTrackerHit} collection to be processed. */
-  public void addInputCollection(String name) {
-    if (_inListNames == null) _inListNames = new ArrayList<String>(5);
-    _inListNames.add(name);
-  }
-  
-  /**
-   * Set the name for output map (<tt>HashMap<Sensor, ArrayList<DigiTrackerHit>></tt>)
-   * to be saved into the event.
-   */
-  public void setOutputCollection(String name) {
-    _outListName = name;
-  }
-  
   /**
    * Set any <tt>double</tt> parameter.
    * The following parameters can be set with this method:<br>
@@ -95,6 +81,39 @@
     }
   }
   
+  /** 
+   * Set any <tt>String</tt> parameter. 
+   * The following parameters can be set with this method:<br>
+   * <tt>"ADD_INPUT_LIST_NAME"</tt> - Add a name of input list of simulated hits
+   *                 (type <tt>List<SimTrackerHit></tt>). 
+   *                 Default: <tt>null</tt> (all lists will be processed).<br>
+   * <tt>"OUTPUT_MAP_NAME"</tt> - Name of ouitput collection of hist
+   *             (type <tt>HashMap<Sensor, ArrayList<DigiTrackerHit>></tt>). 
+   *             Default: "DigiHits".<br>
+   * <tt>"DIAGNOSTIC_MAP_NAME"</tt> - If set, this name will be used to save a collection
+   *             of pairs of simulated hits lists corresponding to single sensor-particle
+   *             crossing, and digitized hits lists produced from them.
+   *             (type <tt>HashMap<List<SimTrackerHit>,List<DigiTrackerHit>></tt>). 
+   *             Default: <tt>null</tt>.<br>
+   * @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("ADD_INPUT_LIST_NAME")) {
+      if (_inListNames == null) _inListNames = new ArrayList<String>(5);
+      _inListNames.add(name);
+    } else if (name.equalsIgnoreCase("OUTPUT_MAP_NAME")) {
+      _outMapName = value;
+    } else if (name.equalsIgnoreCase("DIAGNOSTIC_MAP_NAME")) {
+      _diagnosticMapName = value;
+    } else {
+      throw new NoSuchParameterException(name, this.getClass());
+    }
+  }
+  
 // -- Processing event :  ------------------------------------------------------
   
   public void process(EventHeader event) {
@@ -120,6 +139,9 @@
     // Create output map :
     
     HashMap<Sensor, ArrayList<DigiTrackerHit>> outMap = new HashMap<Sensor, ArrayList<DigiTrackerHit>>();
+    
+    // diagnostic map, will only be saved if "DIAGNOSTIC_MAP_NAME" has been set
+    HashMap<List<SimTrackerHit>,List<DigiTrackerHit>> diagnostics = new HashMap<List<SimTrackerHit>,List<DigiTrackerHit>>();
 
     // Loop over input collections :
     
@@ -154,7 +176,7 @@
       for (LinkedList<SimTrackerHit> group : groupList) {
         
         List<DigiTrackerHit> digiGroup = _digitizer.digitize(group);
-        if (getHistogramLevel() >= HLEVEL_FULL) DigitizerTest.plotGroup(group, digiGroup);
+        if (_diagnosticMapName != null) diagnostics.put(group, digiGroup);
         
         Sensor prevSensor = null;
         ArrayList<DigiTrackerHit> digiList = null;
@@ -173,14 +195,11 @@
       }
 
     } // end of loop over input collections
+
+    if (_diagnosticMapName != null) event.put(_diagnosticMapName, diagnostics);
     
     // Combine and sort DigiTrackerHits in each list
     
-//      System.out.println("Map before:");
-//      for (ArrayList<DigiTrackerHit> list : outMap.values()) System.out.print(" "+list.size());
-//      System.out.println(" ");
-    
-    
     for (ArrayList<DigiTrackerHit> dList : outMap.values()) {
       Collections.sort(dList);
       DigiTrackerHit[] copy = dList.toArray(new DigiTrackerHit[dList.size()+1]);
@@ -219,14 +238,10 @@
       }
       dList.trimToSize();
     }
-      
-//      System.out.println("Map after:");
-//      for (ArrayList<DigiTrackerHit> list : outMap.values()) System.out.print(" "+list.size());
-//      System.out.println(" ");
     
     // Put the map back into the event
     
-    event.put(_outListName, outMap);
+    event.put(_outMapName, outMap);
     
   }
   
@@ -235,7 +250,8 @@
   protected Digitizer _digitizer;
   
   protected ArrayList<String> _inListNames;
-  protected String _outListName;
+  protected String _outMapName;
+  protected String _diagnosticMapName;
   
   protected double _distCut2;
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/digitization/diagnostics
DigitizerTest.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- DigitizerTest.java	14 Jul 2007 14:41:10 -0000	1.1
+++ DigitizerTest.java	15 Jul 2007 23:24:03 -0000	1.2
@@ -3,52 +3,218 @@
 import java.util.*;
 
 import hep.aida.*;
+import org.lcsim.event.EventHeader;
 import org.lcsim.event.SimTrackerHit;
+import org.lcsim.recon.cat.util.NoSuchParameterException;
+import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
+import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
 
 import org.lcsim.contrib.onoprien.tracking.digitization.*;
 import org.lcsim.contrib.onoprien.tracking.geom.*;
 import org.lcsim.contrib.onoprien.tracking.hit.*;
 
 /**
+ * Tester driver for running SimTrackerHit to DigiTrackerHit conversion diagnostics.
  *
+ * To use this driver, {@link DigitizationDriver} should be asked to save a mapping 
+ * of simulated hit lists corresponding to single sensor-particle crossing, and 
+ * digitized hit lists produced from them, into the event record (through a call to
+ * <tt>set("DIAGNOSTIC_MAP_NAME", mapName)</tt>). This driver will clear the map
+ * and remove it from the event record after use.
+ * 
  * @author D.Onoprienko
- * @version $Id: DigitizerTest.java,v 1.1 2007/07/14 14:41:10 onoprien Exp $
+ * @version $Id: DigitizerTest.java,v 1.2 2007/07/15 23:24:03 onoprien Exp $
  */
-public class DigitizerTest {
+public class DigitizerTest extends Driver {
   
+// -- Constructor :  -----------------------------------------------------------
+  
+  public DigitizerTest() {
+    _aida = AIDA.defaultInstance();
+    _hFactory = _aida.histogramFactory();
+    _eventHistList = new LinkedList<IHistogram>();
+  }
+  
+// -- Setters :  ---------------------------------------------------------------
+  
+  /** 
+   * Set any <tt>String</tt> parameter. 
+   * The following parameters can be set with this method:<br>
+   * <tt>"DIAGNOSTIC_MAP_NAME"</tt> - Name of input collection
+   *         of pairs of simulated hits lists corresponding to single sensor-particle
+   *         crossing, and digitized hits lists produced from them.
+   *         (type <tt>HashMap<List<SimTrackerHit>,List<DigiTrackerHit>></tt>). 
+   *         No Default.<br>
+   * @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("DIAGNOSTIC_MAP_NAME")) {
+      _diagnosticMapName = value;
+    } else {
+      throw new NoSuchParameterException(name, this.getClass());
+    }
+  }
+  
+// -- Processing event :  ------------------------------------------------------
+  
+  public void process(EventHeader event) {
+    
+    while (! _eventHistList.isEmpty()) {
+      _hFactory.destroy(_eventHistList.poll());
+    }
+    _iGroup = 0;
+    
+    _missed = 0;
+    _diagnosticMap = (HashMap<List<SimTrackerHit>,List<DigiTrackerHit>>) event.get(_diagnosticMapName);
+    System.out.println("Testing digitization, " + _diagnosticMap.size() + " groups of hits");
+    
+    for (List<SimTrackerHit> simList : _diagnosticMap.keySet()) {
+      List<DigiTrackerHit> digiList = _diagnosticMap.get(simList);
+      plotGroup(simList, digiList);
+    }
+    if (_missed > 0) System.out.println("Missed " + _missed + " SimTrackerHit groups");
+    
+    super.process(event);
+    _diagnosticMap = null;
+    event.remove(_diagnosticMapName);
+  }
  
 // -----------------------------------------------------------------------------
   
-  static public void plotGroup(List<SimTrackerHit> simList, List<DigiTrackerHit> digiList) {
-
-    System.out.println(" ");
-    System.out.println("Digitizer: in "+simList.size()+" out "+ digiList.size());
-    for (SimTrackerHit simHit : simList) {
-      double[] pos = simHit.getPoint();
-      System.out.println(" Det "+simHit.getSubdetector().getName()+" Layer "+simHit.getLayer()+" X "+pos[0]+" Y "+pos[1]+" Z "+pos[2]);
-    }
+  public void plotGroup(List<SimTrackerHit> simList, List<DigiTrackerHit> digiList) {
+    
     if (digiList.isEmpty()) {
-      System.out.println("Empty output");
+      _missed++;
       return;
     }
-    System.out.println(" Sensor "+digiList.get(0).getSensor().getID());
-    for (DigiTrackerHit dHit : digiList) {
-      Hep3Vector pos = dHit.getSensor().getType().getChannelDimensions(dHit.getChannel());
-      System.out.println(" "+ dHit.getChannel()+" Dimensions u,v,w "+pos.x()+" "+pos.y()+" "+pos.z());
-    }
-    System.out.println(" ");
 
     Sensor sensor = digiList.get(0).getSensor();
-    int sensorID = sensor.getID();
-    ICloud1D cloud1 = aida.cloud1D("Sensor " + sensorID);
-    cloud1.reset();
+    SensorType sensorType = sensor.getType();
+    boolean isStrip = (sensorType.getHitDimension() == 1);
+    String title = "Sensor" + sensor.getID() + "_" + _iGroup++ + "_";
+    String subDetName = simList.get(0).getSubdetector().getName();
+
+    System.out.println("Digitizer: simulated hits in "+simList.size()+" digitized hits out "+ digiList.size()+
+            " subd: " + subDetName + " sensor " + sensor.getID());
+    
+    // Calculate bin values and create histograms
+    
+    double[] lowU = new double[digiList.size()];
+    double[] lowV = new double[digiList.size()];
+    double highU = - Double.MAX_VALUE;
+    double highV = - Double.MAX_VALUE;
+    int i=0;
     for (DigiTrackerHit dHit : digiList) {
-      cloud1.fill(dHit.getChannel(), dHit.getSignal());
+      int channel = dHit.getChannel();
+      Hep3Vector channelSize = sensorType.getChannelDimensions(channel);
+      Hep3Vector locPos = sensorType.getChannelPosition(channel);
+      lowU[i] = locPos.x() - channelSize.x()/2.;
+      double uHigh = locPos.x() + channelSize.x()/2.;
+      if (uHigh > highU) highU = uHigh;
+      lowV[i] = locPos.y() - channelSize.y()/2.;
+      double vHigh = locPos.y() + channelSize.y()/2.;
+      if (vHigh > highV) highV = vHigh;
+      i++;
+    }
+    Arrays.sort(lowU);
+    double lastU = - Double.MAX_VALUE;
+    ArrayList<Double> binsU = new ArrayList<Double>();
+    for (i=0; i<lowU.length; i++) {
+      if (lowU[i] > lastU) {
+        lastU = lowU[i];
+        binsU.add(lastU);
+      } 
+    }
+    binsU.add(highU);
+    int nU = binsU.size();
+    lowU = new double[nU];
+    for (i=0; i<nU; i++) {
+      lowU[i] = binsU.get(i);
+    }
+    IHistogram digiHist;
+    IHistogram simHist;
+    if (isStrip) {
+      digiHist = _hFactory.createHistogram1D(title+"digi", title+"digi", lowU);
+      simHist = _hFactory.createHistogram1D(title+"sim", title+"sim", lowU);
+    } else {
+      Arrays.sort(lowV);
+      double lastV = - Double.MAX_VALUE;
+      ArrayList<Double> binsV = new ArrayList<Double>();
+      for (i=0; i<lowV.length; i++) {
+        if (lowV[i] > lastV) {
+          lastV = lowV[i];
+          binsV.add(lastV);
+        } 
+      }
+      binsV.add(highV);
+      int nV = binsV.size();
+      lowV = new double[nV];
+      for (i=0; i<nV; i++) {
+        lowV[i] = binsV.get(i);
+      }
+      digiHist = _hFactory.createHistogram2D(title+"digi", title+"digi", lowU, lowV);
+      simHist = _hFactory.createHistogram2D(title+"sim", title+"sim", lowU, lowV);
+    }
+    _eventHistList.add(digiHist);
+    _eventHistList.add(simHist);
+    
+    // Fill histograms
+
+    Hep3Vector meanSimPos = new BasicHep3Vector();
+    double totCharge = 0.;
+    for (SimTrackerHit simHit : simList) {
+      double[] gPos = simHit.getPoint();
+      Hep3Vector globPos = new BasicHep3Vector(gPos);
+      Hep3Vector locPos = sensor.globalToLocal(globPos);
+      double charge = (simHit.getPathLength() > 0.) ? simHit.getPathLength()*simHit.getdEdx() : simHit.getdEdx();
+      meanSimPos = VecOp.add(meanSimPos, VecOp.mult(charge, sensor.localToGlobal(locPos)));
+      totCharge += charge;
+      if (isStrip) {
+        ((IHistogram1D)simHist).fill(locPos.x(), charge);
+      } else {
+        ((IHistogram2D)simHist).fill(locPos.x(), locPos.y(), charge);
+      }
+    }
+    meanSimPos = VecOp.mult(1./totCharge, meanSimPos);
+
+    Hep3Vector meanDigiPos = new BasicHep3Vector();
+    totCharge = 0.;
+    for (DigiTrackerHit digiHit : digiList) {
+      Hep3Vector locPos = sensorType.getChannelPosition(digiHit.getChannel());
+      Hep3Vector globPos = sensor.localToGlobal(locPos);
+      double charge = digiHit.getSignal();
+      meanDigiPos = VecOp.add(meanDigiPos, VecOp.mult(charge, globPos));
+      totCharge += charge;
+      if (isStrip) {
+        ((IHistogram1D)digiHist).fill(locPos.x(), charge);
+      } else {
+        ((IHistogram2D)digiHist).fill(locPos.x(), locPos.y(), charge);
+      }
     }
+    meanDigiPos = VecOp.mult(1./totCharge, meanDigiPos);
+    
+    double diffSimDigi = VecOp.sub(meanSimPos, meanDigiPos).magnitude();
+    _aida.cloud1D(subDetName).fill(diffSimDigi);
 
   }
+// -- Private parts :  ---------------------------------------------------------
+  
+  
+  protected AIDA _aida;  
+  protected IHistogramFactory _hFactory;
+  protected LinkedList<IHistogram> _eventHistList;
+
+  protected String _diagnosticMapName;
+  protected HashMap<List<SimTrackerHit>,List<DigiTrackerHit>> _diagnosticMap;
+  
+  protected int _missed;
+  protected int _iGroup;
 
-  static private AIDA aida = AIDA.defaultInstance();
 }

lcsim/src/org/lcsim/contrib/onoprien/tracking/digitization/digitizers
DigitizerSmear.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- DigitizerSmear.java	14 Jul 2007 14:42:01 -0000	1.3
+++ DigitizerSmear.java	15 Jul 2007 23:24:03 -0000	1.4
@@ -22,9 +22,10 @@
 /**
  * Very simple-minded digitizer - for illustration purposes only.
  * Creates one <tt>DigiTrackerHit</tt> per input <tt>SimTrackerHit</tt>.
+ * No smearing.
  *
  * @author D.Onoprienko
- * @version $Id: DigitizerSmear.java,v 1.3 2007/07/14 14:42:01 onoprien Exp $
+ * @version $Id: DigitizerSmear.java,v 1.4 2007/07/15 23:24:03 onoprien Exp $
  */
 public class DigitizerSmear implements Digitizer, ConditionsListener {
   
@@ -74,7 +75,6 @@
     ArrayList<DigiTrackerHit> digiListFinal = new ArrayList<DigiTrackerHit>();
     while (!digiListTemp.isEmpty()) {
       ListIterator<DigiTrackerHit> it = digiListTemp.listIterator();
-      int nHits = 0;
       int channel = -1;
       double time = 0.;
       double signal = 0.;
@@ -82,19 +82,16 @@
         DigiTrackerHit dHit = it.next();
         if (channel == -1) channel = dHit.getChannel();
         if (channel == dHit.getChannel()) {
-          nHits++;
           time += dHit.getTime()*dHit.getSignal();
           signal += dHit.getSignal();
           it.remove();
         }
       }
-      if (time > 0.) time /= signal;
-      signal /= nHits;
+      if (signal > 0.) time /= signal;
       digiListFinal.add(new DigiTrackerHitElemental(signal, time, sensor, channel, mcParticle));
     }
     digiListFinal.trimToSize();
 
-    //System.out.println("Digitizer returns "+ digiListFinal.size() +" hits");
     return digiListFinal;
   }
   
CVSspam 0.2.8