#include "AliFMDDebug.h"
#include "AliFMDParameters.h"
#include "AliFMDGeometry.h"
#include "AliFMDRing.h"
#include "AliFMDCalibGain.h"
#include "AliFMDCalibPedestal.h"
#include "AliFMDCalibSampleRate.h"
#include "AliFMDCalibStripRange.h"
#include "AliFMDAltroMapping.h"
#include <AliCDBManager.h>
#include <AliCDBEntry.h>
#include <AliFMDPreprocessor.h>
#include <AliLog.h>
#include <Riostream.h>
#include <sstream>
#include <TSystem.h>
#include <TArrayF.h>
#include <TH2D.h>
ClassImp(AliFMDParameters)
#if 0
;
#endif
AliFMDParameters* AliFMDParameters::fgInstance = 0;
const char* AliFMDParameters::fgkPulseGain = "FMD/Calib/PulseGain";
const char* AliFMDParameters::fgkPedestal = "FMD/Calib/Pedestal";
const char* AliFMDParameters::fgkDead = "FMD/Calib/Dead";
const char* AliFMDParameters::fgkSampleRate = "FMD/Calib/SampleRate";
const char* AliFMDParameters::fgkAltroMap = "FMD/Calib/AltroMap";
const char* AliFMDParameters::fgkZeroSuppression = "FMD/Calib/ZeroSuppression";
const char* AliFMDParameters::fgkStripRange = "FMD/Calib/StripRange";
const char* AliFMDParameters::fkPedestalShuttleID = "pedestals";
const char* AliFMDParameters::fkGainShuttleID = "gains";
const char* AliFMDParameters::fkConditionsShuttleID = "conditions";
AliFMDParameters*
AliFMDParameters::Instance()
{
if (!fgInstance) fgInstance = new AliFMDParameters;
return fgInstance;
}
AliFMDParameters::AliFMDParameters()
: fIsInit(kFALSE),
fkSiDeDxMip(1.664),
fVA1MipRange(0),
fAltroChannelSize(0),
fChannelsPerAltro(0),
fPedestalFactor(0),
fZSPre(1),
fZSPost(1),
fZSPedSubtract(kTRUE),
fFixedPedestal(100),
fFixedPedestalWidth(2),
fFixedZeroSuppression(1),
fFixedSampleRate(2),
fFixedThreshold(0),
fFixedMinStrip(0),
fFixedMaxStrip(127),
fFixedPulseGain(2),
fEdepMip(0),
fHasCompleteHeader(kTRUE),
fZeroSuppression(0),
fSampleRate(0),
fPedestal(0),
fPulseGain(0),
fDeadMap(0),
fAltroMap(0),
fStripRange(0),
fRunNo(-1)
{
SetVA1MipRange();
SetAltroChannelSize();
SetChannelsPerAltro();
SetZeroSuppression();
SetSampleRate();
SetPedestal();
SetPedestalWidth();
SetPedestalFactor();
SetThreshold();
SetStripRange();
SetGain();
fAltroMap = new AliFMDAltroMapping;
fAltroMap->SetBit(TObject::kCanDelete);
}
Bool_t
AliFMDParameters::CheckForNewRun()
{
Int_t run = AliCDBManager::Instance()->GetRun();
if (run != fRunNo) {
fIsInit = false;
fRunNo = run;
}
return run != fRunNo;
}
UShort_t
AliFMDParameters::Init(Bool_t forceReInit, UInt_t what)
{
if (forceReInit) fIsInit = kFALSE;
CheckForNewRun();
if (fIsInit) return 0;
UShort_t errMask = 0;
if (what & kPulseGain) errMask |= InitPulseGain();
if (what & kPedestal) errMask |= InitPedestal();
if (what & kDeadMap) errMask |= InitDeadMap();
if (what & kSampleRate) errMask |= InitSampleRate();
if (what & kZeroSuppression) errMask |= InitZeroSuppression();
if (what & kAltroMap) errMask |= InitAltroMap();
if (what & kStripRange) errMask |= InitStripRange();
fIsInit = kTRUE;
return errMask;
}
UShort_t
AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what)
{
if (forceReInit) fIsInit = kFALSE;
CheckForNewRun();
if (fIsInit) return 0;
UShort_t errMask = 0;
if (what & kPulseGain) errMask |= InitPulseGain(pp);
if (what & kPedestal) errMask |= InitPedestal(pp);
if (what & kDeadMap) errMask |= InitDeadMap(pp);
if (what & kSampleRate) errMask |= InitSampleRate(pp);
if (what & kZeroSuppression) errMask |= InitZeroSuppression(pp);
if (what & kAltroMap) errMask |= InitAltroMap(pp);
if (what & kStripRange) errMask |= InitStripRange(pp);
fIsInit = kTRUE;
return errMask;
}
Bool_t
AliFMDParameters::CheckFile(const char* prefix,
const char* path,
int number,
TString& f) const
{
f = (Form("%s%d.csv", prefix, number));
AliFMDDebug(5, ("Checking if %s exists in %s ...", f.Data(), path));
f = gSystem->Which(path, f.Data());
AliFMDDebug(5, ("Got back '%s'", f.Data()));
return !f.IsNull();
}
UShort_t
AliFMDParameters::Init(const char* path, Bool_t forceReInit, UInt_t what)
{
if (forceReInit) fIsInit = kFALSE;
CheckForNewRun();
if (fIsInit) return 0;
AliFMDCalibStripRange* range = 0;
AliFMDCalibSampleRate* rate = 0;
AliFMDCalibPedestal* peds = 0;
AliFMDCalibGain* gains = 0;
for (Int_t i = 1; i <= 3; i++) {
TString f;
if (((what & kSampleRate) || (what & kStripRange)) &&
CheckFile("conditions", path, i, f)) {
if (!rate && (what & kSampleRate)) rate = new AliFMDCalibSampleRate;
if (!range && (what & kStripRange)) range = new AliFMDCalibStripRange;
std::ifstream in(f.Data());
if (range) range->ReadFromFile(in);
if (rate) rate->ReadFromFile(in);
in.close();
}
if ((what & kPedestal) && CheckFile("peds", path, i, f)) {
if (!peds) peds = new AliFMDCalibPedestal;
std::ifstream in(f.Data());
peds->ReadFromFile(in);
in.close();
}
if ((what & kPulseGain) && CheckFile("gains", path, i, f)) {
if (!gains) gains = new AliFMDCalibGain;
std::ifstream in(f.Data());
gains->ReadFromFile(in);
in.close();
}
}
if (range) what &= ~kStripRange;
if (rate) what &= ~kSampleRate;
if (peds) what &= ~kPedestal;
if (gains) what &= ~kPulseGain;
UShort_t ret = Init(kFALSE, what);
if (range) SetStripRange(range);
if (rate) SetSampleRate(rate);
if (peds) SetPedestal(peds);
if (gains) SetGain(gains);
fIsInit = kTRUE;
return ret;
}
void
AliFMDParameters::MakeDeadMap(Float_t maxNoise,
Float_t minGain,
Float_t maxGain)
{
if (fPedestal)
fDeadMap = fPedestal->MakeDeadMap(maxNoise, fDeadMap);
if (fPulseGain)
fDeadMap = fPulseGain->MakeDeadMap(minGain, maxGain, fDeadMap);
}
#define DET2IDX(det,ring,sec,str) \
(det * 1000 + (ring == 'I' ? 0 : 512) + str)
void
AliFMDParameters::Draw(Option_t* option)
{
TString opt(option);
enum {
kLocalPulseGain,
kLocalThreshold,
kLocalPedestal,
kLocalPedestalWidth,
kLocalDead,
kLocalSampleRate,
kLocalAltroMap,
kLocalZeroSuppression,
kLocalMinStripRange,
kLocalMaxStripRange
} what;
if (opt.Contains("dead", TString::kIgnoreCase))
what = kLocalDead;
else if (opt.Contains("threshold",TString::kIgnoreCase))
what = kLocalThreshold;
else if (opt.Contains("gain",TString::kIgnoreCase))
what = kLocalPulseGain;
else if (opt.Contains("pedestal",TString::kIgnoreCase))
what = kLocalPedestal;
else if (opt.Contains("noise",TString::kIgnoreCase))
what = kLocalPedestalWidth;
else if (opt.Contains("zero",TString::kIgnoreCase))
what = kLocalZeroSuppression;
else if (opt.Contains("rate",TString::kIgnoreCase))
what = kLocalSampleRate;
else if (opt.Contains("min",TString::kIgnoreCase))
what = kLocalMinStripRange;
else if (opt.Contains("max",TString::kIgnoreCase))
what = kLocalMaxStripRange;
else if (opt.Contains("map",TString::kIgnoreCase))
what = kLocalAltroMap;
else {
Warning("Draw", "unknown parameter: %s\n\tShould be one of\n\t"
"dead, threshold, gain, pedestal, noise, zero, rate, "
"min, max, map",
option);
return;
}
TArrayD xbins(3 * 512 + 2 * 256 + 5);
Int_t i = 1;
Bool_t skip = kTRUE;
for (UShort_t det = 1; det <= 3; det++) {
UShort_t nRings = (det == 1 ? 1 : 2);
for (UShort_t iring = 0; iring < nRings; iring++) {
UShort_t nStrip = (iring == 0 ? 512 : 256);
Char_t ring = (iring == 0 ? 'I' : 'O');
for (UShort_t str = 0; str < nStrip; str++) {
Int_t idx = DET2IDX(det, ring, 0, str);
if (skip) {
xbins[i-1] = idx - .5;
skip = kFALSE;
}
xbins[i] = idx + .5;
i++;
}
skip = kTRUE;
i++;
}
}
TArrayD ybins(41);
for ( i = 0; i < ybins.fN; i++) ybins[i] = Float_t(i - .5);
TH2D* hist = new TH2D("calib", Form("Calibration %s", option),
xbins.fN-1, xbins.fArray,
ybins.fN-1, ybins.fArray);
hist->GetXaxis()->SetTitle("1000 #times detector + 512 #times ring + strip");
hist->GetYaxis()->SetTitle("sector");
for (UShort_t det = 1; det <= 3; det++) {
UShort_t nRings = (det == 1 ? 1 : 2);
for (UShort_t iring = 0; iring < nRings; iring++) {
UShort_t nSector = (iring == 0 ? 20 : 40);
UShort_t nStrip = (iring == 0 ? 512 : 256);
Char_t ring = (iring == 0 ? 'I' : 'O');
for (UShort_t sec = 0; sec < nSector; sec++) {
for (UShort_t str = 0; str < nStrip; str++) {
Int_t idx = DET2IDX(det, ring, sec, str);
UShort_t ddl, addr, time, sam=0;
Double_t val = 0;
switch (what) {
case kLocalPulseGain:
val = GetPulseGain(det,ring,sec,str); break;
case kLocalThreshold:
val = GetThreshold(); break;
case kLocalPedestal:
val = GetPedestal(det,ring,sec,str); break;
case kLocalPedestalWidth:
val = GetPedestalWidth(det,ring,sec,str); break;
case kLocalDead:
val = IsDead(det,ring,sec,str); break;
case kLocalSampleRate:
val = GetSampleRate(det,ring,sec,str); break;
case kLocalAltroMap:
Detector2Hardware(det,ring,sec,str,sam,ddl,addr,time);
val = addr; break;
case kLocalZeroSuppression:
val = GetZeroSuppression(det,ring,sec,str); break;
case kLocalMinStripRange:
val = GetMinStrip(det,ring,sec,str); break;
case kLocalMaxStripRange:
val = GetMaxStrip(det,ring,sec,str); break;
}
hist->Fill(idx,sec,val);
}
}
}
}
hist->Draw("lego");
}
void
AliFMDParameters::Print(Option_t* option) const
{
TString opt(option);
Bool_t showStrips = opt.Contains("a", TString::kIgnoreCase);
UShort_t ds[] = { 1, 2, 3, 0 };
Char_t rs[] = { 'I', 'O', '\0' };
UShort_t minStrip = 0;
UShort_t maxStrip = 512;
UShort_t minSector = 0;
UShort_t maxSector = 40;
if (opt.Contains("fmd",TString::kIgnoreCase)) {
Int_t i = opt.Index("fmd",TString::kIgnoreCase);
Int_t j = opt.Index("]",TString::kIgnoreCase);
if (j != kNPOS)
showStrips = kTRUE;
else
j = opt.Length();
enum {
kReadDet,
kReadRing,
kReadLbrack,
kReadSector,
kReadComma,
kReadStrip,
kReadRbrack,
kEnd
} state = kReadDet;
std::stringstream s(opt(i+4, j-i-3).Data());
while (state != kEnd) {
Char_t tmp = s.peek();
if (tmp == ' ' || tmp == '\t') {
s.get();
continue;
}
switch (state) {
case kReadDet: {
if (tmp == '*') s.get();
else {
UShort_t det;
s >> det;
if (!s.bad()) {
ds[0] = det;
ds[1] = 0;
}
}
state = (s.bad() ? kEnd : kReadRing);
} break;
case kReadRing: {
Char_t ring;
s >> ring;
if (ring != '*' && !s.bad()) {
rs[0] = ring;
rs[1] = '\0';
}
state = (s.bad() ? kEnd : kReadLbrack);
} break;
case kReadLbrack: {
Char_t lbrack;
s >> lbrack;
state = (s.bad() ? kEnd : kReadSector);
} break;
case kReadSector: {
if (tmp == '*') s.get();
else {
UShort_t sec;
s >> sec;
if (!s.bad()) {
minSector = sec;
maxSector = sec + 1;
}
}
state = (s.bad() ? kEnd : kReadComma);
} break;
case kReadComma: {
Char_t comma;
s >> comma;
state = (s.bad() ? kEnd : kReadStrip);
} break;
case kReadStrip: {
if (tmp == '*') s.get();
else {
UShort_t str;
s >> str;
if (!s.bad()) {
minStrip = str;
maxStrip = str + 1;
}
}
state = (s.bad() ? kEnd : kReadRbrack);
} break;
case kReadRbrack: {
Char_t rbrack;
s >> rbrack;
state = kEnd;
} break;
case kEnd:
break;
}
}
}
UShort_t* dp = ds;
UShort_t det;
while ((det = *(dp++))) {
Char_t* rp = rs;
Char_t ring;
while ((ring = *(rp++))) {
if (det == 1 && ring == 'O') continue;
UShort_t min = GetMinStrip(det, ring, 0, 0);
UShort_t max = GetMaxStrip(det, ring, 0, 0);
std::cout << "FMD" << det << ring
<< " Strip range: "
<< std::setw(3) << min << ","
<< std::setw(3) << max << std::endl;
UShort_t nSec = ( ring == 'I' ? 20 : 40 );
UShort_t nStr = ( ring == 'I' ? 512 : 256 );
for (UShort_t sec = minSector; sec < maxSector && sec < nSec; sec++) {
UShort_t rate = GetSampleRate(det, ring, sec, 0);
std::cout << "FMD" << det << ring << "[" << std::setw(2) << sec
<< "] sample rate: " << rate << std::endl;
if (!showStrips) continue;
std::cout
<< " Strip | Pedestal | Gain | ZS thr. | Address\n"
<< "--------+-------------------+------------+---------+---------"
<< std::endl;
for (UShort_t str = minStrip; str < nStr && str < maxStrip; str++) {
if (str == minStrip) std::cout << std::setw(3) << sec << ",";
else std::cout << " ";
std::cout << std::setw(3) << str << " | ";
if (IsDead(det, ring, sec, str)) {
std::cout << "dead" << std::endl;
continue;
}
UShort_t ddl, addr, time, sam=0;
Detector2Hardware(det, ring, sec, str, sam, ddl, addr, time);
std::cout << std::setw(7) << GetPedestal(det, ring, sec, str)
<< "+/-" << std::setw(7)
<< GetPedestalWidth(det, ring, sec, str)
<< " | " << std::setw(10)
<< GetPulseGain(det, ring, sec, str)
<< " | " << std::setw(7)
<< GetZeroSuppression(det, ring, sec, str)
<< " | 0x" << std::hex << std::setw(4)
<< std::setfill('0') << ddl << ",0x" << std::setw(3)
<< addr << std::dec << std::setfill(' ') << std::endl;
}
}
std::cout
<< "============================================================="
<< std::endl;
}
}
}
AliCDBEntry*
AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp,
Bool_t fatal) const
{
AliCDBEntry* entry = 0;
if (!pp) {
AliCDBManager* cdb = AliCDBManager::Instance();
entry = cdb->Get(path);
}
else {
const char* third = gSystem->BaseName(path);
const char* second = gSystem->BaseName(gSystem->DirName(path));
entry = pp->GetFromCDB(second, third);
}
if (!entry) {
TString msg(Form("No %s found in CDB, perhaps you need to "
"use AliFMDCalibFaker?", path));
if (fatal) { AliFatal(msg.Data()); }
else AliLog::Message(AliLog::kWarning, msg.Data(), "FMD",
"AliFMDParameters", "GetEntry", __FILE__,
__LINE__);
return 0;
}
if (entry && AliLog::GetDebugLevel("FMD", "") > 0) {
AliInfoF("Got entry %p for %s", entry, path);
entry->PrintId();
entry->PrintMetaData();
entry->Print();
}
return entry;
}
UShort_t
AliFMDParameters::InitPulseGain(AliFMDPreprocessor* pp)
{
AliCDBEntry* gain = GetEntry(fgkPulseGain, pp);
if (!gain) return kPulseGain;
AliFMDDebug(5, ("Got gain from CDB"));
fPulseGain = dynamic_cast<AliFMDCalibGain*>(gain->GetObject());
if (!fPulseGain) {
AliError("Invalid pulser gain object from CDB");
return kPulseGain;
}
if (!fPulseGain->Values().Ptr()) {
AliError("Empty pulser gain object from CDB");
return kPulseGain;
}
return 0;
}
UShort_t
AliFMDParameters::InitPedestal(AliFMDPreprocessor* pp)
{
AliCDBEntry* pedestal = GetEntry(fgkPedestal, pp);
if (!pedestal) return kPedestal;
AliFMDDebug(5, ("Got pedestal from CDB"));
fPedestal = dynamic_cast<AliFMDCalibPedestal*>(pedestal->GetObject());
if (!fPedestal) {
AliError("Invalid pedestal object from CDB");
return kPedestal;
}
if (!fPedestal->Values().Ptr()) {
AliError("Empty pedestal object from CDB");
return kPedestal;
}
return 0;
}
UShort_t
AliFMDParameters::InitDeadMap(AliFMDPreprocessor* pp)
{
AliCDBEntry* deadMap = GetEntry(fgkDead, pp);
if (!deadMap) return kDeadMap;
AliFMDDebug(5, ("Got dead map from CDB"));
fDeadMap = dynamic_cast<AliFMDCalibDeadMap*>(deadMap->GetObject());
if (!fDeadMap) {
AliError("Invalid dead map object from CDB");
return kDeadMap;
}
if (!fDeadMap->Ptr()) {
AliError("Empty dead map object from CDB");
return kDeadMap;
}
return 0;
}
UShort_t
AliFMDParameters::InitZeroSuppression(AliFMDPreprocessor* pp)
{
AliCDBEntry* zeroSup = GetEntry(fgkZeroSuppression, pp);
if (!zeroSup) return kZeroSuppression;
AliFMDDebug(5, ("Got zero suppression from CDB"));
fZeroSuppression =
dynamic_cast<AliFMDCalibZeroSuppression*>(zeroSup->GetObject());
if (!fZeroSuppression) {
AliError("Invalid zero suppression object from CDB");
return kZeroSuppression;
}
if (!fZeroSuppression->Ptr()) {
AliWarningF("Empty zero suppression object from CDB, assuming %d",
fFixedZeroSuppression);
AliCDBManager* cdbMan = AliCDBManager::Instance();
if(!cdbMan || !cdbMan->GetCacheFlag())
delete fZeroSuppression;
fZeroSuppression = 0;
}
return 0;
}
UShort_t
AliFMDParameters::InitSampleRate(AliFMDPreprocessor* pp)
{
AliCDBEntry* sampRat = GetEntry(fgkSampleRate, pp);
if (!sampRat) return kSampleRate;
AliFMDDebug(5, ("Got zero suppression from CDB"));
fSampleRate = dynamic_cast<AliFMDCalibSampleRate*>(sampRat->GetObject());
if (!fSampleRate) {
AliError("Invalid sample rate object from CDB");
return kSampleRate;
}
if (!fSampleRate->Rates().Ptr()) {
AliError("empty sample rate object from CDB");
return kSampleRate;
}
return 0;
}
UShort_t
AliFMDParameters::InitAltroMap(AliFMDPreprocessor* pp)
{
if (fAltroMap && fAltroMap->TestBit(TObject::kCanDelete)) {
delete fAltroMap;
fAltroMap = 0;
}
AliCDBEntry* hwMap = GetEntry(fgkAltroMap, pp, kFALSE);
if (hwMap) {
AliFMDDebug(5, ("Got ALTRO map from CDB"));
fAltroMap = dynamic_cast<AliFMDAltroMapping*>(hwMap->GetObject());
if (fAltroMap) fAltroMap->ResetBit(TObject::kCanDelete);
}
if (!fAltroMap) {
AliError("Invalid ALTRO map object from CDB");
fAltroMap = new AliFMDAltroMapping;
fAltroMap->SetBit(TObject::kCanDelete);
}
return 0;
}
UShort_t
AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp)
{
AliCDBEntry* range = GetEntry(fgkStripRange, pp);
if (!range) return kStripRange;
AliFMDDebug(5, ("Got strip range from CDB"));
fStripRange = dynamic_cast<AliFMDCalibStripRange*>(range->GetObject());
if (!fStripRange) {
AliError("Invalid strip range object from CDB");
return kStripRange;
}
if (!fStripRange->Ranges().Ptr()) {
AliError("Empty strip range object from CDB");
return kStripRange;
}
return 0;
}
Float_t
AliFMDParameters::GetThreshold() const
{
if (!fPulseGain) return fFixedThreshold;
return fPulseGain->Threshold();
}
Float_t
AliFMDParameters::GetPulseGain(UShort_t detector, Char_t ring,
UShort_t sector, UShort_t strip) const
{
if (!fPulseGain) {
if (fFixedPulseGain <= 0)
fFixedPulseGain = fVA1MipRange * GetEdepMip() / fAltroChannelSize;
return fFixedPulseGain;
}
AliFMDDebug(50, ("pulse gain for FMD%d%c[%2d,%3d]=%f",
detector, ring, sector, strip,
fPulseGain->Value(detector, ring, sector, strip)));
return fPulseGain->Value(detector, ring, sector, strip);
}
Bool_t
AliFMDParameters::IsDead(UShort_t detector, Char_t ring,
UShort_t sector, UShort_t strip) const
{
if (!fDeadMap) return kFALSE;
AliFMDDebug(50, ("Dead for FMD%d%c[%2d,%3d]=%s",
detector, ring, sector, strip,
fDeadMap->operator()(detector, ring, sector, strip) ?
"no" : "yes"));
return fDeadMap->operator()(detector, ring, sector, strip);
}
UShort_t
AliFMDParameters::GetZeroSuppression(UShort_t detector, Char_t ring,
UShort_t sector, UShort_t strip) const
{
if (!fZeroSuppression) return fFixedZeroSuppression;
if (!fZeroSuppression->Ptr() ||
fZeroSuppression->MaxIndex() <= 0) return fFixedZeroSuppression;
AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%d",
detector, ring, sector, strip,
fZeroSuppression->operator()(detector, ring,
sector, strip)));
return fZeroSuppression->operator()(detector, ring, sector, strip/128);
}
UShort_t
AliFMDParameters::GetSampleRate(UShort_t det, Char_t ring, UShort_t sector,
UShort_t str) const
{
if (!fSampleRate) return fFixedSampleRate;
UInt_t ret = fSampleRate->Rate(det, ring, sector, str);
AliFMDDebug(50, ("Sample rate for FMD%d%c[%2d,%3d]=%d",
det, ring, sector, str, ret));
return ret;
}
UShort_t
AliFMDParameters::GetMinStrip(UShort_t det, Char_t ring, UShort_t sector,
UShort_t str) const
{
if (!fStripRange) return fFixedMinStrip;
UInt_t ret = fStripRange->Min(det, ring, sector, str);
AliFMDDebug(50, ("Min strip # for FMD%d%c[%2d,%3d]=%d",
det, ring, sector, str, ret));
return ret;
}
UShort_t
AliFMDParameters::GetMaxStrip(UShort_t det, Char_t ring, UShort_t sector,
UShort_t str) const
{
if (!fStripRange) return fFixedMaxStrip;
UInt_t ret = fStripRange->Max(det, ring, sector, str);
AliFMDDebug(50, ("Max strip # for FMD%d%c[%2d,%3d]=%d",
det, ring, sector, str, ret));
return ret;
}
Float_t
AliFMDParameters::GetPedestal(UShort_t detector, Char_t ring,
UShort_t sector, UShort_t strip) const
{
if (!fPedestal) return fFixedPedestal;
AliFMDDebug(50, ("pedestal for FMD%d%c[%2d,%3d]=%f",
detector, ring, sector, strip,
fPedestal->Value(detector, ring, sector, strip)));
return fPedestal->Value(detector, ring, sector, strip);
}
Float_t
AliFMDParameters::GetPedestalWidth(UShort_t detector, Char_t ring,
UShort_t sector, UShort_t strip) const
{
if (!fPedestal) return fFixedPedestalWidth;
AliFMDDebug(50, ("pedetal width for FMD%d%c[%2d,%3d]=%f",
detector, ring, sector, strip,
fPedestal->Width(detector, ring, sector, strip)));
return fPedestal->Width(detector, ring, sector, strip);
}
AliFMDAltroMapping*
AliFMDParameters::GetAltroMap() const
{
return fAltroMap;
}
Bool_t
AliFMDParameters::Hardware2Detector(UShort_t ddl, UShort_t addr,
UShort_t timebin,
UShort_t& det, Char_t& ring,
UShort_t& sec, Short_t& str,
UShort_t& sam) const
{
if (!fAltroMap) return kFALSE;
UShort_t board, chip, chan;
fAltroMap->ChannelAddress(addr, board, chip, chan);
return Hardware2Detector(ddl,board,chip,chan,timebin,det,ring,sec,str,sam);
}
Bool_t
AliFMDParameters::Hardware2Detector(UShort_t ddl, UShort_t board,
UShort_t chip, UShort_t chan,
UShort_t timebin,
UShort_t& det, Char_t& ring,
UShort_t& sec, Short_t& str,
UShort_t& sam) const
{
if (!fAltroMap) {
AliFMDDebug(1, ("No ALTRO map available"));
return kFALSE;
}
if (fAltroMap->DDL2Detector(ddl) < 0) {
AliFMDDebug(1, ("Invalid DDL number %d", ddl));
return kFALSE;
}
det = fAltroMap->DDL2Detector(ddl);
Short_t stripBase = 0;
if (!fAltroMap->Channel2StripBase(board,chip,chan, ring, sec, stripBase)) {
AliFMDDebug(1, ("Failed to translate "
"%d/0x%02x/0x%x/0x%x/%04d -> "
"FMD%d%c[%2d,%3d] to detector",
ddl, board, chip, chan, timebin,
det, ring, sec, stripBase));
return kFALSE;
}
UShort_t preSamples = GetPreSamples(det, ring, sec, stripBase);
UShort_t sampleRate = GetSampleRate(det, ring, sec, stripBase);
Short_t stripOff = 0;
fAltroMap->Timebin2Strip(sec, timebin, preSamples, sampleRate, stripOff, sam);
str = stripBase + stripOff;
AliFMDDebug(50, ("%d/0x%02x/0x%x/0x%x/%04d -> FMD%d%c[%02d,%03d]-%d"
" (pre=%2d, rate=%d)",
ddl, board, chip, chan, timebin,
det, ring, sec, str, sam, preSamples, sampleRate));
return kTRUE;
}
Bool_t
AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring,
UShort_t sec, UShort_t str,
UShort_t sam,
UShort_t& ddl, UShort_t& board,
UShort_t& altro, UShort_t& channel,
UShort_t& timebin) const
{
if (!fAltroMap) {
AliFMDDebug(1, ("No ALTRO map available"));
return kFALSE;
}
UShort_t preSamples = GetPreSamples(det, ring, sec, str);
UShort_t sampleRate = GetSampleRate(det, ring, sec, str);
UShort_t strip = str - GetMinStrip(det,ring,sec,str);
return fAltroMap->Detector2Hardware(det, ring, sec, strip, sam,
preSamples, sampleRate,
ddl, board, altro, channel, timebin);
}
Bool_t
AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring,
UShort_t sec, UShort_t str,
UShort_t sam,
UShort_t& ddl, UShort_t& addr,
UShort_t& timebin) const
{
if (!fAltroMap) return kFALSE;
UShort_t preSamples = GetPreSamples(det, ring, sec, str);
UShort_t sampleRate = GetSampleRate(det, ring, sec, str);
UShort_t strip = str - GetMinStrip(det,ring,sec,str);
return fAltroMap->Detector2Hardware(det, ring, sec, strip, sam,
preSamples, sampleRate,
ddl, addr, timebin);
}
Float_t
AliFMDParameters::GetEdepMip() const
{
if (fEdepMip <= 0){
AliFMDGeometry* fmd = AliFMDGeometry::Instance();
fEdepMip = (fkSiDeDxMip
* fmd->GetRing('I')->GetSiThickness()
* fmd->GetSiDensity());
}
return fEdepMip;
}
Float_t
AliFMDParameters::GetDACPerMIP() const
{
return 29.67;
}
AliFMDParameters.cxx:1000 AliFMDParameters.cxx:1001 AliFMDParameters.cxx:1002 AliFMDParameters.cxx:1003 AliFMDParameters.cxx:1004 AliFMDParameters.cxx:1005 AliFMDParameters.cxx:1006 AliFMDParameters.cxx:1007 AliFMDParameters.cxx:1008 AliFMDParameters.cxx:1009 AliFMDParameters.cxx:1010 AliFMDParameters.cxx:1011 AliFMDParameters.cxx:1012 AliFMDParameters.cxx:1013 AliFMDParameters.cxx:1014 AliFMDParameters.cxx:1015 AliFMDParameters.cxx:1016 AliFMDParameters.cxx:1017 AliFMDParameters.cxx:1018 AliFMDParameters.cxx:1019 AliFMDParameters.cxx:1020 AliFMDParameters.cxx:1021 AliFMDParameters.cxx:1022 AliFMDParameters.cxx:1023 AliFMDParameters.cxx:1024 AliFMDParameters.cxx:1025 AliFMDParameters.cxx:1026 AliFMDParameters.cxx:1027 AliFMDParameters.cxx:1028 AliFMDParameters.cxx:1029 AliFMDParameters.cxx:1030 AliFMDParameters.cxx:1031 AliFMDParameters.cxx:1032 AliFMDParameters.cxx:1033 AliFMDParameters.cxx:1034 AliFMDParameters.cxx:1035 AliFMDParameters.cxx:1036 AliFMDParameters.cxx:1037 AliFMDParameters.cxx:1038 AliFMDParameters.cxx:1039 AliFMDParameters.cxx:1040 AliFMDParameters.cxx:1041 AliFMDParameters.cxx:1042 AliFMDParameters.cxx:1043 AliFMDParameters.cxx:1044 AliFMDParameters.cxx:1045 AliFMDParameters.cxx:1046 AliFMDParameters.cxx:1047 AliFMDParameters.cxx:1048 AliFMDParameters.cxx:1049 AliFMDParameters.cxx:1050 AliFMDParameters.cxx:1051 AliFMDParameters.cxx:1052 AliFMDParameters.cxx:1053 AliFMDParameters.cxx:1054 AliFMDParameters.cxx:1055 AliFMDParameters.cxx:1056 AliFMDParameters.cxx:1057 AliFMDParameters.cxx:1058 AliFMDParameters.cxx:1059 AliFMDParameters.cxx:1060 AliFMDParameters.cxx:1061 AliFMDParameters.cxx:1062 AliFMDParameters.cxx:1063 AliFMDParameters.cxx:1064 AliFMDParameters.cxx:1065 AliFMDParameters.cxx:1066 AliFMDParameters.cxx:1067 AliFMDParameters.cxx:1068 AliFMDParameters.cxx:1069 AliFMDParameters.cxx:1070 AliFMDParameters.cxx:1071 AliFMDParameters.cxx:1072 AliFMDParameters.cxx:1073 AliFMDParameters.cxx:1074 AliFMDParameters.cxx:1075 AliFMDParameters.cxx:1076 AliFMDParameters.cxx:1077 AliFMDParameters.cxx:1078 AliFMDParameters.cxx:1079 AliFMDParameters.cxx:1080 AliFMDParameters.cxx:1081 AliFMDParameters.cxx:1082 AliFMDParameters.cxx:1083 AliFMDParameters.cxx:1084 AliFMDParameters.cxx:1085 AliFMDParameters.cxx:1086 AliFMDParameters.cxx:1087 AliFMDParameters.cxx:1088 AliFMDParameters.cxx:1089 AliFMDParameters.cxx:1090 AliFMDParameters.cxx:1091 AliFMDParameters.cxx:1092 AliFMDParameters.cxx:1093 AliFMDParameters.cxx:1094 AliFMDParameters.cxx:1095 AliFMDParameters.cxx:1096 AliFMDParameters.cxx:1097 AliFMDParameters.cxx:1098 AliFMDParameters.cxx:1099 AliFMDParameters.cxx:1100 AliFMDParameters.cxx:1101 AliFMDParameters.cxx:1102 AliFMDParameters.cxx:1103 AliFMDParameters.cxx:1104 AliFMDParameters.cxx:1105 AliFMDParameters.cxx:1106 AliFMDParameters.cxx:1107 AliFMDParameters.cxx:1108 AliFMDParameters.cxx:1109 AliFMDParameters.cxx:1110 AliFMDParameters.cxx:1111 AliFMDParameters.cxx:1112 AliFMDParameters.cxx:1113 AliFMDParameters.cxx:1114 AliFMDParameters.cxx:1115 AliFMDParameters.cxx:1116 AliFMDParameters.cxx:1117 AliFMDParameters.cxx:1118 AliFMDParameters.cxx:1119 AliFMDParameters.cxx:1120 AliFMDParameters.cxx:1121 AliFMDParameters.cxx:1122 AliFMDParameters.cxx:1123 AliFMDParameters.cxx:1124 AliFMDParameters.cxx:1125 AliFMDParameters.cxx:1126 AliFMDParameters.cxx:1127 AliFMDParameters.cxx:1128 AliFMDParameters.cxx:1129 AliFMDParameters.cxx:1130 AliFMDParameters.cxx:1131 AliFMDParameters.cxx:1132 AliFMDParameters.cxx:1133 AliFMDParameters.cxx:1134 AliFMDParameters.cxx:1135 AliFMDParameters.cxx:1136 AliFMDParameters.cxx:1137 AliFMDParameters.cxx:1138 AliFMDParameters.cxx:1139 AliFMDParameters.cxx:1140 AliFMDParameters.cxx:1141 AliFMDParameters.cxx:1142 AliFMDParameters.cxx:1143 AliFMDParameters.cxx:1144 AliFMDParameters.cxx:1145 AliFMDParameters.cxx:1146 AliFMDParameters.cxx:1147 AliFMDParameters.cxx:1148 AliFMDParameters.cxx:1149 AliFMDParameters.cxx:1150 AliFMDParameters.cxx:1151 AliFMDParameters.cxx:1152 AliFMDParameters.cxx:1153 AliFMDParameters.cxx:1154 AliFMDParameters.cxx:1155 AliFMDParameters.cxx:1156 AliFMDParameters.cxx:1157 AliFMDParameters.cxx:1158 AliFMDParameters.cxx:1159 AliFMDParameters.cxx:1160 AliFMDParameters.cxx:1161 AliFMDParameters.cxx:1162 AliFMDParameters.cxx:1163 AliFMDParameters.cxx:1164 AliFMDParameters.cxx:1165 AliFMDParameters.cxx:1166 AliFMDParameters.cxx:1167 AliFMDParameters.cxx:1168 AliFMDParameters.cxx:1169 AliFMDParameters.cxx:1170 AliFMDParameters.cxx:1171 AliFMDParameters.cxx:1172 AliFMDParameters.cxx:1173 AliFMDParameters.cxx:1174 AliFMDParameters.cxx:1175 AliFMDParameters.cxx:1176 AliFMDParameters.cxx:1177 AliFMDParameters.cxx:1178 AliFMDParameters.cxx:1179 AliFMDParameters.cxx:1180 AliFMDParameters.cxx:1181 AliFMDParameters.cxx:1182 AliFMDParameters.cxx:1183 AliFMDParameters.cxx:1184 AliFMDParameters.cxx:1185 AliFMDParameters.cxx:1186 AliFMDParameters.cxx:1187 AliFMDParameters.cxx:1188 AliFMDParameters.cxx:1189 AliFMDParameters.cxx:1190 AliFMDParameters.cxx:1191 AliFMDParameters.cxx:1192 AliFMDParameters.cxx:1193 AliFMDParameters.cxx:1194 AliFMDParameters.cxx:1195 AliFMDParameters.cxx:1196 AliFMDParameters.cxx:1197 AliFMDParameters.cxx:1198 AliFMDParameters.cxx:1199 AliFMDParameters.cxx:1200 AliFMDParameters.cxx:1201 AliFMDParameters.cxx:1202 AliFMDParameters.cxx:1203 AliFMDParameters.cxx:1204 AliFMDParameters.cxx:1205 AliFMDParameters.cxx:1206 AliFMDParameters.cxx:1207 AliFMDParameters.cxx:1208 AliFMDParameters.cxx:1209 AliFMDParameters.cxx:1210 AliFMDParameters.cxx:1211 AliFMDParameters.cxx:1212 AliFMDParameters.cxx:1213 AliFMDParameters.cxx:1214 AliFMDParameters.cxx:1215 AliFMDParameters.cxx:1216 AliFMDParameters.cxx:1217 AliFMDParameters.cxx:1218 AliFMDParameters.cxx:1219 AliFMDParameters.cxx:1220 AliFMDParameters.cxx:1221 AliFMDParameters.cxx:1222 AliFMDParameters.cxx:1223 AliFMDParameters.cxx:1224 AliFMDParameters.cxx:1225 AliFMDParameters.cxx:1226 AliFMDParameters.cxx:1227 AliFMDParameters.cxx:1228 AliFMDParameters.cxx:1229 AliFMDParameters.cxx:1230 AliFMDParameters.cxx:1231 AliFMDParameters.cxx:1232 AliFMDParameters.cxx:1233 AliFMDParameters.cxx:1234 AliFMDParameters.cxx:1235 AliFMDParameters.cxx:1236 AliFMDParameters.cxx:1237 AliFMDParameters.cxx:1238 AliFMDParameters.cxx:1239 AliFMDParameters.cxx:1240 AliFMDParameters.cxx:1241 AliFMDParameters.cxx:1242 AliFMDParameters.cxx:1243 AliFMDParameters.cxx:1244 AliFMDParameters.cxx:1245 AliFMDParameters.cxx:1246 AliFMDParameters.cxx:1247 AliFMDParameters.cxx:1248 AliFMDParameters.cxx:1249 AliFMDParameters.cxx:1250 AliFMDParameters.cxx:1251 AliFMDParameters.cxx:1252 AliFMDParameters.cxx:1253 AliFMDParameters.cxx:1254 AliFMDParameters.cxx:1255 AliFMDParameters.cxx:1256 AliFMDParameters.cxx:1257 AliFMDParameters.cxx:1258 AliFMDParameters.cxx:1259 AliFMDParameters.cxx:1260 AliFMDParameters.cxx:1261 AliFMDParameters.cxx:1262 AliFMDParameters.cxx:1263 AliFMDParameters.cxx:1264 AliFMDParameters.cxx:1265 AliFMDParameters.cxx:1266 AliFMDParameters.cxx:1267 AliFMDParameters.cxx:1268 AliFMDParameters.cxx:1269 AliFMDParameters.cxx:1270 AliFMDParameters.cxx:1271 AliFMDParameters.cxx:1272 AliFMDParameters.cxx:1273 AliFMDParameters.cxx:1274 AliFMDParameters.cxx:1275 AliFMDParameters.cxx:1276 AliFMDParameters.cxx:1277 AliFMDParameters.cxx:1278 AliFMDParameters.cxx:1279 AliFMDParameters.cxx:1280 AliFMDParameters.cxx:1281 AliFMDParameters.cxx:1282 AliFMDParameters.cxx:1283 AliFMDParameters.cxx:1284 AliFMDParameters.cxx:1285 AliFMDParameters.cxx:1286 AliFMDParameters.cxx:1287 AliFMDParameters.cxx:1288 AliFMDParameters.cxx:1289 AliFMDParameters.cxx:1290 AliFMDParameters.cxx:1291 AliFMDParameters.cxx:1292 AliFMDParameters.cxx:1293 AliFMDParameters.cxx:1294 AliFMDParameters.cxx:1295 AliFMDParameters.cxx:1296 AliFMDParameters.cxx:1297 AliFMDParameters.cxx:1298 AliFMDParameters.cxx:1299 AliFMDParameters.cxx:1300 AliFMDParameters.cxx:1301 AliFMDParameters.cxx:1302 AliFMDParameters.cxx:1303 AliFMDParameters.cxx:1304 AliFMDParameters.cxx:1305 AliFMDParameters.cxx:1306 AliFMDParameters.cxx:1307 AliFMDParameters.cxx:1308 AliFMDParameters.cxx:1309 AliFMDParameters.cxx:1310 AliFMDParameters.cxx:1311 AliFMDParameters.cxx:1312 AliFMDParameters.cxx:1313 AliFMDParameters.cxx:1314 AliFMDParameters.cxx:1315 AliFMDParameters.cxx:1316 AliFMDParameters.cxx:1317 AliFMDParameters.cxx:1318 AliFMDParameters.cxx:1319 AliFMDParameters.cxx:1320 AliFMDParameters.cxx:1321 AliFMDParameters.cxx:1322 AliFMDParameters.cxx:1323 AliFMDParameters.cxx:1324 AliFMDParameters.cxx:1325 AliFMDParameters.cxx:1326 AliFMDParameters.cxx:1327 AliFMDParameters.cxx:1328 AliFMDParameters.cxx:1329 AliFMDParameters.cxx:1330 AliFMDParameters.cxx:1331 AliFMDParameters.cxx:1332 AliFMDParameters.cxx:1333 AliFMDParameters.cxx:1334