1 package org.lcsim.recon.tracking.trfcyl;
2
3 import org.lcsim.recon.tracking.trfutil.Assert;
4
5 import org.lcsim.recon.tracking.trfbase.HitGenerator;
6 import org.lcsim.recon.tracking.trfbase.HitError;
7 import org.lcsim.recon.tracking.trfbase.Surface;
8 import org.lcsim.recon.tracking.trfbase.Cluster;
9 import org.lcsim.recon.tracking.trfbase.VTrack;
10 import org.lcsim.recon.tracking.trfbase.CrossStat;
11
12
13
14
15
16
17
18
19
20 public class HitCylPhiZ2DGenerator extends HitGenerator
21 {
22
23
24
25
26 private Surface _srf;
27
28
29 private double _dphi;
30
31
32 private double _dz;
33
34
35 private double _dphidz;
36
37
38
39
40
41
42
43
44
45
46
47
48 public HitCylPhiZ2DGenerator( SurfCylinder srf,
49 double dphi, double dz, double dphidz)
50 {
51 super();
52 _srf = new SurfCylinder(srf);
53 _dphi = dphi;
54 _dz = dz;
55 _dphidz = dphidz;
56 Assert.assertTrue( _dphi >= 0.0 );
57 Assert.assertTrue( _dz >= 0.0 );
58
59 Assert.assertTrue( _dphi*_dphi*_dz*dz - _dphidz*dphidz >= 0.0 );
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73
74 public HitCylPhiZ2DGenerator( SurfCylinder srf,
75 double dphi, double dz, double dphidz,
76 long iseed)
77 {
78 super(iseed);
79 _srf = new SurfCylinder(srf);
80 _dphi = dphi;
81 _dz = dz;
82 _dphidz = dphidz;
83
84 Assert.assertTrue( _dphi >= 0.0 );
85 Assert.assertTrue( _dz >= 0.0 );
86
87 Assert.assertTrue( _dphi*_dphi*_dz*dz - _dphidz*dphidz >= 0.0 );
88 }
89
90
91
92
93
94
95
96 public HitCylPhiZ2DGenerator( HitCylPhiZ2DGenerator hgen)
97 {
98 super(hgen);
99 _srf = hgen._srf;
100 _dphi = hgen._dphi;
101 _dz = hgen._dz;
102 _dphidz = hgen._dphidz;
103 Assert.assertTrue( _dphi >= 0.0 );
104 Assert.assertTrue( _dz >= 0.0 );
105
106 }
107
108
109
110
111
112
113
114
115 public Surface surface()
116 { return _srf;
117 }
118
119
120
121
122
123
124
125
126
127
128 public Cluster newCluster( VTrack trv )
129 {
130 return newCluster(trv, 0);
131 }
132
133
134
135
136
137
138
139
140
141
142 public Cluster newCluster( VTrack trv, int mcid )
143 {
144 Cluster clu = null;
145
146 Assert.assertTrue( _srf.pureEqual( trv.surface() ) );
147 if ( ! _srf.pureEqual( trv.surface() ) ) return clu;
148
149
150 CrossStat xstat = _srf.status(trv);
151 if ( (! _srf.isPure()) && (! xstat.inBounds()) ) return clu;
152
153
154 double ran1 = gauss();
155 double ran2 = gauss();
156 double a2 = 0;
157 if ( _dphi != 0.0 ) a2 = _dphidz/_dphi;
158 double b2 = _dz;
159 if (a2 != 0.0 ) b2 = Math.sqrt( _dz*_dz - a2*a2);
160
161 double phi = trv.vector().get(SurfCylinder.IPHI) + _dphi*ran1;
162 double z = trv.vector().get(SurfCylinder.IZ) + a2*ran1 + b2*ran2;
163
164
165 double radius = _srf.parameter(SurfCylinder.RADIUS);
166 clu = new ClusCylPhiZ2D( radius, phi, _dphi, z, _dz, _dphidz, mcid );
167
168 return clu;
169
170 }
171
172
173
174
175
176
177
178 public String toString()
179 {
180 StringBuffer sb = new StringBuffer("HitCylPhiZ2D Generator at \n" + surface());
181 sb.append("\n dphi: " + _dphi);
182 sb.append("\n dz: " + _dz);
183 sb.append("\n dhidz: " + _dphidz);
184 sb.append(super.toString());
185 return sb.toString();
186 }
187
188 }
189