Commit in hps-java/src/main/java/org/lcsim/hps/users/omoreno on MAIN | |||
ExtendTrack.java | +233 | -209 | 1.4 -> 1.5 |
two bugfixes and a bit of rewrite
diff -u -r1.4 -r1.5 --- ExtendTrack.java 27 Aug 2012 20:02:04 -0000 1.4 +++ ExtendTrack.java 4 Sep 2012 22:55:18 -0000 1.5 @@ -5,223 +5,247 @@
import hep.physics.vec.Hep3Vector; //--- org.lcsim ---//
+import hep.physics.vec.VecOp;
import org.lcsim.event.Track; /** * * @author Omar Moreno <[log in to unmask]>
- * @version $Id: ExtendTrack.java,v 1.4 2012/08/27 20:02:04 meeg Exp $
+ * @version $Id: ExtendTrack.java,v 1.5 2012/09/04 22:55:18 meeg Exp $
*/
-
public class ExtendTrack {
- - - public static final double ECAL_FACE = 1450; // mm - public static final double DIPOLE_EDGE = 914; // mm - - - Track track; - double[] trackParameters; - - boolean debug = true; - - /** - * - */ - public ExtendTrack(){ - track = null; - } - - /** - * - */ - public void setTrack(Track track){ - this.track = track; - trackParameters = new double[9]; - this.setTrackParameters(track); - } - - /** - * - */ - public void setTrackParameters(Track track){ - - // All track parameters are in LCSim coordinates system - trackParameters[0] = track.getTrackParameter(0); // DOCA - trackParameters[1] = track.getTrackParameter(1); // phi0 - trackParameters[2] = 1/track.getTrackParameter(2); // R - trackParameters[3] = -this.getDoca()*Math.sin(this.getPhi0()); // x0 - trackParameters[4] = this.getDoca()*Math.cos(this.getPhi0()); // y0 - trackParameters[5] = track.getTrackParameter(3); // z0 - trackParameters[6] = track.getTrackParameter(4); // tan(Lambda) - trackParameters[7] = (this.getR() - this.getPhi0())*Math.sin(this.getPhi0()); // xc - trackParameters[8] = -(this.getR() - this.getPhi0())*Math.cos(this.getPhi0()); // yc - } - - /** - * - */ - public double getDoca(){ - return trackParameters[0]; - } - - /** - * - */ - public double getPhi0(){ - return trackParameters[1]; - } - - /** - * - */ - public double getR(){ - return trackParameters[2]; - } - - /** - * - */ - public double getX0(){ - return trackParameters[3]; - } - - /** - * - */ - public double getY0(){ - return trackParameters[4]; - } - /** - * - */ - public double getZ0(){ - return trackParameters[5]; - } - - /** - * - */ - public double getTanLambda(){ - return trackParameters[6]; - } - - /** - * - */ - public double getXC(){ - return trackParameters[7]; - } - - /** - * - */ - public double getYC(){ - return trackParameters[8]; - } - - /** - * - */ - public void printTrackParameters(){ - System.out.println(" DOCA: " + this.getDoca() + - " phi0: " + this.getPhi0() + - " R: " + this.getR() + - " x0: " + this.getX0() + - " y0: " + this.getY0() + - " z0: " + this.getZ0() + - " tan(Lambda): " + this.getTanLambda() + - " xc: " + this.getXC() + - " yc: " + this.getYC() ); - - } - - /** - * - */ - public double getXOnHelixProjection(double y){ - - // Check if a track has been set - if(track == null) throw new RuntimeException("Track has not been set!"); - - // Find the x position - return this.getXC() - + Math.signum(this.getR())*Math.sqrt(this.getR()*this.getR() - Math.pow(y-this.getYC(), 2)); - } - - /** - * - */ - public double getYOnHelixProjection(double x){ - - // Check if a track has been set - if(track == null) throw new RuntimeException("Track has not been set!"); - - return this.getYC() - + Math.signum(this.getR())*Math.sqrt(this.getR()*this.getR() - Math.pow(x-this.getXC(), 2)); - - } - - /** - * - */ - public double arcLength(double x, double y){ - - double phi0 = Math.atan2(this.getY0() - this.getYC(), this.getX0() - this.getXC()); - double phi = Math.atan2(y - this.getYC(), x - this.getXC()); - double dphi = phi - phi0; - - if (dphi > Math.PI) dphi -= 2. * Math.PI; - if (dphi < -Math.PI) dphi += 2. * Math.PI; - - return -this.getR()*dphi; - } - - /** - * - */ - public Hep3Vector positionAtEcal(){ - - // Check if a track has been set - if(track == null) throw new RuntimeException("Track has not been set!"); - - return this.extrapolateTrack(ECAL_FACE); - } - - /** - * - */ - public Hep3Vector extrapolateTrack(double x){ - - if(x > DIPOLE_EDGE){ - - double yDipole = this.getYOnHelixProjection(DIPOLE_EDGE); - double s = this.arcLength(DIPOLE_EDGE, yDipole); - double zDipole = this.getZ0() + s*this.getTanLambda(); - double phi = this.getPhi0() - s/this.getR(); - - double dx = x - DIPOLE_EDGE; - double r = dx/(Math.cos(phi)*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2)))); - double dy = r*Math.sin(phi)*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); - double dz = r*(this.getTanLambda()/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); - - double y = yDipole + dy; - double z = zDipole + dz; - - return new BasicHep3Vector(x, y, z); - } else if(x < 0){ - double dx = x - this.getX0(); - double r = dx/(Math.cos(this.getPhi0())*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2)))); - double dy = r*Math.sin(this.getPhi0())*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); - double dz = r*(this.getTanLambda()/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); - - double y = this.getY0() + dy; - double z = this.getZ0() + dz; - - return new BasicHep3Vector(x, y, z); - } else throw new RuntimeException(x + " value is invalid! x-coodinate must be outside of dipole volume!"); - }
+ public static final double ECAL_FACE = 1450; // mm + public static final double DIPOLE_EDGE = 914; // mm + Track track; + double[] trackParameters; + boolean debug = true; + + /** + * + */ + public ExtendTrack() { + track = null; + } + + /** + * + */ + public void setTrack(Track track) { + this.track = track; + trackParameters = new double[9]; + this.setTrackParameters(track); + } + + /** + * + */ + public void setTrackParameters(Track track) { + + // All track parameters are in LCSim coordinates system + trackParameters[0] = track.getTrackParameter(0); // DOCA + trackParameters[1] = track.getTrackParameter(1); // phi0 + trackParameters[2] = 1 / track.getTrackParameter(2); // R + trackParameters[3] = -this.getDoca() * Math.sin(this.getPhi0()); // x0 + trackParameters[4] = this.getDoca() * Math.cos(this.getPhi0()); // y0 + trackParameters[5] = track.getTrackParameter(3); // z0 + trackParameters[6] = track.getTrackParameter(4); // tan(Lambda) + trackParameters[7] = (this.getR() - this.getDoca()) * Math.sin(this.getPhi0()); // xc + trackParameters[8] = -(this.getR() - this.getDoca()) * Math.cos(this.getPhi0()); // yc + } + + /** + * + */ + public double getDoca() { + return trackParameters[0]; + } + + /** + * + */ + public double getPhi0() { + return trackParameters[1]; + } + + /** + * + */ + public double getR() { + return trackParameters[2]; + } + + /** + * + */ + public double getX0() { + return trackParameters[3]; + } + + /** + * + */ + public double getY0() { + return trackParameters[4]; + } + + /** + * + */ + public double getZ0() { + return trackParameters[5]; + } + + /** + * + */ + public double getTanLambda() { + return trackParameters[6]; + } + + /** + * + */ + public double getXC() { + return trackParameters[7]; + } + + /** + * + */ + public double getYC() { + return trackParameters[8]; + } + + /** + * + */ + public void printTrackParameters() { + System.out.println(" DOCA: " + this.getDoca() + + " phi0: " + this.getPhi0() + + " R: " + this.getR() + + " x0: " + this.getX0() + + " y0: " + this.getY0() + + " z0: " + this.getZ0() + + " tan(Lambda): " + this.getTanLambda() + + " xc: " + this.getXC() + + " yc: " + this.getYC()); + + } + + /** + * + */ + public double getXOnHelixProjection(double y) { + + // Check if a track has been set + if (track == null) { + throw new RuntimeException("Track has not been set!"); + } + + // Find the x position + return this.getXC() + + Math.signum(this.getR()) * Math.sqrt(this.getR() * this.getR() - Math.pow(y - this.getYC(), 2)); + } + + /** + * + */ + public double getYOnHelixProjection(double x) { + + // Check if a track has been set + if (track == null) { + throw new RuntimeException("Track has not been set!"); + } + + return this.getYC() + + Math.signum(this.getR()) * Math.sqrt(this.getR() * this.getR() - Math.pow(x - this.getXC(), 2)); + + } + + /** + * + */ + public double arcLength(double x, double y) {
+ double phi0 = Math.atan2(this.getY0() - this.getYC(), this.getX0() - this.getXC()); + double phi = Math.atan2(y - this.getYC(), x - this.getXC()); + double dphi = phi - phi0;
+ if (dphi > Math.PI) { + dphi -= 2. * Math.PI; + } + if (dphi < -Math.PI) { + dphi += 2. * Math.PI; + } + + return -this.getR() * dphi; + } + + /** + * + */ + public Hep3Vector positionAtEcal() { + + // Check if a track has been set + if (track == null) { + throw new RuntimeException("Track has not been set!"); + } + + return this.extrapolateTrack(ECAL_FACE); + } + + /** + * + */ + public Hep3Vector extrapolateTrack(double x) { + + if (x > DIPOLE_EDGE) { + +// double yDipole = this.getYOnHelixProjection(DIPOLE_EDGE); +// double s = this.arcLength(DIPOLE_EDGE, yDipole); +// double zDipole = this.getZ0() + s*this.getTanLambda(); +// double phi = this.getPhi0() - s/this.getR(); + + double phi = phiAtX(DIPOLE_EDGE); + Hep3Vector posAtDipole = extrapolateTrack(DIPOLE_EDGE); + Hep3Vector velAtDipole = new BasicHep3Vector(Math.cos(phi), Math.sin(phi), this.getTanLambda()); + double dx = x - DIPOLE_EDGE; + Hep3Vector delta = VecOp.mult(dx / velAtDipole.x(), velAtDipole); + return VecOp.add(posAtDipole, delta); +// double r = dx/(Math.cos(phi)*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2)))); +// double dy = r*Math.sin(phi)*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); +// double dz = r*(this.getTanLambda()/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); +// +// double y = yDipole + dy; +// double z = zDipole + dz; + + } else if (x < 0) { + double phi = phiAtX(0); + Hep3Vector posAtDipole = extrapolateTrack(0); + Hep3Vector velAtDipole = new BasicHep3Vector(Math.cos(phi), Math.sin(phi), this.getTanLambda()); + double dx = x - 0; + Hep3Vector delta = VecOp.mult(dx / velAtDipole.x(), velAtDipole); + return VecOp.add(posAtDipole, delta); + +// double dx = x - this.getX0(); +// double r = dx/(Math.cos(this.getPhi0())*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2)))); +// double dy = r*Math.sin(this.getPhi0())*(1/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); +// double dz = r*(this.getTanLambda()/Math.sqrt(1 + Math.pow(this.getTanLambda(), 2))); +// +// double y = this.getY0() + dy; +// double z = this.getZ0() + dz; +// +// return new BasicHep3Vector(x, y, z); + } else { + double phi = phiAtX(x); + double y = this.getYC() + this.getR() * Math.cos(phi); + double z = this.getZ0() - this.getR() * (phi - this.getPhi0()) * this.getTanLambda(); + return new BasicHep3Vector(x, y, z); + } + } + + public double phiAtX(double x) { + return Math.asin((this.getXC() - x) / this.getR()); //always chooses phi between -pi/2 and pi/2 (so track is going in +x direction) + }
}
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1