X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=FMD%2FAliFMDParameters.h;h=c8c05127d486dfa82de704492ba24ee077a29890;hp=0de6b7610444d2d47bb21b2d3ad2047ed382b06a;hb=dcc2ade075ecd6298757d84b65bdd14ca92f42f6;hpb=362c9d61708912a81d77cb017e1d05fd1f9486a6 diff --git a/FMD/AliFMDParameters.h b/FMD/AliFMDParameters.h index 0de6b761044..c8c05127d48 100644 --- a/FMD/AliFMDParameters.h +++ b/FMD/AliFMDParameters.h @@ -37,6 +37,9 @@ class AliFMDCalibGain; class AliFMDCalibSampleRate; class AliFMDCalibStripRange; class AliFMDAltroMapping; +class AliCDBEntry; +class AliFMDPreprocessor; + //____________________________________________________________________ // // Singleton class to handle various parameters (not geometry) of the @@ -75,6 +78,28 @@ class AliFMDAltroMapping; class AliFMDParameters : public TNamed { public: + /** Enumeration of things to initialize */ + enum What { + /** Pulser gain */ + kPulseGain = 0x1, // Pulser gain + /** Pedestals and noise */ + kPedestal = 0x2, // Pedestal and noise + /** Dead channel map */ + kDeadMap = 0x4, // Dead channel map + /** Over sampling rate */ + kSampleRate = 0x8, // Over sampling rate + /** Zero suppression parameters */ + kZeroSuppression = 0x10, // Zero suppression parameters + /** ALTRO data map */ + kAltroMap = 0x20, // Altro channel map + /** Strip Range */ + kStripRange = 0x40 //Strip range, + }; + enum { + kAll = (kPulseGain|kPedestal|kDeadMap|kSampleRate| + kZeroSuppression|kAltroMap|kStripRange) + }; + /** Singleton access @return single to */ static AliFMDParameters* Instance(); @@ -82,7 +107,57 @@ public: /** Initialize the manager. This tries to read the parameters from CDB. If that fails, the class uses the hard-coded parameters. */ - void Init(); + void Init(Bool_t forceReInit=kFALSE, UInt_t what=kAll ); + /** Initialize the manager. This tries to read the parameters from + CDB. If that fails, the class uses the hard-coded parameters. + */ + void Init(AliFMDPreprocessor* pp, + Bool_t forceReInit=kFALSE, + UInt_t what=kAll); + /** + * 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). + * + * @param path Where to look for the CSV files + * @param forceReInit Always reinitialise + * @param what What calibrations to load. + */ + void Init(const char* path, + Bool_t forceReInit=kFALSE, + UInt_t what=kAll); + + /** + * 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. + * + * @param maxNoise Maximum noise value before a channel is marked + * as dead. + * @param minGain Minimum value of the calibrated gain before a + * channel is considered dead. + * @param maxGain Maximum value of the calibrated gain before a + * channel is considered dead. + */ + void MakeDeadMap(Float_t maxNoise=10, Float_t minGain=.1, Float_t maxGain=10); /** Print all parameters. @param option Option string */ void Print(Option_t* option="A") const; @@ -115,6 +190,15 @@ public: void SetChannelsPerAltro(UShort_t size=128) { fChannelsPerAltro = size; } /** @param f Factor to use for accepting a signal. */ void SetPedestalFactor(Float_t f=3) { fPedestalFactor = f; } + /** @param n Number of pre-samples to keep during zero-suppression - + only used in simulation. */ + void SetZSPreSamples(UShort_t n=1) { fZSPre = (n & 0x3); } + /** @param n Number of post-samples to keep during zero-suppression - + only used in simulation. */ + void SetZSPostSamples(UShort_t n=1) { fZSPost = (n & 0x3); } + /** @param use If true, do pedestal subtraction before zero + suppression - only used in simulation */ + void SetZSPedSubtract(Bool_t use=kTRUE) { fZSPedSubtract = use; } /** @} */ /** @{ */ @@ -122,9 +206,12 @@ public: /** @param s Zero suppression threshold in ADC counts */ void SetZeroSuppression(UShort_t s=0) { fFixedZeroSuppression = s; } /** @param r How many times we oversample each strip. */ - void SetSampleRate(UShort_t r=1) { fFixedSampleRate = (r>2?2:r);} + void SetSampleRate(UShort_t r=1) { fFixedSampleRate = r ;}//(r>2?2:r);} + void SetSampleRate(AliFMDCalibSampleRate* r) { fSampleRate = r; } /** @param p Pedestal value in ADC counts */ void SetPedestal(Float_t p=10) { fFixedPedestal = p; } + /** @param p Pedestal map */ + void SetPedestal(AliFMDCalibPedestal* p) { fPedestal = p; } /** @param w Pedestal width in ADC counts */ void SetPedestalWidth(Float_t w=1) { fFixedPedestalWidth = w; } /** @param t Threshold used for 1 MIP acceptance. */ @@ -133,6 +220,13 @@ public: @param min Minimum strip number (0-127). @param max Maximum strip number (0-127). */ void SetStripRange(UShort_t min=0, UShort_t max=127); + void SetStripRange(AliFMDCalibStripRange* r) { fStripRange = r; } + /** Whether raw data has full common data header (8 32bit words) or + the older invalid format (7 32bit words with bogus entries) + @param yes if true the raw data has complete data header */ + void UseCompleteHeader(Bool_t yes=kTRUE) { fHasCompleteHeader = yes; } + /** @param g Gain map */ + void SetGain(AliFMDCalibGain* g) { fPulseGain = g; } /** @} */ /** @{ */ @@ -145,12 +239,23 @@ public: UShort_t GetChannelsPerAltro() const { return fChannelsPerAltro; } /** @return The average energy deposited by one MIP */ Float_t GetEdepMip() const; + /** @return The conversion factor from DAC to ADC */ + Float_t GetDACPerMIP() const; /** @return The factor used of signal acceptance */ Float_t GetPedestalFactor() const { return fPedestalFactor; } + /** @param n Number of pre-samples to keep during zero-suppression - + only used in simulation. */ + UShort_t GetZSPreSamples() const { return fZSPre; } + /** @param n Number of post-samples to keep during zero-suppression - + only used in simulation. */ + UShort_t GetZSPostSamples() const { return fZSPost; } + /** @param use If true, do pedestal subtraction before zero + suppression - only used in simulation */ + Bool_t IsZSPedSubtract() const { return fZSPedSubtract; } /** @} */ /** @{ */ - /** @name Get variable parameters */ + /** @name Various varible conditions */ /** Whether the strip is considered dead @param detector Detector # (1-3) @param ring Ring ID ('I' or 'O') @@ -233,6 +338,68 @@ public: Char_t ring, UShort_t sector, UShort_t strip) const; + /** Get the number of pre-samples in ALTRO channels + @param detector Detector # (1-3) + @param ring Ring ID ('I' or 'O') + @param sector Sector number (0-39) + @param strip Strip number (0-511) + @return Maximum strip */ + UShort_t GetPreSamples(UShort_t, + Char_t, + UShort_t, + UShort_t) const { return 14+5; } + /** @} */ + + /** @{ + @name Hardware to detector translation (and inverse) */ + /** 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 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& 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 hwaddr Hardware address. + @param timebin Timebin + @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& det, Char_t& ring, + UShort_t& sec, Short_t& str, + UShort_t& sam) const; +#if 0 + /** Translate hardware address to detector coordinates + @param ddl DDL number + @param board Board address + @param chip Chip # + @param channel Channel # + @param det On return, Detector # (1-3) + @param ring On return, Ring ID ('I' or 'O') + @param sec On return, Sector number (0-39) + @param str On return, Strip number (0-511) + @return @c true on success. */ + Bool_t Hardware2Detector(UShort_t ddl, UShort_t board, + UShort_t chip, UShort_t channel, + UShort_t& det, Char_t& ring, + UShort_t& sec, Short_t& str) const; /** Translate hardware address to detector coordinates @param ddl DDL number @param addr Hardware address @@ -241,8 +408,58 @@ public: @param sec On return, Sector number (0-39) @param str On return, Strip number (0-511) @return @c true on success. */ - Bool_t Hardware2Detector(UInt_t ddl, UInt_t addr, UShort_t& det, - Char_t& ring, UShort_t& sec, UShort_t& str) const; + Bool_t Hardware2Detector(UShort_t ddl, UShort_t addr, UShort_t& det, + Char_t& ring, UShort_t& sec, Short_t& str) const; +#endif + + /** 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 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& 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 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& ddl, UShort_t& hwaddr, + UShort_t& timebin) const; +#if 0 + /** Translate detector coordinates to hardware address + @param det Detector # (1-3) + @param ring Ring ID ('I' or 'O') + @param sec Sector number (0-39) + @param str Strip number (0-511) + @param ddl On return, DDL number + @param board On return, Board address + @param chip On return, Chip # + @param channel On return, Channel # + @return @c true on success. */ + Bool_t Detector2Hardware(UShort_t det, Char_t ring, + UShort_t sec, UShort_t str, + UShort_t& ddl, UShort_t& board, + UShort_t& chip, UShort_t& channel) const; /** Translate detector coordinates to hardware address @param det Detector # (1-3) @param ring Ring ID ('I' or 'O') @@ -252,11 +469,17 @@ public: @param addr On return, Hardware address @return @c true on success. */ Bool_t Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, - UShort_t str, UInt_t& ddl, UInt_t& addr) const; + UShort_t str, UShort_t& ddl, UShort_t& addr) const; +#endif /** Get the map that translates hardware to detector coordinates @return Get the map that translates hardware to detector coordinates */ AliFMDAltroMapping* GetAltroMap() const; + /** Whether raw data has full common data header (8 32bit words) or + the older invalid format (7 32bit words with bogus entries) + @return false if the raw data has incomplete data header */ + Bool_t HasCompleteHeader() const { return fHasCompleteHeader; } + /** @} */ static const char* PulseGainPath() { return fgkPulseGain; } @@ -266,12 +489,43 @@ public: static const char* AltroMapPath() { return fgkAltroMap; } static const char* ZeroSuppressionPath() { return fgkZeroSuppression; } static const char* StripRangePath() { return fgkStripRange; } + static const char* GetPedestalShuttleID() {return fkPedestalShuttleID;} + static const char* GetGainShuttleID() {return fkGainShuttleID;} + static const char* GetConditionsShuttleID() {return fkConditionsShuttleID;} + protected: /** CTOR */ AliFMDParameters(); /** CTOR */ AliFMDParameters(const AliFMDParameters& o) - : TNamed(o), fkSiDeDxMip(o.fkSiDeDxMip) {} + : TNamed(o), + fIsInit(o.fIsInit), + fkSiDeDxMip(o.fkSiDeDxMip), + fVA1MipRange(o.fVA1MipRange), + fAltroChannelSize(o.fAltroChannelSize), + fChannelsPerAltro(o.fChannelsPerAltro), + fPedestalFactor(o.fPedestalFactor), + fZSPre(o.fZSPre), + fZSPost(o.fZSPost), + fZSPedSubtract(o.fZSPedSubtract), + fFixedPedestal(o.fFixedPedestal), + fFixedPedestalWidth(o.fFixedPedestalWidth), + fFixedZeroSuppression(o.fFixedZeroSuppression), + fFixedSampleRate(o.fFixedSampleRate), + fFixedThreshold(o.fFixedThreshold), + fFixedMinStrip(o.fFixedMinStrip), + fFixedMaxStrip(o.fFixedMaxStrip), + fFixedPulseGain(o.fFixedPulseGain), + fEdepMip(o.fEdepMip), + fHasCompleteHeader(o.fHasCompleteHeader), + fZeroSuppression(o.fZeroSuppression), + fSampleRate(o.fSampleRate), + fPedestal(o.fPedestal), + fPulseGain(o.fPulseGain), + fDeadMap(o.fDeadMap), + fAltroMap(o.fAltroMap), + fStripRange(o.fStripRange) + {} /** Assignement operator @return Reference to this */ AliFMDParameters& operator=(const AliFMDParameters&) { return *this; } @@ -279,45 +533,74 @@ protected: virtual ~AliFMDParameters() {} /** Singleton instance */ static AliFMDParameters* fgInstance; // Static singleton instance + /** + * Check if the file prefixnumber exists in @a path, + * and write the full path to @a f. + * + * @param prefix File prefix (cond, peds, gains, ...) + * @param path Path to files + * @param number Detector number (1, 2, or 3) + * @param f On return full path to file (if found) + * + * @return @c true if file exists and is readable, @c false otherwise + */ + Bool_t CheckFile(const char* prefix, const char* path, + int number, TString& f) const; + /** Get an entry from either global AliCDBManager or passed + AliFMDPreprocessor. + @param path Path to CDB object. + @param pp AliFMDPreprocessor + @param fatal If true, raise a fatal flag if we didn't get the entry. + @return AliCDBEntry if found */ + AliCDBEntry* GetEntry(const char* path, AliFMDPreprocessor* pp, + Bool_t fatal=kTRUE) const; /** Initialize gains. Try to get them from CDB */ - void InitPulseGain(); + void InitPulseGain(AliFMDPreprocessor* pp=0); /** Initialize pedestals. Try to get them from CDB */ - void InitPedestal(); + void InitPedestal(AliFMDPreprocessor* pp=0); /** Initialize dead map. Try to get it from CDB */ - void InitDeadMap(); + void InitDeadMap(AliFMDPreprocessor* pp=0); /** Initialize sample rates. Try to get them from CDB */ - void InitSampleRate(); + void InitSampleRate(AliFMDPreprocessor* pp=0); /** Initialize zero suppression thresholds. Try to get them from CDB */ - void InitZeroSuppression(); + void InitZeroSuppression(AliFMDPreprocessor* pp=0); /** Initialize hardware map. Try to get it from CDB */ - void InitAltroMap(); + void InitAltroMap(AliFMDPreprocessor* pp=0); /** Initialize strip range. Try to get it from CDB */ - void InitStripRange(); + void InitStripRange(AliFMDPreprocessor* pp=0); - Bool_t fIsInit; // Whether we've been initialised + Bool_t fIsInit; // Whether we've been initialised - static const char* fgkPulseGain; // Path to PulseGain calib object - static const char* fgkPedestal; // Path to Pedestal calib object - static const char* fgkDead; // Path to Dead calib object - static const char* fgkSampleRate; // Path to SampleRate calib object - static const char* fgkAltroMap; // Path to AltroMap calib object - static const char* fgkZeroSuppression; // Path to ZeroSuppression cal object - static const char* fgkStripRange; // Path to strip range cal object - const Float_t fkSiDeDxMip; // MIP dE/dx in Silicon - UShort_t fVA1MipRange; // # MIPs the pre-amp can do - UShort_t fAltroChannelSize; // Largest # to store in 1 ADC ch. - UShort_t fChannelsPerAltro; // Number of pre-amp. chan/adc chan. - Float_t fPedestalFactor; // Number of pedestal widths + static const char* fgkPulseGain; // Path to PulseGain calib object + static const char* fgkPedestal; // Path to Pedestal calib object + static const char* fgkDead; // Path to Dead calib object + static const char* fgkSampleRate; // Path to SampleRate calib object + static const char* fgkAltroMap; // Path to AltroMap calib object + static const char* fgkZeroSuppression; // Path to ZeroSuppression cal object + static const char* fgkStripRange; // Path to strip range cal object + const Float_t fkSiDeDxMip; // MIP dE/dx in Silicon + UShort_t fVA1MipRange; // # MIPs the pre-amp can do + UShort_t fAltroChannelSize; // Largest # to store in 1 ADC ch. + UShort_t fChannelsPerAltro; // Number of pre-amp. chan/adc chan. + Float_t fPedestalFactor; // Number of pedestal widths + UShort_t fZSPre; // Number of pre-samples in ZS + UShort_t fZSPost; // Number of post-samples in ZS + Bool_t fZSPedSubtract; // Pedestal subtraction before ZS - Float_t fFixedPedestal; // Pedestal to subtract - Float_t fFixedPedestalWidth; // Width of pedestal - UShort_t fFixedZeroSuppression; // Threshold for zero-suppression - UShort_t fFixedSampleRate; // Times the ALTRO samples pre-amp. - Float_t fFixedThreshold; // Threshold in ADC counts - UShort_t fFixedMinStrip; // Minimum strip read-out - UShort_t fFixedMaxStrip; // Maximum strip read-out - mutable Float_t fFixedPulseGain; //! Gain (cached) - mutable Float_t fEdepMip; //! Cache of energy loss for a MIP + Float_t fFixedPedestal; // Pedestal to subtract + Float_t fFixedPedestalWidth; // Width of pedestal + UShort_t fFixedZeroSuppression; // Threshold for zero-suppression + UShort_t fFixedSampleRate; // Times the ALTRO samples pre-amp. + Float_t fFixedThreshold; // Threshold in ADC counts + UShort_t fFixedMinStrip; // Minimum strip read-out + UShort_t fFixedMaxStrip; // Maximum strip read-out + mutable Float_t fFixedPulseGain; //! Gain (cached) + mutable Float_t fEdepMip; //! Cache of energy loss for a MIP + Bool_t fHasCompleteHeader; // raw data has incomplete data header + + static const char* fkPedestalShuttleID; // Shuttle/preprocessor ID for pedestals + static const char* fkGainShuttleID; // Shuttle/preprocessor ID for gains + static const char* fkConditionsShuttleID; // Shuttle/preprocessor ID for conditions AliFMDCalibZeroSuppression* fZeroSuppression; // Zero suppression from CDB AliFMDCalibSampleRate* fSampleRate; // Sample rate from CDB @@ -327,7 +610,7 @@ protected: AliFMDAltroMapping* fAltroMap; // Map of hardware AliFMDCalibStripRange* fStripRange; // Strip range - ClassDef(AliFMDParameters,5) // Manager of parameters + ClassDef(AliFMDParameters,6) // Manager of parameters }; #endif