]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/AliFMDParameters.cxx
The line
[u/mrichter/AliRoot.git] / FMD / AliFMDParameters.cxx
CommitLineData
1a1fdef7 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 **************************************************************************/
1a1fdef7 15/* $Id$ */
c2fc1258 16/** @file AliFMDParameters.cxx
17 @author Christian Holm Christensen <cholm@nbi.dk>
18 @date Mon Mar 27 12:44:26 2006
19 @brief Manager of FMD parameters
20*/
1a1fdef7 21//____________________________________________________________________
22//
23// Forward Multiplicity Detector based on Silicon wafers.
24//
25// This class is a singleton that handles various parameters of
26// the FMD detectors.
6169f936 27// The manager normally serves the parameters from the Conditions
28// Database (CDB). These are retrivied by the member function
29// `Init'. Optionally, the class can serve hard-coded constants, if
30// no CDB is available.
1a1fdef7 31//
f95a63c4 32#include "AliFMDDebug.h" // ALILOG_H
8f6ee336 33#include "AliFMDParameters.h" // ALIFMDPARAMETERS_H
34#include "AliFMDGeometry.h" // ALIFMDGEOMETRY_H
35#include "AliFMDRing.h" // ALIFMDRING_H
36#include "AliFMDCalibGain.h" // ALIFMDCALIBGAIN_H
37#include "AliFMDCalibPedestal.h" // ALIFMDCALIBPEDESTAL_H
c2fc1258 38#include "AliFMDCalibSampleRate.h" // ALIFMDCALIBSAMPLERATE_H
39#include "AliFMDCalibStripRange.h" // ALIFMDCALIBSTRIPRANGE_H
57c3c593 40#include "AliFMDAltroMapping.h" // ALIFMDALTROMAPPING_H
41#include <AliCDBManager.h> // ALICDBMANAGER_H
42#include <AliCDBEntry.h> // ALICDBMANAGER_H
dc02d468 43#include <AliFMDPreprocessor.h>
44#include <AliLog.h>
1a1fdef7 45#include <Riostream.h>
8ec606c2 46#include <sstream>
dc02d468 47#include <TSystem.h>
6169f936 48#include <TArrayF.h>
49#include <TH2D.h>
1a1fdef7 50
51//====================================================================
52ClassImp(AliFMDParameters)
53#if 0
54 ; // This is here to keep Emacs for indenting the next line
55#endif
56
57//____________________________________________________________________
58AliFMDParameters* AliFMDParameters::fgInstance = 0;
59
57c3c593 60//____________________________________________________________________
77186f44 61const char* AliFMDParameters::fgkPulseGain = "FMD/Calib/PulseGain";
62const char* AliFMDParameters::fgkPedestal = "FMD/Calib/Pedestal";
63const char* AliFMDParameters::fgkDead = "FMD/Calib/Dead";
64const char* AliFMDParameters::fgkSampleRate = "FMD/Calib/SampleRate";
65const char* AliFMDParameters::fgkAltroMap = "FMD/Calib/AltroMap";
66const char* AliFMDParameters::fgkZeroSuppression = "FMD/Calib/ZeroSuppression";
67const char* AliFMDParameters::fgkStripRange = "FMD/Calib/StripRange";
68const char* AliFMDParameters::fkPedestalShuttleID = "pedestals";
69const char* AliFMDParameters::fkGainShuttleID = "gains";
70const char* AliFMDParameters::fkConditionsShuttleID = "conditions";
57c3c593 71
1a1fdef7 72//____________________________________________________________________
73AliFMDParameters*
74AliFMDParameters::Instance()
75{
76 // Get static instance
77 if (!fgInstance) fgInstance = new AliFMDParameters;
78 return fgInstance;
79}
80
81//____________________________________________________________________
82AliFMDParameters::AliFMDParameters()
57c3c593 83 : fIsInit(kFALSE),
02a27b50 84 fkSiDeDxMip(1.664),
b5ee4425 85 fVA1MipRange(0),
86 fAltroChannelSize(0),
87 fChannelsPerAltro(0),
88 fPedestalFactor(0),
89 fFixedPedestal(0),
90 fFixedPedestalWidth(0),
91 fFixedZeroSuppression(0),
92 fFixedSampleRate(0),
93 fFixedThreshold(0),
94 fFixedMinStrip(0),
95 fFixedMaxStrip(0),
8f6ee336 96 fFixedPulseGain(0),
97 fEdepMip(0),
625d7886 98 fHasCompleteHeader(kTRUE),
8f6ee336 99 fZeroSuppression(0),
100 fSampleRate(0),
101 fPedestal(0),
102 fPulseGain(0),
57c3c593 103 fDeadMap(0),
c2fc1258 104 fAltroMap(0),
105 fStripRange(0)
1a1fdef7 106{
107 // Default constructor
108 SetVA1MipRange();
109 SetAltroChannelSize();
110 SetChannelsPerAltro();
111 SetZeroSuppression();
112 SetSampleRate();
113 SetPedestal();
114 SetPedestalWidth();
115 SetPedestalFactor();
8f6ee336 116 SetThreshold();
c2fc1258 117 SetStripRange();
06ca6759 118 fAltroMap = new AliFMDAltroMapping;
1a1fdef7 119}
120
57c3c593 121//__________________________________________________________________
122void
f6449cc0 123AliFMDParameters::Init(Bool_t forceReInit, UInt_t what)
57c3c593 124{
125 // Initialize the parameters manager. We need to get stuff from the
126 // CDB here.
a9579262 127 if (forceReInit) fIsInit = kFALSE;
57c3c593 128 if (fIsInit) return;
f6449cc0 129 if (what & kPulseGain) InitPulseGain();
130 if (what & kPedestal) InitPedestal();
131 if (what & kDeadMap) InitDeadMap();
132 if (what & kSampleRate) InitSampleRate();
133 if (what & kZeroSuppression) InitZeroSuppression();
134 if (what & kAltroMap) InitAltroMap();
6bf06d81 135 if (what & kStripRange) InitStripRange();
1e8f773e 136 fIsInit = kTRUE;
dc02d468 137}
138//__________________________________________________________________
139void
140AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what)
141{
142 // Initialize the parameters manager. We need to get stuff from the
143 // CDB here.
144 if (forceReInit) fIsInit = kFALSE;
145 if (fIsInit) return;
146 if (what & kPulseGain) InitPulseGain(pp);
147 if (what & kPedestal) InitPedestal(pp);
148 if (what & kDeadMap) InitDeadMap(pp);
149 if (what & kSampleRate) InitSampleRate(pp);
150 if (what & kZeroSuppression) InitZeroSuppression(pp);
151 if (what & kAltroMap) InitAltroMap(pp);
6bf06d81 152 if (what & kStripRange) InitStripRange(pp);
dc02d468 153 fIsInit = kTRUE;
1e8f773e 154}
c2fc1258 155
6169f936 156//__________________________________________________________________
157#define DET2IDX(det,ring,sec,str) \
a9579262 158 (det * 1000 + (ring == 'I' ? 0 : 512) + str)
6169f936 159
160//__________________________________________________________________
161void
162AliFMDParameters::Draw(Option_t* option)
163{
164 TString opt(option);
165 enum {
458e52e8 166 kLocalPulseGain, // Path to PulseGain calib object
167 kLocalThreshold, // Path to PulseGain calib object
168 kLocalPedestal, // Path to Pedestal calib object
169 kLocalPedestalWidth, // Path to Pedestal calib object
170 kLocalDead, // Path to Dead calib object
171 kLocalSampleRate, // Path to SampleRate calib object
172 kLocalAltroMap, // Path to AltroMap calib object
173 kLocalZeroSuppression, // Path to ZeroSuppression cal object
174 kLocalMinStripRange, // Path to strip range cal object
175 kLocalMaxStripRange // Path to strip range cal object
6169f936 176 } what;
6169f936 177
178 if (opt.Contains("dead", TString::kIgnoreCase))
458e52e8 179 what = kLocalDead;
6169f936 180 else if (opt.Contains("threshold",TString::kIgnoreCase))
458e52e8 181 what = kLocalThreshold;
6169f936 182 else if (opt.Contains("gain",TString::kIgnoreCase))
458e52e8 183 what = kLocalPulseGain;
6169f936 184 else if (opt.Contains("pedestal",TString::kIgnoreCase))
458e52e8 185 what = kLocalPedestal;
6169f936 186 else if (opt.Contains("noise",TString::kIgnoreCase))
458e52e8 187 what = kLocalPedestalWidth;
6169f936 188 else if (opt.Contains("zero",TString::kIgnoreCase))
458e52e8 189 what = kLocalZeroSuppression;
6169f936 190 else if (opt.Contains("rate",TString::kIgnoreCase))
458e52e8 191 what = kLocalSampleRate;
6169f936 192 else if (opt.Contains("min",TString::kIgnoreCase))
458e52e8 193 what = kLocalMinStripRange;
6169f936 194 else if (opt.Contains("max",TString::kIgnoreCase))
458e52e8 195 what = kLocalMaxStripRange;
6169f936 196 else if (opt.Contains("map",TString::kIgnoreCase))
458e52e8 197 what = kLocalAltroMap;
6169f936 198 else {
199 Warning("Draw", "unknown parameter: %s\n\tShould be one of\n\t"
200 "dead, threshold, gain, pedestal, noise, zero, rate, "
201 "min, max, map",
202 option);
203 return;
204 }
205
206 TArrayD xbins(3 * 512 + 2 * 256 + 5);
207 Int_t i = 1;
208 Bool_t skip = kTRUE;
209 for (UShort_t det = 1; det <= 3; det++) {
210 UShort_t nRings = (det == 1 ? 1 : 2);
211 for (UShort_t iring = 0; iring < nRings; iring++) {
212 UShort_t nStrip = (iring == 0 ? 512 : 256);
213 Char_t ring = (iring == 0 ? 'I' : 'O');
214 for (UShort_t str = 0; str < nStrip; str++) {
a9579262 215 // UShort_t nSec = (iring == 0 ? 20 : 40);
216 // Char_t ring = (iring == 0 ? 'I' : 'O');
217 // for (UShort_t sec = 0; sec < nSec; sec++) {
6169f936 218 Int_t idx = DET2IDX(det, ring, 0, str);
a9579262 219 // Int_t idx = DET2IDX(det, ring, sec, 0);
6169f936 220 if (skip) {
221 xbins[i-1] = idx - .5;
222 skip = kFALSE;
223 }
224 xbins[i] = idx + .5;
225 i++;
226 }
227 skip = kTRUE;
228 i++;
229 }
230 }
231 TArrayD ybins(41);
458e52e8 232 for (/*Int_t*/ i = 0; i < ybins.fN; i++) ybins[i] = Float_t(i - .5);
6169f936 233 TH2D* hist = new TH2D("calib", Form("Calibration %s", option),
234 xbins.fN-1, xbins.fArray,
235 ybins.fN-1, ybins.fArray);
a9579262 236 hist->GetXaxis()->SetTitle("1000 #times detector + 512 #times ring + strip");
237 hist->GetYaxis()->SetTitle("sector");
238
6169f936 239 // hist->Draw("Lego");
240 // return;
241
242 for (UShort_t det = 1; det <= 3; det++) {
243 UShort_t nRings = (det == 1 ? 1 : 2);
244 for (UShort_t iring = 0; iring < nRings; iring++) {
245 UShort_t nSector = (iring == 0 ? 20 : 40);
246 UShort_t nStrip = (iring == 0 ? 512 : 256);
247 Char_t ring = (iring == 0 ? 'I' : 'O');
248 for (UShort_t sec = 0; sec < nSector; sec++) {
249 for (UShort_t str = 0; str < nStrip; str++) {
250 Int_t idx = DET2IDX(det, ring, sec, str);
251 UInt_t ddl, addr;
252 Double_t val = 0;
253 switch (what) {
458e52e8 254 case kLocalPulseGain: // Path to PulseGain calib object
6169f936 255 val = GetPulseGain(det,ring,sec,str); break;
458e52e8 256 case kLocalThreshold: // Path to PulseGain calib object
6169f936 257 val = GetThreshold(); break;
458e52e8 258 case kLocalPedestal: // Path to Pedestal calib object
6169f936 259 val = GetPedestal(det,ring,sec,str); break;
458e52e8 260 case kLocalPedestalWidth: // Path to Pedestal calib object
6169f936 261 val = GetPedestalWidth(det,ring,sec,str); break;
458e52e8 262 case kLocalDead: // Path to Dead calib object
6169f936 263 val = IsDead(det,ring,sec,str); break;
458e52e8 264 case kLocalSampleRate: // Path to SampleRate calib object
6169f936 265 val = GetSampleRate(det,ring,sec,str); break;
458e52e8 266 case kLocalAltroMap: // Path to AltroMap calib object
6169f936 267 Detector2Hardware(det,ring,sec,str, ddl, addr);
268 val = addr; break;
458e52e8 269 case kLocalZeroSuppression: // Path to ZeroSuppression cal object
6169f936 270 val = GetZeroSuppression(det,ring,sec,str); break;
458e52e8 271 case kLocalMinStripRange: // Path to strip range cal object
6169f936 272 val = GetMinStrip(det,ring,sec,str); break;
458e52e8 273 case kLocalMaxStripRange: // Path to strip range cal object
6169f936 274 val = GetMaxStrip(det,ring,sec,str); break;
275 }
276 hist->Fill(idx,sec,val);
a9579262 277 // hist->Fill(idx,str,val);
6169f936 278 }
279 }
280 }
281 }
282 hist->Draw("lego");
283}
284
c2fc1258 285//__________________________________________________________________
286void
287AliFMDParameters::Print(Option_t* option) const
288{
02a27b50 289 // Print information.
290 // If option contains an 'A' then everything is printed.
a9579262 291 // If the option contains the string "FMD" the function will search
292 // for detector, ring, sector, and strip numbers to print, in the
293 // format
294 //
295 // FMD<detector><ring>[<sector>,<string>]
296 //
297 // The wild card '*' means all of <detector>, <ring>, <sector>, or
298 // <strip>.
c2fc1258 299 TString opt(option);
a9579262 300 Bool_t showStrips = opt.Contains("a", TString::kIgnoreCase);
301 UShort_t ds[] = { 1, 2, 3, 0 };
302 Char_t rs[] = { 'I', 'O', '\0' };
303 UShort_t minStrip = 0;
304 UShort_t maxStrip = 512;
305 UShort_t minSector = 0;
306 UShort_t maxSector = 40;
307
308
8ec606c2 309 if (opt.Contains("fmd",TString::kIgnoreCase)) {
a9579262 310 showStrips = kTRUE;
311 size_t i = opt.Index("fmd",TString::kIgnoreCase);
312 size_t j = opt.Index("]",TString::kIgnoreCase);
313 enum {
97e94238 314 kReadDet,
315 kReadRing,
316 kReadLbrack,
317 kReadSector,
318 kReadComma,
319 kReadStrip,
320 kReadRbrack,
321 kEnd
322 } state = kReadDet;
8ec606c2 323 std::stringstream s(opt(i+4, j-i-3).Data());
97e94238 324 while (state != kEnd) {
a9579262 325 Char_t tmp = s.peek();
326 if (tmp == ' ' || tmp == '\t') {
327 s.get();
328 continue;
329 }
330 switch (state) {
97e94238 331 case kReadDet: { // First, try to kRead the detector
a9579262 332 if (tmp == '*') s.get();
333 else {
334 UShort_t det;
335 s >> det;
336 if (!s.bad()) {
337 ds[0] = det;
338 ds[1] = 0;
339 }
340 }
97e94238 341 state = (s.bad() ? kEnd : kReadRing);
a9579262 342 } break;
97e94238 343 case kReadRing: { // Then try to read the ring;
a9579262 344 Char_t ring;
345 s >> ring;
346 if (ring != '*' && !s.bad()) {
347 rs[0] = ring;
348 rs[1] = '\0';
349 }
97e94238 350 state = (s.bad() ? kEnd : kReadLbrack);
a9579262 351 } break;
97e94238 352 case kReadLbrack: { // Try to read a left bracket
a9579262 353 Char_t lbrack;
354 s >> lbrack;
97e94238 355 state = (s.bad() ? kEnd : kReadSector);
a9579262 356 } break;
97e94238 357 case kReadSector: { // Try to read a sector
a9579262 358 if (tmp == '*') s.get();
359 else {
360 UShort_t sec;
361 s >> sec;
362 if (!s.bad()) {
363 minSector = sec;
364 maxSector = sec + 1;
365 }
366 }
97e94238 367 state = (s.bad() ? kEnd : kReadComma);
a9579262 368 } break;
97e94238 369 case kReadComma: { // Try to read a left bracket
a9579262 370 Char_t comma;
371 s >> comma;
97e94238 372 state = (s.bad() ? kEnd : kReadStrip);
a9579262 373 } break;
97e94238 374 case kReadStrip: { // Try to read a strip
a9579262 375 if (tmp == '*') s.get();
376 else {
377 UShort_t str;
378 s >> str;
379 if (!s.bad()) {
380 minStrip = str;
381 maxStrip = str + 1;
382 }
383 }
97e94238 384 state = (s.bad() ? kEnd : kReadRbrack);
a9579262 385 } break;
97e94238 386 case kReadRbrack: { // Try to read a left bracket
a9579262 387 Char_t rbrack;
388 s >> rbrack;
97e94238 389 state = kEnd;
a9579262 390 } break;
97e94238 391 case kEnd:
a9579262 392 break;
393 }
394 }
8ec606c2 395 }
a9579262 396 UShort_t* dp = ds;
397 UShort_t det;
398 while ((det = *(dp++))) {
399
400 Char_t* rp = rs;
401 Char_t ring;
402 while ((ring = *(rp++))) {
403 if (det == 1 && ring == 'O') continue;
404 UShort_t min = GetMinStrip(det, ring, 0, 0);
405 UShort_t max = GetMaxStrip(det, ring, 0, 0);
406 UShort_t rate = GetSampleRate(det, ring, 0, 0);
407 std::cout << "FMD" << det << ring
408 << " Strip range: "
409 << std::setw(3) << min << ","
410 << std::setw(3) << max << " Rate: "
411 << std::setw(2) << rate << std::endl;
412
413 if (!showStrips) continue;
414 UShort_t nSec = ( ring == 'I' ? 20 : 40 );
415 UShort_t nStr = ( ring == 'I' ? 512 : 256 );
416 for (UShort_t sec = minSector; sec < maxSector && sec < nSec; sec++) {
c2fc1258 417 std::cout
8ec606c2 418 << " Strip | Pedestal | Gain | ZS thr. | Address\n"
419 << "--------+-------------------+------------+---------+---------"
c2fc1258 420 << std::endl;
a9579262 421 for (UShort_t str = minStrip; str < nStr && str < maxStrip; str++) {
422 if (str == minStrip) std::cout << std::setw(3) << sec << ",";
423 else std::cout << " ";
424 std::cout << std::setw(3) << str << " | ";
425 if (IsDead(det, ring, sec, str)) {
c2fc1258 426 std::cout << "dead" << std::endl;
427 continue;
428 }
429 UInt_t ddl, addr;
a9579262 430 Detector2Hardware(det, ring, sec, str, ddl, addr);
431 std::cout << std::setw(7) << GetPedestal(det, ring, sec, str)
c2fc1258 432 << "+/-" << std::setw(7)
a9579262 433 << GetPedestalWidth(det, ring, sec, str)
8ec606c2 434 << " | " << std::setw(10)
a9579262 435 << GetPulseGain(det, ring, sec, str)
436 << " | " << std::setw(7)
437 << GetZeroSuppression(det, ring, sec, str)
c2fc1258 438 << " | 0x" << std::hex << std::setw(4)
439 << std::setfill('0') << ddl << ",0x" << std::setw(3)
440 << addr << std::dec << std::setfill(' ') << std::endl;
a9579262 441 } // for (strip)
442 } // for (sector)
443 std::cout
444 << "============================================================="
445 << std::endl;
446 } // while (ring)
447 } // while (det)
448
c2fc1258 449}
450
451//__________________________________________________________________
452void
453AliFMDParameters::SetStripRange(UShort_t min, UShort_t max)
454{
02a27b50 455 // Set fixed strip range
c2fc1258 456 fFixedMinStrip = min;
457 fFixedMaxStrip = max;
458}
459
dc02d468 460//__________________________________________________________________
461AliCDBEntry*
462AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp,
463 Bool_t fatal) const
464{
465 // Get an entry from the CDB or via preprocessor
466 AliCDBEntry* entry = 0;
467 if (!pp) {
468 AliCDBManager* cdb = AliCDBManager::Instance();
469 entry = cdb->Get(path);
470 }
471 else {
472 const char* third = gSystem->BaseName(path);
473 const char* second = gSystem->BaseName(gSystem->DirName(path));
474 entry = pp->GetFromCDB(second, third);
475 }
476 if (!entry) {
477 TString msg(Form("No %s found in CDB, perhaps you need to "
478 "use AliFMDCalibFaker?", path));
479 if (fatal) { AliFatal(msg.Data()); }
480 else AliLog::Message(AliLog::kWarning, msg.Data(), "FMD",
481 "AliFMDParameters", "GetEntry", __FILE__,
482 __LINE__);
483 return 0;
484 }
485 return entry;
486}
487
488
1e8f773e 489//__________________________________________________________________
490void
dc02d468 491AliFMDParameters::InitPulseGain(AliFMDPreprocessor* pp)
1e8f773e 492{
02a27b50 493 // Get pulse gain from CDB or used fixed
dc02d468 494 AliCDBEntry* gain = GetEntry(fgkPulseGain, pp);
495 if (!gain) return;
57c3c593 496
f95a63c4 497 AliFMDDebug(1, ("Got gain from CDB"));
1e8f773e 498 fPulseGain = dynamic_cast<AliFMDCalibGain*>(gain->GetObject());
f95a63c4 499 if (!fPulseGain) AliFatal("Invalid pulser gain object from CDB");
1e8f773e 500}
501//__________________________________________________________________
502void
dc02d468 503AliFMDParameters::InitPedestal(AliFMDPreprocessor* pp)
1e8f773e 504{
02a27b50 505 // Initialize the pedestals from CDB
dc02d468 506 AliCDBEntry* pedestal = GetEntry(fgkPedestal, pp);
507 if (!pedestal) return;
508
f95a63c4 509 AliFMDDebug(1, ("Got pedestal from CDB"));
1e8f773e 510 fPedestal = dynamic_cast<AliFMDCalibPedestal*>(pedestal->GetObject());
f95a63c4 511 if (!fPedestal) AliFatal("Invalid pedestal object from CDB");
1e8f773e 512}
513
514//__________________________________________________________________
515void
dc02d468 516AliFMDParameters::InitDeadMap(AliFMDPreprocessor* pp)
1e8f773e 517{
02a27b50 518 // Get Dead-channel-map from CDB
dc02d468 519 AliCDBEntry* deadMap = GetEntry(fgkDead, pp);
520 if (!deadMap) return;
521
f95a63c4 522 AliFMDDebug(1, ("Got dead map from CDB"));
1e8f773e 523 fDeadMap = dynamic_cast<AliFMDCalibDeadMap*>(deadMap->GetObject());
f95a63c4 524 if (!fDeadMap) AliFatal("Invalid dead map object from CDB");
1e8f773e 525}
526
527//__________________________________________________________________
528void
dc02d468 529AliFMDParameters::InitZeroSuppression(AliFMDPreprocessor* pp)
1e8f773e 530{
02a27b50 531 // Get 0-suppression from CDB
dc02d468 532 AliCDBEntry* zeroSup = GetEntry(fgkZeroSuppression, pp);
533 if (!zeroSup) return;
f95a63c4 534 AliFMDDebug(1, ("Got zero suppression from CDB"));
1e8f773e 535 fZeroSuppression =
536 dynamic_cast<AliFMDCalibZeroSuppression*>(zeroSup->GetObject());
f95a63c4 537 if (!fZeroSuppression)AliFatal("Invalid zero suppression object from CDB");
1e8f773e 538}
539
540//__________________________________________________________________
541void
dc02d468 542AliFMDParameters::InitSampleRate(AliFMDPreprocessor* pp)
1e8f773e 543{
02a27b50 544 // get Sample rate from CDB
dc02d468 545 AliCDBEntry* sampRat = GetEntry(fgkSampleRate, pp);
546 if (!sampRat) return;
f95a63c4 547 AliFMDDebug(1, ("Got zero suppression from CDB"));
1e8f773e 548 fSampleRate = dynamic_cast<AliFMDCalibSampleRate*>(sampRat->GetObject());
f95a63c4 549 if (!fSampleRate) AliFatal("Invalid zero suppression object from CDB");
1e8f773e 550}
551
552//__________________________________________________________________
553void
dc02d468 554AliFMDParameters::InitAltroMap(AliFMDPreprocessor* pp)
1e8f773e 555{
02a27b50 556 // Get hardware mapping from CDB
06ca6759 557 if (fAltroMap) {
558 delete fAltroMap;
559 fAltroMap = 0;
560 }
458e52e8 561 AliCDBEntry* hwMap = GetEntry(fgkAltroMap, pp, kFALSE);
dc02d468 562 if (!hwMap) return;
563
f95a63c4 564 AliFMDDebug(1, ("Got ALTRO map from CDB"));
1e8f773e 565 fAltroMap = dynamic_cast<AliFMDAltroMapping*>(hwMap->GetObject());
566 if (!fAltroMap) {
f95a63c4 567 AliFatal("Invalid ALTRO map object from CDB");
1e8f773e 568 fAltroMap = new AliFMDAltroMapping;
57c3c593 569 }
57c3c593 570}
571
c2fc1258 572//__________________________________________________________________
573void
dc02d468 574AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp)
c2fc1258 575{
02a27b50 576 // Get strips read-out from CDB
dc02d468 577 AliCDBEntry* range = GetEntry(fgkStripRange, pp);
578 if (!range) return;
f95a63c4 579 AliFMDDebug(1, ("Got strip range from CDB"));
c2fc1258 580 fStripRange = dynamic_cast<AliFMDCalibStripRange*>(range->GetObject());
f95a63c4 581 if (!fStripRange) AliFatal("Invalid strip range object from CDB");
c2fc1258 582}
583
1e8f773e 584
8f6ee336 585//__________________________________________________________________
586Float_t
587AliFMDParameters::GetThreshold() const
588{
02a27b50 589 // Get threshold from CDB
8f6ee336 590 if (!fPulseGain) return fFixedThreshold;
591 return fPulseGain->Threshold();
592}
593
594//__________________________________________________________________
595Float_t
596AliFMDParameters::GetPulseGain(UShort_t detector, Char_t ring,
597 UShort_t sector, UShort_t strip) const
598{
599 // Returns the pulser calibrated gain for strip # strip in sector #
600 // sector or ring id ring of detector # detector.
601 //
602 // For simulation, this is normally set to
603 //
604 // VA1_MIP_Range
605 // ------------------ * MIP_Energy_Loss
606 // ALTRO_channel_size
607 //
608 if (!fPulseGain) {
609 if (fFixedPulseGain <= 0)
610 fFixedPulseGain = fVA1MipRange * GetEdepMip() / fAltroChannelSize;
611 return fFixedPulseGain;
612 }
f95a63c4 613 AliFMDDebug(50, ("pulse gain for FMD%d%c[%2d,%3d]=%f",
1e8f773e 614 detector, ring, sector, strip,
615 fPulseGain->Value(detector, ring, sector, strip)));
8f6ee336 616 return fPulseGain->Value(detector, ring, sector, strip);
617}
618
619//__________________________________________________________________
620Bool_t
621AliFMDParameters::IsDead(UShort_t detector, Char_t ring,
622 UShort_t sector, UShort_t strip) const
623{
02a27b50 624 // Check if the channel is dead
8f6ee336 625 if (!fDeadMap) return kFALSE;
f95a63c4 626 AliFMDDebug(50, ("Dead for FMD%d%c[%2d,%3d]=%s",
1e8f773e 627 detector, ring, sector, strip,
628 fDeadMap->operator()(detector, ring, sector, strip) ?
629 "no" : "yes"));
8f6ee336 630 return fDeadMap->operator()(detector, ring, sector, strip);
631}
632
633//__________________________________________________________________
634UShort_t
635AliFMDParameters::GetZeroSuppression(UShort_t detector, Char_t ring,
636 UShort_t sector, UShort_t strip) const
637{
02a27b50 638 // Get zero suppression threshold
8f6ee336 639 if (!fZeroSuppression) return fFixedZeroSuppression;
640 // Need to map strip to ALTRO chip.
f95a63c4 641 AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%f",
1e8f773e 642 detector, ring, sector, strip,
643 fZeroSuppression->operator()(detector, ring,
644 sector, strip)));
8f6ee336 645 return fZeroSuppression->operator()(detector, ring, sector, strip/128);
646}
647
648//__________________________________________________________________
649UShort_t
c2fc1258 650AliFMDParameters::GetSampleRate(UShort_t det, Char_t ring, UShort_t sector,
651 UShort_t str) const
8f6ee336 652{
02a27b50 653 // Get sampl rate
8f6ee336 654 if (!fSampleRate) return fFixedSampleRate;
655 // Need to map sector to digitizier card.
c2fc1258 656 UInt_t ret = fSampleRate->Rate(det, ring, sector, str);
f95a63c4 657 AliFMDDebug(50, ("Sample rate for FMD%d%c[%2d,%3d]=%d",
c2fc1258 658 det, ring, sector, str, ret));
659 return ret;
660}
661
662//__________________________________________________________________
663UShort_t
664AliFMDParameters::GetMinStrip(UShort_t det, Char_t ring, UShort_t sector,
665 UShort_t str) const
666{
02a27b50 667 // Get strip range read out
c2fc1258 668 if (!fStripRange) return fFixedMinStrip;
669 // Need to map sector to digitizier card.
670 UInt_t ret = fStripRange->Min(det, ring, sector, str);
f95a63c4 671 AliFMDDebug(50, ("Min strip # for FMD%d%c[%2d,%3d]=%d",
c2fc1258 672 det, ring, sector, str, ret));
673 return ret;
674}
675
676//__________________________________________________________________
677UShort_t
678AliFMDParameters::GetMaxStrip(UShort_t det, Char_t ring, UShort_t sector,
679 UShort_t str) const
680{
02a27b50 681 // Get strip range read out
c2fc1258 682 if (!fStripRange) return fFixedMaxStrip;
683 // Need to map sector to digitizier card.
684 UInt_t ret = fStripRange->Max(det, ring, sector, str);
f95a63c4 685 AliFMDDebug(50, ("Max strip # for FMD%d%c[%2d,%3d]=%d",
c2fc1258 686 det, ring, sector, str, ret));
687 return ret;
8f6ee336 688}
1a1fdef7 689
8f6ee336 690//__________________________________________________________________
691Float_t
692AliFMDParameters::GetPedestal(UShort_t detector, Char_t ring,
693 UShort_t sector, UShort_t strip) const
694{
02a27b50 695 // Get the pedesal
8f6ee336 696 if (!fPedestal) return fFixedPedestal;
f95a63c4 697 AliFMDDebug(50, ("pedestal for FMD%d%c[%2d,%3d]=%f",
1e8f773e 698 detector, ring, sector, strip,
699 fPedestal->Value(detector, ring, sector, strip)));
8f6ee336 700 return fPedestal->Value(detector, ring, sector, strip);
701}
702
703//__________________________________________________________________
704Float_t
705AliFMDParameters::GetPedestalWidth(UShort_t detector, Char_t ring,
706 UShort_t sector, UShort_t strip) const
707{
02a27b50 708 // Get the pedesal
8f6ee336 709 if (!fPedestal) return fFixedPedestalWidth;
f95a63c4 710 AliFMDDebug(50, ("pedetal width for FMD%d%c[%2d,%3d]=%f",
1e8f773e 711 detector, ring, sector, strip,
712 fPedestal->Width(detector, ring, sector, strip)));
8f6ee336 713 return fPedestal->Width(detector, ring, sector, strip);
714}
715
1a1fdef7 716//__________________________________________________________________
57c3c593 717AliFMDAltroMapping*
718AliFMDParameters::GetAltroMap() const
719{
02a27b50 720 // Get the hardware address to detector index map
57c3c593 721 return fAltroMap;
1a1fdef7 722}
723
57c3c593 724
bf000c32 725//__________________________________________________________________
726Bool_t
f6449cc0 727AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t board,
728 UInt_t chip, UInt_t chan,
729 UShort_t& det, Char_t& ring,
730 UShort_t& sec, UShort_t& str) const
731{
732 // Map hardware address to detector index
733 if (!fAltroMap) return kFALSE;
734 return fAltroMap->Hardware2Detector(ddl,board,chip,chan, det,ring,sec,str);
735}
736//__________________________________________________________________
737Bool_t
738AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t addr,
739 UShort_t& det, Char_t& ring,
740 UShort_t& sec, UShort_t& str) const
bf000c32 741{
02a27b50 742 // Map hardware address to detector index
57c3c593 743 if (!fAltroMap) return kFALSE;
744 return fAltroMap->Hardware2Detector(ddl, addr, det, ring, sec, str);
bf000c32 745}
746
747//__________________________________________________________________
748Bool_t
f6449cc0 749AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring,
750 UShort_t sec, UShort_t str,
751 UInt_t& ddl, UInt_t& board,
752 UInt_t& chip, UInt_t& chan) const
753{
754 // Map detector index to hardware address
755 if (!fAltroMap) return kFALSE;
756 return fAltroMap->Detector2Hardware(det,ring,sec,str, ddl,board,chip,chan);
757}
758
759//__________________________________________________________________
760Bool_t
761AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring,
762 UShort_t sec, UShort_t str,
763 UInt_t& ddl, UInt_t& addr) const
bf000c32 764{
02a27b50 765 // Map detector index to hardware address
57c3c593 766 if (!fAltroMap) return kFALSE;
767 return fAltroMap->Detector2Hardware(det, ring, sec, str, ddl, addr);
bf000c32 768}
769
57c3c593 770
771//__________________________________________________________________
772Float_t
773AliFMDParameters::GetEdepMip() const
774{
775 // Get energy deposited by a MIP in the silicon sensors
776 if (fEdepMip <= 0){
777 AliFMDGeometry* fmd = AliFMDGeometry::Instance();
02a27b50 778 fEdepMip = (fkSiDeDxMip
57c3c593 779 * fmd->GetRing('I')->GetSiThickness()
780 * fmd->GetSiDensity());
781 }
782 return fEdepMip;
783}
784
785
bf000c32 786
787
788
1a1fdef7 789//____________________________________________________________________
790//
791// EOF
792//