View Javadoc

1   package org.lcsim.recon.tracking.trfutil;
2   import junit.framework.TestCase;
3   public class ArraySmearer_Test extends TestCase
4   {
5       private boolean debug;
6       public void testArraySmearer()
7       {
8           double[] _pulls = new double[3];
9           double[][] _pulsum = new double[2][3];
10          double[] _pullerr = new double[3];
11          double[][] cov1 =  new double[1][1];
12          // Single variable, should be gaussian smeared...
13          cov1[0][0] = 3.;
14          ArraySmearer as = new ArraySmearer( cov1 );
15          if(debug) System.out.println(as);
16          double[] vec1 = { 1.0 };
17          double[] tmp = new double[1];
18          int nsamples = 1000;
19          for (int k = 0 ; k<nsamples ; ++k )
20          {
21              System.arraycopy(vec1, 0, tmp, 0, 1);
22              as.smear(tmp);
23              for (int i = 0; i<tmp.length ; ++i )
24              {
25                  _pulls[i] = vec1[i] - tmp[i];
26                  _pulsum[0][i] += _pulls[i];
27                  _pulsum[1][i] += _pulls[i]*_pulls[i];
28              }
29          }
30          double fac=1./Math.sqrt((double)(nsamples));
31          for (int i=0; i<vec1.length; ++i)
32          {
33              _pulsum[0][i]=_pulsum[0][i]/(double)nsamples;
34              _pulsum[1][i]=Math.sqrt(_pulsum[1][i]/((double)nsamples)-_pulsum[0][i]*_pulsum[0][i]);
35              _pullerr[i]=fac*_pulsum[1][i];
36              if(debug) System.out.println("Mean: "+_pulsum[0][i]+" +/- "+_pullerr[i]+" sigma= "+_pulsum[1][i]/Math.sqrt(cov1[i][i]));
37          }
38          
39          
40          // 2x2
41          double[][] cov2 =  new double[2][2];
42          // covariance matrix should be square, symmetric
43          // and have positive-definite determinant
44          cov2[0][0] = 4.;
45          cov2[1][1] = 16.;
46          cov2[0][1] = 1.;
47          cov2[1][0] = 1.;
48          ArraySmearer as2 = new ArraySmearer( cov2 );
49          if(debug) System.out.println(as2);
50          double[] vec2 =
51          { 1.0, 1.0 };
52          double[] tmp2 = new double[2];
53          for (int i = 0; i< tmp2.length ; ++i )
54          {
55              _pulls[i] = 0.;
56              _pulsum[0][i] = 0.;
57              _pulsum[1][i] = 0.;
58          }
59          int nsamples2 = 1000;
60          for (int k = 0 ; k<nsamples2 ; ++k )
61          {
62              System.arraycopy(vec2, 0, tmp2, 0, 2);
63              as2.smear(tmp2);
64              
65              for (int i = 0; i<tmp2.length ; ++i )
66              {
67                  _pulls[i] = vec2[i] - tmp2[i];
68                  _pulsum[0][i] += _pulls[i];
69                  _pulsum[1][i] += _pulls[i]*_pulls[i];
70              }
71          }
72          double fac2=1./Math.sqrt((double)(nsamples2));
73          for (int i=0; i<vec2.length; ++i)
74          {
75              if(debug) System.out.println("_pulsum[0]["+i+"]= "+_pulsum[0][i]);
76              _pulsum[0][i]=_pulsum[0][i]/(double)nsamples2;
77              _pulsum[1][i]=Math.sqrt(_pulsum[1][i]/((double)nsamples2)-_pulsum[0][i]*_pulsum[0][i]);
78              _pullerr[i]=fac2*_pulsum[1][i];
79              
80              if(debug) System.out.println("Mean: "+_pulsum[0][i]+" +/- "+_pullerr[i]+" sigma= "+_pulsum[1][i]/Math.sqrt(cov2[i][i]));
81          }
82          
83          //TODO introduce real tests with Assertions
84          
85      }
86  }
87