]>
Commit | Line | Data |
---|---|---|
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$ | |
37831078 | 18 | Revision 1.9 2000/06/30 12:07:50 kowal2 |
19 | Updated from the TPC-PreRelease branch | |
20 | ||
73042f01 | 21 | Revision 1.8.4.4 2000/06/26 07:39:42 kowal2 |
22 | Changes to obey the coding rules | |
23 | ||
24 | Revision 1.8.4.3 2000/06/25 08:38:41 kowal2 | |
25 | Splitted from AliTPCtracking | |
26 | ||
27 | Revision 1.8.4.2 2000/06/14 16:48:24 kowal2 | |
28 | Parameter setting improved. Removed compiler warnings | |
29 | ||
30 | Revision 1.8.4.1 2000/06/09 07:12:21 kowal2 | |
31 | ||
32 | Updated defaults | |
33 | ||
34 | Revision 1.8 2000/04/17 09:37:33 kowal2 | |
35 | removed obsolete AliTPCDigitsDisplay.C | |
36 | ||
cc80f89e | 37 | Revision 1.7.8.2 2000/04/10 08:44:51 kowal2 |
38 | ||
39 | New transformations added | |
40 | Different pad and pad-rows geometries for different sectors | |
41 | ||
42 | Revision 1.7.8.1 2000/04/10 07:56:53 kowal2 | |
43 | Not used anymore - removed | |
44 | ||
45 | Revision 1.7 1999/10/08 13:10:35 fca | |
46 | Values in SetDefault are in radiants | |
47 | ||
4d89658a | 48 | Revision 1.6 1999/10/08 06:27:59 fca |
49 | Defaults updated | |
50 | ||
683f9fec | 51 | Revision 1.5 1999/10/05 17:18:27 fca |
52 | Correct GetWire check on even/odd fnWires | |
53 | ||
ae4cbe70 | 54 | Revision 1.4 1999/09/29 09:24:34 fca |
55 | Introduction of the Copyright and cvs Log | |
56 | ||
4c039060 | 57 | */ |
58 | ||
8c555625 | 59 | /////////////////////////////////////////////////////////////////////// |
60 | // Manager and of geomety classes for set: TPC // | |
61 | // // | |
1283eee5 | 62 | // !sectors are numbered from 0 // |
63 | // !pad rows are numbered from 0 // | |
64 | // | |
65 | // 12.6. changed z relative | |
8c555625 | 66 | // Origin: Marian Ivanov, Uni. of Bratislava, ivanov@fmph.uniba.sk // |
67 | // // | |
68 | /////////////////////////////////////////////////////////////////////// | |
69 | ||
73042f01 | 70 | // |
8c555625 | 71 | |
72 | #include <iostream.h> | |
73 | #include <TMath.h> | |
1283eee5 | 74 | #include <TObject.h> |
cc80f89e | 75 | #include <TRandom.h> |
1283eee5 | 76 | #include <AliTPCParam.h> |
8c555625 | 77 | |
78 | ||
cc80f89e | 79 | |
8c555625 | 80 | |
73042f01 | 81 | ClassImp(AliTPCParam) |
8c555625 | 82 | |
83 | ||
84 | //___________________________________________ | |
85 | AliTPCParam::AliTPCParam() | |
86 | { | |
cc80f89e | 87 | // |
88 | //constructor sets the default parameters | |
89 | // | |
90 | ||
91 | fResponseBin = 0; | |
92 | fResponseWeight = 0; | |
93 | fRotAngle = 0; | |
73042f01 | 94 | SetTitle("75x40_100x60"); |
8c555625 | 95 | SetDefault(); |
96 | } | |
97 | ||
cc80f89e | 98 | AliTPCParam::~AliTPCParam() |
1283eee5 | 99 | { |
100 | // | |
cc80f89e | 101 | //destructor deletes some dynamicaly alocated variables |
102 | // | |
103 | ||
104 | if (fResponseBin!=0) delete [] fResponseBin; | |
105 | if (fResponseWeight!=0) delete [] fResponseWeight; | |
106 | if (fRotAngle !=0) delete [] fRotAngle; | |
107 | ||
1283eee5 | 108 | } |
109 | ||
110 | ||
cc80f89e | 111 | |
112 | ||
113 | Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const | |
114 | { | |
115 | // | |
116 | // calculates sector number (index[1], undefined on input) | |
117 | // xyz intact | |
118 | // | |
119 | ||
120 | Float_t angle,x1; | |
121 | Int_t sector; | |
122 | Float_t r = TMath::Sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]); | |
123 | if ((xyz[0]==0)&&(xyz[1]==0)) angle = 0.; | |
124 | else | |
8c555625 | 125 | { |
cc80f89e | 126 | angle =TMath::ASin(xyz[1]/r); |
127 | if (xyz[0]<0) angle=TMath::Pi()-angle; | |
128 | if ( (xyz[0]>0) && (xyz[1]<0) ) angle=2*TMath::Pi()+angle; | |
129 | } | |
3c0f9266 | 130 | |
cc80f89e | 131 | sector=Int_t((angle-fInnerAngleShift)/fInnerAngle); |
132 | ||
8c555625 | 133 | Float_t cos,sin; |
cc80f89e | 134 | AdjustCosSin(sector,cos,sin); |
135 | x1=xyz[0]*cos + xyz[1]*sin; | |
8c555625 | 136 | |
cc80f89e | 137 | if (x1>fOuterRadiusLow) |
138 | { | |
139 | sector=Int_t((angle-fOuterAngleShift)/fOuterAngle)+fNInnerSector; | |
140 | if (xyz[2]<0) sector+=(fNOuterSector>>1); | |
141 | } | |
8c555625 | 142 | else |
1283eee5 | 143 | if (xyz[2]<0) sector+=(fNInnerSector>>1); |
cc80f89e | 144 | index[1]=sector; // calculated sector number |
145 | index[0]=1; // indicates system after transformation | |
146 | return sector; | |
147 | } | |
1283eee5 | 148 | |
cc80f89e | 149 | Bool_t AliTPCParam::Transform(Float_t *xyz, Int_t *index, Int_t* oindex) |
150 | { | |
151 | //transformation from input coodination system to output coordination system | |
152 | switch (index[0]){ | |
153 | case 0: | |
154 | break; | |
155 | }; | |
156 | ||
157 | return kFALSE; | |
158 | ||
159 | } | |
160 | ||
161 | Int_t AliTPCParam::GetPadRow(Float_t *xyz, Int_t *index) const | |
162 | { | |
163 | // | |
164 | //calculates pad row of point xyz - transformation to system 8 (digit system) | |
165 | // | |
166 | Int_t system = index[0]; | |
167 | if (0==system) { | |
168 | Transform0to1(xyz,index); | |
169 | system=1; | |
170 | } | |
171 | if (1==system) { | |
172 | Transform1to2(xyz,index); | |
173 | system=2; | |
174 | } | |
175 | ||
176 | if (fGeometryType==0){ //straight row | |
177 | if (2==system) { | |
178 | Transform2to3(xyz,index); | |
179 | system=3; | |
180 | } | |
181 | if (3==system) { | |
182 | Transform3to4(xyz,index); | |
183 | system=4; | |
8c555625 | 184 | } |
cc80f89e | 185 | if (4==system) { |
186 | Transform4to8(xyz,index); | |
187 | system=8; | |
8c555625 | 188 | } |
cc80f89e | 189 | if (8==system) { |
190 | index[0]=8; | |
191 | return index[2]; | |
192 | } | |
8c555625 | 193 | } |
cc80f89e | 194 | |
195 | if (fGeometryType==1){ //cylindrical geometry | |
196 | if (2==system) { | |
197 | Transform2to5(xyz,index); | |
198 | system=5; | |
199 | } | |
200 | if (5==system) { | |
201 | Transform2to3(xyz,index); | |
202 | system=6; | |
203 | } | |
204 | if (6==system) { | |
205 | Transform3to4(xyz,index); | |
206 | system=7; | |
207 | } | |
208 | if (8==system) { | |
209 | index[0]=8; | |
210 | return index[2]; | |
211 | } | |
212 | } | |
213 | index[0]=system; | |
214 | return -1; //if no reasonable system | |
8c555625 | 215 | } |
216 | ||
cc80f89e | 217 | void AliTPCParam::SetSectorAngles(Float_t innerangle, Float_t innershift, Float_t outerangle, |
218 | Float_t outershift) | |
8c555625 | 219 | { |
cc80f89e | 220 | // |
221 | // set opening angles | |
73042f01 | 222 | const static Float_t kDegtoRad = 0.01745329251994; |
cc80f89e | 223 | fInnerAngle = innerangle; //opening angle of Inner sector |
224 | fInnerAngleShift = innershift; //shift of first inner sector center to the 0 | |
225 | fOuterAngle = outerangle; //opening angle of outer sector | |
226 | fOuterAngleShift = outershift; //shift of first sector center to the 0 | |
227 | fInnerAngle *=kDegtoRad; | |
228 | fInnerAngleShift *=kDegtoRad; | |
229 | fOuterAngle *=kDegtoRad; | |
230 | fOuterAngleShift *=kDegtoRad; | |
8c555625 | 231 | } |
cc80f89e | 232 | |
233 | Float_t AliTPCParam::GetInnerAngle() const | |
8c555625 | 234 | { |
cc80f89e | 235 | //return angle |
236 | return fInnerAngle; | |
237 | ||
8c555625 | 238 | } |
239 | ||
cc80f89e | 240 | Float_t AliTPCParam::GetInnerAngleShift() const |
241 | { | |
242 | //return angle | |
243 | return fInnerAngleShift; | |
8c555625 | 244 | } |
cc80f89e | 245 | Float_t AliTPCParam::GetOuterAngle() const |
246 | { | |
247 | //return angle | |
248 | return fOuterAngle; | |
249 | } | |
250 | Float_t AliTPCParam::GetOuterAngleShift() const | |
251 | { | |
252 | //return angle | |
253 | ||
254 | return fOuterAngleShift; | |
255 | } | |
256 | ||
8c555625 | 257 | |
258 | Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row) | |
259 | { | |
260 | // | |
261 | //give index of the given sector and pad row | |
262 | //no control if the sectors and rows are reasonable !!! | |
263 | // | |
cc80f89e | 264 | if (sector<fNInnerSector) return sector*fNRowLow+row; |
265 | return (fNInnerSector*fNRowLow)+(sector-fNInnerSector)*fNRowUp+row; | |
8c555625 | 266 | } |
267 | ||
cc80f89e | 268 | Bool_t AliTPCParam::AdjustSectorRow(Int_t index, Int_t & sector, Int_t &row) const |
8c555625 | 269 | { |
270 | // | |
271 | //return sector and padrow for given index | |
cc80f89e | 272 | //if index is reasonable returns true else return false |
8c555625 | 273 | // |
274 | if ( (index<0) || (index>fNtRows)) return kFALSE; | |
cc80f89e | 275 | Int_t outindex = fNInnerSector*fNRowLow; |
8c555625 | 276 | if (index<outindex) { |
cc80f89e | 277 | sector = index/fNRowLow; |
278 | row = index - sector*fNRowLow; | |
8c555625 | 279 | return kTRUE; |
280 | } | |
281 | index-= outindex; | |
cc80f89e | 282 | sector = index/fNRowUp; |
283 | row = index - sector*fNRowUp; | |
284 | sector += fNInnerSector; | |
8c555625 | 285 | return kTRUE; |
286 | } | |
287 | ||
cc80f89e | 288 | void AliTPCParam::SetDefault() |
8c555625 | 289 | { |
290 | // | |
cc80f89e | 291 | //set default parameters |
8c555625 | 292 | // |
37831078 | 293 | //const static Int_t kMaxRows=600; |
73042f01 | 294 | // |
295 | //sector default parameters | |
296 | // | |
37831078 | 297 | const static Float_t kInnerRadiusLow = 82.97; |
298 | const static Float_t kOuterRadiusLow = 133.58; | |
299 | const static Float_t kInnerRadiusUp = 133.17; | |
300 | const static Float_t kOuterRadiusUp = 247.78; | |
73042f01 | 301 | const static Float_t kInnerAngle = 20; // 20 degrees |
302 | const static Float_t kInnerAngleShift = 10; | |
303 | const static Float_t kOuterAngle = 20; // 20 degrees | |
304 | const static Float_t kOuterAngleShift = 10; | |
305 | const static Float_t kInnerFrameSpace = 1.5; | |
306 | const static Float_t kOuterFrameSpace = 1.5; | |
37831078 | 307 | const static Float_t kInnerWireMount = 1.370825926; |
308 | const static Float_t kOuterWireMount = 1.370825926; | |
73042f01 | 309 | const static Float_t kZLength =250.; |
310 | const static Int_t kGeometryType = 0; //straight rows | |
311 | // | |
312 | //wires default parameters | |
313 | // | |
314 | const static Int_t kNInnerWiresPerPad = 3; | |
315 | const static Int_t kInnerDummyWire = 2; | |
316 | const static Float_t kInnerOffWire = 0.5; | |
317 | const static Int_t kNOuterWiresPerPad = 4; | |
318 | const static Int_t kOuterDummyWire = 2; | |
319 | const static Float_t kOuterOffWire = 0.5; | |
320 | // | |
321 | //pad default parameters | |
322 | // | |
323 | const static Float_t kInnerPadPitchLength = 0.75; | |
324 | const static Float_t kInnerPadPitchWidth = 0.40; | |
325 | const static Float_t kInnerPadLength = 0.75; | |
326 | const static Float_t kInnerPadWidth = 0.40; | |
327 | const static Float_t kOuterPadPitchLength = 1.0; | |
328 | const static Float_t kOuterPadPitchWidth = 0.6; | |
329 | const static Float_t kOuterPadLength = 1.0; | |
330 | const static Float_t kOuterPadWidth = 0.6; | |
331 | const static Bool_t kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM | |
332 | const static Int_t kNCrossRows = 1; //number of rows to cross-talk | |
333 | ||
334 | // | |
335 | //gas default parameters | |
336 | // | |
337 | const static Float_t kDiffT = 2.2e-2; | |
338 | const static Float_t kDiffL = 2.2e-2; | |
339 | const static Float_t kGasGain = 2.e4; | |
340 | const static Float_t kDriftV =2.83e6; | |
341 | const static Float_t kOmegaTau = 0.145; | |
342 | const static Float_t kAttCoef = 250.; | |
343 | const static Float_t kOxyCont = 5.e-6; | |
344 | // | |
345 | //electronic default parameters | |
346 | // | |
347 | const static Float_t kPadCoupling=0.5; | |
348 | const static Int_t kZeroSup=2; | |
349 | const static Float_t kNoise = 1000; | |
350 | const static Float_t kChipGain = 12; | |
351 | const static Float_t kChipNorm = 0.4; | |
352 | const static Float_t kTSample = 2.e-7; | |
353 | const static Float_t kTFWHM = 1.9e-7; //fwhm of charge distribution | |
354 | const static Int_t kMaxTBin =445; | |
355 | const static Int_t kADCSat =1024; | |
356 | const static Float_t kADCDynRange =2000.; | |
357 | // | |
358 | // | |
359 | // | |
360 | const static Float_t kBField =0.2; | |
361 | const static Float_t kNPrimLoss =10.9; | |
362 | const static Float_t kNTotalLoss =39.9; | |
363 | // | |
364 | //response constants | |
365 | // | |
366 | const static Int_t kNResponseMax=100; | |
367 | const static Float_t kResponseThreshold=0.01; | |
8c555625 | 368 | fbStatus = kFALSE; |
8c555625 | 369 | // |
cc80f89e | 370 | //set sector parameters |
371 | // | |
372 | SetInnerRadiusLow(kInnerRadiusLow); | |
373 | SetOuterRadiusLow(kOuterRadiusLow); | |
374 | SetInnerRadiusUp(kInnerRadiusUp); | |
375 | SetOuterRadiusUp(kOuterRadiusUp); | |
376 | SetInnerFrameSpace(kInnerFrameSpace); | |
377 | SetOuterFrameSpace(kOuterFrameSpace); | |
378 | SetInnerWireMount(kInnerWireMount); | |
379 | SetOuterWireMount(kOuterWireMount); | |
380 | SetSectorAngles(kInnerAngle,kInnerAngleShift,kOuterAngle,kOuterAngleShift); | |
381 | SetZLength(kZLength); | |
382 | SetGeometryType(kGeometryType); | |
383 | // | |
384 | //set wire parameters | |
385 | // | |
386 | SetInnerNWires(kNInnerWiresPerPad); | |
387 | SetInnerDummyWire(kInnerDummyWire); | |
388 | SetInnerOffWire(kInnerOffWire); | |
389 | SetOuterNWires(kNOuterWiresPerPad); | |
390 | SetOuterDummyWire(kOuterDummyWire); | |
391 | SetOuterOffWire(kOuterOffWire); | |
392 | // | |
393 | //set pad parameter | |
1283eee5 | 394 | // |
cc80f89e | 395 | SetInnerPadPitchLength(kInnerPadPitchLength); |
396 | SetInnerPadPitchWidth(kInnerPadPitchWidth); | |
397 | SetInnerPadLength(kInnerPadLength); | |
398 | SetInnerPadWidth(kInnerPadWidth); | |
399 | SetOuterPadPitchLength(kOuterPadPitchLength); | |
400 | SetOuterPadPitchWidth(kOuterPadPitchWidth); | |
401 | SetOuterPadLength(kOuterPadLength); | |
402 | SetOuterPadWidth(kOuterPadWidth); | |
403 | SetMWPCReadout(kBMWPCReadout); | |
404 | SetNCrossRows(kNCrossRows); | |
1283eee5 | 405 | // |
cc80f89e | 406 | //set gas paremeters |
407 | // | |
408 | SetDiffT(kDiffT); | |
409 | SetDiffL(kDiffL); | |
410 | SetGasGain(kGasGain); | |
411 | SetDriftV(kDriftV); | |
412 | SetOmegaTau(kOmegaTau); | |
413 | SetAttCoef(kAttCoef); | |
414 | SetOxyCont(kOxyCont); | |
415 | // | |
416 | //set electronivc parameters | |
417 | // | |
418 | SetPadCoupling(kPadCoupling); | |
419 | SetZeroSup(kZeroSup); | |
420 | SetNoise(kNoise); | |
421 | SetChipGain(kChipGain); | |
422 | SetChipNorm(kChipNorm); | |
423 | SetTSample(kTSample); | |
424 | SetTFWHM(kTFWHM); | |
425 | SetMaxTBin(kMaxTBin); | |
426 | SetADCSat(kADCSat); | |
427 | SetADCDynRange(kADCDynRange); | |
428 | //set magnetic field | |
429 | SetBField(kBField); | |
430 | SetNPrimLoss(kNPrimLoss); | |
431 | SetNTotalLoss(kNTotalLoss); | |
432 | // | |
433 | //set response parameters | |
434 | // | |
435 | SetNResponseMax(kNResponseMax); | |
436 | SetResponseThreshold(kResponseThreshold); | |
8c555625 | 437 | } |
cc80f89e | 438 | |
8c555625 | 439 | |
440 | Bool_t AliTPCParam::Update() | |
441 | { | |
1283eee5 | 442 | // |
443 | // update some calculated parameter which must be updated after changing "base" | |
444 | // parameters | |
445 | // for example we can change size of pads and according this recalculate number | |
446 | // of pad rows, number of of pads in given row .... | |
447 | // | |
73042f01 | 448 | const Float_t kQel = 1.602e-19; // elementary charge |
8c555625 | 449 | fbStatus = kFALSE; |
1283eee5 | 450 | |
451 | Int_t i,j; //loop variables because HP | |
452 | //-----------------Sector section------------------------------------------ | |
453 | //calclulate number of sectors | |
cc80f89e | 454 | fNInnerSector = Int_t(4*TMath::Pi()/fInnerAngle+0.2); |
455 | // number of inner sectors - factor 0.2 to don't be influnced by inprecision | |
1283eee5 | 456 | if (fNInnerSector%2) return kFALSE; |
457 | fNOuterSector = Int_t(4*TMath::Pi()/fOuterAngle+0.2); | |
458 | if (fNOuterSector%2) return kFALSE; | |
459 | fNSector = fNInnerSector+fNOuterSector; | |
cc80f89e | 460 | |
461 | if (fRotAngle!=0) delete [] fRotAngle; | |
462 | fRotAngle = new Float_t[4*fNSector]; | |
1283eee5 | 463 | //calculate sin and cosine of rotations angle |
464 | //sectors angles numbering from 0 | |
cc80f89e | 465 | |
466 | j=fNInnerSector*2; | |
1283eee5 | 467 | Float_t angle = fInnerAngleShift; |
cc80f89e | 468 | for (i=0; j<fNInnerSector*4; i+=4, j+=4 , angle +=fInnerAngle){ |
1283eee5 | 469 | fRotAngle[i]=TMath::Cos(angle); |
470 | fRotAngle[i+1]=TMath::Sin(angle); | |
471 | fRotAngle[j] = fRotAngle[i]; | |
472 | fRotAngle[j+1] = fRotAngle[i+1]; | |
cc80f89e | 473 | fRotAngle[i+2] =angle; |
474 | fRotAngle[j+2] =angle; | |
1283eee5 | 475 | } |
476 | angle = fOuterAngleShift; | |
cc80f89e | 477 | j=(fNInnerSector+fNOuterSector/2)*4; |
478 | for (i=fNInnerSector*4; j<fNSector*4; i+=4,j+=4, angle +=fOuterAngle){ | |
1283eee5 | 479 | fRotAngle[i]=TMath::Cos(angle); |
480 | fRotAngle[i+1]=TMath::Sin(angle); | |
481 | fRotAngle[j] = fRotAngle[i]; | |
482 | fRotAngle[j+1] = fRotAngle[i+1]; | |
cc80f89e | 483 | fRotAngle[i+2] =angle; |
484 | fRotAngle[j+2] =angle; | |
1283eee5 | 485 | } |
cc80f89e | 486 | fZWidth = fTSample*fDriftV; |
73042f01 | 487 | fTotalNormFac = fPadCoupling*fChipNorm*kQel*1.e15*fChipGain*fADCSat/fADCDynRange; |
488 | fNoiseNormFac = kQel*1.e15*fChipGain*fADCSat/fADCDynRange; | |
cc80f89e | 489 | //wire section |
490 | Int_t nwire; | |
491 | Float_t wspace; //available space for wire | |
492 | Float_t dummyspace; //dummyspace for wire | |
493 | ||
494 | fInnerWWPitch = Float_t((Double_t)fInnerPadPitchLength/(Double_t)fNInnerWiresPerPad); | |
495 | wspace =fInnerRadiusUp-fInnerRadiusLow-2*fInnerOffWire; | |
496 | nwire = Int_t(wspace/fInnerWWPitch); | |
497 | wspace = Float_t(nwire)*fInnerWWPitch; | |
498 | dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.; | |
499 | fRInnerFirstWire = fInnerRadiusLow+dummyspace; | |
500 | fRInnerLastWire = fRInnerFirstWire+fInnerWWPitch*(Float_t)(nwire); | |
501 | ||
502 | fOuterWWPitch = Float_t((Double_t)fOuterPadPitchLength/(Double_t)fNOuterWiresPerPad); | |
503 | wspace =fOuterRadiusUp-fOuterRadiusLow-2*fOuterOffWire; | |
504 | nwire = Int_t(wspace/fOuterWWPitch); | |
505 | wspace = Float_t(nwire)*fOuterWWPitch; | |
506 | dummyspace =(fOuterRadiusUp-fOuterRadiusLow-wspace)/2.; | |
507 | fROuterFirstWire = fOuterRadiusLow+dummyspace; | |
508 | fROuterLastWire = fROuterFirstWire+fOuterWWPitch*(Float_t)(nwire); | |
1283eee5 | 509 | |
510 | ||
8c555625 | 511 | // |
cc80f89e | 512 | //response data |
513 | // | |
514 | if (fResponseBin==0) delete [] fResponseBin; | |
515 | if (fResponseWeight==0) delete [] fResponseBin; | |
516 | fResponseBin = new Int_t[3*fNResponseMax]; | |
517 | fResponseWeight = new Float_t[fNResponseMax]; | |
518 | ||
8c555625 | 519 | fbStatus = kTRUE; |
520 | return kTRUE; | |
521 | } | |
522 | ||
523 | ||
524 | ||
525 | Bool_t AliTPCParam::GetStatus() | |
526 | { | |
527 | //get information about object consistency | |
528 | return fbStatus; | |
529 | } | |
530 | ||
531 | Int_t AliTPCParam::GetNRowLow() const | |
532 | { | |
533 | //get the number of pad rows in low sector | |
cc80f89e | 534 | return fNRowLow; |
8c555625 | 535 | } |
536 | Int_t AliTPCParam::GetNRowUp() const | |
537 | { | |
538 | //get the number of pad rows in up sector | |
cc80f89e | 539 | return fNRowUp; |
8c555625 | 540 | } |
541 | Float_t AliTPCParam::GetPadRowRadiiLow(Int_t irow) const | |
542 | { | |
543 | //get the pad row (irow) radii | |
cc80f89e | 544 | if ( !(irow<0) && (irow<fNRowLow) ) |
8c555625 | 545 | return fPadRowLow[irow]; |
546 | else | |
547 | return 0; | |
548 | } | |
549 | ||
550 | Float_t AliTPCParam::GetPadRowRadiiUp(Int_t irow) const | |
551 | { | |
552 | //get the pad row (irow) radii | |
cc80f89e | 553 | if ( !(irow<0) && (irow<fNRowUp) ) |
8c555625 | 554 | return fPadRowUp[irow]; |
555 | else | |
556 | return 0; | |
557 | } | |
558 | ||
559 | Int_t AliTPCParam::GetNPadsLow(Int_t irow) const | |
560 | { | |
561 | //get the number of pads in row irow | |
cc80f89e | 562 | if ( !(irow<0) && (irow<fNRowLow) ) |
563 | return fNPadsLow[irow]; | |
8c555625 | 564 | else |
565 | return 0; | |
566 | } | |
567 | ||
568 | ||
569 | Int_t AliTPCParam::GetNPadsUp(Int_t irow) const | |
570 | { | |
571 | //get the number of pads in row irow | |
cc80f89e | 572 | if ( !(irow<0) && (irow<fNRowUp) ) |
573 | return fNPadsUp[irow]; | |
8c555625 | 574 | else |
575 | return 0; | |
576 | } | |
577 | ||
578 | ||
579 | void AliTPCParam::Streamer(TBuffer &R__b) | |
580 | { | |
581 | // Stream an object of class AliTPC. | |
582 | ||
583 | if (R__b.IsReading()) { | |
584 | Version_t R__v = R__b.ReadVersion(); if (R__v) { } | |
cc80f89e | 585 | AliDetectorParam::Streamer(R__b); |
8c555625 | 586 | if (R__v < 2) return; |
cc80f89e | 587 | //--------------------------------------------------------------------- |
588 | // ALICE TPC sector geometry | |
589 | //-------------------------------------------------------------------- | |
590 | R__b >> fInnerRadiusLow; // lower radius of inner sector-IP | |
591 | R__b >> fInnerRadiusUp; // upper radius of inner sector-IP | |
592 | R__b >> fOuterRadiusUp; // upper radius of outer sector-IP | |
593 | R__b >> fOuterRadiusLow; // lower radius of outer sector-IP | |
594 | R__b >> fInnerAngle; //opening angle of Inner sector | |
595 | R__b >> fInnerAngleShift; //shift of first inner sector center to the 0 | |
596 | R__b >> fOuterAngle; //opening angle of outer sector | |
597 | R__b >> fOuterAngleShift; //shift of first sector center to the 0 | |
598 | R__b >> fInnerFrameSpace; //spce for inner frame in the phi direction | |
599 | R__b >> fOuterFrameSpace; //spce for outer frame in the phi direction | |
600 | R__b >> fInnerWireMount; | |
601 | R__b >> fOuterWireMount; | |
602 | //R__b >> fNInnerSector; //!number of inner sectors - calculated | |
603 | //R__b >> fNOuterSector; //!number of outer sectors -calculated | |
604 | //R__b >> fNSector; //! total number of sectors -calculated | |
605 | R__b >> fZLength; //length of the drift region of the TPC | |
606 | //R__b.ReadFastArray(fRotAngle,fNSector*4); // sin and cos of rotation angles for | |
607 | R__b >> fGeometryType; //type of geometry -0 straight rows | |
608 | // diferent sectors | |
609 | //--------------------------------------------------------------------- | |
610 | // ALICE TPC wires geometry | |
611 | //-------------------------------------------------------------------- | |
612 | R__b >> fNInnerWiresPerPad;// Number of wires per pad | |
613 | //R__b >> fInnerWWPitch; // pitch between wires in inner sector - calculated | |
614 | R__b >> fInnerDummyWire; //number of wires without pad readout | |
615 | R__b >> fInnerOffWire;//oofset of first wire to the begining of the sector | |
616 | //R__b >> fRInnerFirstWire; //position of the first wire -calculated | |
617 | //R__b >> fRInnerLastWire; //position of the last wire -calculated | |
618 | R__b >> fNOuterWiresPerPad;// Number of wires per pad | |
619 | //R__b >> fOuterWWPitch; // pitch between wires in outer sector - calculated | |
620 | R__b >> fOuterDummyWire; //number of wires without pad readout | |
621 | R__b >> fOuterOffWire;//oofset of first wire to the begining of the sector | |
622 | //R__b >> fROuterFirstWire; //position of the first wire -calulated | |
623 | //R__b >> fROuterLastWire; //position of the last wire -calculated | |
624 | //--------------------------------------------------------------------- | |
625 | // ALICE TPC pad parameters | |
626 | //-------------------------------------------------------------------- | |
627 | R__b >> fInnerPadPitchLength; //Inner pad pitch length | |
628 | R__b >> fInnerPadPitchWidth; //Inner pad pitch width | |
629 | R__b >> fInnerPadLength; //Inner pad length | |
630 | R__b >> fInnerPadWidth; //Inner pad width | |
631 | R__b >> fOuterPadPitchLength; //Outer pad pitch length | |
632 | R__b >> fOuterPadPitchWidth; //Outer pad pitch width | |
633 | R__b >> fOuterPadLength; //Outer pad length | |
634 | R__b >> fOuterPadWidth; //Outer pad width | |
635 | R__b >> fBMWPCReadout; //indicate wire readout | |
636 | R__b >> fNCrossRows; //number of pad rows to crostalk | |
637 | R__b >> fNRowLow; // number of pad rows per low sector | |
638 | R__b >> fNRowUp; // number of pad rows per sector up | |
639 | //R__b >> fPadRowLow[600]; // Lower sector, pad row radii | |
640 | //R__b >> fPadRowUp[600]; // Upper sector, pad row radii | |
641 | //R__b >> fNPadsLow[600]; // Lower sector, number of pads per row | |
642 | //R__b >> fNPadsUp[600]; // Upper sector, number of pads per row | |
643 | //--------------------------------------------------------------------- | |
644 | // ALICE TPC Gas Parameters | |
645 | //-------------------------------------------------------------------- | |
646 | R__b >> fDiffT; //tangencial diffusion constant | |
647 | R__b >> fDiffL; //longutudinal diffusion constant | |
648 | R__b >> fGasGain; //gas gain constant | |
649 | R__b >> fDriftV; //drift velocity constant | |
650 | R__b >> fOmegaTau; //omega tau ExB coeficient | |
651 | R__b >> fAttCoef; //attachment coefitients | |
652 | R__b >> fOxyCont; //oxygen content | |
653 | //--------------------------------------------------------------------- | |
654 | // ALICE TPC Electronics Parameters | |
655 | //-------------------------------------------------------------------- | |
656 | R__b >> fPadCoupling; //coupling factor ration of anode signal | |
657 | //and total pads signal | |
658 | R__b >> fZeroSup; //zero suppresion constant | |
659 | R__b >> fNoise; //noise sigma constant | |
660 | R__b >> fChipGain; //preamp shaper constant | |
661 | R__b >> fChipNorm; //preamp shaper normalisation | |
662 | R__b >> fTSample; // sampling time | |
663 | R__b >> fZWidth; //derived value calculated using TSample and driftw | |
664 | R__b >> fTSigma; // width of the Preamp/Shaper function | |
665 | R__b >> fMaxTBin; //maximum time bin number | |
666 | R__b >> fADCSat; //saturation value of ADC (10 bits) | |
667 | R__b >> fADCDynRange; // input dynamic range (mV) | |
668 | //-------------------------------------------------------- | |
8c555625 | 669 | } else { |
670 | R__b.WriteVersion(AliTPCParam::IsA()); | |
cc80f89e | 671 | AliDetectorParam::Streamer(R__b); |
672 | //--------------------------------------------------------------------- | |
673 | // ALICE TPC sector geometry | |
674 | //-------------------------------------------------------------------- | |
675 | R__b << fInnerRadiusLow; // lower radius of inner sector-IP | |
676 | R__b << fInnerRadiusUp; // upper radius of inner sector-IP | |
677 | R__b << fOuterRadiusUp; // upper radius of outer sector-IP | |
678 | R__b << fOuterRadiusLow; // lower radius of outer sector-IP | |
679 | R__b << fInnerAngle; //opening angle of Inner sector | |
680 | R__b << fInnerAngleShift; //shift of first inner sector center to the 0 | |
681 | R__b << fOuterAngle; //opening angle of outer sector | |
682 | R__b << fOuterAngleShift; //shift of first sector center to the 0 | |
683 | R__b << fInnerFrameSpace; //spce for inner frame in the phi direction | |
684 | R__b << fOuterFrameSpace; //spce for outer frame in the phi direction | |
685 | R__b << fInnerWireMount; | |
686 | R__b << fOuterWireMount; | |
687 | //R__b << fNInnerSector; //!number of inner sectors - calculated | |
688 | //R__b << fNOuterSector; //!number of outer sectors -calculated | |
689 | //R__b << fNSector; //! total number of sectors -calculated | |
690 | R__b << fZLength; //length of the drift region of the TPC | |
691 | //R__b.WriteFastArray(fRotAngle,fNSector*4); // sin and cos of rotation angles for | |
692 | R__b << fGeometryType; //type of geometry -0 straight rows | |
8c555625 | 693 | |
cc80f89e | 694 | // diferent sectors |
695 | //--------------------------------------------------------------------- | |
696 | // ALICE TPC wires geometry | |
697 | //-------------------------------------------------------------------- | |
698 | R__b << fNInnerWiresPerPad;// Number of wires per pad | |
699 | // R__b << fInnerWWPitch; // pitch between wires in inner sector - calculated | |
700 | R__b << fInnerDummyWire; //number of wires without pad readout | |
701 | R__b << fInnerOffWire;//oofset of first wire to the begining of the sector | |
702 | //R__b << fRInnerFirstWire; //position of the first wire -calculated | |
703 | //R__b << fRInnerLastWire; //position of the last wire -calculated | |
704 | R__b << fNOuterWiresPerPad;// Number of wires per pad | |
705 | //R__b << fOuterWWPitch; // pitch between wires in outer sector - calculated | |
706 | R__b << fOuterDummyWire; //number of wires without pad readout | |
707 | R__b << fOuterOffWire;//oofset of first wire to the begining of the sector | |
708 | //R__b << fROuterFirstWire; //position of the first wire -calulated | |
709 | //R__b << fROuterLastWire; //position of the last wire -calculated | |
710 | //--------------------------------------------------------------------- | |
711 | // ALICE TPC pad parameters | |
712 | //-------------------------------------------------------------------- | |
713 | R__b << fInnerPadPitchLength; //Inner pad pitch length | |
714 | R__b << fInnerPadPitchWidth; //Inner pad pitch width | |
715 | R__b << fInnerPadLength; //Inner pad length | |
716 | R__b << fInnerPadWidth; //Inner pad width | |
717 | R__b << fOuterPadPitchLength; //Outer pad pitch length | |
718 | R__b << fOuterPadPitchWidth; //Outer pad pitch width | |
719 | R__b << fOuterPadLength; //Outer pad length | |
720 | R__b << fOuterPadWidth; //Outer pad width | |
721 | R__b << fBMWPCReadout; //indicate wire readout | |
722 | R__b << fNCrossRows; // number of rows to cross talk | |
723 | R__b << fNRowLow; // number of pad rows per low sector | |
724 | R__b << fNRowUp; // number of pad rows per sector up | |
725 | // R__b << fPadRowLow[600]; // Lower sector, pad row radii | |
726 | //R__b << fPadRowUp[600]; // Upper sector, pad row radii | |
727 | //R__b << fNPadsLow[600]; // Lower sector, number of pads per row | |
728 | //R__b << fNPadsUp[600]; // Upper sector, number of pads per row | |
729 | //--------------------------------------------------------------------- | |
730 | // ALICE TPC Gas Parameters | |
731 | //-------------------------------------------------------------------- | |
732 | R__b << fDiffT; //tangencial diffusion constant | |
733 | R__b << fDiffL; //longutudinal diffusion constant | |
734 | R__b << fGasGain; //gas gain constant | |
735 | R__b << fDriftV; //drift velocity constant | |
736 | R__b << fOmegaTau; //omega tau ExB coeficient | |
737 | R__b << fAttCoef; //attachment coefitients | |
738 | R__b << fOxyCont; //oxygen content | |
739 | //--------------------------------------------------------------------- | |
740 | // ALICE TPC Electronics Parameters | |
741 | //-------------------------------------------------------------------- | |
742 | R__b << fPadCoupling; //coupling factor ration of anode signal | |
743 | //and total pads signal | |
744 | R__b << fZeroSup; //zero suppresion constant | |
745 | R__b << fNoise; //noise sigma constant | |
746 | R__b << fChipGain; //preamp shaper constant | |
747 | R__b << fChipNorm; //preamp shaper normalisation | |
748 | R__b << fTSample; // sampling time | |
749 | R__b << fZWidth; //derived value calculated using TSample and driftw | |
750 | R__b << fTSigma; // width of the Preamp/Shaper function | |
751 | R__b << fMaxTBin; //maximum time bin number | |
752 | R__b << fADCSat; //saturation value of ADC (10 bits) | |
753 | R__b << fADCDynRange; // input dynamic range (mV) | |
8c555625 | 754 | } |
755 | } | |
756 |