Commit in projects/lcsim/trunk on MAIN | |||
event-heprep/src/main/java/org/lcsim/util/heprep/ReconstructedParticleConverterNew.java | +7 | -3 | 3158 -> 3159 |
/TrackConverter.java | +85 | -81 | 3158 -> 3159 |
/TrackUtil.java | +52 | added 3159 | |
tracking/src/main/java/org/lcsim/util/swim/HelixSwimmerYField.java | +6 | -42 | 3158 -> 3159 |
/HelixYField.java | +5 | -1 | 3158 -> 3159 |
+155 | -127 |
Changes in lcsim to support display of Tracks that are swum within a Y B-field.
--- projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/ReconstructedParticleConverterNew.java 2014-06-26 23:50:25 UTC (rev 3158) +++ projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/ReconstructedParticleConverterNew.java 2014-06-27 00:13:54 UTC (rev 3159) @@ -134,14 +134,18 @@
} private void convertTracks(EventHeader event, List<Track> collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree, Color trackColor, HepRepType type)
- {
+ { + if (collection.size() == 0) + return; +
Detector detector = event.getDetector(); double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue(); double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
- double[] field = detector.getFieldMap().getField(zero); - HelixSwimmer helix = new HelixSwimmer(field[2]);
+ double[] origin = TrackUtil.getOrigin(collection.get(0)); + double[] field = detector.getFieldMap().getField(origin); + HelixSwimmer helix = TrackUtil.getHelixSwimmer(collection, field);
for (Track t : (List<Track>) collection) {
--- projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/TrackConverter.java 2014-06-26 23:50:25 UTC (rev 3158) +++ projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/TrackConverter.java 2014-06-27 00:13:54 UTC (rev 3159) @@ -17,102 +17,106 @@
import org.lcsim.geometry.Detector; import org.lcsim.util.swim.HelixSwimmer;
-
/**
- *
+ * Convert a Track to a Wired representation by swimming it in the B-field using + * a helix approximation.
* @author tonyj
+ * @author Jeremy McCormick <[log in to unmask]>
* @version $Id: TrackConverter.java,v 1.7 2012/10/18 19:32:49 jeremy Exp $ */
-class TrackConverter implements HepRepCollectionConverter -{ - private static final double[] zero = { 0,0,0 };
+class TrackConverter implements HepRepCollectionConverter {
- public boolean canHandle(Class k) - { - return Track.class.isAssignableFrom(k); - } - public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) - { - try { - event.getDetector(); - } - catch (Exception x) - { - return; - }
+ public boolean canHandle(Class k) { + return Track.class.isAssignableFrom(k); + }
- LCMetaData meta = event.getMetaData(collection); - String name = meta.getName(); - int flags = meta.getFlags(); - Detector detector = event.getDetector();
+ public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) { + try { + event.getDetector(); + } catch (Exception x) { + return; + } + + if (collection.size() == 0) + return; + + List<Track> trackList = (List<Track>) collection; + Track firstTrack = trackList.get(0); + + LCMetaData meta = event.getMetaData(collection); + String name = meta.getName(); + Detector detector = event.getDetector();
- double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue(); - double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
+ double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue(); + double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
- double[] field = detector.getFieldMap().getField(zero); - HelixSwimmer helix = new HelixSwimmer(field[2]);
+ double[] origin = TrackUtil.getOrigin(firstTrack); + double[] field = detector.getFieldMap().getField(origin); + + HelixSwimmer helix = TrackUtil.getHelixSwimmer(trackList, field); + //System.out.println("swimming with helix of type " + helix.getClass().getCanonicalName()); + + HepRepType typeX = factory.createHepRepType(typeTree, name); + typeX.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER); + typeX.addAttValue("drawAs", "Line");
- HepRepType typeX = factory.createHepRepType(typeTree, name); - typeX.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER); - typeX.addAttValue("drawAs","Line");
+ typeX.addAttDef("pT", "Transverse momentum", "physics", ""); + typeX.addAttDef("dedX", "de/Dx", "physics", "GeV"); + typeX.addAttDef("dedX error", "", "physics", "GeV"); + typeX.addAttDef("Charge", "", "physics", ""); + typeX.addAttDef("Chi2", "", "physics", ""); + typeX.addAttDef("pX", "Momentum X", "physics", "GeV"); + typeX.addAttDef("pY", "Momentum Y", "physics", "GeV"); + typeX.addAttDef("pZ", "Momentum Z", "physics", "GeV"); + typeX.addAttDef("NDF", "Number Degrees Freedom", "physics", ""); + typeX.addAttDef("Reference Point X", "Reference Point X", "physics", "mm"); + typeX.addAttDef("Reference Point Y", "Reference Point Y", "physics", "mm"); + typeX.addAttDef("Reference Point Z", "Reference Point Z", "physics", "mm"); + typeX.addAttDef("d0", "d0", "physics", ""); + typeX.addAttDef("phi0", "phi0", "physics", ""); + typeX.addAttDef("omega", "omega", "physics", ""); + typeX.addAttDef("z0", "z0", "physics", ""); + typeX.addAttDef("s", "s", "physics", "");
- typeX.addAttDef("pT","Transverse momentum", "physics", ""); - typeX.addAttDef("dedX","de/Dx", "physics", "GeV"); - typeX.addAttDef("dedX error","", "physics", "GeV"); - typeX.addAttDef("Charge","", "physics", ""); - typeX.addAttDef("Chi2","", "physics", ""); - typeX.addAttDef("pX","Momentum X", "physics", "GeV"); - typeX.addAttDef("pY","Momentum Y", "physics", "GeV"); - typeX.addAttDef("pZ","Momentum Z", "physics", "GeV"); - typeX.addAttDef("NDF","Number Degrees Freedom","physics",""); - typeX.addAttDef("Reference Point X","Reference Point X","physics","mm"); - typeX.addAttDef("Reference Point Y","Reference Point Y","physics","mm"); - typeX.addAttDef("Reference Point Z","Reference Point Z","physics","mm"); - typeX.addAttDef("d0","d0","physics",""); - typeX.addAttDef("phi0","phi0","physics",""); - typeX.addAttDef("omega","omega","physics",""); - typeX.addAttDef("z0","z0","physics",""); - typeX.addAttDef("s","s","physics","");
+ for (Track track : trackList) { + + helix.setTrack(track); + double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax, trackingZMax);
- for (Track t : (List<Track>) collection) - { - helix.setTrack(t); - double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax,trackingZMax);
+ TrackState ts = track.getTrackStates().get(0); + double[] referencePoint = ts.getReferencePoint(); + double[] momentum = ts.getMomentum();
- TrackState ts = t.getTrackStates().get(0); - double[] rp = ts.getReferencePoint(); - double[] p = ts.getMomentum(); -
HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, typeX);
- double pt = field[2]*Constants.fieldConversion/Math.abs(ts.getParameter(2)); - - instanceX.addAttValue("pT",pt); - instanceX.addAttValue("dedX",t.getdEdx()); - instanceX.addAttValue("dedX error",t.getdEdxError()); - instanceX.addAttValue("Charge",t.getCharge()); - instanceX.addAttValue("Chi2",t.getChi2()); - instanceX.addAttValue("pX",p[0]); - instanceX.addAttValue("pY",p[1]); - instanceX.addAttValue("pZ",p[2]); - instanceX.addAttValue("NDF",t.getNDF()); - instanceX.addAttValue("Reference Point X",rp[0]); - instanceX.addAttValue("Reference Point Y",rp[1]); - instanceX.addAttValue("Reference Point Z",rp[2]); - instanceX.addAttValue("d0",ts.getParameter(0)); - instanceX.addAttValue("phi0",ts.getParameter(1)); - instanceX.addAttValue("omega",ts.getParameter(2)); - instanceX.addAttValue("z0",ts.getParameter(3)); - instanceX.addAttValue("s",ts.getParameter(4));
+ double pt = field[2] * Constants.fieldConversion / Math.abs(ts.getParameter(2));
+ instanceX.addAttValue("pT", pt); + instanceX.addAttValue("dedX", track.getdEdx()); + instanceX.addAttValue("dedX error", track.getdEdxError()); + instanceX.addAttValue("Charge", track.getCharge()); + instanceX.addAttValue("Chi2", track.getChi2()); + instanceX.addAttValue("pX", momentum[0]); + instanceX.addAttValue("pY", momentum[1]); + instanceX.addAttValue("pZ", momentum[2]); + instanceX.addAttValue("NDF", track.getNDF()); + instanceX.addAttValue("Reference Point X", referencePoint[0]); + instanceX.addAttValue("Reference Point Y", referencePoint[1]); + instanceX.addAttValue("Reference Point Z", referencePoint[2]); + instanceX.addAttValue("d0", ts.getParameter(0)); + instanceX.addAttValue("phi0", ts.getParameter(1)); + instanceX.addAttValue("omega", ts.getParameter(2)); + instanceX.addAttValue("z0", ts.getParameter(3)); + instanceX.addAttValue("s", ts.getParameter(4)); +
double dAlpha = 10; // 1cm
- for (int k=0;k<200;k++) - { - double d = k*dAlpha; - if (d>distanceToCylinder) break;
+ for (int k = 0; k < 200; k++) { + double d = k * dAlpha; + if (d > distanceToCylinder) + break;
Hep3Vector point = helix.getPointAtDistance(d);
- factory.createHepRepPoint(instanceX,point.x(),point.y(),point.z()); - } - } - }
+ factory.createHepRepPoint(instanceX, point.x(), point.y(), point.z()); + } + } + }
}
\ No newline at end of file
--- projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/TrackUtil.java (rev 0) +++ projects/lcsim/trunk/event-heprep/src/main/java/org/lcsim/util/heprep/TrackUtil.java 2014-06-27 00:13:54 UTC (rev 3159) @@ -0,0 +1,52 @@
+package org.lcsim.util.heprep; + +import java.util.List; + +import org.lcsim.event.Track; +import org.lcsim.event.base.BaseTrack; +import org.lcsim.util.swim.HelixSwimmer; +import org.lcsim.util.swim.HelixSwimmerYField; + +/** + * A few utilities for display of Tracks in Wired. + * @author Jeremy McCormick <[log in to unmask]> + */ +class TrackUtil { + + private TrackUtil() { + } + + private static final double[] ORIGIN = { 0, 0, 0 }; + private static final double[] YORIGIN = { 0, 0, 0.00001 }; /* FIXME: Hack for HPS!!! */ + + /** + * Get a <code>HelixSwimmer</code> implementation depending on the track type. + * @param tracks The list of <code>Track</code> objects. + * @param field The B-field components. + * @return The <code>HelixSwimmer</code> implementation class. + */ + static HelixSwimmer getHelixSwimmer(List<Track> tracks, double[] field) { + HelixSwimmer swimmer = new HelixSwimmer(field[2]); + if (tracks.size() > 0) { + Track track = tracks.get(0); + if (track.getType() == BaseTrack.TrackType.Y_FIELD.ordinal()) { + swimmer = new HelixSwimmerYField(field[1]); + } + } + return swimmer; + } + + /** + * Get the origin coordinate to use depending on the track type. + * @param track A sample <code>Track</code> from the collection. + * @return The origin as a double array containing X, Y, and Z coordinates. + */ + // FIXME: This is basically a hack for HPS where the B-field is reported as zero at the origin + // for most detector geometries. + static double[] getOrigin(Track track) { + if (track.getType() == BaseTrack.TrackType.Y_FIELD.ordinal()) + return YORIGIN; + else + return ORIGIN; + } +}
\ No newline at end of file
--- projects/lcsim/trunk/tracking/src/main/java/org/lcsim/util/swim/HelixSwimmerYField.java 2014-06-26 23:50:25 UTC (rev 3158) +++ projects/lcsim/trunk/tracking/src/main/java/org/lcsim/util/swim/HelixSwimmerYField.java 2014-06-27 00:13:54 UTC (rev 3159) @@ -5,9 +5,6 @@
import static org.lcsim.event.LCIOParameters.ParameterName.omega; import static org.lcsim.event.LCIOParameters.ParameterName.phi0; import static org.lcsim.event.LCIOParameters.ParameterName.tanLambda;
-import hep.physics.matrix.BasicMatrix; -import hep.physics.vec.BasicHep3Vector; -import hep.physics.vec.Hep3Vector;
import org.lcsim.event.LCIOParameters; import org.lcsim.event.Track;
@@ -15,6 +12,10 @@
import org.lcsim.spacegeom.CartesianVector; import org.lcsim.spacegeom.SpacePoint;
+/** + * Swim Track assuming B-field in Y direction. + * @author Jeremy McCormick <[log in to unmask]> + */
public class HelixSwimmerYField extends HelixSwimmer { public HelixSwimmerYField(double B) {
@@ -24,47 +25,10 @@
public void setTrack(Track t) { double pt = sqrt(t.getPX() * t.getPX() + t.getPY() * t.getPY()); LCIOParameters parameters = new LCIOParameters(t.getTrackParameters(), pt);
-
SpacePoint ref = new CartesianPoint(t.getReferencePoint()); SpacePoint origin = LCIOParameters.Parameters2Position(parameters, ref);
- _trajectory = new Helix(origin, 1 / parameters.get(omega), parameters
+ _trajectory = new HelixYField(origin, 1 / parameters.get(omega), parameters
.get(phi0), atan(parameters.get(tanLambda)));
- // Hep3Vectors have too many shortcomings
_momentum = new CartesianVector(LCIOParameters.Parameters2Momentum(parameters).v());
- } - - /* - public void setTrack(Hep3Vector origp, Hep3Vector origr0, int iq) { - Hep3Vector p = getTrackPoint(origp); - Hep3Vector r0 = getTrackPoint(origr0); - double pt = Math.sqrt(p.x() * p.x() + p.y() * p.y()); - double phi = Math.atan2(p.y(), p.x()); - double lambda = Math.atan2(p.z(), pt); - if (iq != 0 && field != 0) { - double radius = pt / (iq * field); - _trajectory = new HelixYField(r0, radius, phi, lambda); - } else { - _trajectory = new Line(r0, phi, lambda); - } - _momentum = new CartesianVector(p.v()); - _charge = iq; - System.out.println("momentum_x: " + _momentum.x()); - System.out.println("momentum_y: " + _momentum.y()); - System.out.println("momentum_z: " + _momentum.z()); - } - */ - - private Hep3Vector getTrackPoint(Hep3Vector pos) { - BasicMatrix _detToTrk; - _detToTrk = new BasicMatrix(3, 3); - _detToTrk.setElement(0, 2, 1); - _detToTrk.setElement(1, 0, 1); - _detToTrk.setElement(2, 1, 1); - double[] trk = { 0, 0, 0 }; - trk[0] = _detToTrk.e(0, 0) * pos.x() + _detToTrk.e(0, 1) * pos.y() + _detToTrk.e(0, 2) * pos.z(); - trk[1] = _detToTrk.e(1, 0) * pos.x() + _detToTrk.e(1, 1) * pos.y() + _detToTrk.e(1, 2) * pos.z(); - trk[2] = _detToTrk.e(2, 0) * pos.x() + _detToTrk.e(2, 1) * pos.y() + _detToTrk.e(2, 2) * pos.z(); - Hep3Vector retpt = new BasicHep3Vector(trk[0], trk[1], trk[2]); - return retpt; - }
+ }
}
--- projects/lcsim/trunk/tracking/src/main/java/org/lcsim/util/swim/HelixYField.java 2014-06-26 23:50:25 UTC (rev 3158) +++ projects/lcsim/trunk/tracking/src/main/java/org/lcsim/util/swim/HelixYField.java 2014-06-27 00:13:54 UTC (rev 3159) @@ -6,6 +6,10 @@
import org.lcsim.spacegeom.CartesianPoint; import org.lcsim.spacegeom.SpacePoint;
+/** + * Helix for swimming in Y B-field. + * @author Jeremy McCormick <[log in to unmask]> + */
public class HelixYField extends Helix { public HelixYField(Hep3Vector org, double r, double p, double lambda) {
@@ -19,7 +23,7 @@
double z = origin.z() + alpha * sinLambda; CartesianPoint trkpoint = new CartesianPoint(x, y, z); CartesianPoint labpoint = getLabPoint(trkpoint);
- System.out.println(trkpoint.toString() + labpoint.toString());
+ // System.out.println(trkpoint.toString() + labpoint.toString());
return labpoint; }
Use REPLY-ALL to reply to list
To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1