Print

Print


Commit in trf/src/test/java/org/lcsim/recon/tracking/trfzp on MAIN
PropZZRKTest.java+375added 1.1
Runge-Kutta Propagator

trf/src/test/java/org/lcsim/recon/tracking/trfzp
PropZZRKTest.java added at 1.1
diff -N PropZZRKTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PropZZRKTest.java	28 Aug 2013 22:28:09 -0000	1.1
@@ -0,0 +1,375 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.lcsim.recon.tracking.trfzp;
+
+import junit.framework.TestCase;
+import org.lcsim.recon.tracking.magfield.ConstantMagneticField;
+import org.lcsim.recon.tracking.trfbase.*;
+
+import static java.lang.Math.abs;
+import static java.lang.Math.max;
+
+/**
+ *
+ * @author ngraf
+ */
+public class PropZZRKTest extends TestCase
+{
+
+    private boolean debug = true;
+
+    public void testPropZZRK()
+    {
+        ConstantMagneticField field = new ConstantMagneticField(0., 0., 2.);
+        PropZZRK prop = new PropZZRK(field);
+        System.out.println(prop);
+
+        // Construct equivalent PropZZ propagator.
+        PropZZ prop0 = new PropZZ(2.0);
+        if (debug) {
+            System.out.println(prop0);
+        }
+
+        // Here we propagate some tracks both forward and backward and then
+        // each back to the original track.  We check that the returned
+        // track parameters match those of the original track.
+        System.out.println("Check reversibility.");
+        double z1[] = {100.0, -100.0, 100.0, -100.0, 100.0, -100.0, 100.0, 100.0};
+        double z2[] = {150.0, -50.0, 50.0, -150.0, 50.0, -50.0, 150.0, 50.0};
+        double x[] = {10.0, 1.0, -1.0, 2.0, 2.0, -2.0, 3.0, 0.0};
+        double xv[] = {0.5, 0.03, -0.03, 0.5, -0.5, 1.0, 1.0, 2.0};
+        double crv[] = {0.1, -0.1, 0.1, 0.01, 0.01, -1.0, 1.0, 0.02};
+        double y[] = {20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 0.0};
+        double yv[] = {-0.5, 0.01, -0.02, 0.0, 0.0, 0.5, -0.5, 0.0};
+        double fbdf[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        double bfdf[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        boolean forw[] = {true, false, false, true, false, true, true, true};
+        double maxdiff = 1.e-7;
+        int ntrk = 8;
+        int i;
+
+
+        for (i = 0; i < ntrk; ++i) {
+            System.out.println("********** Propagate track " + i + ". **********");
+            PropStat pstat = new PropStat();
+            SurfZPlane sz1 = new SurfZPlane(z1[i]);
+            SurfZPlane sz2 = new SurfZPlane(z2[i]);
+            TrackVector vec1 = new TrackVector();
+            vec1.set(0, x[i]);    // x
+            vec1.set(1, y[i]);    // y
+            vec1.set(2, xv[i]);   // dx/dz
+            vec1.set(3, yv[i]);   // dy/dz
+            vec1.set(4, crv[i]);  // q/p
+            TrackSurfaceDirection tdir;
+            if (forw[i]) {
+                tdir = TrackSurfaceDirection.TSD_FORWARD;
+            } else {
+                tdir = TrackSurfaceDirection.TSD_BACKWARD;
+            }
+            VTrack trv1 = new VTrack(sz1.newPureSurface(), vec1, tdir);
+            System.out.println(" starting: " + trv1);
+            //
+            // Find the direction that will propagate this track from z1 to z2.
+            //
+            PropDir dir = PropDir.FORWARD;
+            PropDir rdir = PropDir.BACKWARD;
+            if (z2[i] > z1[i] && tdir == TrackSurfaceDirection.TSD_BACKWARD
+                    || z2[i] < z1[i] && tdir == TrackSurfaceDirection.TSD_FORWARD) {
+                dir = PropDir.BACKWARD;
+                rdir = PropDir.FORWARD;
+            }
+
+            //
+            // Propagate.
+            VTrack trv2f = trv1;
+            pstat = prop.vecDirProp(trv2f, sz2, dir);
+            assert (pstat.success());
+            System.out.println("  forward: " + trv2f);
+            System.out.println(pstat);
+            if (dir == PropDir.FORWARD) {
+                assert (pstat.forward());
+            }
+            if (dir == PropDir.BACKWARD) {
+                assert (pstat.backward());
+            }
+
+            //
+            // Propagate using PropZZ and check difference.
+            VTrack trv2f0 = trv1;
+            pstat = prop0.vecDirProp(trv2f0, sz2, dir);
+            assert (pstat.success());
+            System.out.println("  forward: " + trv2f0);
+            System.out.println(pstat);
+            double diff0 =
+                    sz2.vecDiff(trv2f.vector(), trv2f0.vector()).amax();
+            System.out.println("diff: " + diff0);
+            assert (diff0 < maxdiff);
+
+            //
+            // Propagate in reverse direction.
+            VTrack trv2fb = trv2f;
+            pstat = prop.vecDirProp(trv2fb, sz1, rdir);
+            assert (pstat.success());
+            System.out.println(" f return: " + trv2fb);
+            System.out.println(pstat);
+            if (rdir == PropDir.FORWARD) {
+                assert (pstat.forward());
+            }
+            if (rdir == PropDir.BACKWARD) {
+                assert (pstat.backward());
+            }
+            // Check the return differences.
+            double difff =
+                    sz1.vecDiff(trv2fb.vector(), trv1.vector()).amax();
+            System.out.println("diff: " + difff);
+            assert (difff < maxdiff);
+            //
+            // Check no-move forward propagation to the same surface.
+            VTrack trv1s = trv1;
+            pstat = prop.vecDirProp(trv1s, sz1, PropDir.FORWARD);
+            assert (pstat.success());
+            System.out.println(" same f: " + trv1s);
+            System.out.println(pstat);
+            assert (pstat.same());
+            assert (pstat.pathDistance() == 0);
+            //
+            // Check no-move backward propagation to the same surface.
+            trv1s = trv1;
+            pstat = prop.vecDirProp(trv1s, sz1, PropDir.BACKWARD);
+            assert (pstat.success());
+            System.out.println(" same b: " + trv1s);
+            System.out.println(pstat);
+            assert (pstat.same());
+            assert (pstat.pathDistance() == 0);
+            //
+            // Check move propagation to the same surface.
+            //
+            // forward
+            int successes = 0;
+            trv1s = trv1;
+            pstat = prop.vecDirProp(trv1s, sz1, PropDir.FORWARD_MOVE);
+            System.out.println(" forward move: " + trv1s);
+            System.out.println(pstat);
+            if (pstat.forward()) {
+                ++successes;
+            }
+            // backward
+            trv1s = trv1;
+            pstat = prop.vecDirProp(trv1s, sz1, PropDir.BACKWARD_MOVE);
+            System.out.println(" backward move: " + trv1s);
+            System.out.println(pstat);
+            if (pstat.backward()) {
+                ++successes;
+            }
+            // Neither of these should have succeeded.
+            assert (successes == 0);
+            //
+            // nearest
+            trv1s = trv1;
+            pstat = prop.vecDirProp(trv1s, sz1, PropDir.NEAREST_MOVE);
+            System.out.println(" nearest move: " + trv1s);
+            System.out.println(pstat);
+            assert (!pstat.success());
+
+
+//               cng 120905 problems here... 
+//            // Test derivatives numerically using uniform field. 
+//            System.out.println("Testing derivatives with uniform field");
+//            VTrack trv1a = trv1;
+//            TrackDerivative deriv = new TrackDerivative();
+//            pstat = prop.vecDirProp(trv1a, sz2, PropDir.NEAREST, deriv);
+//            assert (pstat.success());
+//            VTrack trv1a0 = trv1;
+//            TrackDerivative deriv0 = new TrackDerivative();
+//            pstat = prop0.vecDirProp(trv1a0, sz2, PropDir.NEAREST, deriv0);
+//            assert (pstat.success());
+//            for (int j = 0; j < 5; ++j) {
+//                double d;
+//                if (j < 2) {
+//                    d = 0.25;
+//                } else if (j < 4) {
+//                    d = 0.01;
+//                } else {
+//                    d = 0.001;
+//                }
+//                TrackVector vec1b = vec1;
+//                TrackVector vec1c = vec1;
+//                vec1b.set(j, vec1.get(j) + d);
+//                vec1c.set(j, vec1.get(j) - d);
+//                VTrack trv1b = new VTrack(sz1.newPureSurface(), vec1b, tdir);
+//                VTrack trv1c = new VTrack(sz1.newPureSurface(), vec1c, tdir);
+//                pstat = prop.vecDirProp(trv1b, sz2, PropDir.NEAREST);
+//                assert (pstat.success());
+//                pstat = prop.vecDirProp(trv1c, sz2, PropDir.NEAREST);
+//                assert (pstat.success());
+//                System.out.println("Testing diffs");
+//                System.out.println("ii, j \t dij deriv(ii,j) deriv0(ii,j)");
+//                for (int ii = 0; ii < 5; ++ii) {
+//                    double dij = (trv1b.vector(ii) - trv1c.vector(ii)) / (2. * d);
+//                    System.out.println(ii + ", " + j + '\t' + dij + '\t' + deriv.get(ii, j) + '\t' + deriv0.get(ii, j));
+//                    double scale = max(abs(deriv.get(ii, j)), 1.);
+//                    assert (abs(deriv.get(ii, j) - deriv0.get(ii, j)) / scale < maxdiff);
+//                    double tmp = abs(dij - deriv.get(ii, j)) / scale;
+//                    System.out.println(tmp + " " + scale);
+//                    assert (abs(dij - deriv.get(ii, j)) / scale < 1.e-3);
+//                }
+//            }
+
+// following was commented out originally
+//    /*
+//    // Test derivatives numerically using non-uniform field.
+//    System.out.println("Testing derivatives with non-uniform field");
+//    VTrack trv1an = trv1;
+//    TrackDerivative derivn;
+//    pstat = propmc.vecDirProp(trv1an,sz2,PropDir.NEAREST, &derivn);
+//    assert(pstat.success());
+//    for(int j=0; j<5; ++j) {
+//      double d;
+//      if(j < 2)
+//	d = 0.1;
+//      else if(j < 4)
+//	d = 0.01;
+//      else
+//	d = 0.001;
+//      TrackVector vec1bn = vec1;
+//      TrackVector vec1cn = vec1;
+//      vec1bn(j, vec1(j) + d;
+//      vec1cn(j, vec1(j) - d;
+//      VTrack trv1bn(SurfacePtr(sz1.newPureSurface()), vec1bn, tdir);
+//      VTrack trv1cn(SurfacePtr(sz1.newPureSurface()), vec1cn, tdir);
+//      pstat = propmc.vecDirProp(trv1bn,sz2,PropDir.NEAREST);
+//      assert(pstat.success());
+//      pstat = propmc.vecDirProp(trv1cn,sz2,PropDir.NEAREST);
+//      assert(pstat.success());
+//      for(int i=0; i<5; ++i) {
+//	double dijn = (trv1bn.vector(i) - trv1cn.vector(i))/(2.*d);
+//	cout + i + ", " + j + '\t' +  dijn + '\t' + derivn(i,j) );
+//	double scale = max(abs(derivn(i,j)), 1.);
+//	assert(abs(dijn-derivn(i,j))/scale < 0.01);
+//      }
+//    }
+//    */
+        }
+
+        //********************************************************************
+
+        // Repeat the above with errors.
+        System.out.println("Check reversibility with errors.");
+        double exx[] = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1};
+        double exy[] = {0.05, -0.05, 0.05, -0.05, 0.05, -0.05, 0.05, 0.05};
+        double eyy[] = {0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25};
+        double exxv[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double eyxv[] = {0.02, -0.02, 0.02, -0.02, 0.02, -0.02, 0.02, 0.02};
+        double exvxv[] = {0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01};
+        double exyv[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double eyyv[] = {0.04, -0.04, 0.04, -0.04, 0.04, -0.04, 0.04, 0.04};
+        double exvyv[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double eyvyv[] = {0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02};
+        double exc[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double eyc[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double exvc[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double eyvc[] = {0.004, -0.004, 0.004, -0.004, 0.004, -0.004, 0.004, 0.004};
+        double ecc[] = {0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01};
+        for (i = 0; i < ntrk; ++i) {
+            System.out.println("********** Propagate track " + i + ". **********");
+            PropStat pstat = new PropStat();
+            SurfZPlane dz1 = new SurfZPlane(z1[i]);
+            SurfZPlane dz2 = new SurfZPlane(z2[i]);
+            TrackVector vec1 = new TrackVector();
+            vec1.set(0, x[i]);    // x
+            vec1.set(1, y[i]);    // y
+            vec1.set(2, xv[i]);   // dx/dz
+            vec1.set(3, yv[i]);   // dy/dz
+            vec1.set(4, crv[i]);  // curvature
+            TrackError err1 = new TrackError();
+            err1.set(0, 0, exx[i]);
+            err1.set(0, 1, exy[i]);
+            err1.set(1, 1, eyy[i]);
+            err1.set(0, 2, exxv[i]);
+            err1.set(1, 2, eyxv[i]);
+            err1.set(2, 2, exvxv[i]);
+            err1.set(0, 3, exyv[i]);
+            err1.set(1, 3, eyyv[i]);
+            err1.set(2, 3, exvyv[i]);
+            err1.set(3, 3, eyvyv[i]);
+            err1.set(0, 4, exc[i]);
+            err1.set(1, 4, eyc[i]);
+            err1.set(2, 4, exvc[i]);
+            err1.set(3, 4, eyvc[i]);
+            err1.set(4, 4, ecc[i]);
+            TrackSurfaceDirection tdir;
+            if (forw[i]) {
+                tdir = TrackSurfaceDirection.TSD_FORWARD;
+            } else {
+                tdir = TrackSurfaceDirection.TSD_BACKWARD;
+            }
+            ETrack tre1 = new ETrack((dz1.newPureSurface()), vec1, err1, tdir);
+            System.out.println(" starting: " + tre1);
+            //
+            // Find the direction that will propagate this track from r1 to r2.
+            //
+            PropDir dir = PropDir.FORWARD;
+            PropDir rdir = PropDir.BACKWARD;
+            if (z2[i] > z1[i] && tdir == TrackSurfaceDirection.TSD_BACKWARD
+                    || z2[i] < z1[i] && tdir == TrackSurfaceDirection.TSD_FORWARD) {
+                dir = PropDir.BACKWARD;
+                rdir = PropDir.FORWARD;
+            }
+
+            //
+            // Propagate.
+            ETrack tre2f = tre1;
+            pstat = prop.errDirProp(tre2f, dz2, dir);
+            assert (pstat.success());
+            System.out.println("  forward: " + tre2f);
+            System.out.println(pstat);
+            if (dir == PropDir.FORWARD) {
+                assert (pstat.forward());
+            }
+            if (dir == PropDir.BACKWARD) {
+                assert (pstat.backward());
+            }
+
+            //
+            // Propagate using PropZZ and check difference.
+            ETrack tre2f0 = tre1;
+            pstat = prop0.errDirProp(tre2f0, dz2, dir);
+            assert (pstat.success());
+            System.out.println("  forward: " + tre2f0);
+            System.out.println(pstat);
+            double vdiff0 =
+                    dz2.vecDiff(tre2f.vector(), tre2f0.vector()).amax();
+            System.out.println("vec diff: " + vdiff0);
+            assert (vdiff0 < maxdiff);
+            TrackError df0 = tre2f.error().minus(tre2f0.error());
+            double ediff0 = df0.amax();
+            System.out.println("err diff: " + ediff0);
+            assert (ediff0 < maxdiff);
+
+            //
+            // Propagate backward
+            ETrack tre2fb = tre2f;
+            pstat = prop.errDirProp(tre2fb, dz1, rdir);
+            assert (pstat.success());
+            System.out.println(" f return: " + tre2fb);
+            System.out.println(pstat);
+            if (rdir == PropDir.FORWARD) {
+                assert (pstat.forward());
+            }
+            if (rdir == PropDir.BACKWARD) {
+                assert (pstat.backward());
+            }
+            double difff =
+                    dz1.vecDiff(tre2fb.vector(), tre1.vector()).amax();
+            System.out.println("vec diff: " + difff);
+            assert (difff < maxdiff);
+            TrackError dfb = tre2fb.error().minus(tre1.error());
+            double edifff = dfb.amax();
+            System.out.println("err diff: " + edifff);
+            assert (edifff < maxdiff);
+        }
+
+    }
+}
CVSspam 0.2.12


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