7a0ff78e |
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 | /////////////////////////////////////////////////////////////////////////////// |
18 | // // |
19 | // Geometry class for a single ROC // |
20 | // // |
21 | // // |
22 | /////////////////////////////////////////////////////////////////////////////// |
23 | #include "AliTPCROC.h" |
24 | #include "TMath.h" |
25 | |
26 | ClassImp(AliTPCROC) |
27 | |
28 | |
29 | AliTPCROC* AliTPCROC::fgInstance = 0; |
30 | |
31 | |
32 | |
33 | |
34 | //_ singleton implementation __________________________________________________ |
35 | AliTPCROC* AliTPCROC::Instance() |
36 | { |
37 | // |
38 | // Singleton implementation |
39 | // Returns an instance of this class, it is created if neccessary |
40 | // |
41 | if (fgInstance == 0){ |
42 | fgInstance = new AliTPCROC(); |
43 | fgInstance->Init(); |
44 | } |
45 | return fgInstance; |
46 | } |
47 | |
48 | |
49 | |
50 | |
51 | void AliTPCROC::Init(){ |
52 | // |
53 | // initialize static variables |
54 | // |
55 | if (AliTPCROC::fNSectorsAll>0) return; |
56 | fNSectorsAll =72; |
57 | fNSectors[0] =36; |
58 | fNSectors[1] =36; |
59 | // |
60 | fNRows[0]= 63; |
61 | fNRows[1]= 96; |
62 | // |
63 | // number of pads in padrow |
c5bbaa2c |
64 | fNPads[0] = new UInt_t[fNRows[0]]; |
65 | fNPads[1] = new UInt_t[fNRows[1]]; |
7a0ff78e |
66 | // |
67 | // padrow index in array |
68 | // |
c5bbaa2c |
69 | fRowPosIndex[0] = new UInt_t[fNRows[0]]; |
70 | fRowPosIndex[1] = new UInt_t[fNRows[1]]; |
7a0ff78e |
71 | // |
72 | // inner sectors |
73 | // |
c5bbaa2c |
74 | UInt_t index =0; |
75 | for (UInt_t irow=0; irow<fNRows[0];irow++){ |
76 | UInt_t npads = (irow==0) ? 68 : 2 *Int_t(Double_t(irow)/3. +33.67); |
7a0ff78e |
77 | fNPads[0][irow] = npads; |
78 | fRowPosIndex[0][irow] = index; |
79 | index+=npads; |
80 | } |
81 | fNChannels[0] = index; |
82 | // |
83 | index =0; |
84 | Double_t k1 = 10.*TMath::Tan(10*TMath::DegToRad())/6.; |
85 | Double_t k2 = 15.*TMath::Tan(10*TMath::DegToRad())/6.; |
c5bbaa2c |
86 | for (UInt_t irow=0; irow<fNRows[1];irow++){ |
87 | UInt_t npads = (irow<64) ? |
7a0ff78e |
88 | 2*Int_t(k1*Double_t(irow)+37.75): |
89 | 2*Int_t(k2*Double_t(irow-64)+56.66); |
90 | fNPads[1][irow] = npads; |
91 | fRowPosIndex[1][irow] = index; |
92 | index+=npads; |
93 | } |
94 | fNChannels[1] = index; |
95 | SetGeometry(); |
96 | } |
97 | |
98 | |
99 | |
100 | |
101 | void AliTPCROC::SetGeometry() |
102 | { |
103 | // |
104 | //set ROC geometry parameters |
105 | // |
106 | const Float_t kInnerRadiusLow = 83.65; |
107 | const Float_t kInnerRadiusUp = 133.3; |
108 | const Float_t kOuterRadiusLow = 133.5; |
109 | const Float_t kOuterRadiusUp = 247.7; |
110 | const Float_t kInnerFrameSpace = 1.5; |
111 | const Float_t kOuterFrameSpace = 1.5; |
112 | const Float_t kInnerWireMount = 1.2; |
113 | const Float_t kOuterWireMount = 1.4; |
114 | const Float_t kZLength =250.; |
c5bbaa2c |
115 | const UInt_t kNRowLow = 63; |
116 | const UInt_t kNRowUp1 = 64; |
117 | const UInt_t kNRowUp2 = 32; |
118 | const UInt_t kNRowUp = 96; |
7a0ff78e |
119 | const Float_t kInnerAngle = 20; // 20 degrees |
120 | const Float_t kOuterAngle = 20; // 20 degrees |
121 | // |
122 | // pad parameters |
123 | // |
124 | const Float_t kInnerPadPitchLength = 0.75; |
125 | const Float_t kInnerPadPitchWidth = 0.40; |
126 | const Float_t kInnerPadLength = 0.75; |
127 | const Float_t kInnerPadWidth = 0.40; |
128 | const Float_t kOuter1PadPitchLength = 1.0; |
129 | const Float_t kOuterPadPitchWidth = 0.6; |
130 | const Float_t kOuter1PadLength = 1.0; |
131 | const Float_t kOuterPadWidth = 0.6; |
132 | const Float_t kOuter2PadPitchLength = 1.5; |
133 | const Float_t kOuter2PadLength = 1.5; |
134 | |
135 | // |
136 | //wires default parameters |
137 | // |
c5bbaa2c |
138 | // const UInt_t kNInnerWiresPerPad = 3; |
139 | // const UInt_t kInnerDummyWire = 2; |
7a0ff78e |
140 | // const Float_t kInnerWWPitch = 0.25; |
141 | // const Float_t kRInnerFirstWire = 84.475; |
142 | // const Float_t kRInnerLastWire = 132.475; |
143 | // const Float_t kInnerOffWire = 0.5; |
c5bbaa2c |
144 | // const UInt_t kNOuter1WiresPerPad = 4; |
145 | // const UInt_t kNOuter2WiresPerPad = 6; |
7a0ff78e |
146 | // const Float_t kOuterWWPitch = 0.25; |
147 | // const Float_t kROuterFirstWire = 134.225; |
148 | // const Float_t kROuterLastWire = 246.975; |
c5bbaa2c |
149 | // const UInt_t kOuterDummyWire = 2; |
7a0ff78e |
150 | // const Float_t kOuterOffWire = 0.5; |
151 | // |
152 | //set sector parameters |
153 | // |
154 | fInnerRadiusLow = kInnerRadiusLow; |
155 | fOuterRadiusLow = kOuterRadiusLow; |
156 | fInnerRadiusUp = kInnerRadiusUp; |
157 | fOuterRadiusUp = kOuterRadiusUp; |
158 | fInnerFrameSpace = kInnerFrameSpace; |
159 | fOuterFrameSpace = kOuterFrameSpace; |
160 | fInnerWireMount = kInnerWireMount; |
161 | fOuterWireMount = kOuterWireMount; |
162 | fZLength = kZLength; |
163 | fInnerAngle = TMath::DegToRad()*kInnerAngle; |
164 | fOuterAngle = TMath::DegToRad()*kOuterAngle; |
165 | |
166 | fNRowLow = kNRowLow; |
167 | fNRowUp1 = kNRowUp1; |
168 | fNRowUp2 = kNRowUp2; |
169 | fNRowUp = kNRowUp; |
170 | // |
171 | //set pad parameter |
172 | // |
173 | fInnerPadPitchLength = kInnerPadPitchLength; |
174 | fInnerPadPitchWidth = kInnerPadPitchWidth; |
175 | fInnerPadLength = kInnerPadLength; |
176 | fInnerPadWidth = kInnerPadWidth; |
177 | fOuter1PadPitchLength = kOuter1PadPitchLength; |
178 | fOuter2PadPitchLength = kOuter2PadPitchLength; |
179 | fOuterPadPitchWidth = kOuterPadPitchWidth; |
180 | fOuter1PadLength = kOuter1PadLength; |
181 | fOuter2PadLength = kOuter2PadLength; |
182 | fOuterPadWidth = kOuterPadWidth; |
183 | |
184 | // |
185 | //set wire parameters |
186 | // |
187 | // SetInnerNWires(kNInnerWiresPerPad); |
188 | // SetInnerDummyWire(kInnerDummyWire); |
189 | // SetInnerOffWire(kInnerOffWire); |
190 | // SetOuter1NWires(kNOuter1WiresPerPad); |
191 | // SetOuter2NWire(kNOuter2WiresPerPad); |
192 | // SetOuterDummyWire(kOuterDummyWire); |
193 | // SetOuterOffWire(kOuterOffWire); |
194 | // SetInnerWWPitch(kInnerWWPitch); |
195 | // SetRInnerFirstWire(kRInnerFirstWire); |
196 | // SetRInnerLastWire(kRInnerLastWire); |
197 | // SetOuterWWPitch(kOuterWWPitch); |
198 | // SetROuterFirstWire(kROuterFirstWire); |
199 | // SetROuterLastWire(kROuterLastWire); |
38bc857e |
200 | |
201 | UInt_t i=0; |
202 | Float_t firstrow = fInnerRadiusLow + 1.575; |
203 | for( i= 0;i<fNRowLow;i++) |
204 | { |
205 | Float_t x = firstrow + fInnerPadPitchLength*(Float_t)i; |
206 | fPadRowLow[i]=x; |
207 | fYInner[i+1] = x*TMath::Tan(fInnerAngle/2.)-fInnerWireMount; |
208 | fNPadsLow[i] = GetNPads(0,i) ; // ROC implement |
209 | } |
210 | // cross talk rows |
211 | fYInner[0]=(fPadRowLow[0]-fInnerPadPitchLength)*TMath::Tan(fInnerAngle/2.)-fInnerWireMount; |
212 | fYInner[fNRowLow+1]=(fPadRowLow[fNRowLow-1]+fInnerPadPitchLength)*TMath::Tan(fInnerAngle/2.)-fInnerWireMount; |
213 | firstrow = fOuterRadiusLow + 1.6; |
214 | for(i=0;i<fNRowUp;i++) |
215 | { |
216 | if(i<fNRowUp1){ |
217 | Float_t x = firstrow + fOuter1PadPitchLength*(Float_t)i; |
218 | fPadRowUp[i]=x; |
219 | fYOuter[i+1]= x*TMath::Tan(fOuterAngle/2.)-fOuterWireMount; |
220 | fNPadsUp[i] = GetNPads(36,i) ; // ROC implement |
221 | if(i==fNRowUp1-1) { |
222 | fLastWireUp1=fPadRowUp[i] +0.625; |
223 | firstrow = fPadRowUp[i] + 0.5*(fOuter1PadPitchLength+fOuter2PadPitchLength); |
224 | } |
225 | } |
226 | else |
227 | { |
228 | Float_t x = firstrow + fOuter2PadPitchLength*(Float_t)(i-64); |
229 | fPadRowUp[i]=x; |
230 | fNPadsUp[i] = GetNPads(36,i) ; // ROC implement |
231 | } |
232 | fYOuter[i+1] = fPadRowUp[i]*TMath::Tan(fOuterAngle/2.)-fOuterWireMount; |
233 | } |
234 | |
235 | |
236 | |
7a0ff78e |
237 | } |
238 | |
239 | |
240 | |
241 | |
242 | //_____________________________________________________________________________ |
179c6296 |
243 | AliTPCROC::AliTPCROC() |
244 | :TObject(), |
245 | fNSectorsAll(0), |
246 | fInnerRadiusLow(0.), |
247 | fInnerRadiusUp(0.), |
248 | fOuterRadiusUp(0.), |
249 | fOuterRadiusLow(0.), |
250 | fInnerFrameSpace(0.), |
251 | fOuterFrameSpace(0.), |
252 | fInnerWireMount(0.), |
253 | fOuterWireMount(0.), |
254 | fZLength(0.), |
255 | fInnerAngle(0.), |
256 | fOuterAngle(0.), |
257 | fNInnerWiresPerPad(0), |
258 | fInnerWWPitch(0.), |
259 | fInnerDummyWire(0), |
260 | fInnerOffWire(0.), |
261 | fRInnerFirstWire(0.), |
262 | fRInnerLastWire(0.), |
263 | fLastWireUp1(0.), |
264 | fNOuter1WiresPerPad(0), |
265 | fNOuter2WiresPerPad(0), |
266 | fOuterWWPitch(0.), |
267 | fOuterDummyWire(0), |
268 | fOuterOffWire(0), |
269 | fROuterFirstWire(0.), |
270 | fROuterLastWire(0), |
271 | fInnerPadPitchLength(0.), |
272 | fInnerPadPitchWidth(0.), |
273 | fInnerPadLength(0.), |
274 | fInnerPadWidth(0.), |
275 | fOuter1PadPitchLength(0.), |
276 | fOuter2PadPitchLength(0), |
277 | fOuterPadPitchWidth(0), |
278 | fOuter1PadLength(0.), |
279 | fOuter2PadLength(0), |
280 | fOuterPadWidth(0), |
281 | fNRowLow(0), |
282 | fNRowUp1(0), |
283 | fNRowUp2(0), |
284 | fNRowUp(0), |
285 | fNtRows(0) |
7a0ff78e |
286 | { |
287 | // |
288 | // Default constructor |
c5bbaa2c |
289 | for (UInt_t i=0;i<2;i++){ |
7a0ff78e |
290 | fNSectors[i] = 0; |
291 | fNRows[i] = 0; |
292 | fNChannels[i] = 0; |
293 | fNPads[i] = 0; |
294 | fRowPosIndex[i]= 0; |
295 | } |
296 | } |
297 | |
298 | |
299 | //_____________________________________________________________________________ |
179c6296 |
300 | AliTPCROC::AliTPCROC(const AliTPCROC &roc) |
301 | :TObject(roc), |
302 | fNSectorsAll(0), |
303 | fInnerRadiusLow(0.), |
304 | fInnerRadiusUp(0.), |
305 | fOuterRadiusUp(0.), |
306 | fOuterRadiusLow(0.), |
307 | fInnerFrameSpace(0.), |
308 | fOuterFrameSpace(0.), |
309 | fInnerWireMount(0.), |
310 | fOuterWireMount(0.), |
311 | fZLength(0.), |
312 | fInnerAngle(0.), |
313 | fOuterAngle(0.), |
314 | fNInnerWiresPerPad(0), |
315 | fInnerWWPitch(0.), |
316 | fInnerDummyWire(0), |
317 | fInnerOffWire(0.), |
318 | fRInnerFirstWire(0.), |
319 | fRInnerLastWire(0.), |
320 | fLastWireUp1(0.), |
321 | fNOuter1WiresPerPad(0), |
322 | fNOuter2WiresPerPad(0), |
323 | fOuterWWPitch(0.), |
324 | fOuterDummyWire(0), |
325 | fOuterOffWire(0), |
326 | fROuterFirstWire(0.), |
327 | fROuterLastWire(0), |
328 | fInnerPadPitchLength(0.), |
329 | fInnerPadPitchWidth(0.), |
330 | fInnerPadLength(0.), |
331 | fInnerPadWidth(0.), |
332 | fOuter1PadPitchLength(0.), |
333 | fOuter2PadPitchLength(0), |
334 | fOuterPadPitchWidth(0), |
335 | fOuter1PadLength(0.), |
336 | fOuter2PadLength(0), |
337 | fOuterPadWidth(0), |
338 | fNRowLow(0), |
339 | fNRowUp1(0), |
340 | fNRowUp2(0), |
341 | fNRowUp(0), |
342 | fNtRows(0) |
343 | |
7a0ff78e |
344 | { |
345 | // |
346 | // AliTPCROC copy constructor |
347 | // |
348 | fNSectorsAll = roc.fNSectorsAll; |
349 | fNSectors[0] = roc.fNSectors[0]; |
350 | fNSectors[1] = roc.fNSectors[1]; |
351 | fNRows[0] = roc.fNRows[0]; |
352 | fNRows[1] = roc.fNRows[1]; |
353 | fNChannels[0]= roc.fNChannels[0]; |
354 | fNChannels[1]= roc.fNChannels[1]; |
355 | // |
356 | // number of pads in padrow |
c5bbaa2c |
357 | fNPads[0] = new UInt_t[fNRows[0]]; |
358 | fNPads[1] = new UInt_t[fNRows[1]]; |
7a0ff78e |
359 | // |
360 | // padrow index in array |
361 | // |
c5bbaa2c |
362 | fRowPosIndex[0] = new UInt_t[fNRows[0]]; |
363 | fRowPosIndex[1] = new UInt_t[fNRows[1]]; |
7a0ff78e |
364 | // |
c5bbaa2c |
365 | for (UInt_t irow =0; irow<fNRows[0];irow++){ |
7a0ff78e |
366 | fNPads[0][irow] = roc.fNPads[0][irow]; |
367 | fRowPosIndex[0][irow] = roc.fRowPosIndex[0][irow]; |
368 | } |
c5bbaa2c |
369 | for (UInt_t irow =0; irow<fNRows[1];irow++){ |
7a0ff78e |
370 | fNPads[1][irow] = roc.fNPads[1][irow]; |
371 | fRowPosIndex[1][irow] = roc.fRowPosIndex[1][irow]; |
372 | } |
373 | } |
179c6296 |
374 | //____________________________________________________________________________ |
375 | AliTPCROC & AliTPCROC::operator =(const AliTPCROC & roc) |
376 | { |
377 | // |
378 | // assignment operator - dummy |
379 | // |
380 | fZLength = roc.fZLength; |
381 | return (*this); |
382 | } |
7a0ff78e |
383 | //_____________________________________________________________________________ |
384 | AliTPCROC::~AliTPCROC() |
385 | { |
386 | // |
387 | // AliTPCROC destructor |
388 | // |
389 | delete [] fNPads[0]; |
390 | delete [] fNPads[1]; |
391 | delete [] fRowPosIndex[0]; |
392 | delete [] fRowPosIndex[1]; |
a411fffe |
393 | fgInstance = 0x0; |
7a0ff78e |
394 | |
395 | } |
396 | |
38bc857e |
397 | |
398 | |
399 | |
400 | void AliTPCROC::GetPositionLocal(UInt_t sector, UInt_t row, UInt_t pad, Float_t *pos){ |
401 | // |
402 | // get position of center of pad - ideal frame used |
403 | // |
404 | pos[2]=fZLength; |
405 | if (sector<36){ |
406 | pos[0] = fPadRowLow[row]; |
407 | pos[1] = fInnerPadPitchWidth*(Int_t(pad)-Int_t(fNPads[0][row])/2); |
408 | }else{ |
409 | pos[0] = fPadRowUp[row]; |
28be5586 |
410 | pos[1] = fOuterPadPitchWidth*(Int_t(pad)-Int_t(fNPads[1][row])/2); |
38bc857e |
411 | } |
412 | if ((sector%36)>=18){ |
413 | pos[2] *= -1.; |
414 | pos[1] *= -1.; |
415 | } |
416 | } |
417 | |
418 | |
419 | void AliTPCROC::GetPositionGlobal(UInt_t sector, UInt_t row, UInt_t pad, Float_t *pos){ |
420 | // |
421 | // get position of center of pad - ideal frame used |
422 | // |
423 | GetPositionLocal(sector,row,pad,pos); |
424 | Double_t alpha = TMath::DegToRad()*(10.+20.*(sector%18)); |
425 | Float_t gx = pos[0]*TMath::Cos(alpha)-pos[1]*TMath::Sin(alpha); |
426 | Float_t gy = pos[1]*TMath::Cos(alpha)+pos[0]*TMath::Sin(alpha); |
427 | pos[0] = gx; |
428 | pos[1] = gy; |
429 | } |