-/**************************************************************************
+/*************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
* 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 <cholm@nbi.dk>
- @date Mon Mar 27 12:44:26 2006
- @brief Manager of FMD parameters
-*/
+ *************************************************************************
+ * $Id$ */
+/**
+ * @file AliFMDParameters.cxx
+ * @author Christian Holm Christensen <cholm@nbi.dk>
+ * @date Mon Mar 27 12:44:26 2006
+ * @brief Manager of FMD parameters
+ */
//____________________________________________________________________
//
// Forward Multiplicity Detector based on Silicon wafers.
AliFMDParameters*
AliFMDParameters::Instance()
{
+ //
// Get static instance
+ //
if (!fgInstance) fgInstance = new AliFMDParameters;
return fgInstance;
}
fAltroMap(0),
fStripRange(0)
{
+ //
// Default constructor
+ //
SetVA1MipRange();
SetAltroChannelSize();
SetChannelsPerAltro();
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();
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);
int number,
TString& f) const
{
+ //
+ // Check if the file <i>prefix</i><i>number</i> 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());
void
AliFMDParameters::Init(const char* path, Bool_t forceReInit, UInt_t what)
{
- // Initialize the parameters manager. Pedestals, gains, strip
- // range, and sample rate is read from local comma separated value
- // files if available. Otherwise, the calibrations are obtained
- // from OCDB.
+ //
+ // 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: <tt>peds</tt><i>det_number</i><tt>.csv</tt>
+ // - Gains: <tt>gains</tt><i>det_number</i><tt>.csv</tt>
+ // - Sample Rate: <tt>conditions</tt><i>det_number</i><tt>.csv</tt>
+ // - Strip Range: <tt>conditions</tt><i>det_number</i><tt>.csv</tt>
+ //
+ // where <i>det_number</i> 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;
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)
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
}
-//__________________________________________________________________
-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();
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;
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;
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;
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"));
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"));
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;
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"));
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();
}
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;
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,
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;
// 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)));
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);
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);
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);
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,
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,
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;
}
UShort_t& sec, Short_t& str,
UShort_t& sam) const
{
- // Translate a hardware address to detector coordinates.
//
- // See also Hardware2Detector that accepts 4 inputs
+ // 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);
}
//____________________________________________________________________
Bool_t
-AliFMDParameters::Hardware2Detector(UShort_t ddl, UShort_t board,
- UShort_t chip, UShort_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 (!fAltroMap) return kFALSE;
- if (fAltroMap->DDL2Detector(ddl) < 0) return kFALSE;
+ // 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))
+ 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;
return kTRUE;
}
-#if 0
-//__________________________________________________________________
-Bool_t
-AliFMDParameters::Hardware2Detector(UShort_t ddl, UShort_t board,
- UShort_t chip, UShort_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(UShort_t ddl, UShort_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);
-}
-#endif
//____________________________________________________________________
Bool_t
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);
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);
ddl, addr, timebin);
}
-#if 0
-//__________________________________________________________________
-Bool_t
-AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring,
- UShort_t sec, UShort_t str,
- UShort_t& ddl, UShort_t& board,
- UShort_t& chip, UShort_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& ddl, UShort_t& addr) const
-{
- // Map detector index to hardware address
- if (!fAltroMap) return kFALSE;
- return fAltroMap->Detector2Hardware(det, ring, sec, str, ddl, addr);
-}
-#endif
//__________________________________________________________________
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
Float_t
AliFMDParameters::GetDACPerMIP() const
{
- //This is the conversion from the Digital-to-Analog-Converter setting
+ //
+ // 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;
}