X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDParameters.cxx;h=7142e26eeb13727c37e4f7754a68298140d35c2e;hb=222f9c453274e94711b82b98e9e856936fc3f52a;hp=bbed9b2f0e4d9c355a247d10688dd4f73fbf1839;hpb=cce354f6461eaffb98dca5dd52f01e3b384f8680;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDParameters.cxx b/FMD/AliFMDParameters.cxx index bbed9b2f0e4..7142e26eeb1 100644 --- a/FMD/AliFMDParameters.cxx +++ b/FMD/AliFMDParameters.cxx @@ -1,4 +1,4 @@ -/************************************************************************** +/************************************************************************* * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * @@ -11,13 +11,14 @@ * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * - **************************************************************************/ -/* $Id$ */ -/** @file AliFMDParameters.cxx - @author Christian Holm Christensen - @date Mon Mar 27 12:44:26 2006 - @brief Manager of FMD parameters -*/ + ************************************************************************* + * $Id$ */ +/** + * @file AliFMDParameters.cxx + * @author Christian Holm Christensen + * @date Mon Mar 27 12:44:26 2006 + * @brief Manager of FMD parameters + */ //____________________________________________________________________ // // Forward Multiplicity Detector based on Silicon wafers. @@ -73,7 +74,9 @@ const char* AliFMDParameters::fkConditionsShuttleID = "conditions"; AliFMDParameters* AliFMDParameters::Instance() { + // // Get static instance + // if (!fgInstance) fgInstance = new AliFMDParameters; return fgInstance; } @@ -86,17 +89,17 @@ AliFMDParameters::AliFMDParameters() fAltroChannelSize(0), fChannelsPerAltro(0), fPedestalFactor(0), - fZSPre(0), - fZSPost(0), - fZSPedSubtract(kFALSE), - fFixedPedestal(0), - fFixedPedestalWidth(0), - fFixedZeroSuppression(0), - fFixedSampleRate(0), + fZSPre(1), + fZSPost(1), + fZSPedSubtract(kTRUE), + fFixedPedestal(100), + fFixedPedestalWidth(2), + fFixedZeroSuppression(1), + fFixedSampleRate(2), fFixedThreshold(0), fFixedMinStrip(0), - fFixedMaxStrip(0), - fFixedPulseGain(0), + fFixedMaxStrip(127), + fFixedPulseGain(2), fEdepMip(0), fHasCompleteHeader(kTRUE), fZeroSuppression(0), @@ -107,7 +110,9 @@ AliFMDParameters::AliFMDParameters() fAltroMap(0), fStripRange(0) { + // // Default constructor + // SetVA1MipRange(); SetAltroChannelSize(); SetChannelsPerAltro(); @@ -118,6 +123,7 @@ AliFMDParameters::AliFMDParameters() SetPedestalFactor(); SetThreshold(); SetStripRange(); + SetGain(); fAltroMap = new AliFMDAltroMapping; } @@ -125,8 +131,14 @@ AliFMDParameters::AliFMDParameters() void AliFMDParameters::Init(Bool_t forceReInit, UInt_t what) { - // Initialize the parameters manager. We need to get stuff from the - // CDB here. + // + // Initialize the manager. This tries to read the parameters from + // CDB. If that fails, the class uses the hard-coded parameters. + // + // Parameters: + // forceReInit Force (re-)initalize flag + // what What to initialize + // if (forceReInit) fIsInit = kFALSE; if (fIsInit) return; if (what & kPulseGain) InitPulseGain(); @@ -142,8 +154,15 @@ AliFMDParameters::Init(Bool_t forceReInit, UInt_t what) void AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what) { - // Initialize the parameters manager. We need to get stuff from the - // CDB here. + // + // Initialize the manager. This tries to read the parameters from + // CDB. If that fails, the class uses the hard-coded parameters. + // + // Parameters: + // pp Preprocessor + // forceReInit Force (re-)initalize flag + // what What to initialize + // if (forceReInit) fIsInit = kFALSE; if (fIsInit) return; if (what & kPulseGain) InitPulseGain(pp); @@ -156,6 +175,137 @@ AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what) fIsInit = kTRUE; } +//__________________________________________________________________ +Bool_t +AliFMDParameters::CheckFile(const char* prefix, + const char* path, + int number, + TString& f) const +{ + // + // Check if the file prefixnumber exists in @a path, + // and write the full path to @a f. + // + // Parameters: + // prefix File prefix (cond, peds, gains, ...) + // path Path to files + // number Detector number (1, 2, or 3) + // f On return full path to file (if found) + // + // Return: + // @c true if file exists and is readable, @c false otherwise + // + 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(); +} + +//__________________________________________________________________ +void +AliFMDParameters::Init(const char* path, Bool_t forceReInit, UInt_t what) +{ + // + // Initialize the manager. This will try to read some calibrations + // (sample rate, strip range, gains, pedestals) from local comma + // separated value (CSV) files in the directory pointed at by @a + // path. If they are not found, then they will be retrieved from + // OCDB as appropriately. Other calibrations are always read from + // OCDB. + // + // The CSV files should be named as + // + // - Pedestals: pedsdet_number.csv + // - Gains: gainsdet_number.csv + // - Sample Rate: conditionsdet_number.csv + // - Strip Range: conditionsdet_number.csv + // + // where det_number is the detector number (1, 2, or 3). + // + // Parameters: + // path Where to look for the CSV files + // forceReInit Always reinitialise + // what What calibrations to load. + // + if (forceReInit) fIsInit = kFALSE; + if (fIsInit) return; + + 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; + + Init(kFALSE, what); + + if (range) SetStripRange(range); + if (rate) SetSampleRate(rate); + if (peds) SetPedestal(peds); + if (gains) SetGain(gains); + + fIsInit = kTRUE; +} + +//__________________________________________________________________ +void +AliFMDParameters::MakeDeadMap(Float_t maxNoise, + Float_t minGain, + Float_t maxGain) +{ + // + // Automatically generate a dead map from the pedestals and gains. + // A channel is marked as dead of the noise is too high (currently + // more than 10 ADC counts), or the gain is unreasonable (currently + // larger than 10, or smaller than 0.1). + // + // The procedure does not overwrite channels previously marked as + // dead - e.g., channels marked as dead in the calibration loaded + // from OCDB will continue to be marked as dead. That is, this + // procedure will never make a channel un-dead. + // + // Parameters: + // maxNoise Maximum noise value before a channel is marked + // as dead. + // minGain Minimum value of the calibrated gain before a + // channel is considered dead. + // maxGain Maximum value of the calibrated gain before a + // channel is considered dead. + // + 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) @@ -164,6 +314,22 @@ AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what) void AliFMDParameters::Draw(Option_t* option) { + // + // Draw parameters. + // + // Parameters: + // option What to draw. Should be one of + // - dead Dead channels + // - threshold Threshold + // - gain Gain + // - pedestal Pedestal + // - noise Noise (or pedestal width) + // - zero Zero suppression + // - rate Sampling rate (VA1 clock / ALTRO clock) + // - min Minimum strip read out + // - max Maximum strip read out + // - map hardware address + // TString opt(option); enum { kLocalPulseGain, // Path to PulseGain calib object @@ -251,7 +417,7 @@ AliFMDParameters::Draw(Option_t* option) for (UShort_t sec = 0; sec < nSector; sec++) { for (UShort_t str = 0; str < nStrip; str++) { Int_t idx = DET2IDX(det, ring, sec, str); - UInt_t ddl, addr; + UShort_t ddl, addr, time, sam=0; Double_t val = 0; switch (what) { case kLocalPulseGain: // Path to PulseGain calib object @@ -267,7 +433,7 @@ AliFMDParameters::Draw(Option_t* option) case kLocalSampleRate: // Path to SampleRate calib object val = GetSampleRate(det,ring,sec,str); break; case kLocalAltroMap: // Path to AltroMap calib object - Detector2Hardware(det,ring,sec,str, ddl, addr); + Detector2Hardware(det,ring,sec,str,sam,ddl,addr,time); val = addr; break; case kLocalZeroSuppression: // Path to ZeroSuppression cal object val = GetZeroSuppression(det,ring,sec,str); break; @@ -435,8 +601,8 @@ AliFMDParameters::Print(Option_t* option) const std::cout << "dead" << std::endl; continue; } - UInt_t ddl, addr; - Detector2Hardware(det, ring, sec, str, ddl, addr); + 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) @@ -457,21 +623,22 @@ AliFMDParameters::Print(Option_t* option) const } -//__________________________________________________________________ -void -AliFMDParameters::SetStripRange(UShort_t min, UShort_t max) -{ - // Set fixed strip range - fFixedMinStrip = min; - fFixedMaxStrip = max; -} - //__________________________________________________________________ AliCDBEntry* AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp, Bool_t fatal) const { - // Get an entry from the CDB or via preprocessor + // + // Get an entry from either global AliCDBManager or passed + // AliFMDPreprocessor. + // + // Parameters: + // path Path to CDB object. + // pp AliFMDPreprocessor + // fatal If true, raise a fatal flag if we didn't get the entry. + // Return: + // AliCDBEntry if found + // AliCDBEntry* entry = 0; if (!pp) { AliCDBManager* cdb = AliCDBManager::Instance(); @@ -491,6 +658,12 @@ AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp, __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; } @@ -499,70 +672,114 @@ AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp, void AliFMDParameters::InitPulseGain(AliFMDPreprocessor* pp) { - // Get pulse gain from CDB or used fixed + // + // Initialize gains. Try to get them from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* gain = GetEntry(fgkPulseGain, pp); if (!gain) return; AliFMDDebug(5, ("Got gain from CDB")); fPulseGain = dynamic_cast(gain->GetObject()); if (!fPulseGain) AliFatal("Invalid pulser gain object from CDB"); + if (!fPulseGain->Values().Ptr()) + AliFatal("Empty pulser gain object from CDB"); } //__________________________________________________________________ void AliFMDParameters::InitPedestal(AliFMDPreprocessor* pp) { - // Initialize the pedestals from CDB + // + // Initialize pedestals. Try to get them from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* pedestal = GetEntry(fgkPedestal, pp); if (!pedestal) return; AliFMDDebug(5, ("Got pedestal from CDB")); fPedestal = dynamic_cast(pedestal->GetObject()); if (!fPedestal) AliFatal("Invalid pedestal object from CDB"); + if (!fPedestal->Values().Ptr()) AliFatal("Empty pedestal object from CDB"); } //__________________________________________________________________ void AliFMDParameters::InitDeadMap(AliFMDPreprocessor* pp) { - // Get Dead-channel-map from CDB + // + // Initialize dead map. Try to get it from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* deadMap = GetEntry(fgkDead, pp); if (!deadMap) return; AliFMDDebug(5, ("Got dead map from CDB")); fDeadMap = dynamic_cast(deadMap->GetObject()); if (!fDeadMap) AliFatal("Invalid dead map object from CDB"); + if (!fDeadMap->Ptr()) AliFatal("Empty dead map object from CDB"); } //__________________________________________________________________ void AliFMDParameters::InitZeroSuppression(AliFMDPreprocessor* pp) { - // Get 0-suppression from CDB + // + // Initialize zero suppression thresholds. Try to get them from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* zeroSup = GetEntry(fgkZeroSuppression, pp); if (!zeroSup) return; AliFMDDebug(5, ("Got zero suppression from CDB")); fZeroSuppression = dynamic_cast(zeroSup->GetObject()); if (!fZeroSuppression)AliFatal("Invalid zero suppression object from CDB"); + 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; + } } //__________________________________________________________________ void AliFMDParameters::InitSampleRate(AliFMDPreprocessor* pp) { - // get Sample rate from CDB + // + // Initialize sample rates. Try to get them from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* sampRat = GetEntry(fgkSampleRate, pp); if (!sampRat) return; AliFMDDebug(5, ("Got zero suppression from CDB")); fSampleRate = dynamic_cast(sampRat->GetObject()); - if (!fSampleRate) AliFatal("Invalid zero suppression object from CDB"); + if (!fSampleRate) AliFatal("Invalid sample rate object from CDB"); + if (!fSampleRate->Rates().Ptr()) + AliFatal("empty sample rate object from CDB"); } //__________________________________________________________________ void AliFMDParameters::InitAltroMap(AliFMDPreprocessor* pp) { - // Get hardware mapping from CDB + // + // Initialize hardware map. Try to get it from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // if (fAltroMap) { delete fAltroMap; fAltroMap = 0; @@ -582,12 +799,19 @@ AliFMDParameters::InitAltroMap(AliFMDPreprocessor* pp) void AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp) { - // Get strips read-out from CDB + // + // Initialize strip range. Try to get it from CDB + // + // Parameters: + // pp Pre-processor if called from shuttle + // AliCDBEntry* range = GetEntry(fgkStripRange, pp); if (!range) return; AliFMDDebug(5, ("Got strip range from CDB")); fStripRange = dynamic_cast(range->GetObject()); if (!fStripRange) AliFatal("Invalid strip range object from CDB"); + if (!fStripRange->Ranges().Ptr()) + AliFatal("Empty strip range object from CDB"); } @@ -595,7 +819,13 @@ AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp) Float_t AliFMDParameters::GetThreshold() const { - // Get threshold from CDB + // + // Get the threshold in the pulser gain + // + // + // Return: + // Threshold from pulser + // if (!fPulseGain) return fFixedThreshold; return fPulseGain->Threshold(); } @@ -605,15 +835,25 @@ Float_t AliFMDParameters::GetPulseGain(UShort_t detector, Char_t ring, UShort_t sector, UShort_t strip) const { - // Returns the pulser calibrated gain for strip # strip in sector # - // sector or ring id ring of detector # detector. // - // For simulation, this is normally set to + // Gain of pre-amp. for strip, sector, ring, detector + // + // For simulations this is normally set to + // + // @f[ + // \frac{\mbox{VA1_MIP_Range}{\mbox{ALTRO_channel_size}}\mbox{MIP_Energy_Loss} + // @f] // - // VA1_MIP_Range - // ------------------ * MIP_Energy_Loss - // ALTRO_channel_size // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // Gain of pre-amp. + // if (!fPulseGain) { if (fFixedPulseGain <= 0) fFixedPulseGain = fVA1MipRange * GetEdepMip() / fAltroChannelSize; @@ -630,7 +870,19 @@ Bool_t AliFMDParameters::IsDead(UShort_t detector, Char_t ring, UShort_t sector, UShort_t strip) const { - // Check if the channel is dead + // + // Whether the strip is considered dead + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // @c true if the strip is considered dead, @c false if it's + // OK. + // if (!fDeadMap) return kFALSE; AliFMDDebug(50, ("Dead for FMD%d%c[%2d,%3d]=%s", detector, ring, sector, strip, @@ -644,10 +896,26 @@ UShort_t AliFMDParameters::GetZeroSuppression(UShort_t detector, Char_t ring, UShort_t sector, UShort_t strip) const { - // Get zero suppression threshold + // + // zero suppression threshold (in ADC counts) + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // zero suppression threshold (in ADC counts) + // if (!fZeroSuppression) return fFixedZeroSuppression; + + // In case of empty zero suppression objects. + if (!fZeroSuppression->Ptr() || + fZeroSuppression->MaxIndex() <= 0) return fFixedZeroSuppression; + // Need to map strip to ALTRO chip. - AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%f", + AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%d", detector, ring, sector, strip, fZeroSuppression->operator()(detector, ring, sector, strip))); @@ -659,7 +927,18 @@ UShort_t AliFMDParameters::GetSampleRate(UShort_t det, Char_t ring, UShort_t sector, UShort_t str) const { - // Get sampl rate + // + // Get the sampling rate + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // The sampling rate + // if (!fSampleRate) return fFixedSampleRate; // Need to map sector to digitizier card. UInt_t ret = fSampleRate->Rate(det, ring, sector, str); @@ -673,7 +952,18 @@ UShort_t AliFMDParameters::GetMinStrip(UShort_t det, Char_t ring, UShort_t sector, UShort_t str) const { - // Get strip range read out + // + // Get the minimum strip in the read-out range + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // Minimum strip + // if (!fStripRange) return fFixedMinStrip; // Need to map sector to digitizier card. UInt_t ret = fStripRange->Min(det, ring, sector, str); @@ -687,7 +977,18 @@ UShort_t AliFMDParameters::GetMaxStrip(UShort_t det, Char_t ring, UShort_t sector, UShort_t str) const { - // Get strip range read out + // + // Get the maximum strip in the read-out range + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // Maximum strip + // if (!fStripRange) return fFixedMaxStrip; // Need to map sector to digitizier card. UInt_t ret = fStripRange->Max(det, ring, sector, str); @@ -701,7 +1002,18 @@ Float_t AliFMDParameters::GetPedestal(UShort_t detector, Char_t ring, UShort_t sector, UShort_t strip) const { - // Get the pedesal + // + // Get mean of pedestal + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // Mean of pedestal + // if (!fPedestal) return fFixedPedestal; AliFMDDebug(50, ("pedestal for FMD%d%c[%2d,%3d]=%f", detector, ring, sector, strip, @@ -714,7 +1026,18 @@ Float_t AliFMDParameters::GetPedestalWidth(UShort_t detector, Char_t ring, UShort_t sector, UShort_t strip) const { - // Get the pedesal + // + // Width of pedestal + // + // Parameters: + // detector Detector # (1-3) + // ring Ring ID ('I' or 'O') + // sector Sector number (0-39) + // strip Strip number (0-511) + // + // Return: + // Width of pedestal + // if (!fPedestal) return fFixedPedestalWidth; AliFMDDebug(50, ("pedetal width for FMD%d%c[%2d,%3d]=%f", detector, ring, sector, strip, @@ -726,90 +1049,135 @@ AliFMDParameters::GetPedestalWidth(UShort_t detector, Char_t ring, AliFMDAltroMapping* AliFMDParameters::GetAltroMap() const { - // Get the hardware address to detector index map + // + // Get the map that translates hardware to detector coordinates + // + // Return: + // Get the map that translates hardware to detector + // coordinates + // return fAltroMap; } //____________________________________________________________________ Bool_t -AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t addr, +AliFMDParameters::Hardware2Detector(UShort_t ddl, UShort_t addr, UShort_t timebin, - UShort_t& det, Char_t& ring, + UShort_t& det, Char_t& ring, UShort_t& sec, Short_t& str, UShort_t& sam) const { - // Translate a hardware address to detector coordinates. // - // See also Hardware2Detector that accepts 4 inputs - if (!Hardware2Detector(ddl, addr, det, ring, sec, str)) return kFALSE; - UShort_t preSamples = GetPreSamples(det, ring, sec, str); - UShort_t sampleRate = GetSampleRate(det, ring, sec, str); - if (!fAltroMap->Hardware2Detector(ddl, addr, timebin, - preSamples, sampleRate, - det, ring, sec, str, sam)) return kFALSE; - AliFMDDebug(50, ("%d/0x%02x/0x%x/0x%x/%04d -> FMD%d%c[%02d,%03d]-%d" - " (pre=%2d, rate=%d)", - ddl, ((addr >> 7) & 0x1F), ((addr >> 4) & 0x7), addr & 0xF, - timebin, det, ring, sec, str, sam, preSamples, sampleRate)); - // str += GetMinStrip(det,ring,sec,str); - return kTRUE; - + // Map a hardware address into a detector index. + // + // Parameters: + // ddl Hardware DDL number + // addr Hardware address. + // timebin Timebin + // det On return, the detector # + // ring On return, the ring ID + // sec On return, the sector # + // str On return, the base of strip # + // sam On return, the sample number for this strip + // + // Return: + // @c true on success, false otherwise + // + 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(UInt_t ddl, UInt_t board, - UInt_t chip, UInt_t chan, +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 { - // Translate a hardware address to detector coordinates. // - // See also Hardware2Detector that accepts 4 inputs - if (!Hardware2Detector(ddl,board,chip,chan,det,ring,sec,str)) return kFALSE; - UShort_t preSamples = GetPreSamples(det, ring, sec, str); - UShort_t sampleRate = GetSampleRate(det, ring, sec, str); - if (!fAltroMap->Hardware2Detector(ddl, board, chip, chan, timebin, - preSamples, sampleRate, - det, ring, sec, str, sam)) return kFALSE; - // str += GetMinStrip(det,ring,sec,str); + // Map a hardware address into a detector index. + // + // Parameters: + // ddl Hardware DDL number + // board FEC number + // altro ALTRO number + // channel Channel number + // timebin Timebin + // det On return, the detector # + // ring On return, the ring ID + // sec On return, the sector # + // str On return, the base of strip # + // sam On return, the sample number for this strip + // + // Return: + // @c true on success, false otherwise + // + 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::Hardware2Detector(UInt_t ddl, UInt_t board, - UInt_t chip, UInt_t chan, - UShort_t& det, Char_t& ring, - UShort_t& sec, Short_t& str) const -{ - // Map hardware address to detector index - if (!fAltroMap) return kFALSE; - return fAltroMap->Hardware2Detector(ddl,board,chip,chan, det,ring,sec,str); -} -//__________________________________________________________________ -Bool_t -AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t addr, - UShort_t& det, Char_t& ring, - UShort_t& sec, Short_t& str) const -{ - // Map hardware address to detector index - if (!fAltroMap) return kFALSE; - return fAltroMap->Hardware2Detector(ddl, addr, det, ring, sec, str); -} //____________________________________________________________________ Bool_t AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, UShort_t sam, - UInt_t& ddl, UInt_t& board, - UInt_t& altro, UInt_t& channel, + UShort_t& ddl, UShort_t& board, + UShort_t& altro, UShort_t& channel, UShort_t& timebin) const { - if (!fAltroMap) return kFALSE; + // + // Map a detector index into a hardware address. + // + // Parameters: + // det The detector # + // ring The ring ID + // sec The sector # + // str The strip # + // sam The sample number + // ddl On return, hardware DDL number + // board On return, the FEC board address (local to DDL) + // altro On return, the ALTRO number (local to FEC) + // channel On return, the channel number (local to ALTRO) + // timebin On return, the timebin number (local to ALTRO) + // + // Return: + // @c true on success, false otherwise + // + 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); @@ -820,26 +1188,30 @@ AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, -//__________________________________________________________________ -Bool_t -AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, - UShort_t sec, UShort_t str, - UInt_t& ddl, UInt_t& board, - UInt_t& chip, UInt_t& chan) const -{ - // Map detector index to hardware address - if (!fAltroMap) return kFALSE; - return fAltroMap->Detector2Hardware(det,ring,sec,str, ddl,board,chip,chan); -} - //____________________________________________________________________ Bool_t AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, UShort_t sam, - UInt_t& ddl, UInt_t& addr, + UShort_t& ddl, UShort_t& addr, UShort_t& timebin) const { + // + // Map a detector index into a hardware address. + // + // Parameters: + // det The detector # + // ring The ring ID + // sec The sector # + // str The strip # + // sam The sample number + // ddl On return, hardware DDL number + // addr On return, hardware address. + // timebin On return, the timebin number (local to ALTRO) + // + // Return: + // @c true on success, false otherwise + // if (!fAltroMap) return kFALSE; UShort_t preSamples = GetPreSamples(det, ring, sec, str); UShort_t sampleRate = GetSampleRate(det, ring, sec, str); @@ -849,23 +1221,15 @@ AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, ddl, addr, timebin); } -//__________________________________________________________________ -Bool_t -AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, - UShort_t sec, UShort_t str, - UInt_t& ddl, UInt_t& addr) const -{ - // Map detector index to hardware address - if (!fAltroMap) return kFALSE; - return fAltroMap->Detector2Hardware(det, ring, sec, str, ddl, addr); -} - //__________________________________________________________________ Float_t AliFMDParameters::GetEdepMip() const { - // Get energy deposited by a MIP in the silicon sensors + // + // Return: + // The average energy deposited by one MIP + // if (fEdepMip <= 0){ AliFMDGeometry* fmd = AliFMDGeometry::Instance(); fEdepMip = (fkSiDeDxMip @@ -874,11 +1238,22 @@ AliFMDParameters::GetEdepMip() const } return fEdepMip; } - - - - +//____________________________________________________________________ +Float_t +AliFMDParameters::GetDACPerMIP() const +{ + // + // This is the conversion from Digital-to-Analog-Converter setting + // to the number of MIPs. The number was measured in the NBI lab during + // August 2008. + // + // Return: + // The conversion factor from DAC to ADC + // + return 29.67; +} + //____________________________________________________________________ // // EOF