#ifndef ALIFMDALTROMAPPING_H #define ALIFMDALTROMAPPING_H /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights * reserved. * * Latest changes by Christian Holm Christensen * * See cxx source for full Copyright notice */ /** @file AliFMDAltroMapping.h @author Christian Holm Christensen @date Sun Mar 26 18:28:11 2006 @brief Map HW address to detector coordinates and back again. */ #ifndef ALIALTROMAPPING_H # include #endif // // Map hardware address to detector coordinates. // // The hardware address consist of a DDL number and 12bits of ALTRO // addresses. The ALTRO address are formatted as follows. // // 12 7 4 0 // |---------------|---------|------------| // | Board # | ALTRO # | Channel # | // +---------------+---------+------------+ // // //____________________________________________________________________ /** @class AliFMDAltroMapping @brief Class that encodes a map to/from ALTRO hardware address to FMD detector coordinates. The hardware address consist of a DDL number and 12bits of ALTRO addresses. The ALTRO address are formatted as follows. @verbatim 12 7 4 0 |---------------|---------|------------| | Board # | ALTRO # | Channel # | +---------------+---------+------------+ @endverbatim @ingroup FMD_base */ class AliFMDAltroMapping : public AliAltroMapping { public: /** * Constructor */ AliFMDAltroMapping(); /** * Destructor */ virtual ~AliFMDAltroMapping() {} /** * Return detector number corresponding to given DDL number * * @param ddl DDL number * @return Detector number */ Short_t DDL2Detector(UInt_t ddl) const { return (ddl<=2 ? Short_t(ddl + 1) : -1); } /** * Return the ring identifier corresponding to a board number * * @param board Board number * @return Ring identifier */ Char_t Board2Ring(UShort_t board) const { return (board%2)?'O':'I'; } /** * Return the strip base number corresponding to a channel address * * @param board Board number * @param altro Altro number * @param channel Channel number * @param ring On return, the ring ID * @param sec On return, the sector number * @param strip On return, the strip base offset * @return @c true on success */ Bool_t Channel2StripBase(UShort_t board, UShort_t altro, UShort_t chan, Char_t& ring, UShort_t& sec, Short_t& str) const; /** * Return the strip, sample corresponding to a timebin * * @param sec Sector * @param timebin Time bin * @param preSamples Number of pre-samples * @param sampleRate Oversampling rate * @param strip On return, the strip number in this channel * @param sam On return, the sample number */ void Timebin2Strip(UShort_t sec, UShort_t timebin, UShort_t preSamples, UShort_t sampleRate, Short_t& strip, UShort_t& sample) const; /** * Map a hardware address into a detector index. * * @param ddl Hardware DDL number * @param hwaddr Hardware address. * @param timebin Timebin * @param preSamples # of pre samples * @param sampleRate Over sampling rate * @param det On return, the detector # * @param ring On return, the ring ID * @param sec On return, the sector # * @param str On return, the base of strip # * @param sam On return, the sample number for this strip * @return @c true on success, false otherwise */ Bool_t Hardware2Detector(UShort_t ddl, UShort_t hwaddr, UShort_t timebin, UShort_t preSamples, UShort_t sampleRate, UShort_t& det, Char_t& ring, UShort_t& sec, Short_t& str, UShort_t& sam) const; /** * Map a hardware address into a detector index. * * @param ddl Hardware DDL number * @param board FEC number * @param altro ALTRO number * @param channel Channel number * @param timebin Timebin * @param preSamples # of pre samples * @param sampleRate Over sampling rate * @param det On return, the detector # * @param ring On return, the ring ID * @param sec On return, the sector # * @param str On return, the base of strip # * @param sam On return, the sample number for this strip * @return @c true on success, false otherwise */ Bool_t Hardware2Detector(UShort_t ddl, UShort_t board, UShort_t altro, UShort_t chan, UShort_t timebin, UShort_t preSamples, UShort_t sampleRate, UShort_t& det, Char_t& ring, UShort_t& sec, Short_t& str, UShort_t& sam) const; /** * Return DDL number corresponding to given detector number * * @param det Detector number * @return DDL number */ UShort_t Detector2DDL(UShort_t det) const { return det - 1; } /** * Return board address corresponding to a sector * * @param ring Ring identifier * @param sec Sector number * @return The board number, or negative number in case of failure */ Short_t Sector2Board(Char_t ring, UShort_t sec) const; /** * Convert strip address to a channel address. * * @param ring Ring identifier * @param sec Sector number * @param str Strip number * @param board On return, contains the board number * @param altro On return, contains the altro number * @param chan On return, contains the channel number * @return @c true on success. */ Bool_t Strip2Channel(Char_t ring, UShort_t sec, UShort_t str, UShort_t& board, UShort_t& altro, UShort_t& chan) const; /** * Get the timebin correspoding to a strip and sample * * @param sec Sector number * @param str Strip number * @param sam Sample number * @param preSamples Number of pre-samples. * @param sampleRate The over-sampling rate * @return the timebin corresponding to the passed strip */ UShort_t Strip2Timebin(UShort_t sec, UShort_t strip, UShort_t sam, UShort_t preSamples, UShort_t sampleRate) const; /** * Map a detector index into a hardware address. * * @param det The detector # * @param ring The ring ID * @param sec The sector # * @param str The strip # * @param sam The sample number * @param preSamples Number of pre-samples * @param sampleRate The oversampling rate * @param ddl On return, hardware DDL number * @param board On return, the FEC board address (local to DDL) * @param altro On return, the ALTRO number (local to FEC) * @param channel On return, the channel number (local to ALTRO) * @param timebin On return, the timebin number (local to ALTRO) * @return @c true on success, false otherwise */ Bool_t Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, UShort_t sam, UShort_t preSamples, UShort_t sampleRate, UShort_t& ddl, UShort_t& board, UShort_t& altro, UShort_t& channel, UShort_t& timebin) const; /** * Map a detector index into a hardware address. * * @param det The detector # * @param ring The ring ID * @param sec The sector # * @param str The strip # * @param sam The sample number * @param preSamples Number of pre-samples * @param sampleRate The oversampling rate * @param ddl On return, hardware DDL number * @param hwaddr On return, hardware address. * @param timebin On return, the timebin number (local to ALTRO) * @return @c true on success, false otherwise */ Bool_t Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, UShort_t sam, UShort_t preSamples, UShort_t sampleRate, UShort_t& ddl, UShort_t& hwaddr, UShort_t& timebin) const; /** * Convert board, chip, channel to a hardware address * * @param board Board number * @param altro Altro number * @param channel Channel number * @return hardware address of a channel */ UInt_t ChannelAddress(UShort_t board, UShort_t altro, UShort_t channel) const; /** * Convert a channel address to board, altro, channel fields * * @param hwaddr Channel address * @param board On return, the Board number * @param altro On return, the Altro number * @param channel On return, the Channel number */ void ChannelAddress(UShort_t hwaddr, UShort_t& board, UShort_t& altro, UShort_t& channel) const; /** * convert a partial detector index into a hardware address * * @param sector Sector number * @param str Strip number * @param ring Ring ID as an integer * @return Hardware address */ Int_t GetHWAddress(Int_t sector, Int_t str, Int_t ring); /** * Get the pad-row (or sector) corresponding to hardware address * * @param hwaddr hardware address * @return Sector number */ Int_t GetPadRow(Int_t hwaddr) const; /** * Get the pad (or strip) corresponding to hardware address * * @param hwaddr hardware address * @return Strip number */ Int_t GetPad(Int_t hwaddr) const; /** * Get the sector (or ring) corresponding to hardware address * * @param hwaddr hardware address * @return Ring ID as an integer */ Int_t GetSector(Int_t hwaddr) const; /** * Print map to standard out * * @param option Option string (hw, or det) */ void Print(Option_t* option="hw") const; protected: /** * Read map from file - not used * * @return @c true on success */ virtual Bool_t ReadMapping(); /** * Create the inverse mapping arrays */ virtual Bool_t CreateInvMapping(); ClassDef(AliFMDAltroMapping, 2) // Read raw FMD Altro data }; #endif //____________________________________________________________________ // // Local Variables: // mode: C++ // End: // // EOF //