lcsim/src/org/lcsim/util/swim
diff -u -r1.5 -r1.6
--- Helix.java 22 Aug 2005 03:31:16 -0000 1.5
+++ Helix.java 22 Aug 2005 17:51:47 -0000 1.6
@@ -19,7 +19,7 @@
* All quantities in this class are dimensionless. It has no dependencies
* except for Hep3Vector (which could easily be removed).
* @author tonyj
- * @version $Id: Helix.java,v 1.5 2005/08/22 03:31:16 tonyj Exp $
+ * @version $Id: Helix.java,v 1.6 2005/08/22 17:51:47 tonyj Exp $
*/
public class Helix implements Trajectory
{
@@ -62,10 +62,12 @@
public double getDistanceToInfiniteCylinder(double r)
{
+ if (r<0) throw new IllegalArgumentException("radius "+r+"<0");
double darg = r*r/(2.*radius*radiusOfCenter) - radiusOfCenter/(2.*radius) - radius/(2.*radiusOfCenter);
double diff = asin(darg) + phi - phiToCenter;
- if (diff < 0) diff += 2*Math.PI;
- return (Math.abs(radius)/cosLambda)*diff;
+ double result = (radius/cosLambda)*diff;
+ if (result < 0) result += Math.abs(radius/cosLambda)*2*Math.PI;
+ return result;
}
/**
lcsim/src/org/lcsim/util/swim
diff -u -r1.2 -r1.3
--- Trajectory.java 20 Aug 2005 23:25:07 -0000 1.2
+++ Trajectory.java 22 Aug 2005 17:51:47 -0000 1.3
@@ -5,7 +5,7 @@
/**
* A particle trajectory (either a Helix or a Line)
* @author tonyj
- * @version $Id: Trajectory.java,v 1.2 2005/08/20 23:25:07 tonyj Exp $
+ * @version $Id: Trajectory.java,v 1.3 2005/08/22 17:51:47 tonyj Exp $
*/
public interface Trajectory
{
@@ -16,6 +16,8 @@
/**
* Calculates the distance at which the trajectory first reaches radius R.
* Returns Double.NaN if the trajectory does not intercept the cylinder.
+ * In principle there could be multiple solutions, so this method should
+ * always return the minimum <b>positive</b> solution.
*/
public double getDistanceToInfiniteCylinder(double r);
lcsim/test/org/lcsim/util/swim
diff -u -r1.1 -r1.2
--- HelixTest.java 18 Aug 2005 15:24:04 -0000 1.1
+++ HelixTest.java 22 Aug 2005 17:51:47 -0000 1.2
@@ -10,7 +10,7 @@
/**
*
* @author tonyj
- * @version $Id: HelixTest.java,v 1.1 2005/08/18 15:24:04 tonyj Exp $
+ * @version $Id: HelixTest.java,v 1.2 2005/08/22 17:51:47 tonyj Exp $
*/
public class HelixTest extends TestCase
{
@@ -41,6 +41,13 @@
assertTrue(Double.isNaN(circle.getDistanceToInfiniteCylinder(2)));
assertTrue(Double.isNaN(circle.getDistanceToInfiniteCylinder(0)));
assertEquals(0,circle.getDistanceToInfiniteCylinder(1),1e-14);
+
+ System.out.println(circle.getDOCA(new BasicHep3Vector(-.5, 0,0)));
+ System.out.println(circle.getDOCA(new BasicHep3Vector(.5, 0,0)));
+ System.out.println(circle.getDOCA(new BasicHep3Vector(0,.5,0)));
+ System.out.println(circle.getDOCA(new BasicHep3Vector(0,-.5,0)));
+ System.out.println(circle.getDOCA(new BasicHep3Vector(0,.5,1)));
+ System.out.println(circle.getDOCA(new BasicHep3Vector(0,-.5,1)));
}
public void testCircle2()
{
@@ -76,9 +83,30 @@
assertEquals(d,helix.getDistanceToZPlane(Math.PI*2));
assertTrue(Double.isNaN(helix.getDistanceToInfiniteCylinder(3*radius)));
assertEquals(d/2,helix.getDistanceToInfiniteCylinder(2*radius),1e-14);
+ assertEquals(1.4809609793861218,helix.getDistanceToInfiniteCylinder(radius),1e-14);
+ assertEquals(0,helix.getDistanceToInfiniteCylinder(0),1e-14);
+ }
+ public void testHelix2()
+ {
+ Hep3Vector origin = new BasicHep3Vector(0,0,0);
+ double radius = -1;
+ double phi = Math.PI/2;
+ double lambda = -Math.PI/4;
+ Helix helix = new Helix(origin,radius,phi,lambda);
+
+ assertEquals(origin, helix.getPointAtDistance(0));
+ double d = Math.PI*2*Math.sqrt(2);
+ assertEquals(new BasicHep3Vector(0,0,-Math.PI*2), helix.getPointAtDistance(d));
+ assertEquals(new BasicHep3Vector(-2,0,-Math.PI), helix.getPointAtDistance(d/2));
+
+ assertEquals(d/2,helix.getDistanceToZPlane(-Math.PI));
+ assertEquals(d,helix.getDistanceToZPlane(-Math.PI*2));
+ assertTrue(Double.isNaN(helix.getDistanceToInfiniteCylinder(3)));
+ assertEquals(d/2,helix.getDistanceToInfiniteCylinder(2),1e-14);
+ assertEquals(1.4809609793861218,helix.getDistanceToInfiniteCylinder(1),1e-14);
assertEquals(0,helix.getDistanceToInfiniteCylinder(0),1e-14);
}
- public void testHelix2() throws IOException
+ public void testHelix3() throws IOException
{
Hep3Vector origin = new BasicHep3Vector(0,0,0);
double radius = 1;
@@ -105,6 +133,7 @@
assertEquals(Math.sqrt(2)/2,xy.rmsY(),1e-14);
aida.saveAs("helix.aida");
}
+
private void assertEquals(Hep3Vector v1, Hep3Vector v2)
{
assertEquals(v1.x(),v2.x(), 1e-14);