4c039060 |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * |
4 | * Author: The ALICE Off-line Project. * |
5 | * Contributors are mentioned in the code where appropriate. * |
6 | * * |
7 | * Permission to use, copy, modify and distribute this software and its * |
8 | * documentation strictly for non-commercial purposes is hereby granted * |
9 | * without fee, provided that the above copyright notice appears in all * |
10 | * copies and that both the copyright notice and this permission notice * |
11 | * appear in the supporting documentation. The authors make no claims * |
12 | * about the suitability of this software for any purpose. It is * |
13 | * provided "as is" without express or implied warranty. * |
14 | **************************************************************************/ |
15 | |
16 | /* |
17 | $Log$ |
ad0e60d9 |
18 | Revision 1.2 1999/09/29 09:24:20 fca |
19 | Introduction of the Copyright and cvs Log |
20 | |
4c039060 |
21 | */ |
22 | |
58005f18 |
23 | |
24 | #include "AliITSmoduleSSD.h" |
25 | |
ad0e60d9 |
26 | //Technical parameters of detector |
27 | const Float_t AliITSmoduleSSD::kStereo = 0.0175; //Stereo Angle 17.5 mrad |
28 | const Float_t AliITSmoduleSSD::kTan = 0.0175; |
29 | const Int_t AliITSmoduleSSD::kNStrips = 768; //Number of strips on each side |
30 | const Float_t AliITSmoduleSSD::kPitch = 0.095; //Distance strip - strip (mm) |
31 | const Float_t AliITSmoduleSSD::kX = 72.96; //X size (mm) |
32 | const Float_t AliITSmoduleSSD::kY = 0.3; //Y size (mm) |
33 | const Float_t AliITSmoduleSSD::kZ = 40; //Thickness (mm) |
34 | |
35 | // <------------------------------ |
36 | |
37 | //______________________________________________________________ |
38 | // |
39 | // Parameters for simulation |
40 | //______________________________________________________________ |
41 | |
42 | const Float_t AliITSmoduleSSD::kSigmaP = 0.003; //Gaussian sigm |
43 | const Float_t AliITSmoduleSSD::kSigmaN = 0.002; |
44 | const Int_t AliITSmoduleSSD::kSteps = 10; //Number of steps |
45 | const Int_t AliITSmoduleSSD::kTresholdP = 1500; |
46 | const Int_t AliITSmoduleSSD::kTresholdN = 2500; |
47 | |
48 | |
58005f18 |
49 | |
50 | ClassImp(AliITSmoduleSSD) |
51 | |
52 | //____________________________________________________________________ |
53 | // |
54 | // Constructor |
55 | //____________________________________________________________________ |
56 | // |
57 | |
58 | |
59 | AliITSmoduleSSD::AliITSmoduleSSD() { |
60 | |
61 | |
62 | //Invalid Strips parameters |
63 | |
64 | fInvalidP = new TArrayS(0); |
65 | fInvalidN = new TArrayS(0); |
66 | |
67 | fNInvalidP = 0; |
68 | fNInvalidN = 0; |
69 | |
70 | |
71 | //DCS parameters |
72 | |
73 | fGainP = 83; |
74 | fGainN = 83; |
75 | fSNRatioP = 600; |
76 | fSNRatioP = 500; |
77 | |
78 | fCouplingPR = 0.021; |
79 | fCouplingPL = 0.026; |
80 | fCouplingNR = 0.013; |
81 | fCouplingNL = 0.010; |
82 | |
83 | } |
84 | |
85 | AliITSmoduleSSD::AliITSmoduleSSD(Int_t index) { |
86 | |
87 | fIndex = index; |
88 | |
89 | //Invalid Strips parameters |
90 | |
91 | fInvalidP = new TArrayS(0); |
92 | fInvalidN = new TArrayS(0); |
93 | |
94 | fNInvalidP = 0; |
95 | fNInvalidN = 0; |
96 | |
97 | |
98 | //DCS parameters |
99 | |
100 | fGainP = 83; |
101 | fGainN = 83; |
102 | fSNRatioP = 600; |
103 | fSNRatioP = 500; |
104 | |
105 | fCouplingPR = 0.021; |
106 | fCouplingPL = 0.026; |
107 | fCouplingNR = 0.013; |
108 | fCouplingNL = 0.010; |
109 | } |
110 | |
111 | AliITSmoduleSSD::~AliITSmoduleSSD() { |
112 | |
113 | if (!fInvalidP) delete fInvalidP; |
114 | if (!fInvalidN) delete fInvalidN; |
115 | } |
116 | |
117 | |
118 | //____________________________________________________________________ |
119 | // |
120 | // Inalid strips menagement |
121 | //____________________________________________________________________ |
122 | // |
123 | |
124 | |
125 | |
126 | void AliITSmoduleSSD::SetInvalidP(Int_t strip, Bool_t b) { |
127 | |
128 | Bool_t already = kFALSE; |
129 | Int_t i; |
130 | |
131 | for (i=0; i<fNInvalidP; i++) { |
132 | if ((*fInvalidP)[i] == strip) { |
133 | already = kTRUE; |
134 | break; |
135 | } |
136 | } |
137 | |
138 | if (!already && b) { |
139 | (*fInvalidP)[fNInvalidP++] = strip; |
140 | } |
141 | } |
142 | |
143 | void AliITSmoduleSSD::SetInvalidMC(Float_t m, Float_t s) { |
144 | |
145 | fNInvalid = m; |
146 | fISigma = s; |
147 | SetInvalidMC(); |
148 | } |
149 | |
150 | void AliITSmoduleSSD::SetInvalidMC() { |
151 | |
152 | Int_t m = (Int_t)gRandom->Gaus(fNInvalid, fISigma); |
153 | |
154 | for(int i=0; i<m; i++) { |
155 | SetInvalidP((Int_t)(gRandom->Rndm()*kNStrips), kTRUE); |
156 | } |
157 | |
158 | } |
159 | |
160 | Bool_t AliITSmoduleSSD::IsValidP(Int_t n) { |
161 | |
162 | for(Int_t i=0; i<fNInvalidP; i++) |
163 | if ((*fInvalidP)[i] == n) return kFALSE; |
164 | return kTRUE; |
165 | } |
166 | |
167 | Bool_t AliITSmoduleSSD::IsValidN(Int_t n) { |
168 | |
169 | for(Int_t i=0; i<fNInvalidN; i++) |
170 | if ((*fInvalidN)[i] == n) return kFALSE; |
171 | return kTRUE; |
172 | } |
173 | |
174 | |
175 | //____________________________________________________________________ |
176 | // |
177 | // Add digit |
178 | //____________________________________________________________________ |
179 | // |
180 | |
181 | /********************************************************************* |
182 | * |
183 | * AddDigits |
184 | * sets paramerers: layer, ladder detector |
185 | * scan tracks wich produced this digit |
186 | * creates new SSD DIGTS |
187 | * call ITS to add digit to its Array |
188 | * set index frm ITS in its own array |
189 | * |
190 | * S.Radomski 17.09.1999 |
191 | * |
192 | *********************************************************************/ |
193 | |
194 | void AliITSmoduleSSD::AddDigit(Int_t strNo, Int_t s, Bool_t p) { |
195 | |
196 | Int_t tracks[3]; |
197 | Int_t digits[4]; |
198 | AliITSdigit *t = (AliITSdigit*) (new AliITSdigitSSD(tracks, digits, |
199 | strNo, s, p)); |
200 | |
201 | fIdigits->AddAt(((AliITS *)fITS)->AddDigit(t), fNdigits++); |
202 | } |
203 | |
204 | |
205 | //____________________________________________________________________ |
206 | // |
207 | // Hits to digits |
208 | //____________________________________________________________________ |
209 | // |
210 | |
211 | |
212 | |
213 | void AliITSmoduleSSD::HitToDigit() { |
214 | |
215 | Int_t i; //for iteration |
216 | fP = new TArrayI(768); |
217 | fN = new TArrayI(768); |
218 | |
219 | fPtrack1 = new TArrayI(768); |
220 | fPtrack2 = new TArrayI(768); |
221 | fPtrack3 = new TArrayI(768); |
222 | |
223 | fNtrack1 = new TArrayI(768); |
224 | fNtrack2 = new TArrayI(768); |
225 | fNtrack3 = new TArrayI(768); |
226 | |
227 | for(i=0; i<kNStrips; i++) { |
228 | (*fN)[i] = 0; |
229 | (*fP)[i] = 0; |
230 | } // end for i |
231 | |
232 | for(i=0; i<fNhitsM; i++) HitToDigit(i); |
233 | |
234 | ApplyCoupling(); |
235 | ApplyNoise(); |
236 | |
237 | for(i=0; i<fNInvalidP; i++) (*fP)[(*fInvalidP)[i]] = -20; |
238 | for(i=0; i<fNInvalidN; i++) (*fN)[(*fInvalidN)[i]] = -20; |
239 | |
240 | for(i=0; i<kNStrips; i++) |
241 | if ((*fP)[i]>kTresholdP) AddDigit(i+1, (*fP)[i], kTRUE); |
242 | |
243 | for(i=0; i<kNStrips; i++) |
244 | if ((*fN)[i]>kTresholdN) AddDigit(i+1, (*fN)[i], kFALSE); |
245 | |
246 | delete fN; |
247 | delete fP; |
248 | |
249 | delete fPtrack1; |
250 | delete fPtrack2; |
251 | delete fPtrack3; |
252 | |
253 | delete fPtrack1; |
254 | delete fPtrack2; |
255 | delete fPtrack3; |
256 | |
257 | } |
258 | |
259 | |
260 | |
261 | void AliITSmoduleSSD::HitToDigit(Int_t hitNo) { |
262 | |
263 | Int_t stripP, stripN, i; |
264 | Float_t dsP, dsN; |
265 | Float_t sP, sN; |
266 | Float_t EP, EN; |
267 | AliITShit *hit = (AliITShit*)((*fHitsM)[hitNo]); |
268 | Float_t dZ = kZ/kSteps*1000, l; |
269 | |
270 | if(hit->GetIonization()==0.0) return; |
271 | |
272 | Float_t x = hit->GetXG(); |
273 | Float_t y = hit->GetYG(); |
274 | |
275 | Float_t dx = 0.0; //TMath::Tan(hit->fTheta)*kZ/kSteps; |
276 | Float_t dy = 0.0; //TMath::Tan(hit->fPhi)*kZ/kSteps; |
277 | l = sqrt(dZ*dZ + dx*dx *1000000); |
278 | |
279 | x -= (kSteps/2 -1) * dx; |
280 | y -= (kSteps/2 -1) * dy; |
281 | |
282 | for (i=1; i<kSteps; i++) { |
283 | |
284 | stripP = GetStripP(x, y); |
285 | dsP = Get2StripP(x, y); |
286 | |
287 | stripN = GetStripN(x, y); |
288 | dsN = Get2StripN(x, y); |
289 | |
290 | EP = gRandom->Landau(fGainP*l, l*10); |
291 | EN = gRandom->Landau(fGainN*l, l*10); |
292 | |
293 | sP = kSigmaP * sqrt(i); |
294 | sN = kSigmaN * sqrt(kSteps-i); |
295 | |
296 | sP = (i<3 && dsP>0.3 && dsP<0.7)? 0.02 : sP; |
297 | sN = (i>7 && dsN>0.3 && dsN<0.7)? 0.02 : sN; |
298 | |
299 | sP = (i==3 && dsP>0.4 && dsP<0.6)? 0.015 : sP; |
300 | sN = (i==7 && dsN>0.4 && dsN<0.6)? 0.015 : sN; |
301 | |
302 | |
303 | (*fP)[stripP-1]+=(Int_t)(EP*(F(-0.5-dsP,sP)-F(-1.5-dsP,sP))); |
304 | (*fP)[stripP] +=(Int_t)(EP*(F(0.5-dsP,sP)-F(-0.5-dsP,sP))); |
305 | (*fP)[stripP+1]+=(Int_t)(EP*(F(1.5-dsP,sP)-F(0.5-dsP,sP))); |
306 | (*fP)[stripP+2]+=(Int_t)(EP*(F(2.5-dsP,sP)-F(1.5-dsP,sP))); |
307 | |
308 | (*fN)[stripN-1]+=(Int_t)(EN*(F(-0.5-dsN,sN)-F(-1.5-dsN,sN))); |
309 | (*fN)[stripN] +=(Int_t)(EN*(F(0.5-dsN,sN)-F(-0.5-dsN,sN))); |
310 | (*fN)[stripN+1]+=(Int_t)(EN*(F(1.5-dsN,sN)-F(0.5-dsN,sN))); |
311 | (*fN)[stripN+2]+=(Int_t)(EN*(F(2.5-dsN,sN)-F(1.5-dsN,sN))); |
312 | |
313 | x += dx; |
314 | y += dy; |
315 | } |
316 | } |
317 | |
318 | |
319 | //____________________________________________________________________ |
320 | // |
321 | // Private Methods for Simulation |
322 | //____________________________________________________________________ |
323 | // |
324 | |
325 | |
326 | |
327 | void AliITSmoduleSSD::ApplyNoise() { |
328 | |
329 | for(Int_t i = 0; i<kNStrips; i++) { |
330 | (*fP)[i] += (Int_t)gRandom->Gaus(0,fSNRatioP); |
331 | (*fN)[i] += (Int_t)gRandom->Gaus(0,fSNRatioN); |
332 | } |
333 | } |
334 | |
335 | void AliITSmoduleSSD::ApplyCoupling() { |
336 | |
337 | for(Int_t i = 1; i<kNStrips-1; i++) { |
338 | (*fP)[i] += (Int_t)((*fP)[i-1]*fCouplingPL + (*fP)[i+1]*fCouplingPR); |
339 | (*fN)[i] += (Int_t)((*fN)[i-1]*fCouplingNL + (*fN)[i+1]*fCouplingNR); |
340 | } |
341 | } |
342 | |
343 | |
344 | //____________________________________________________________________ |
345 | // |
346 | // Private methods for geometry |
347 | //____________________________________________________________________ |
348 | // |
349 | |
350 | |
351 | |
352 | Int_t AliITSmoduleSSD::GetStripP(Float_t x, Float_t y) { |
353 | |
354 | Float_t X = x - y*kTan; |
355 | Int_t strip = (Int_t)(X/kPitch); |
356 | strip = (strip<0)? -1: strip; |
357 | strip = (strip>kNStrips)? -1: strip; |
358 | return strip; |
359 | } |
360 | |
361 | Int_t AliITSmoduleSSD::GetStripN(Float_t x, Float_t y) { |
362 | |
363 | Float_t X = x - kTan*(kY - y); |
364 | Int_t strip = (Int_t)(X/kPitch); |
365 | strip = (strip<0)? -1: strip; |
366 | strip = (strip>kNStrips)? -1: strip; |
367 | return strip; |
368 | |
369 | } |
370 | |
371 | Float_t AliITSmoduleSSD::Get2StripP(Float_t x, Float_t y) { |
372 | |
373 | Int_t n = GetStripP(x,y); |
374 | return (x - y*kTan) / kPitch - n; |
375 | } |
376 | |
377 | Float_t AliITSmoduleSSD::Get2StripN(Float_t x, Float_t y) { |
378 | |
379 | Int_t n = GetStripN(x,y); |
380 | return (x - kTan*(kY - y)) / kPitch - n; |
381 | } |
382 | |
383 | |
384 | Bool_t AliITSmoduleSSD::GetCrossing (Float_t &P, Float_t &N) { |
385 | |
386 | P *= kPitch; |
387 | N *= kPitch; |
388 | |
389 | P = (kY * kTan + N + P)/2.0; // x coordinate |
390 | N = kY - (P-N)/kTan; // y coordinate |
391 | |
392 | if (N<0 || N>kY) return kFALSE; |
393 | if (P<0 || P>kX) return kFALSE; |
394 | return kTRUE; |
395 | } |
396 | |
397 | //____________________________________________________________________ |
398 | |
399 | |
400 | |