1 package org.lcsim.recon.tracking.trfutil;
2 import java.util.Random;
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class ArraySmearer
43 {
44
45
46 private double[][] _smear;
47
48
49 private double[][] _cov;
50
51 private int _ndim;
52
53 private Random _r = new Random();
54
55
56
57
58
59
60
61
62 public ArraySmearer( double[][] cov)
63 {
64
65 _ndim = cov.length;
66
67 for(int i = 0; i< _ndim; ++i)
68 {
69 if(cov[i].length != _ndim) throw new IllegalArgumentException("Array Smearer: Bad covariance matrix!");
70 }
71
72 for(int i = 0; i < _ndim; ++i)
73 {
74 for (int j = 0; j< _ndim ; ++j )
75 {
76 if( cov[i][j] != cov[j][i] ) throw new IllegalArgumentException("Array Smearer: Bad covariance matrix!");
77 }
78 }
79
80
81 _smear = new double[_ndim][_ndim];
82
83 _cov = new double[_ndim][_ndim];
84 System.arraycopy(cov,0,_cov,0,_ndim);
85
86 double ck = 0.;
87 double sum;
88 for (int i=0; i<_ndim; i++)
89 {
90
91 sum = 0;
92 for (int j=0; j<i; j++)
93 {
94 sum += _smear[i][j]*_smear[i][j];
95 }
96 _smear[i][i] = Math.sqrt(Math.abs(cov[i][i] - sum));
97
98 for (int k=i+1; k<_ndim; k++)
99 {
100 sum = 0;
101 for (int j=0; j<i; j++)
102 {
103 sum += _smear[k][j]*_smear[i][j];
104 }
105 _smear[k][i] = (cov[k][i] - sum)/_smear[i][i];
106 }
107 }
108 }
109
110
111
112
113
114
115 public void smear(double[] vec)
116 {
117 if(vec.length!=_ndim) throw new IllegalArgumentException("Array Smearer: Bad input vector!");
118 double smrfac;
119
120 for (int i=0; i<_ndim; i++)
121 {
122 smrfac = 0.0;
123 for (int j=0; j<=i; j++)
124 {
125 smrfac += _smear[i][j]*_r.nextGaussian();
126 }
127 vec[i] += smrfac;
128 }
129 }
130
131
132
133
134
135
136
137
138 public void generate(double[] vec)
139 {
140 if(vec.length!=_ndim) throw new IllegalArgumentException("Array Generator: Bad input vector!");
141 double[] z = new double[_ndim];
142
143 for (int i=0; i<_ndim; i++)
144 {
145 z[i] = _r.nextGaussian();
146 }
147
148 for (int i=0; i<_ndim; i++)
149 {
150 vec[i]=0.;
151 for (int j=0; j<=i; j++)
152 {
153 vec[i] += _smear[i][j]*z[j];
154 }
155
156 }
157 }
158
159
160
161
162
163
164
165 public String toString()
166 {
167 String className = getClass().getName();
168 int lastDot = className.lastIndexOf('.');
169 if(lastDot!=-1)className = className.substring(lastDot+1);
170 StringBuffer sb = new StringBuffer(className+" of dimension "+_ndim+"\n");
171 for ( int i = 0; i<_ndim ; ++i )
172 {
173 for (int j = 0 ; j<_ndim ; ++j )
174 {
175 sb.append( _cov[i][j] +" ");
176 }
177 sb.append("\n");
178 }
179 sb.append("\n smear= \n");
180 for ( int i = 0; i<_ndim ; ++i )
181 {
182 for (int j = 0 ; j<_ndim ; ++j )
183 {
184 sb.append( _smear[i][j] +" ");
185 }
186 sb.append("\n");
187 }
188 return sb.toString();
189 }
190 }