2 added + 2 modified, total 4 files
lcsim/src/org/lcsim/contrib/onoprien/vsegment/mctruth
diff -u -r1.3 -r1.4
--- MCTruth.java 21 Oct 2008 00:53:47 -0000 1.3
+++ MCTruth.java 24 Oct 2008 04:09:13 -0000 1.4
@@ -20,7 +20,7 @@
* be added to the processing chain (usually as the first driver).
*
* @author D. Onoprienko
- * @version $Id: MCTruth.java,v 1.3 2008/10/21 00:53:47 onoprien Exp $
+ * @version $Id: MCTruth.java,v 1.4 2008/10/24 04:09:13 onoprien Exp $
*/
public class MCTruth {
@@ -85,9 +85,17 @@
}
}
-// -- Getting MCParticles : ---------------------------------------------------
+// -- Getting MCParticles : ---------------------------------------------------
+ public List<MCParticle> getMCParticles(VSTrackerHit hit) {
+ List<SimTrackerHit> simHits = getSimTrackerHits(hit);
+ HashSet<MCParticle> mcSet = new HashSet<MCParticle>();
+ for (SimTrackerHit simHit : simHits) mcSet.add(simHit.getMCParticle());
+ return new ArrayList<MCParticle> (mcSet);
+ }
+
+
// -- Looking up tracking objects by MCParticle : -----------------------------
lcsim/src/org/lcsim/contrib/onoprien/vsegment/process
diff -N HelicalTrackHitConverter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ HelicalTrackHitConverter.java 24 Oct 2008 04:09:13 -0000 1.1
@@ -0,0 +1,273 @@
+package org.lcsim.contrib.onoprien.vsegment.process;
+
+import java.util.*;
+
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.digisim.MyLCRelation;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrack2DHit;
+import org.lcsim.fit.helicaltrack.HelicalTrack3DHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
+import org.lcsim.fit.helicaltrack.HitIdentifier;
+import org.lcsim.fit.helicaltrack.HitUtils;
+import org.lcsim.fit.helicaltrack.StereoHitMaker;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+import org.lcsim.spacegeom.SpacePointVector;
+
+import org.lcsim.contrib.onoprien.vsegment.geom.SegmentationManager;
+import org.lcsim.contrib.onoprien.vsegment.geom.Sensor;
+import org.lcsim.contrib.onoprien.vsegment.geom.SensorType;
+import org.lcsim.contrib.onoprien.vsegment.geom.sensortype.Cylinder;
+import org.lcsim.contrib.onoprien.vsegment.hit.ITrackerHit;
+import org.lcsim.contrib.onoprien.vsegment.hit.TrackerHitMap;
+import org.lcsim.contrib.onoprien.vsegment.hit.VSTrackerHit;
+import org.lcsim.contrib.onoprien.vsegment.mctruth.MCTruth;
+import org.lcsim.contrib.onoprien.vsegment.transform.ConstHep3Vector;
+import org.lcsim.contrib.onoprien.vsegment.transform.IRefFrame;
+
+/**
+ * Driver that converts <tt>VSTrackerHits</tt> into <tt>HelicalTrackHits</tt>
+ * required by <tt>seedtracker</tt> package.
+ *
+ * @author D. Onoprienko
+ * @version $Id: HelicalTrackHitConverter.java,v 1.1 2008/10/24 04:09:13 onoprien Exp $
+ */
+public class HelicalTrackHitConverter extends VSDriver {
+
+// -- Constructor : -----------------------------------------------------------
+
+ public HelicalTrackHitConverter() {}
+
+// -- Setters : ---------------------------------------------------------------
+
+ /**
+ * Set any parameter.
+ * The following parameters can be set with this method:
+ * <p><dl>
+ * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap<Sensor,VSTrackerHit></tt>.<br>
+ * Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
+ * <dt>"OUTPUT_LIST_NAME"</dt> <dd>Name of output list of hits.
+ * If a list with this name already exists in the event record, the newly created hits will
+ * be added to it.<br>
+ * Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
+ * <dt>"HIT_RELATION_NAME"</dt> <dd>Name of a collection of <tt>LCRelations</tt> between created
+ * <tt>HelicalTrackHits</tt> and the original <tt>VSTrackerHits</tt>.<br>
+ * Default: <tt>null</tt> (no collection will be saved).</dd>
+ * <dt>"MC_RELATION_NAME"</dt> <dd>Name of a collection of <tt>LCRelations</tt> between created
+ * <tt>HelicalTrackHits</tt> and <tt>MCParticles</tt>.<br>
+ * Default: <tt>null</tt> (no collection will be saved).</dd>
+ * <dt>"STEREO_HIT_MAKER"</dt> <dd>{@link StereoHitMaker} object to be used by this converter to
+ * create hits from strips in stereo layers.<br>
+ * Default: <tt>null</tt> (must be specified before this driver can be used).</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 nunber of values, or a value
+ * of incorrect type is supplied.
+ */
+ public void set(String name, Object... values) {
+ Object value = values.length == 0 ? null : values[0];
+ try {
+ if (name.equalsIgnoreCase("INPUT_MAP_NAME")) {
+ _inMapName = (String) value;
+ } else if (name.equalsIgnoreCase("OUTPUT_LIST_NAME")) {
+ _outListName = (String) value;
+ } else if (name.equalsIgnoreCase("HIT_RELATION_NAME")) {
+ _hitRelName = (String) value;
+ } else if (name.equalsIgnoreCase("MC_RELATION_NAME")) {
+ _mcRelName = (String) value;
+ } else if (name.equalsIgnoreCase("STEREO_HIT_MAKER")) {
+ _crosser = (StereoHitMaker) value;
+ } else {
+ super.set(name, values);
+ }
+ } catch (ClassCastException x) {
+ throw new IllegalArgumentException(ERR_VIT, x);
+ }
+ }
+
+
+// -- Event processing : ------------------------------------------------------
+
+ /**
+ * Process event.
+ */
+ public void process(EventHeader event) {
+
+ super.process(event);
+
+ if (_segman == null) _segman = (SegmentationManager) event.get("SegmentationManager");
+ _mcTruth = (MCTruth) event.get("MCTruth");
+
+ // Initialize the list of HelicalTrackHits and vector with local z direction
+ List<HelicalTrackHit> helhits = new ArrayList<HelicalTrackHit>();
+ Hep3Vector lz = new BasicHep3Vector(0., 0., 1.);
+
+ // Create a List of LCRelations to relate HelicalTrackHits to the original hits
+ List<LCRelation> hitRelations = new ArrayList<LCRelation>();
+
+ // Make a mapping between the stereo strips and corresponding hits
+ Map<HelicalTrackStrip,VSTrackerHit> stripmap = new HashMap<HelicalTrackStrip,VSTrackerHit>();
+
+ // Get the hit map that gives the list of hits on a particular sensor
+ TrackerHitMap<Sensor,VSTrackerHit> hitmap = (TrackerHitMap<Sensor, VSTrackerHit>) event.get(_inMapName);
+
+ for (Sensor sensor : hitmap.keySet()) {
+ List<Sensor> stereoPartners = _segman.getStereoPartners(sensor);
+ List<VSTrackerHit> sensorhits = hitmap.get(sensor);
+ for (VSTrackerHit hit : sensorhits) {
+ if (hit.getType() == ITrackerHit.Type.STRIP) {
+ if (stereoPartners == null) { // Isolated axial hit - convert it and add to the hit list
+ HelicalTrackHit axialhit = MakeAxialHit(hit);
+ if (axialhit != null) {
+ hitRelations.add(new MyLCRelation(axialhit, hit));
+ helhits.add(axialhit);
+ }
+ } else { // Stereo hit - convert it and add it to the list of stereo strips
+ HelicalTrackStrip strip = MakeStrip(hit);
+ stripmap.put(strip, hit);
+ }
+ } else { // Pixel hit - convert it and add to the hit list
+ HelicalTrackHit pixelhit = MakePixelHit(hit);
+ hitRelations.add(new MyLCRelation(pixelhit, hit));
+ helhits.add(pixelhit);
+ }
+ }
+ }
+
+ // Make the stereo hits
+ List<HelicalTrackStrip> striplist = new ArrayList<HelicalTrackStrip>(stripmap.keySet());
+ List<HelicalTrackCross> stereohits = _crosser.MakeHits(striplist);
+ for (HelicalTrackCross hit : stereohits) {
+ for (HelicalTrackStrip strip : hit.getStrips()) {
+ hitRelations.add(new MyLCRelation(hit, stripmap.get(strip)));
+ }
+ helhits.add(hit);
+ }
+
+
+ // Create the LCRelations between HelicalTrackHits and MC particles
+ if (_mcRelName != null) {
+ List<LCRelation> mcrelations = new ArrayList<LCRelation>();
+ for (HelicalTrackHit hit : helhits) {
+ for (MCParticle mcp : hit.getMCParticles()) {
+ mcrelations.add(new MyLCRelation(hit, mcp));
+ }
+ }
+ event.put(_mcRelName, mcrelations, LCRelation.class, 0);
+ }
+
+ // Put the HelicalTrackHits back into the event
+ event.put(_outListName, helhits, HelicalTrackHit.class, 0);
+ if (_hitRelName != null) event.put(_hitRelName, hitRelations, LCRelation.class, 0);
+
+ // Cleanup
+ _mcTruth = null;
+ }
+
+ private HelicalTrackHit MakeAxialHit(VSTrackerHit hit) {
+ HelicalTrackStrip strip = MakeStrip(hit);
+ if (VecOp.cross(strip.v(), ConstHep3Vector.V001).magnitude() > _eps) return null;
+ double zmin = VecOp.add(HitUtils.StripCenter(strip), VecOp.mult(strip.vmin(), strip.v())).z();
+ double zmax = VecOp.add(HitUtils.StripCenter(strip), VecOp.mult(strip.vmax(), strip.v())).z();
+ HelicalTrackHit axialhit = new HelicalTrack2DHit(strip.origin(), HitUtils.StripCov(strip),
+ strip.dEdx(), strip.time(), strip.rawhits(), strip.detector(), strip.layer(), strip.BarrelEndcapFlag(),
+ zmin, zmax);
+ List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+ for (MCParticle mcp : mcplist) {
+ axialhit.addMCParticle(mcp);
+ }
+ return axialhit;
+ }
+
+ private HelicalTrackStrip MakeStrip(VSTrackerHit hit) {
+ Hep3Vector u;
+ Hep3Vector v;
+ Hep3Vector org;
+ double umeas;
+ double du;
+ double vmin;
+ double vmax;
+ Sensor sensor = hit.getSensor();
+ SensorType sType = sensor.getType();
+ IRefFrame hitFrame= hit.getRefFrame();
+ if (sType instanceof Cylinder) {
+ v = hitFrame.v();
+ org = hit.getPosition(IRefFrame.GLOBAL);
+ Hep3Vector r = new BasicHep3Vector(org.x(), org.y(), 0.0);
+ u = VecOp.unit(VecOp.cross(v, r));
+ umeas = 0.;
+ du = hit.getLocalErrors().x();
+ vmax = hit.getLength()/2.;
+ vmin = -vmax;
+ } else {
+ org = hitFrame.getOrigin();
+ u = hitFrame.u();
+ v = hitFrame.v();
+ umeas = hit.getLocalPosition().x();
+ du = hit.getLocalErrors().x();
+ Hep3Vector local = hit.getLocalPosition();
+ double len2 = hit.getLength()/2.;
+ vmin = local.y() - len2;
+ vmax = local.y() + len2;
+ }
+
+ double dEdx = hit.getdEdx();
+ double time = hit.getTime();
+ IDetectorElement de = sensor.getDetectorElement();
+ String det = ID.getName(de);
+ int lyr = ID.getLayer(de);
+ if (_segman.getStereoPartners(sensor) != null) lyr = lyr / 2;
+ BarrelEndcapFlag beflag = ID.getBarrelEndcapFlag(de);
+
+ HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, null,
+ det, lyr, beflag);
+ List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+ for (MCParticle mcp : mcplist) {
+ strip.addMCParticle(mcp);
+ }
+ return strip;
+ }
+
+ private HelicalTrackHit MakePixelHit(VSTrackerHit hit) {
+ IDetectorElement de = hit.getSensor().getDetectorElement();
+ HelicalTrackHit pixel = new HelicalTrack3DHit(hit.getPosition(IRefFrame.GLOBAL), hit.getCovMatrix(IRefFrame.GLOBAL), hit.getdEdx(),
+ hit.getTime(), null, ID.getName(de), ID.getLayer(de), ID.getBarrelEndcapFlag(de));
+ List<MCParticle> mcplist = _mcTruth.getMCParticles(hit);
+ for (MCParticle mcp : mcplist) {
+ pixel.addMCParticle(mcp);
+ }
+
+ return pixel;
+ }
+
+// -- Private parts : ---------------------------------------------------------
+
+ private StereoHitMaker _crosser;
+ private HitIdentifier ID = new HitIdentifier();
+ private double _eps = 1.0e-6;
+
+ protected SegmentationManager _segman;
+
+ protected String _inMapName;
+ protected String _outListName;
+ protected String _hitRelName;
+ protected String _mcRelName;
+
+ private MCTruth _mcTruth;
+}
lcsim/src/org/lcsim/contrib/onoprien/vsegment/process
diff -u -r1.3 -r1.4
--- ClusteringDriver.java 21 Oct 2008 00:53:47 -0000 1.3
+++ ClusteringDriver.java 24 Oct 2008 04:09:13 -0000 1.4
@@ -18,7 +18,7 @@
* Driver that handles clustering of tracker pulses.
*
* @author D. Onoprienko
- * @version $Id: ClusteringDriver.java,v 1.3 2008/10/21 00:53:47 onoprien Exp $
+ * @version $Id: ClusteringDriver.java,v 1.4 2008/10/24 04:09:13 onoprien Exp $
*/
public class ClusteringDriver extends VSDriver implements VSEventListener {
@@ -51,10 +51,10 @@
* Set any parameter.
* The following parameters can be set with this method:
* <p><dl>
- * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap<Sensor,VSTrackerData></tt>.<br>
+ * <dt>"INPUT_MAP_NAME"</dt> <dd>Name of input <tt>TrackerHitMap<Sensor,VSTrackerPulse></tt>.<br>
* Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
* <dt>"OUTPUT_MAP_NAME"</dt> <dd>Name of output collection of hist
- * (type <tt>TrackerHitMap<Sensor,ITrackerData></tt>).<br>
+ * (type <tt>TrackerHitMap<Sensor,VSTrackerHit></tt>).<br>
* If a map with this name already exists in the event record, it will be overwritten.
* If the name is <tt>null</tt> or an empty string, the map will not be saved into the event.<br>
* Default: <tt>null</tt> (must be specified before this driver can be used).</dd>
lcsim/src/org/lcsim/contrib/onoprien/vsegment
diff -N ExampleTrackingDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ExampleTrackingDriver.java 24 Oct 2008 04:09:13 -0000 1.1
@@ -0,0 +1,52 @@
+package org.lcsim.contrib.onoprien.vsegment;
+
+import java.util.*;
+
+import org.lcsim.fit.helicaltrack.StereoHitMaker;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
+import org.lcsim.recon.tracking.seedtracker.SeedTracker;
+import org.lcsim.recon.tracking.seedtracker.StrategyXMLUtils;
+
+import org.lcsim.contrib.onoprien.vsegment.process.HelicalTrackHitConverter;
+import org.lcsim.contrib.onoprien.vsegment.process.VSDriver;
+
+/**
+ *
+ *
+ * @author D. Onoprienko
+ * @version $Id: ExampleTrackingDriver.java,v 1.1 2008/10/24 04:09:13 onoprien Exp $
+ */
+public class ExampleTrackingDriver extends VSDriver {
+
+// -- Constructors : ----------------------------------------------------------
+
+ public ExampleTrackingDriver() {
+
+ // Virtual segmentation and hit processing
+
+ add(new ExampleDriverSiD02());
+
+ // Conversion to HelicalTrackHits
+
+ HelicalTrackHitConverter converter = new HelicalTrackHitConverter();
+ converter.set("INPUT_MAP_NAME", "VSTrackerClusters");
+ converter.set("OUTPUT_LIST_NAME", "HelicalTrackHits");
+ converter.set("HIT_RELATION_NAME", "HelicalTrackHitRelations");
+ converter.set("MC_RELATION_NAME", "HelicalTrackMCRelations");
+ converter.set("STEREO_HIT_MAKER", new StereoHitMaker(10., 10.));
+ add(converter);
+
+ // Track finding and fitting
+
+ List<SeedStrategy> stratlist =
+ StrategyXMLUtils.getStrategyListFromResource(
+ StrategyXMLUtils.getDefaultStrategiesPrefix() + "autogen_ttbar_sid02_vs.xml");
+
+ SeedTracker seedTracker = new SeedTracker(stratlist);
+ add(seedTracker);
+
+ }
+
+// -- Private parts : ---------------------------------------------------------
+
+}
CVSspam 0.2.8