]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDfeeParam.cxx
added method to check the whoole filter mask, not just one bit
[u/mrichter/AliRoot.git] / TRD / AliTRDfeeParam.cxx
CommitLineData
022e76c3 1
2/**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17/* $Id$ */
18
acc49af9 19////////////////////////////////////////////////////////////////////////////
20// //
21// TRD front end electronics parameters class //
22// Contains all FEE (MCM, TRAP, PASA) related //
23// parameters, constants, and mapping. //
24// //
25// New release on 2007/08/17: //
26// The default raw data version (now fRAWversion ) is set to 3 //
27// in the constructor because version 3 raw data read and write //
28// are fully debugged. //
29// //
30// Author: //
31// Ken Oyama (oyama@physi.uni-heidelberg.de) //
32// //
33////////////////////////////////////////////////////////////////////////////
022e76c3 34
7cb613c0 35//#include <TMath.h>
022e76c3 36
ecf39416 37#include "AliLog.h"
ba84a3e3 38
022e76c3 39#include "AliTRDfeeParam.h"
7cb613c0 40//#include "AliTRDgeometry.h"
022e76c3 41#include "AliTRDCommonParam.h"
42
43ClassImp(AliTRDfeeParam)
44
45AliTRDfeeParam *AliTRDfeeParam::fgInstance = 0;
46Bool_t AliTRDfeeParam::fgTerminated = kFALSE;
837e440c 47Bool_t AliTRDfeeParam::fgTracklet = kFALSE;
022e76c3 48
49//_____________________________________________________________________________
50AliTRDfeeParam* AliTRDfeeParam::Instance()
51{
acc49af9 52 //
022e76c3 53 // Instance constructor
acc49af9 54 //
55
022e76c3 56 if (fgTerminated != kFALSE) {
57 return 0;
58 }
59
60 if (fgInstance == 0) {
61 fgInstance = new AliTRDfeeParam();
62 }
63
64 return fgInstance;
acc49af9 65
022e76c3 66}
67
68//_____________________________________________________________________________
69void AliTRDfeeParam::Terminate()
70{
71 //
72 // Terminate the class and release memory
73 //
74
75 fgTerminated = kTRUE;
76
77 if (fgInstance != 0) {
78 delete fgInstance;
79 fgInstance = 0;
80 }
acc49af9 81
022e76c3 82}
83
84//_____________________________________________________________________________
85AliTRDfeeParam::AliTRDfeeParam()
86 :TObject()
022e76c3 87 ,fCP(0)
f2979d08 88 ,fTFnExp(1)
dfd03fc3 89 ,fTFr1(0)
90 ,fTFr2(0)
91 ,fTFc1(0)
92 ,fTFc2(0)
2ec0bacc 93 ,fEBsglIndThr(5)
94 ,fEBsumIndThr(5)
95 ,fEBindLUT(0xF0)
96 ,fEBignoreNeighbour(0)
ecf39416 97 ,fRAWversion(3)
98 ,fRAWstoreRaw(kTRUE)
022e76c3 99{
100 //
101 // Default constructor
102 //
103
104 // PASA V.4
f2979d08 105 if (fTFnExp == 1) {
dfd03fc3 106 fTFr1 = 1.1563;
107 fTFr2 = 0.1299;
108 fTFc1 = 0.0657;
109 fTFc2 = 0.0000;
022e76c3 110 }
f2979d08 111 else if (fTFnExp == 2) {
dfd03fc3 112 fTFr1 = 1.1563;
113 fTFr2 = 0.1299;
114 fTFc1 = 0.1141;
115 fTFc2 = 0.6241;
022e76c3 116 }
117
022e76c3 118 fCP = AliTRDCommonParam::Instance();
119
120}
121
ba84a3e3 122//_____________________________________________________________________________
123AliTRDfeeParam::AliTRDfeeParam(TRootIoCtor *)
124 :TObject()
125 ,fCP(0)
f2979d08 126 ,fTFnExp(1)
ba84a3e3 127 ,fTFr1(0)
128 ,fTFr2(0)
129 ,fTFc1(0)
130 ,fTFc2(0)
131 ,fEBsglIndThr(0)
132 ,fEBsumIndThr(0)
133 ,fEBindLUT(0)
134 ,fEBignoreNeighbour(0)
135 ,fRAWversion(0)
136 ,fRAWstoreRaw(0)
137{
138 //
139 // IO constructor
140 //
141
142}
143
022e76c3 144//_____________________________________________________________________________
145AliTRDfeeParam::AliTRDfeeParam(const AliTRDfeeParam &p)
146 :TObject(p)
022e76c3 147 ,fCP(p.fCP)
f2979d08 148 ,fTFnExp(p.fTFnExp)
dfd03fc3 149 ,fTFr1(p.fTFr1)
150 ,fTFr2(p.fTFr2)
151 ,fTFc1(p.fTFc1)
152 ,fTFc2(p.fTFc2)
2ec0bacc 153 ,fEBsglIndThr(p.fEBsglIndThr)
154 ,fEBsumIndThr(p.fEBsumIndThr)
155 ,fEBindLUT(p.fEBindLUT)
156 ,fEBignoreNeighbour (p.fEBignoreNeighbour)
ecf39416 157 ,fRAWversion(p.fRAWversion)
158 ,fRAWstoreRaw(p.fRAWstoreRaw)
022e76c3 159{
160 //
161 // AliTRDfeeParam copy constructor
162 //
acc49af9 163
022e76c3 164}
165
166//_____________________________________________________________________________
167AliTRDfeeParam::~AliTRDfeeParam()
168{
169 //
170 // AliTRDfeeParam destructor
171 //
acc49af9 172
022e76c3 173}
174
175//_____________________________________________________________________________
176AliTRDfeeParam &AliTRDfeeParam::operator=(const AliTRDfeeParam &p)
177{
178 //
179 // Assignment operator
180 //
181
182 if (this != &p) {
183 ((AliTRDfeeParam &) p).Copy(*this);
184 }
acc49af9 185
022e76c3 186 return *this;
acc49af9 187
022e76c3 188}
189
190//_____________________________________________________________________________
191void AliTRDfeeParam::Copy(TObject &p) const
192{
193 //
194 // Copy function
195 //
196
ecf39416 197 ((AliTRDfeeParam &) p).fCP = fCP;
f2979d08 198 ((AliTRDfeeParam &) p).fTFnExp = fTFnExp;
ecf39416 199 ((AliTRDfeeParam &) p).fTFr1 = fTFr1;
200 ((AliTRDfeeParam &) p).fTFr2 = fTFr2;
201 ((AliTRDfeeParam &) p).fTFc1 = fTFc1;
202 ((AliTRDfeeParam &) p).fTFc2 = fTFc2;
2ec0bacc 203 ((AliTRDfeeParam &) p).fEBsglIndThr = fEBsglIndThr;
204 ((AliTRDfeeParam &) p).fEBsumIndThr = fEBsumIndThr;
205 ((AliTRDfeeParam &) p).fEBindLUT = fEBindLUT;
206 ((AliTRDfeeParam &) p).fEBignoreNeighbour = fEBignoreNeighbour;
ecf39416 207 ((AliTRDfeeParam &) p).fRAWversion = fRAWversion;
208 ((AliTRDfeeParam &) p).fRAWstoreRaw = fRAWstoreRaw;
022e76c3 209
210 TObject::Copy(p);
acc49af9 211
022e76c3 212}
213
214//_____________________________________________________________________________
215Int_t AliTRDfeeParam::GetPadRowFromMCM(Int_t irob, Int_t imcm) const
216{
217 //
acc49af9 218 // Return on which pad row this mcm sits
022e76c3 219 //
220
221 return fgkNmcmRobInRow*(irob/2) + imcm/fgkNmcmRobInCol;
acc49af9 222
022e76c3 223}
224
225//_____________________________________________________________________________
226Int_t AliTRDfeeParam::GetPadColFromADC(Int_t irob, Int_t imcm, Int_t iadc) const
227{
228 //
ecf39416 229 // Return which pad is connected to this adc channel.
230 //
231 // Return virtual pad number even if ADC is outside chamber
232 // to keep compatibility of data processing at the edge MCM.
233 // User has to check that this is in the chamber if it is essential.
234 // Return -100 if iadc is invalid.
235 //
022e76c3 236 // Caution: ADC ordering in the online data is opposite to the pad column ordering.
237 // And it is not one-by-one correspondence. Precise drawing can be found in:
238 // http://wiki.kip.uni-heidelberg.de/ti/TRD/index.php/Image:ROB_MCM_numbering.pdf
acc49af9 239 //
022e76c3 240
a6d08b7f 241 if (iadc < 0 || iadc > fgkNadcMcm ) return -100;
022e76c3 242 Int_t mcmcol = imcm%fgkNmcmRobInCol + GetRobSide(irob)*fgkNmcmRobInCol; // MCM column number on ROC [0..7]
243 Int_t padcol = mcmcol*fgkNcolMcm + fgkNcolMcm + 1 - iadc;
38cb2aa7 244 if( padcol < 0 || padcol >= fgkNcol ) return -1; // this is commented because of reason above OK
860f3a82 245
246 return padcol;
247
248}
249
250//_____________________________________________________________________________
251Int_t AliTRDfeeParam::GetExtendedPadColFromADC(Int_t irob, Int_t imcm, Int_t iadc) const
252{
253 //
254 // Return which pad coresponds to the extended digit container pad numbering
255 // Extended digit container is designed to store all pad data including shared pad,
256 // so we have to introduce new virtual pad numbering scheme for this purpose.
257 //
258
259 if (iadc < 0 || iadc > fgkNadcMcm ) return -100;
260 Int_t mcmcol = imcm%fgkNmcmRobInCol + GetRobSide(irob)*fgkNmcmRobInCol; // MCM column number on ROC [0..7]
af0d9e9e 261 Int_t padcol = mcmcol*fgkNadcMcm + fgkNcolMcm + 2 - iadc;
acc49af9 262
022e76c3 263 return padcol;
acc49af9 264
022e76c3 265}
266
267//_____________________________________________________________________________
268Int_t AliTRDfeeParam::GetMCMfromPad(Int_t irow, Int_t icol) const
269{
270 //
271 // Return on which MCM this pad is directry connected.
272 // Return -1 for error.
273 //
274
275 if ( irow < 0 || icol < 0 || irow > fgkNrowC1 || icol > fgkNcol ) return -1;
276
277 return (icol%(fgkNcol/2))/fgkNcolMcm + fgkNmcmRobInCol*(irow%fgkNmcmRobInRow);
acc49af9 278
022e76c3 279}
280
281//_____________________________________________________________________________
282Int_t AliTRDfeeParam::GetROBfromPad(Int_t irow, Int_t icol) const
283{
284 //
acc49af9 285 // Return on which rob this pad is
022e76c3 286 //
287
288 return (irow/fgkNmcmRobInRow)*2 + GetColSide(icol);
acc49af9 289
022e76c3 290}
291
292//_____________________________________________________________________________
293Int_t AliTRDfeeParam::GetRobSide(Int_t irob) const
294{
295 //
acc49af9 296 // Return on which side this rob sits (A side = 0, B side = 1)
022e76c3 297 //
298
299 if ( irob < 0 || irob >= fgkNrobC1 ) return -1;
acc49af9 300
022e76c3 301 return irob%2;
acc49af9 302
022e76c3 303}
304
305//_____________________________________________________________________________
306Int_t AliTRDfeeParam::GetColSide(Int_t icol) const
307{
308 //
acc49af9 309 // Return on which side this column sits (A side = 0, B side = 1)
022e76c3 310 //
311
312 if ( icol < 0 || icol >= fgkNcol ) return -1;
acc49af9 313
022e76c3 314 return icol/(fgkNcol/2);
acc49af9 315
022e76c3 316}
317
acc49af9 318//_____________________________________________________________________________
319//void AliTRDfeeParam::GetFilterParam( Float_t &r1, Float_t &r2, Float_t &c1
320// , Float_t &c2, Float_t &ped ) const
022e76c3 321//{
322 //
323 // Return current filter parameter
324 //
325
326 // r1 = fR1;
327 //r2 = fR2;
328 //c1 = fC1;
329 //c2 = fC2;
330 //ped = fPedestal;
331//};
ecf39416 332
2ec0bacc 333//_____________________________________________________________________________
334void AliTRDfeeParam::SetEBsglIndThr(Int_t val)
335{
acc49af9 336 //
2ec0bacc 337 // Set Event Buffer Sngle Indicator Threshold (EBIS in TRAP conf).
338 // Timebin is indicated if ADC value >= val.
acc49af9 339 //
2ec0bacc 340
341 if( val >= 0 && val <= 1023 ) {
342 fEBsglIndThr = val;
343 } else {
344 AliError(Form("EBsglIndThr value %d is out of range, keep previously set value (%d).",
345 val, fEBsglIndThr));
346 }
acc49af9 347
2ec0bacc 348}
349
350//_____________________________________________________________________________
351void AliTRDfeeParam::SetEBsumIndThr(Int_t val)
352{
acc49af9 353 //
2ec0bacc 354 // Set Event Buffer Sum Indicator Threshold (EBIT in TRAP conf).
355 // Timebin is indicated if ADC sum value >= val.
acc49af9 356 //
2ec0bacc 357
358 if( val >= 0 && val <= 4095 ) {
359 fEBsumIndThr = val;
acc49af9 360 }
361 else {
2ec0bacc 362 AliError(Form("EBsumIndThr value %d is out of range, keep previously set value (%d).",
363 val, fEBsumIndThr));
364 }
2ec0bacc 365
acc49af9 366}
2ec0bacc 367
368//_____________________________________________________________________________
369void AliTRDfeeParam::SetEBindLUT(Int_t val)
370{
acc49af9 371 //
2ec0bacc 372 // Set Event Buffer Indicator Look-Up Table (EBIL in TRAP conf).
373 // 8 bits value forms lookup table for combination of three criterions.
acc49af9 374 //
2ec0bacc 375
376 if( val >= 0 && val <= 255 ) {
377 fEBindLUT = val;
acc49af9 378 }
379 else {
2ec0bacc 380 AliError(Form("EBindLUT value %d is out of range, keep previously set value (%d).",
381 val, fEBindLUT));
382 }
acc49af9 383
2ec0bacc 384}
385
386//_____________________________________________________________________________
387void AliTRDfeeParam::SetEBignoreNeighbour(Int_t val)
388{
acc49af9 389 //
2ec0bacc 390 // Set Event Buffer Indicator Neighbor Sensitivity. (EBIN in TRAP conf).
391 // If 0, take account of neigbor's values.
acc49af9 392 //
2ec0bacc 393
394 if( val >= 0 && val <= 1 ) {
395 fEBignoreNeighbour = val;
acc49af9 396 }
397 else {
2ec0bacc 398 AliError(Form("EBignoreNeighbour value %d is out of range, keep previously set value (%d).",
399 val, fEBignoreNeighbour));
400 }
401}
ecf39416 402
403//_____________________________________________________________________________
acc49af9 404void AliTRDfeeParam::SetRAWversion( Int_t rawver )
ecf39416 405{
acc49af9 406 //
ecf39416 407 // Set raw data version (major number only)
408 // Maximum available number is preset in fgkMaxRAWversion
acc49af9 409 //
ecf39416 410
411 if( rawver >= 0 && rawver <= fgkMaxRAWversion ) {
acc49af9 412 fRAWversion = rawver;
413 }
414 else {
ecf39416 415 AliError(Form("Raw version is out of range: %d",rawver));
416 }
ecf39416 417
ecf39416 418}
f2979d08 419
420//_____________________________________________________________________________
421void AliTRDfeeParam::SetXenon()
422{
423 //
424 // Sets the filter parameters for the Xenon gas mixture
425 //
426
427 fTFnExp = 1;
428 fTFr1 = 1.1563;
429 fTFr2 = 0.1299;
430 fTFc1 = 0.0657;
431 fTFc2 = 0.0000;
432
433}
434
435//_____________________________________________________________________________
436void AliTRDfeeParam::SetArgon()
437{
438 //
439 // Sets the filter parameters for the Argon gas mixture
440 //
441
442 fTFnExp = 2;
443 fTFr1 = 6.0;
444 fTFr2 = 0.62;
445 fTFc1 = 0.0087;
446 fTFc2 = 0.07;
447
448}
a6d08b7f 449
450