4 modified files
lcsim/src/org/lcsim/contrib/onoprien/tracking
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
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
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
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