View Javadoc

1   /*
2    * PropZZ_Test.java
3    *
4    * Created on July 24, 2007, 11:02 PM
5    *
6    * $Id: PropZZ_Test.java,v 1.1.1.1 2010/04/08 20:38:00 jeremy Exp $
7    */
8   
9   package org.lcsim.recon.tracking.trfzp;
10  
11  import junit.framework.TestCase;
12  import org.lcsim.recon.tracking.spacegeom.SpacePath;
13  import org.lcsim.recon.tracking.spacegeom.SpacePoint;
14  import org.lcsim.recon.tracking.trfbase.ETrack;
15  import org.lcsim.recon.tracking.trfbase.PropDir;
16  import org.lcsim.recon.tracking.trfbase.PropStat;
17  import org.lcsim.recon.tracking.trfbase.Propagator;
18  import org.lcsim.recon.tracking.trfbase.Surface;
19  import org.lcsim.recon.tracking.trfbase.TrackDerivative;
20  import org.lcsim.recon.tracking.trfbase.TrackError;
21  import org.lcsim.recon.tracking.trfbase.TrackVector;
22  import org.lcsim.recon.tracking.trfbase.VTrack;
23  import org.lcsim.recon.tracking.trfutil.Assert;
24  
25  /**
26   *
27   * @author Norman Graf
28   */
29  public class PropZZ_Test extends TestCase
30  {
31      private boolean debug;
32      /** Creates a new instance of PropZZ_Test */
33      public void testPropZZ()
34      {
35          String ok_prefix = "PropZZ (I): ";
36          String error_prefix = "PropZZ test (E): ";
37          
38          if(debug) System.out.println( ok_prefix
39                  + "-------- Testing component PropZZ. --------" );
40          
41          {
42              if(debug) System.out.println( ok_prefix + "Test constructor." );
43              PropZZ prop = new PropZZ(2.0);
44              if(debug) System.out.println( prop );
45              
46              //********************************************************************
47              
48              // Here we propagate some tracks both forward and backward and then
49              // each back to the original track.  We check that the returned
50              // track parameters match those of the original track.
51              if(debug) System.out.println( ok_prefix + "Check reversibility." );
52              
53              double z1[]  ={10.,      10.,     10.,     10.,     10.,     10.};
54              double z2[]  ={20.,     -20.,     20.,     20.,    -20.,    -20.};
55              double z3[]  ={30.,     -30.,     30.,     30.,    -30.,    -30.};
56              int sign_dz[]={  1,       -1,      1,       1,       -1,      -1     };
57              double x[]   ={ -2.,       2.,     40.,     40.,     -2.,     -2.    };
58              double y[]   ={  3.,       3.,      3.,      3.,      3.,      3.    };
59              double dxdz[]={-1.5,     -2.3,     0.,      1.5,     0.,       0.    };
60              double dydz[]={ 2.3,     -1.5,    -2.3,     0.,      2.3,      0.   };
61              double qp[]  ={ 0.05,    -0.05,    0.05,   -0.05,   -0.05,     0.05  };
62              
63              double maxdiff = 1.e-12;
64              int ntrk = 6;
65              int i;
66              for ( i=0; i<ntrk; ++i )
67              {
68                  if(debug) System.out.println( "********** Propagate track " + i + ". **********" );
69                  PropStat pstat = new PropStat();
70                  SurfZPlane szp1 = new SurfZPlane(z1[i]);
71                  SurfZPlane szp2 = new SurfZPlane(z2[i]);
72                  SurfZPlane szp3 = new SurfZPlane(z3[i]);
73                  TrackVector vec1 = new TrackVector();
74                  vec1.set(SurfZPlane.IX   ,   x[i]);     // x
75                  vec1.set(SurfZPlane.IY   , y[i]);     // y
76                  vec1.set(SurfZPlane.IDXDZ, dxdz[i]);  // dx/dz
77                  vec1.set(SurfZPlane.IDYDZ,  dydz[i]);  // dy/dz
78                  vec1.set(SurfZPlane.IQP  ,  qp[i]);    //  q/p
79                  
80                  VTrack trv1 = new VTrack(szp2.newPureSurface(),vec1);
81                  if (sign_dz[i]==1)
82                  {trv1.setForward();
83                  }
84                  else
85                  {trv1.setBackward();
86                  }
87                  if(debug) System.out.println( " starting: " + trv1 );
88                  VTrack trv2f = new VTrack(trv1);
89                  pstat = prop.vecDirProp(trv2f,szp3,PropDir.FORWARD);
90                  Assert.assertTrue( pstat.forward() );
91                  if(debug) System.out.println( "  forward: " + trv2f );
92                  VTrack trv2b = new VTrack(trv1);
93                  pstat = prop.vecDirProp(trv2b,szp1,PropDir.BACKWARD);
94                  Assert.assertTrue( pstat.backward() );
95                  if(debug) System.out.println( " backward: " + trv2b );
96                  VTrack trv2fb = new VTrack(trv2f);
97                  pstat = prop.vecDirProp(trv2fb,szp2,PropDir.BACKWARD);
98                  Assert.assertTrue( pstat.backward() );
99                  if(debug) System.out.println( " f return: " + trv2fb );
100                 VTrack trv2bf = new VTrack(trv2b);
101                 pstat = prop.vecDirProp(trv2bf,szp2,PropDir.FORWARD);
102                 Assert.assertTrue( pstat.forward() );
103                 if(debug) System.out.println( " b return: " + trv2bf );
104                 double difff =
105                         szp1.vecDiff(trv2fb.vector(),trv1.vector()).amax();
106                 double diffb =
107                         szp1.vecDiff(trv2bf.vector(),trv1.vector()).amax();
108                 if(debug) System.out.println( "diffs: " + difff + ' ' + diffb );
109                 Assert.assertTrue( difff < maxdiff );
110                 Assert.assertTrue( diffb < maxdiff );
111             }
112             
113             // Repeat the above with errors.
114             if(debug) System.out.println( ok_prefix + "Check reversibility with errors." );
115             double exx[] =   {  0.01,   0.01,   0.01,   0.01,   0.01,   0.01  };
116             double exy[] =   {  0.01,  -0.01,   0.01,  -0.01,   0.01,  -0.01  };
117             double eyy[] =   {  0.25,   0.25,   0.25,   0.25,   0.25,   0.25, };
118             double exdx[] =  {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
119             double eydx[] =  {  0.04,  -0.04,   0.04,  -0.04,   0.04,  -0.04, };
120             double edxdx[] = {  0.01,   0.01,   0.01,   0.01,   0.01,   0.01  };
121             double exdy[] =  {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
122             double edxdy[] = {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
123             double eydy[] =  {  0.04,  -0.04,   0.04,  -0.04,   0.04,  -0.04  };
124             double edydy[] = {  0.02,   0.02,   0.02,   0.02,   0.02,   0.02  };
125             double exqp[] =  {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
126             double eyqp[] =  {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
127             double edxqp[] = {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
128             double edyqp[] = {  0.004, -0.004,  0.004, -0.004,  0.004, -0.004 };
129             double eqpqp[] = {  0.01,   0.01,   0.01,   0.01,   0.01,   0.01  };
130             
131             for ( i=0; i<ntrk; ++i )
132             {
133                 if(debug) System.out.println( "********** Propagate track " + i + ". **********" );
134                 PropStat pstat = new PropStat();
135                 SurfZPlane szp1= new SurfZPlane((z1[i]));
136                 SurfZPlane szp2= new SurfZPlane((z2[i]));
137                 SurfZPlane szp3= new SurfZPlane((z3[i]));
138                 TrackVector vec1 = new TrackVector();
139                 vec1.set(SurfZPlane.IX    , x[i]);     // x
140                 vec1.set(SurfZPlane.IY    , y[i]);     // y
141                 vec1.set(SurfZPlane.IDXDZ , dxdz[i]);  // dx/dz
142                 vec1.set(SurfZPlane.IDYDZ , dydz[i]);  // dy/dz
143                 vec1.set(SurfZPlane.IQP   , qp[i]);    //  q/p
144                 
145                 TrackError err1 = new TrackError();
146                 err1.set(SurfZPlane.IX,SurfZPlane.IX       , exx[i]);
147                 err1.set(SurfZPlane.IX,SurfZPlane.IY       , exy[i]);
148                 err1.set(SurfZPlane.IY,SurfZPlane.IY       , eyy[i]);
149                 err1.set(SurfZPlane.IX,SurfZPlane.IDXDZ    , exdx[i]);
150                 err1.set(SurfZPlane.IY,SurfZPlane.IDXDZ    , eydx[i]);
151                 err1.set(SurfZPlane.IDXDZ,SurfZPlane.IDXDZ , edxdx[i]);
152                 err1.set(SurfZPlane.IX,SurfZPlane.IDYDZ    , exdy[i]);
153                 err1.set(SurfZPlane.IY,SurfZPlane.IDYDZ    , eydy[i]);
154                 err1.set(SurfZPlane.IDXDZ,SurfZPlane.IDYDZ , edxdy[i]);
155                 err1.set(SurfZPlane.IDYDZ,SurfZPlane.IDYDZ , edydy[i]);
156                 err1.set(SurfZPlane.IX,SurfZPlane.IQP      , exqp[i]);
157                 err1.set(SurfZPlane.IY,SurfZPlane.IQP      , eyqp[i]);
158                 err1.set(SurfZPlane.IDXDZ,SurfZPlane.IQP   , edxqp[i]);
159                 err1.set(SurfZPlane.IDYDZ,SurfZPlane.IQP   , edyqp[i]);
160                 err1.set(SurfZPlane.IQP,SurfZPlane.IQP     , eqpqp[i]);
161                 ETrack trv1 = new ETrack(szp2.newPureSurface(),vec1,err1);
162                 if (sign_dz[i]==1)
163                 {trv1.setForward();
164                 }
165                 else
166                 {trv1.setBackward();
167                 }
168                 if(debug) System.out.println( " starting: " + trv1 );
169                 
170                 ETrack trv2f = new ETrack(trv1);
171                 pstat = prop.errDirProp(trv2f,szp3,PropDir.FORWARD);
172                 Assert.assertTrue( pstat.forward() );
173                 if(debug) System.out.println( "  forward: " + trv2f );
174                 ETrack trv2b = new ETrack(trv1);
175                 pstat = prop.errDirProp(trv2b,szp1,PropDir.BACKWARD);
176                 Assert.assertTrue( pstat.backward() );
177                 if(debug) System.out.println( " backward: " + trv2b );
178                 ETrack trv2fb = new ETrack(trv2f);
179                 pstat = prop.errDirProp(trv2fb,szp2,PropDir.BACKWARD);
180                 Assert.assertTrue( pstat.backward() );
181                 if(debug) System.out.println( " f return: " + trv2fb );
182                 ETrack trv2bf = new ETrack(trv2b);
183                 pstat = prop.errDirProp(trv2bf,szp2,PropDir.FORWARD);
184                 Assert.assertTrue( pstat.forward() );
185                 if(debug) System.out.println( " b return: " + trv2bf );
186                 double difff =
187                         szp1.vecDiff(trv2fb.vector(),trv1.vector()).amax();
188                 double diffb =
189                         szp1.vecDiff(trv2bf.vector(),trv1.vector()).amax();
190                 if(debug) System.out.println( "vec diffs: " + difff + ' ' + diffb );
191                 Assert.assertTrue( difff < maxdiff );
192                 Assert.assertTrue( diffb < maxdiff );
193                 
194                 TrackError dfb = trv2fb.error().minus(trv1.error());
195                 TrackError dbf = trv2bf.error().minus(trv1.error());
196                 double edifff = dfb.amax();
197                 double ediffb = dbf.amax();
198                 if(debug) System.out.println( "err diffs: " + edifff + ' ' + ediffb );
199                 Assert.assertTrue( edifff < maxdiff );
200                 Assert.assertTrue( ediffb < maxdiff );
201                 
202             }
203             
204             //********************************************************************
205             
206             if(debug) System.out.println( ok_prefix + "Test Nearest Propagation" );
207             
208             PropStat pstat = new PropStat();
209             
210             SurfZPlane szp1 = new SurfZPlane(5.);
211             SurfZPlane szp2 = new SurfZPlane(10.);
212             
213             TrackVector vec1 = new TrackVector();
214             vec1.set(SurfZPlane.IX    , 1.);     // x
215             vec1.set(SurfZPlane.IY    , 1.);     // y
216             vec1.set(SurfZPlane.IDXDZ , 1.);     // dx/dz
217             vec1.set(SurfZPlane.IDYDZ , 1.);     // dy/dz
218             vec1.set(SurfZPlane.IQP   , 0.01);   //  q/p
219             
220             VTrack trv1 = new VTrack(szp1.newPureSurface(),vec1);
221             trv1.setForward();
222             
223             if(debug) System.out.println( " starting: " + trv1 );
224             VTrack trv2n = new VTrack(trv1);
225             pstat = prop.vecDirProp(trv2n,szp2,PropDir.NEAREST_MOVE);
226             Assert.assertTrue( pstat.forward() );
227             if(debug) System.out.println( " nearest: " + trv2n );
228             
229             trv1.setBackward();
230             
231             if(debug) System.out.println( " starting: " + trv1 );
232             trv2n = new VTrack(trv1);
233             pstat = prop.vecDirProp(trv2n,szp2,PropDir.NEAREST);
234             Assert.assertTrue( pstat.backward() );
235             if(debug) System.out.println( " nearest: " + trv2n );
236             
237             //********************************************************************
238             
239             if(debug) System.out.println( ok_prefix + "Test same surface" );
240             VTrack trvs0 = new VTrack(szp1.newPureSurface(),vec1);
241             trvs0.setForward();
242             VTrack trvs = new VTrack(trvs0);
243             PropStat tst = prop.vecDirProp(trvs,szp1,PropDir.NEAREST_MOVE);
244             Assert.assertTrue( !tst.success() );
245             tst = prop.vecDirProp(trvs,szp1,PropDir.FORWARD_MOVE);
246             Assert.assertTrue( !tst.success() );
247             tst = prop.vecDirProp(trvs,szp1,PropDir.BACKWARD_MOVE);
248             Assert.assertTrue( !tst.success() );
249             tst = prop.vecDirProp(trvs,szp1,PropDir.NEAREST);
250             Assert.assertTrue( tst.success() );
251             tst = prop.vecDirProp(trvs,szp1,PropDir.FORWARD);
252             Assert.assertTrue( tst.success() );
253             tst = prop.vecDirProp(trvs,szp1,PropDir.BACKWARD);
254             Assert.assertTrue( tst.success() );
255             Assert.assertTrue( trvs0.equals(trvs) );
256             
257             //********************************************************************
258             
259             if(debug) System.out.println( ok_prefix + "Test cloning." );
260             Assert.assertTrue( prop.newPropagator() != null);
261             
262             
263             //********************************************************************
264             
265             if(debug) System.out.println( ok_prefix + "Test the field." );
266             Assert.assertTrue( prop.bField() == 2.0 );
267             
268             //********************************************************************
269         }
270                 
271                 if(debug) System.out.println( ok_prefix + "Test Zero B field propagation" );
272                 
273                 {
274                     PropZZ prop0 = new PropZZ(0.);
275                     if(debug) System.out.println( prop0 );
276                     Assert.assertTrue( prop0.bField() == 0. );
277                     
278                     double z=10.;
279                     Surface srf = new SurfZPlane(z);
280                     VTrack trv0 = new VTrack(srf);
281                     TrackVector vec = new TrackVector();
282                     vec.set(SurfZPlane.IX, 2.);
283                     vec.set(SurfZPlane.IY, 10.);
284                     vec.set(SurfZPlane.IDXDZ, 4.);
285                     vec.set(SurfZPlane.IDYDZ, 2.);
286                     trv0.setVector(vec);
287                     trv0.setForward();
288                     z=4.;
289                     Surface srf_to = new SurfZPlane(z);
290                     
291                     VTrack trv = new VTrack(trv0);
292                     PropStat pstat = prop0.vecDirProp(trv,srf_to,PropDir.FORWARD);
293                     Assert.assertTrue( !pstat.success() );
294                     
295                     trv = new VTrack(trv0);
296                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.BACKWARD);
297                     Assert.assertTrue( pstat.success() );
298                     
299                     trv = new VTrack(trv0);
300                     trv.setBackward();
301                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.BACKWARD);
302                     Assert.assertTrue( !pstat.success() );
303                     
304                     trv = new VTrack(trv0);
305                     trv.setBackward();
306                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.FORWARD);
307                     Assert.assertTrue( pstat.success() );
308                     
309                     trv = new VTrack(trv0);
310                     trv.setForward();
311                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
312                     Assert.assertTrue( pstat.success() );
313                     
314                     Assert.assertTrue( pstat.backward() );
315                     Assert.assertTrue( trv.vector(SurfZPlane.IDXDZ) == trv0.vector(SurfZPlane.IDXDZ) );
316                     Assert.assertTrue( trv.vector(SurfZPlane.IDYDZ) == trv0.vector(SurfZPlane.IDYDZ) );
317                     Assert.assertTrue(trv.surface().pureEqual(srf_to));
318                     
319                     check_zero_propagation(trv0,trv,pstat);
320                     
321                     srf_to = new SurfZPlane(6.);
322                     trv = new VTrack(trv0);
323                     trv.setForward();
324                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
325                     Assert.assertTrue( pstat.success() );
326                     check_zero_propagation(trv0,trv,pstat);
327                     
328                     srf_to = new SurfZPlane(14.);
329                     trv = new VTrack(trv0);
330                     trv.setForward();
331                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
332                     Assert.assertTrue( pstat.success() );
333                     check_zero_propagation(trv0,trv,pstat);
334                     
335                     srf_to = new SurfZPlane(-1.);
336                     trv = new VTrack(trv0);
337                     trv.setForward();
338                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
339                     Assert.assertTrue( pstat.success() );
340                     check_zero_propagation(trv0,trv,pstat);
341                     
342                     srf_to = new SurfZPlane(-14.);
343                     trv = new VTrack(trv0);
344                     trv.setForward();
345                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
346                     Assert.assertTrue( pstat.success() );
347                     check_zero_propagation(trv0,trv,pstat);
348                     
349                     srf_to = new SurfZPlane(14.);
350                     trv = new VTrack(trv0);
351                     trv.setSurface( new SurfZPlane(1.));
352                     trv.setBackward();
353                     VTrack tmp = new VTrack(trv);
354                     VTrack der = new VTrack(trv);
355                     VTrack der1 = new VTrack(trv);
356                     der1.setForward();
357                     pstat = prop0.vecDirProp(trv,srf_to,PropDir.NEAREST);
358                     Assert.assertTrue( pstat.success() );
359                     check_zero_propagation(tmp,trv,pstat);
360                     check_derivatives(prop0,der,srf_to);
361                     check_derivatives(prop0,der1,srf_to);
362                     
363                 }
364                 
365                 
366                 if(debug) System.out.println( ok_prefix
367                         + "------------- All tests passed. -------------" );
368                 
369                 //********************************************************************
370     }
371     
372     
373     private static void  check_zero_propagation(  VTrack trv0,  VTrack trv,  PropStat pstat)
374     {
375         
376         SpacePoint sp = trv.spacePoint();
377         SpacePoint sp0 = trv0.spacePoint();
378         
379         SpacePath sv = trv.spacePath();
380         SpacePath sv0 = trv0.spacePath();
381         
382         Assert.assertTrue( Math.abs(sv0.dx() - sv.dx())<1e-7 );
383         Assert.assertTrue( Math.abs(sv0.dy() - sv.dy())<1e-7 );
384         Assert.assertTrue( Math.abs(sv0.dz() - sv.dz())<1e-7 );
385         
386         double x0 = sp0.x();
387         double y0 = sp0.y();
388         double z0 = sp0.z();
389         double x1 = sp.x();
390         double y1 = sp.y();
391         double z1 = sp.z();
392         
393         double dx = sv.dx();
394         double dy = sv.dy();
395         double dz = sv.dz();
396         
397         double prod = dx*(x1-x0)+dy*(y1-y0)+dz*(z1-z0);
398         double moda = Math.sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0) + (z1-z0)*(z1-z0));
399         double modb = Math.sqrt(dx*dx+dy*dy+dz*dz);
400         double st = pstat.pathDistance();
401         Assert.assertTrue( Math.abs(prod-st) < 1.e-7 );
402         Assert.assertTrue( Math.abs(Math.abs(prod) - moda*modb) < 1.e-7 );
403     }
404     
405     private static void check_derivatives(  Propagator prop, VTrack trv0, Surface srf)
406     {
407         for(int i=0;i<4;++i)
408             for(int j=0;j<4;++j)
409                 check_derivative(prop,trv0,srf,i,j);
410     }
411     
412     private static void check_derivative( Propagator prop, VTrack trv0, Surface srf,int i,int j)
413     {
414         
415         double dx = 1.e-3;
416         VTrack trv = new VTrack(trv0);
417         TrackVector vec = trv.vector();
418         boolean forward = trv0.isForward();
419         
420         VTrack trv_0 = new VTrack(trv0);
421         TrackDerivative der = new TrackDerivative();
422         PropStat pstat = prop.vecProp(trv_0,srf,der);
423         Assert.assertTrue(pstat.success());
424         
425         TrackVector tmp = new TrackVector(vec);
426         tmp.set(j, tmp.get(j)+dx);
427         trv.setVector(tmp);
428         if(forward) trv.setForward();
429         else trv.setBackward();
430         
431         VTrack trv_pl = new VTrack(trv);
432         pstat = prop.vecProp(trv_pl,srf);
433         Assert.assertTrue(pstat.success());
434         
435         TrackVector vecpl = trv_pl.vector();
436         
437         tmp= new TrackVector(vec);
438         tmp.set(j, tmp.get(j)-dx);
439         trv.setVector(tmp);
440         if(forward) trv.setForward();
441         else trv.setBackward();
442         
443         VTrack trv_mn = new VTrack(trv);
444         pstat = prop.vecProp(trv_mn,srf);
445         Assert.assertTrue(pstat.success());
446         
447         TrackVector vecmn = trv_mn.vector();
448         
449         double dy = (vecpl.get(i)-vecmn.get(i))/2.;
450         
451         double dydx = dy/dx;
452         
453         double didj = der.get(i,j);
454         
455         if( Math.abs(didj) > 1e-10 )
456             Assert.assertTrue( Math.abs((dydx - didj)/didj) < 1e-4 );
457         else
458             Assert.assertTrue( Math.abs(dydx) < 1e-4 );
459     }
460 }