5#ifndef TILECALIBDRAWEROFC_H
6#define TILECALIBDRAWEROFC_H
29#include "CoralBase/Blob.h"
38#define PHASE_PRECISION 0.1
70 ,
const std::string& author =
""
71 ,
const std::string& comment =
""
72 , uint64_t timeStamp = 0);
89 float getPhase(
unsigned int channel,
unsigned int adc,
unsigned int phaseIdx)
const;
109 float getOfc(
unsigned int field,
unsigned int channel,
unsigned int adc,
float phase,
unsigned int sample)
const;
118 void fillOfc (
unsigned int channel,
unsigned int adc,
float& phase,
float* w_a,
float* w_b,
float* w_c,
float* g,
float* dg )
const;
125 virtual void dump(std::ostream& stm)
const;
142 void init(uint16_t objVersion
147 ,
const std::string& author=
""
148 ,
const std::string& comment=
""
149 , uint64_t timeStamp=0);
158 void setOfc(
unsigned int field,
unsigned int channel,
unsigned int adc,
float phase,
unsigned int sample,
float value);
164 void setPhases(
unsigned int channel,
unsigned int adc,
const std::vector<float>& phases);
180 const float*
getOfcStartAddress(
unsigned int field,
unsigned int channel,
unsigned int adc,
float& phase)
const;
183 unsigned int getOfcStartOffset(
unsigned int field,
unsigned int channel,
unsigned int adc,
float& phase)
const;
198 unsigned int getPhaseNumber(
unsigned int channel,
unsigned int adc,
float& phase)
const;
205 return *(
static_cast<const uint32_t*
>(
getAddress(0)));
212 return *(
static_cast<const int32_t*
>(
getAddress(1)));
220 if (std::abs(phase) > 1e6F) {
227 const int32_t*
pos = std::lower_bound(beg, end, db_phase);
229 if (pos == end || (*pos != db_phase && pos != beg && (*pos - db_phase) > (db_phase - *(pos - 1)))) {
251 if( objVersion == 3){
return 5; }
252 else if(objVersion == 2){
return 4; }
253 else if(objVersion == 1){
return 3; }
255 throw TileCalib::VersionConflict(
"TileCalibDrawerOfc::getNFields", objVersion);
262 ,
float phase,
unsigned int sample)
const {
264 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::getA", sample,
getNSamples());
269 ,
float* w_a,
float* w_b,
float* w_c,
float* g,
float* dg)
const {
276 memcpy(w_a, startAddress, allSamplesSize);
277 startAddress += fieldSize;
278 memcpy(w_b, startAddress, allSamplesSize);
279 startAddress += fieldSize;
280 memcpy(g, startAddress, allSamplesSize);
281 startAddress += fieldSize;
282 memcpy(w_c, startAddress, allSamplesSize);
284 startAddress += fieldSize;
285 memcpy(dg, startAddress, allSamplesSize);
287 memset(dg, 0, allSamplesSize);
295 ,
float phase,
unsigned int sample,
float value) {
297 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::setOfc", sample,
getNSamples());
306 if(phaseIdx >=
static_cast<unsigned int>(std::abs(
getNPhases()))){
307 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::getPhaseStartAddress", phaseIdx, std::abs(
getNPhases()));
316 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::getPhaseStartAddress", channel,
getNChans());
318 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::getPhaseStartAddress", adc,
getNGains());
322 unsigned int nPhases = std::abs(
getNPhases());
365 if(objVer!=1 && objVer!=2 && objVer!=3){
366 throw TileCalib::VersionConflict(
"TileCalibDrawerOfc::getOfcStartAddress", objVer);
375 throw TileCalib::IndexOutOfRange(
"TileCalibDrawerOfc::getOfcStartAddress", field, nField);
380 unsigned int nPhaseAbs = std::abs(
getNPhases());
383 if(nPhaseSgn < 0) {
offset += nPhaseAbs; }
390 unsigned int lPhase = nSample * nField;
391 unsigned int lAdc = lPhase * nPhaseAbs;
392 unsigned int lChan = lAdc * nGain;
__attribute__((always_inline)) inline uint32_t TileCalibDrawerOfc
#define PHASE_PRECISION
Class for storing Optimal Filtering Coefficients (OFCs) in a coral::Blob.
uint16_t getNChans() const
Returns the number of channels stored in the BLOB.
uint16_t getNGains() const
Returns the number of gains stored for each channel.
TileCalibDrawerBase(const TileCalibDrawerBase &other)
Copy Ctor.
uint16_t getObjVersion() const
Returns the BLOB object version.
uint32_t getObjSizeUint32() const
Returns the size of a data object in units of uint32_t.
const void * getAddress(unsigned int iEle) const
Returns start address of iEle-th basic unit.
TileCalibDrawerOfc(const coral::Blob &blob)
Ctor (const).
unsigned int getPhaseNumber(unsigned int channel, unsigned int adc, float &phase) const
Returns the index for a given phase.
int32_t getNPhases() const
Returns the number of phases (WARNING: Can be negative!)
void setOfc(unsigned int field, unsigned int channel, unsigned int adc, float phase, unsigned int sample, float value)
Sets OFC data.
float getPhase(unsigned int channel, unsigned int adc, unsigned int phaseIdx) const
Returns the stored phase.
virtual void dump() const
Prints out the object content to std::cout.
void fillOfc(unsigned int channel, unsigned int adc, float &phase, float *w_a, float *w_b, float *w_c, float *g, float *dg) const
Fill all OFC for optimazation.
uint32_t getNSamples() const
Returns the number of sample stored.
virtual uint16_t getType() const
Returns TileCalibType::OFC.
unsigned int getOfcStartOffset(unsigned int field, unsigned int channel, unsigned int adc, float &phase) const
void setPhases(unsigned int channel, unsigned int adc, const std::vector< float > &phases)
Sets a phase value.
FIELD
OFC field identifier.
const float * getOfcStartAddress(unsigned int field, unsigned int channel, unsigned int adc, float &phase) const
Returns pointer to first data OFC for a given field, ADC & phase.
int32_t * getPhaseStartAddress(unsigned int channel, unsigned int adc, unsigned int phaseIdx)
void init(uint16_t objVersion, uint32_t nSamples, int32_t nPhases, uint16_t nChans, uint16_t nGains, const std::string &author="", const std::string &comment="", uint64_t timeStamp=0)
Function for initializing a TileCalibDrawerOfc BLOB.
float getOfc(unsigned int field, unsigned int channel, unsigned int adc, float phase, unsigned int sample) const
Returns OFC data.
virtual ~TileCalibDrawerOfc()
Dtor.
float * getOfcStartAddress(unsigned int field, unsigned int channel, unsigned int adc, float &phase)
static TileCalibDrawerOfc * getInstance(coral::Blob &blob, uint16_t objVersion, uint32_t nSamples, int32_t nPhases, uint16_t nChans, uint16_t nGains, const std::string &author="", const std::string &comment="", uint64_t timeStamp=0)
Returns a pointer to a non-const TileCalibDrawerOfc.
const int32_t * getPhaseStartAddress(unsigned int channel, unsigned int adc, unsigned int phaseIdx) const
Returns pointer to the requested phase value.
uint32_t getNFields(uint16_t objVersion=0) const
Returns the number of fields.
unsigned int getPhaseStartOffset(unsigned int channel, unsigned int adc, unsigned int phaseIdx) const
@ OFC
Enum for TileCalibDrawerOfc class.
static const unsigned int MAX_CHAN
Number of channels in drawer.