ATLAS Offline Software
Loading...
Searching...
No Matches
TileRawChannelBuilderOpt2Filter Class Reference

Reconstructs Tile digitized pulses (ie, computes amplitude, time and pedestal) as a linear combination of the samples. More...

#include <TileRawChannelBuilderOpt2Filter.h>

Inheritance diagram for TileRawChannelBuilderOpt2Filter:
Collaboration diagram for TileRawChannelBuilderOpt2Filter:

Public Member Functions

 TileRawChannelBuilderOpt2Filter (const std::string &type, const std::string &name, const IInterface *parent)
 Constructor.
 ~TileRawChannelBuilderOpt2Filter ()
 Destructor.
virtual StatusCode initialize ()
 Initialize method.
virtual StatusCode finalize ()
 Finalize method.
virtual TileRawChannelrawChannel (const TileDigits *digits, const EventContext &ctx)
 Builder virtual method to be implemented by subclasses.
virtual StatusCode createContainer (const EventContext &ctx)
 Create container in SG with name given by parameter (m_rawChannelContainerKey)
virtual StatusCode commitContainer (const EventContext &ctx)
 Commit RawChannelContiner in SG and make const.
void initLog (const EventContext &ctx)
void endLog ()
StatusCode build (const TileDigitsCollection *collection, const EventContext &ctx)
void resetDrawer ()
void resetOverflows (void)
Overflows_tgetOverflowedChannels (void)
std::string getTileRawChannelContainerID (void)
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Static Public Member Functions

static const InterfaceID & interfaceID ()
 AlgTool InterfaceID.
static double correctAmp (double phase, bool of2=true)
 Amplitude correction factor according to the time when using weights for tau=0 without iterations.
static double correctTime (double phase, bool of2=true)
 Time correction factor.
static int CorruptedData (int ros, int drawer, int channel, int gain, const std::vector< float > &digits, float &dmin, float &dmax, float ADCmaxMinusEps, float ADCmaskValueMinusEps)
static const char * BadPatternName (float ped)

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Protected Attributes

SG::ReadHandleKey< TileDQstatusm_DQstatusKey
SG::ReadHandleKey< TileRawChannelContainerm_DSPContainerKey {this, "DSPContainer", "", "DSP Container key"}
SG::WriteHandleKey< TileRawChannelContainerm_rawChannelContainerKey
std::unique_ptr< TileMutableRawChannelContainerm_rawChannelCnt
TileFragHash::TYPE m_rChType
TileRawChannelUnit::UNIT m_rChUnit
unsigned int m_bsflags
int m_firstSample
bool m_calibrateEnergy
bool m_correctTime
bool m_useDSP
float m_ampMinThresh
 correct amplitude if it's above amplitude threshold (in ADC counts)
float m_timeMinThresh
 correct amplitude is time is above time min threshold
float m_timeMaxThresh
 correct amplitude is time is below time max threshold
int m_runType
const TileIDm_tileID
const TileHWIDm_tileHWID
ToolHandleArray< ITileRawChannelToolm_noiseFilterTools
ToolHandle< TileCondToolEmscalem_tileToolEmscale
ToolHandle< TileCondToolTimingm_tileToolTiming
ToolHandle< TileCondIdTransformsm_tileIdTransforms
ServiceHandle< TileCablingSvcm_cablingSvc
 Name of Tile cabling service.
const TileCablingServicem_cabling
 TileCabling instance.
Gaudi::Property< std::vector< int > > m_demoFragIDs
int m_trigType
bool m_idophys
bool m_idolas
bool m_idoped
bool m_idocis
int m_cischan
double m_capdaq
unsigned int m_evtCounter
unsigned int m_chCounter
int m_nChL
int m_nChH
double m_RChSumL
double m_RChSumH
Overflows_t m_overflows
int m_dataPoollSize
int m_error [MAX_CHANNELS]
int m_lastDrawer = -1
bool m_badDrawer = false
bool m_notUpgradeCabling
std::string m_infoName
const TileInfom_tileInfo
int m_i_ADCmax
float m_f_ADCmax
int m_i_ADCmaxPlus1
float m_f_ADCmaxPlus1
float m_ADCmaxMinusEps
float m_ADCmaskValueMinusEps
 indicates channels which were masked in background dataset

Static Protected Attributes

static const int MAX_CHANNELS = 48
static const int MAX_DMUS = 16

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

double filter (int ros, int drawer, int channel, int &gain, double &pedestal, double &amplitude, double &time, const EventContext &ctx)
int findMaxDigitPosition ()
 Finds maximum digit position in the pulse.
float getPedestal (int ros, int drawer, int channel, int gain, const EventContext &ctx)
 Apply the number of iterations needed for reconstruction by calling the Filter method.
int iterate (int ros, int drawer, int channel, int gain, double &pedestal, double &amplitude, double &time, double &chi2, const EventContext &ctx)
 Computes A,time,ped using OF.
double compute (int ros, int drawer, int channel, int gain, double &pedestal, double &amplitude, double &time, double &phase, const EventContext &ctx)
void ofc2int (int nDigits, double *w_off, short *w_int, short &scale)
void fill_drawer_errors (const EventContext &ctx, const TileDigitsCollection *collection)
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ToolHandle< ITileCondToolOfcm_tileCondToolOfc
ToolHandle< TileCondToolNoiseSamplem_tileToolNoiseSample
 Applies OF algorithm.
int m_maxIterations
 maximum number of iteration to perform
int m_pedestalMode
 pedestal mode to use
bool m_confTB
 use testbeam configuration
double m_timeForConvergence
 minimum time difference to quit iteration procedure
bool m_of2
 bool variable for OF method: true=> OF2; false=> OF1
bool m_minus1Iter
 bool variable for whether to apply -1 iteration (initial phase guess)
bool m_correctAmplitude
 If true, resulting amplitude is corrected when using weights for tau=0 without iteration.
bool m_correctTimeNI
 If true, resulting time is corrected when using method without iteration.
bool m_bestPhase
bool m_emulateDsp
int m_nSignal
 internal counters
int m_nNegative
 internal counters
int m_nCenter
 internal counters
int m_nConst
 internal counters
int m_nSamples
 number of samples in the data
int m_t0SamplePosition
 position of peak sample = (m_nSamples-1)/2
double m_maxTime
 max allowed time = 25*(m_nSamples-1)/2
double m_minTime
 min allowed time = -25*(m_nSamples-1)/2
std::vector< float > m_digits
int m_noiseThresholdHG
int m_noiseThresholdLG
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Reconstructs Tile digitized pulses (ie, computes amplitude, time and pedestal) as a linear combination of the samples.

This class implements an energy reconstruction method known as Optimal Filtering. It takes as input the digital samples from the digitizer boards in the front-end electronics and outputs the amplitude, time and pedestal of the pulse. Full details and fundaments of the method can be found in the ATL-TILECAL-2005-001 note. Two different versions of the algorithms are currently used: OF1 (with 2 parameters: amplitude and time) and OF2 (with 3 parameters (amplitude, time and pedestal).

OFCs are calculated on-the-fly (using TileCondToolOfc) or are extracted from COOL database (TileCondToolOfcCool). In case of non-iterative procedure, optionally, the initial, "best phase", can be extracted from COOL DB by means of TileCondToolTiming.

Definition at line 47 of file TileRawChannelBuilderOpt2Filter.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ TileRawChannelBuilderOpt2Filter()

TileRawChannelBuilderOpt2Filter::TileRawChannelBuilderOpt2Filter ( const std::string & type,
const std::string & name,
const IInterface * parent )

Constructor.

Definition at line 52 of file TileRawChannelBuilderOpt2Filter.cxx.

54 : TileRawChannelBuilder(type, name, parent)
55 , m_nSignal(0)
56 , m_nNegative(0)
57 , m_nCenter(0)
58 , m_nConst(0)
59 , m_nSamples(0)
61{
62 //declare interfaces
63 declareInterface< TileRawChannelBuilder >( this );
64 declareInterface< TileRawChannelBuilderOpt2Filter >(this);
65
66 m_rawChannelContainerKey = "TileRawChannelOpt2";
67
68 //declare properties
69 declareProperty("MaxIterations", m_maxIterations = 5);
70 declareProperty("PedestalMode", m_pedestalMode = 17);
71 declareProperty("TimeForConvergence", m_timeForConvergence = 0.5);
72 declareProperty("ConfTB", m_confTB = false);
73 declareProperty("OF2", m_of2 = true);
74 declareProperty("Minus1Iteration", m_minus1Iter = false);
75 declareProperty("AmplitudeCorrection", m_correctAmplitude = false);
76 declareProperty("TimeCorrection", m_correctTimeNI = false);
77 declareProperty("BestPhase", m_bestPhase = false);
78 declareProperty("EmulateDSP", m_emulateDsp = false);
79 declareProperty("NoiseThresholdHG", m_noiseThresholdHG = 5);
80 declareProperty("NoiseThresholdLG", m_noiseThresholdLG = 3);
81 declareProperty("MinTime", m_minTime = 0.0);
82 declareProperty("MaxTime", m_maxTime = -1.0);
83}
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool m_of2
bool variable for OF method: true=> OF2; false=> OF1
double m_minTime
min allowed time = -25*(m_nSamples-1)/2
bool m_correctAmplitude
If true, resulting amplitude is corrected when using weights for tau=0 without iteration.
bool m_correctTimeNI
If true, resulting time is corrected when using method without iteration.
double m_timeForConvergence
minimum time difference to quit iteration procedure
int m_nSamples
number of samples in the data
double m_maxTime
max allowed time = 25*(m_nSamples-1)/2
bool m_minus1Iter
bool variable for whether to apply -1 iteration (initial phase guess)
int m_maxIterations
maximum number of iteration to perform
int m_t0SamplePosition
position of peak sample = (m_nSamples-1)/2
SG::WriteHandleKey< TileRawChannelContainer > m_rawChannelContainerKey
TileRawChannelBuilder(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.

◆ ~TileRawChannelBuilderOpt2Filter()

TileRawChannelBuilderOpt2Filter::~TileRawChannelBuilderOpt2Filter ( )

Destructor.

Definition at line 86 of file TileRawChannelBuilderOpt2Filter.cxx.

86 {
87}

Member Function Documentation

◆ BadPatternName()

const char * TileRawChannelBuilder::BadPatternName ( float ped)
staticinherited

Definition at line 458 of file TileRawChannelBuilder.cxx.

458 {
459 static const char * const errname[26] = {
460 "-10 - good signal",
461 "-9 - underflow",
462 "-8 - overflow",
463 "-7 - underflow and overflow",
464 "-6 - constant signal",
465 "-5 - disconnected channel",
466 "-4 - half a drawer masked",
467 "-3 - bad DQ status",
468 "-2 - underflow in all samples",
469 "-1 - overflow in all samples",
470 "0 - unknown error",
471 "1 - jump from zero to saturation",
472 "2 - samples with zeros",
473 "3 - at least two saturated. others - close to pedestal",
474 "4 - two distinct levels with at least 2 samples each",
475 "5 - pedestal with jump up in one sample",
476 "6 - pedestal with jump down in one sample",
477 "7 - signal with jump up in one sample",
478 "8 - signal with jump down in one sample",
479 "9 - base line above threshold in low gain",
480 "10 - jump down in first sample in low gain",
481 "11 - jump down in last sample in low gain",
482 "12 - jump up in one sample above const",
483 "13 - jump down in one sample below const",
484 "14 - unrecoverable timing jump",
485 "15 - unknown error"
486 };
487
488 return errname[std::min(25, std::max(0, int((ped + 500) * 1e-4)))];
489}

◆ build()

StatusCode TileRawChannelBuilder::build ( const TileDigitsCollection * collection,
const EventContext & ctx )
inherited

Definition at line 492 of file TileRawChannelBuilder.cxx.

493{
494
495 int frag = coll->identify();
496
497 // make sure that error array is up-to-date
498 if (frag != m_lastDrawer && m_notUpgradeCabling) {
499 fill_drawer_errors(ctx, coll);
500 }
501
502 // Iterate over all digits in this collection
503 TileDigitsCollection::const_iterator digitItr = coll->begin();
504 TileDigitsCollection::const_iterator lastDigit = coll->end();
505
506 for (; digitItr != lastDigit; ++digitItr) {
507
508 TileRawChannel* rch = rawChannel((*digitItr), ctx);
509
511
512 int err = m_error[m_tileHWID->channel(rch->adc_HWID())];
513
514 if (err) {
515 if (err == -8 || err == -7) m_overflows.push_back(std::make_pair(rch, (*digitItr)));
516 float ped = rch->pedestal() + 100000 + 10000 * err;
517 rch->setPedestal(ped);
518 if (msgLvl(MSG::VERBOSE) && !m_badDrawer) {
519 if (err < -5) {
520 msg(MSG::VERBOSE) << "BadCh " << m_tileHWID->to_string(rch->adc_HWID())
521 << " warning = " << BadPatternName(ped) << endmsg;
522 } else {
523 msg(MSG::VERBOSE) << "BadCh " << m_tileHWID->to_string(rch->adc_HWID())
524 << " error = " << BadPatternName(ped) << endmsg;
525 }
526 }
527 }
528
529 }
530
531 ATH_CHECK( m_rawChannelCnt->push_back (rch) );
532 }
533
534 IdentifierHash hash = m_rawChannelCnt->hashFunc().hash(coll->identify());
535 TileRawChannelCollection* rawChannelCollection = m_rawChannelCnt->indexFindPtr(hash);
536 rawChannelCollection->setLvl1Id(coll->getLvl1Id());
537 rawChannelCollection->setLvl1Type(coll->getLvl1Type());
538 rawChannelCollection->setDetEvType(coll->getDetEvType());
539 rawChannelCollection->setRODBCID(coll->getRODBCID());
540
541 return StatusCode::SUCCESS;
542}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
static const char * BadPatternName(float ped)
std::unique_ptr< TileMutableRawChannelContainer > m_rawChannelCnt
void fill_drawer_errors(const EventContext &ctx, const TileDigitsCollection *collection)
virtual TileRawChannel * rawChannel(const TileDigits *digits, const EventContext &ctx)
Builder virtual method to be implemented by subclasses.
float pedestal(void) const
void setPedestal(float ped)
void setLvl1Type(uint32_t lvl1Type)
Setter for level1 type from ROD header.
void setLvl1Id(uint32_t lvl1Id)
Setter for level1 id from ROD header.
void setRODBCID(uint32_t rodBCID)
Setter for BCID from ROD header.
void setDetEvType(uint32_t detEvType)
Setter for detector event type from ROD header.
HWIdentifier adc_HWID(void) const
Definition TileRawData.h:53

◆ commitContainer()

StatusCode TileRawChannelBuilder::commitContainer ( const EventContext & ctx)
virtualinherited

Commit RawChannelContiner in SG and make const.

Definition at line 544 of file TileRawChannelBuilder.cxx.

545{
546
547 const TileDQstatus* DQstatus = SG::makeHandle (m_DQstatusKey, ctx).get();
548
549 ToolHandleArray<ITileRawChannelTool>::iterator itrTool = m_noiseFilterTools.begin();
550 ToolHandleArray<ITileRawChannelTool>::iterator endTool = m_noiseFilterTools.end();
551
552 if ( m_useDSP && !m_DSPContainerKey.key().empty() &&
553 (DQstatus->incompleteDigits() || m_chCounter<12288) && itrTool!=endTool )
554 {
555 const TileRawChannelContainer * dspCnt = SG::makeHandle (m_DSPContainerKey, ctx).get();
556 ATH_MSG_DEBUG( "Incomplete container - use noise filter corrections from DSP container" );
557
558 uint32_t bsFlags = dspCnt->get_bsflags();
559 std::vector<IdentifierHash> hashes = m_rawChannelCnt->GetAllCurrentHashes();
560 std::vector<IdentifierHash> dspHashes = dspCnt->GetAllCurrentHashes();
561 if (bsFlags == 0) {
562 ATH_MSG_WARNING("Problem in applying noise corrections: DSP container ("
563 << m_DSPContainerKey.key() << ") seems to be emtpy!");
564 } else if (hashes != dspHashes) {
565 ATH_MSG_ERROR( " Error in applying noise corrections; "
566 "hash vectors do not match.");
567 } else {
568 // Go through all TileRawChannelCollections
569 for (IdentifierHash hash : hashes) {
570 TileRawChannelCollection* coll = m_rawChannelCnt->indexFindPtr (hash);
571 const TileRawChannelCollection* dcoll = dspCnt->indexFindPtr (hash);
572
573 if (coll->identify() != dcoll->identify()) {
574
575 ATH_MSG_ERROR( " Error in applying noise corrections " << MSG::hex
576 << " collection IDs 0x" << coll->identify() << " and 0x" << dcoll->identify()
577 << " do not match " << MSG::dec );
578 break;
579 }
580
581 // iterate over all channels in a collection
584
585 for (TileRawChannel* rch : *coll) {
586 HWIdentifier adc_id = rch->adc_HWID();
587 while (dspItr != dspLast && adc_id != (*dspItr)->adc_HWID()) {
588 ++dspItr;
589 }
590 if (dspItr != dspLast) {
591 float corr = (*dspItr)->pedestal();
592 ATH_MSG_VERBOSE( "Ch "<<m_tileHWID->to_string(adc_id)
593 <<" amp " << rch->amplitude() << " ped " << rch->pedestal()
594 << " corr " << corr );
595 if (corr<10000.) {
596 rch->setAmplitude (rch->amplitude() - corr); // just baseline shift
597 rch->setPedestal (rch->pedestal() + corr); // just baseline shift
598 } else {
599 float ped = rch->pedestal();
600 if (corr > ped) {
601 rch->setPedestal (fmod(ped,10000.) + int(corr)/10000 * 10000); // changing error status
602 ATH_MSG_VERBOSE( "New error status in ped "<<rch->pedestal());
603 }
604 }
605 } else {
606 ATH_MSG_WARNING(" Problem in applying noise corrections "
607 << " can not find channel in DSP container with HWID "
608 << m_tileHWID->to_string(adc_id) );
609 dspItr = dcoll->begin();
610 }
611 }
612 }
613 }
614
615 } else {
616
617 for (ToolHandle<ITileRawChannelTool>& noiseFilterTool : m_noiseFilterTools) {
618 if (noiseFilterTool->process(*m_rawChannelCnt.get(), ctx).isFailure()) {
619 ATH_MSG_ERROR( " Error status returned from noise filter " );
620 } else {
621 ATH_MSG_DEBUG( "Noise filter applied to the container" );
622 }
623 }
624
625 }
626
627 ATH_MSG_DEBUG( " nCh=" << m_chCounter
628 << " nChH/L=" << m_nChH << "/" << m_nChL
629 << " RChSumH/L=" << m_RChSumH << "/" << m_RChSumL );
630
631 SG::WriteHandle<TileRawChannelContainer> rawChannelsContainer(m_rawChannelContainerKey, ctx);
632 ATH_CHECK( rawChannelsContainer.record(std::move(m_rawChannelCnt)) );
633
634 endLog();
635
636 return StatusCode::SUCCESS;
637}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Athena::TPCnvVers::Old Athena::TPCnvVers::Old Athena::TPCnvVers::Current Athena::TPCnvVers::Old Athena::TPCnvVers::Current TileRawChannelContainer
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
virtual std::vector< IdentifierHash > GetAllCurrentHashes() const override final
Returns a collection of all hashes availiable in this IDC.
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
bool incompleteDigits() const
A few extra items (from TileBeamInfoProvider).
SG::ReadHandleKey< TileDQstatus > m_DQstatusKey
SG::ReadHandleKey< TileRawChannelContainer > m_DSPContainerKey
ToolHandleArray< ITileRawChannelTool > m_noiseFilterTools
uint32_t get_bsflags() const
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
setEventNumber uint32_t

◆ compute()

double TileRawChannelBuilderOpt2Filter::compute ( int ros,
int drawer,
int channel,
int gain,
double & pedestal,
double & amplitude,
double & time,
double & phase,
const EventContext & ctx )
private

Definition at line 557 of file TileRawChannelBuilderOpt2Filter.cxx.

558 {
559
560 ATH_MSG_VERBOSE( "compute();"
561 << " ros=" << ros
562 << " drawer=" << drawer
563 << " channel=" << channel
564 << " gain=" << gain );
565
566 int i = 0, digits_size = m_digits.size();
567 double chi2 = 0.;
568 double a[99];
569 double b[99];
570 double c[99];
571 double g[99];
572 double dg[99];
573
574 amplitude = 0.;
575 time = 0.;
576 float ofcPhase = (float) phase;
577 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
578 TileOfcWeightsStruct weights;
579 if (m_tileCondToolOfc->getOfcWeights(drawerIdx, channel, gain, ofcPhase, m_of2, weights, ctx).isFailure())
580 {
581 ATH_MSG_ERROR( "getOfcWeights fails" );
582 return 0;
583 }
584
585 phase = ofcPhase;
586
587 for (i = 0; i < digits_size; ++i) {
588 a[i] = weights.w_a[i];
589 b[i] = weights.w_b[i];
590 g[i] = weights.g[i];
591 dg[i] = weights.dg[i];
592 if (m_of2) c[i] = weights.w_c[i]; // [OptFilterPha+100];
593 }
594
595 // for DSP emulation
596 short a_int[99], ascale = 0, calib = 0, calib_offset = 0;
597 short b_int[99], bscale = 0;
598 unsigned short scale = 0, round = 0, lut = 0;
599 int slope_scale = 0;
600 int dspEnergy = 0, dspTime = 0;
601 if (m_emulateDsp) {
602 dspEnergy = 0;
603 dspTime = 0;
604 slope_scale = (int) truncf(log(std::pow(2., 15) - 1.) / log(2.));
605 calib_offset = (short) roundf(std::pow(2., slope_scale));
606 ofc2int(digits_size, a, a_int, ascale);
607 ofc2int(digits_size, b, b_int, bscale);
608 calib = ascale + slope_scale;
609 }
610
611 ATH_MSG_VERBOSE( "OptFilterPha=" << phase );
612
613 if (m_of2) {
614 if (m_emulateDsp) {
615 pedestal = m_digits[0];
616 for (i = 0; i < digits_size; ++i) {
617 dspEnergy += a_int[i] * ((int) m_digits[i]);
618 dspTime += b_int[i] * ((int) m_digits[i]);
619 amplitude += a[i] * m_digits[i]; //aa temp
620 time += b[i] * m_digits[i]; //aa temp
621 }
622 } else {
623 pedestal = 0.;
624 for (i = 0; i < digits_size; ++i) {
625 amplitude += a[i] * m_digits[i];
626 time += b[i] * m_digits[i];
627 pedestal += c[i] * m_digits[i];
628 }
629 }
630 } else {
631 if (m_emulateDsp) pedestal = m_digits[0];
632 for (i = 0; i < digits_size; ++i) {
633 amplitude += a[i] * (m_digits[i] - pedestal);
634 time += b[i] * (m_digits[i] - pedestal);
635 }
636 }
637
638 if (m_emulateDsp) {
640 round = 1 << (ascale - 2);
641 short e2Dsp = (unsigned short) ((dspEnergy + round) >> (ascale - 1));
642 size_t OptInd = abs(e2Dsp);
643 if (OptInd >= (sizeof(lookup) / sizeof(short))) OptInd = 0;
644 lut = lookup[OptInd];
645 scale = bscale - 4 + lookup[0] - 9;
646 round = 1 << (scale - 1);
647 // int told=dspTime;
648 dspTime = (((dspTime + 0x100) >> 9) * lut + round) >> scale;
649 // printf(" 1 OptFilterTime %f OptFilterTimeDSP %d e2 %d round %d lut %d bscale %d scale %d told %d\n",OptFilterTime/OptFilterEne,OptFilterTimeDSP,OptFilterE2DSP,round,lut,bscale,scale,told);
650 time = dspTime / 16.0;
651
652 // printf(" 1 OptFilterEneDSP %d calib_offset %d calib %d \n",OptFilterEneDSP,calib_offset,calib);
653
654 dspEnergy = (dspEnergy + m_i_ADCmaxPlus1) >> 11;
655 // printf(" 2 OptFilterEneDSP %d \n",OptFilterEneDSP);
656 dspEnergy = (dspEnergy * calib_offset + (1 << (calib - 15 - 1))) >> (calib - 15);
657 // printf(" 3 OptFilterEneDSP %d \n",OptFilterEneDSP);
658 double goffset = (gain == 0) ? 512 : 2048;
659 dspEnergy = (int) (dspEnergy + goffset);
660 amplitude = (dspEnergy - goffset) / 16.;
661 }
662
663 bool goodEnergy = (fabs(amplitude) > 1.0e-04);
664 if (goodEnergy) {
665 if (msgLvl(MSG::VERBOSE)) {
666 msg(MSG::VERBOSE) << "OptFilterEne=" << amplitude << endmsg;
667 msg(MSG::VERBOSE) << "OptFilterTime*OptFilterEne=" << time << endmsg;
668 }
669 if (!m_emulateDsp) time /= amplitude;
670 } else {
671 if (msgLvl(MSG::VERBOSE)) {
672 msg(MSG::VERBOSE) << "OptFilterEne=" << amplitude
673 << " ... assuming 0.0" << endmsg;
674 msg(MSG::VERBOSE) << "OptFilterTime*OptFilterEne=" << time
675 << " ... assuming 0.0" << endmsg;
676 }
677 time = amplitude = 0.0;
678 }
679
680 /* new QF in both cases now 02.2010 AA
681 if(!m_emulatedsp) {
682 for (i=0; i<digits_size; ++i){
683 if(OptFilterDigits[i]>0)
684 OptFilterChi2 += 50*fabs(OptFilterDigits[i]-(OptFilterEne*g[i]+OptFilterPed))/OptFilterDigits[i];
685 else
686 OptFilterChi2 += 50*fabs(OptFilterDigits[i]-(OptFilterEne*g[i]+OptFilterPed))/m_f_ADCmaxPlus1;
687 }
688 } else {
689 */
690 for (i = 0; i < digits_size; ++i) {
691 double dqf = m_digits[i] - amplitude * g[i] + amplitude * time * dg[i] - pedestal;
692 chi2 += dqf * dqf;
693 }
694 chi2 = sqrt(chi2);
695 // new QF }
696
697 // std::cout << "emulate " << m_emulatedsp << " OptFilterEne " << OptFilterEne << " OptFilterDigits[3]" << OptFilterDigits[3] << " OptFilterTime="<<OptFilterTime<<" OptFilterPed="<<OptFilterPed<<" OptFilterChi2="<<OptFilterChi2<<" g 3 " << g[3] << " dg 1 3 5 " << dg[1] << " " << dg[3] << " " << dg[5] <<std::endl;
698 if (fabs(chi2) > 1.0e-04 || goodEnergy) {
699 if (msgLvl(MSG::VERBOSE)) {
700 msg(MSG::VERBOSE) << "OptFilterTime=" << time << endmsg;
701 msg(MSG::VERBOSE) << "OptFilterPed=" << pedestal << endmsg;
702 msg(MSG::VERBOSE) << "OptFilterChi2=" << chi2 << endmsg;
703 }
704 } else {
705 if (msgLvl(MSG::VERBOSE)) {
706 msg(MSG::VERBOSE) << "OptFilterTime=" << time << endmsg;
707 msg(MSG::VERBOSE) << "OptFilterPed=" << pedestal << endmsg;
708 msg(MSG::VERBOSE) << "OptFilterChi2=" << chi2
709 << " ... assuming 0.0" << endmsg;
710 }
711 chi2 = 0.0;
712 }
713 return chi2;
714}
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
ToolHandle< ITileCondToolOfc > m_tileCondToolOfc
void ofc2int(int nDigits, double *w_off, short *w_int, short &scale)
void ascale(TH1F *h, double s_)
double chi2(TH1 *h0, TH1 *h1)
TList * a
time(flags, cells_name, *args, **kw)
constexpr auto lut(Generator &&f)
float round(const float toRound, const unsigned int decimals)
Definition Mdt.cxx:27
MsgStream & msg
Definition testRead.cxx:32

◆ correctAmp()

double TileRawChannelBuilder::correctAmp ( double phase,
bool of2 = true )
staticinherited

Amplitude correction factor according to the time when using weights for tau=0 without iterations.

Definition at line 646 of file TileRawChannelBuilder.cxx.

646 {
647
648 double corr = 1.0;
649 if (of2) {
650 // estimation from Belen for rel 14.0.0
651 /*double a,b,c;
652 if(fabs(phase)<5.){
653 a=0.137; b=0.0877; c=0.0865;
654 }else{
655 a=0.565; b=0.116; c=0.0751;
656 }
657 corr=(1+(a+b*phase+c*phase*phase)/100.);
658 */
659
660 // estimation from Vakhtang for rel 14.4.0
661 /*double k = (phase < 0.0 ? 0.0009400 : 0.0010160);
662 corr = (1.0 + k * phase * phase);
663 */
664
665 // Parabolic correction from Tigran
666 double a1,a2,b,c;
667 a1 = phase < 0.0 ? 0.000940774 : 0.00102111;
668 a2 = phase < 0.0 ? 0.000759051 : 0.000689625;
669 b = phase < 0.0 ? -2.0 * 7.0 * (a1 - a2) : 2.0 * 12.5 * (a1 - a2);
670 c = phase < 0.0 ? 1.0 - 7.0 * 7.0 * (a1-a2) : 1.0 - 12.5 * 12.5 * (a1-a2);
671 if (phase < 12.5 && phase > -7.0) corr = a1 * phase * phase + 1.0;
672 else corr = phase * ( a2 * phase + b) + c;
673
674
675 } else {
676 /*double a,b,c;
677 if(phase<0){
678 a=1.0002942; b=0.0003528; c=0.0005241;
679 }else{
680 a=1.0001841; b=-0.0004182; c=0.0006167;
681 }
682 corr = a + phase * ( b + c * phase);
683 */
684
685 /*double k = (phase < 0.0 ? 0.0005241 : 0.0006167);
686 corr = (1.0 + k * phase * phase);
687 */
688
689 // 4th degree polynomial correction from Tigran
690 double k1 = (phase < 0.0 ? -0.0000326707:0.000380336);
691 double k2 = (phase < 0.0 ? -0.000560962:-0.000670487);
692 double k3 = (phase < 0.0 ? -0.00000807869:0.00000501773);
693 double k4 = (phase < 0.0 ? -0.000000145008:0.0000000584647);
694
695 corr = 1.0 / (1.0 + (k1 + (k2 + (k3 + k4 *phase)*phase)*phase)*phase);
696
697
698 }
699
700 return corr;
701}

◆ correctTime()

double TileRawChannelBuilder::correctTime ( double phase,
bool of2 = true )
staticinherited

Time correction factor.

Definition at line 705 of file TileRawChannelBuilder.cxx.

705 {
706
707 double correction = 0.0;
708
709 if (of2) {
710 if(phase < 0) {
711 correction = (-0.00695743 + (0.0020673 - (0.0002976 + 0.00000361305 * phase) * phase) * phase) * phase;
712 } else {
713 correction = (0.0130013 + (0.00128769 + (-0.000550218 + 0.00000755344 * phase) * phase) * phase) * phase;
714 }
715 }
716 // OF1 does not need correction
717
718 return correction;
719}
correction(mu, runmode, campaign, run=None)
Definition zlumi_mc_cf.py:4

◆ CorruptedData()

int TileRawChannelBuilder::CorruptedData ( int ros,
int drawer,
int channel,
int gain,
const std::vector< float > & digits,
float & dmin,
float & dmax,
float ADCmaxMinusEps,
float ADCmaskValueMinusEps )
staticinherited

Definition at line 723 of file TileRawChannelBuilder.cxx.

724 {
725 bool eb = (ros > 2);
726 bool ebsp = ((ros == 3 && drawer == 14) || (ros == 4 && drawer == 17));
727 bool empty = ((eb && ((channel > 23 && channel < 30) || channel > 41)) || (ebsp && channel < 3));
728 bool not_gap = !(empty || (eb && (channel == 0 || channel == 1 || channel == 12 || channel == 13))
729 || (ebsp && (channel == 18 || channel == 19)));
730
731 const float epsilon = 4.1; // allow +/- 2 counts fluctuations around const value
732 const float delta[4] = { 29.9, 29.9, 49.9, 99.9 }; // jump levels between constLG, constHG, non-constLG, non-constHG
733 const float level1 = 99.9; // jump from this level to m_i_ADCmax is bad
734 const float level2 = 149.9; // base line at this level in low gain is bad
735 const float narrowLevel[2] = { 29.9, 49.9 }; // minimal amplitude for narrow pulses
736 const float delt = std::min(std::min(std::min(delta[0], delta[1]), std::min(delta[2], delta[3])),
737 std::min(narrowLevel[0], narrowLevel[1]));
738 const float secondMaxLevel = 0.3;
739
740 int error = 0;
741
742 unsigned int nSamp = digits.size();
743 if (nSamp) {
744 dmin = dmax = digits[0];
745 unsigned int pmin = 0;
746 unsigned int pmax = 0;
747 unsigned int nzero = (dmin < 0.01) ? 1 : 0;
748 unsigned int nover = (dmax > ADCmaxMinusEps) ? 1 : 0;
749
750 for (unsigned int i = 1; i < nSamp; ++i) {
751 float dig = digits[i];
752 if (dig > dmax) {
753 dmax = dig;
754 pmax = i;
755 } else if (dig < dmin) {
756 dmin = dig;
757 pmin = i;
758 }
759 if (dig < 0.01) ++nzero;
760 else if (dig > ADCmaxMinusEps) ++nover;
761 }
762
763 float dmaxmin = dmax - dmin;
764 //std::cout << " ros " << ros << " drawer " << drawer << " channel " << channel << " not_gap " << not_gap << " nzero " << nzero << " nover " << nover << std::endl;
765
766 if (dmin > ADCmaxMinusEps) { // overflow in all samples
767 error = (dmin > ADCmaskValueMinusEps) ? -3 : -1; // dmin=m_tileInfo->ADCmaskValue() - masking in overlay job (set in TileDigitsMaker)
768
769 } else if (dmax < 0.01) { // underflow in all samples
770 error = (empty) ? -5 : -2; // set different type of errors for exsiting and non-existing channels
771
772 } else if (dmaxmin < 0.01) { // constant value in all samples
773 error = -6;
774
775 } else if (nzero && nover) { // jump from zero to saturation
776 error = 1;
777
778 } else if ((nzero && (not_gap || empty)) || nzero > 1) { // one sample at zero in normal channel
779 error = 2; // or 2 samples at zero in gap/crack/MBTS
780
781 } else if (gain == 0 && dmin > level2) { // baseline above threshold in low gain is bad
782 error = 9;
783
784 } else if (dmaxmin > delt) { // check that max-min is above minimal allowed jump
785
786 float abovemin = dmax;
787 float belowmax = dmin;
788 unsigned int nmin = 0;
789 unsigned int nmax = 0;
790 for (unsigned int i = 0; i < nSamp; ++i) {
791 float smp = digits[i];
792 if (smp - dmin < epsilon) {
793 ++nmin;
794 }
795 if (dmax - smp < epsilon) {
796 ++nmax;
797 }
798 if (smp < abovemin && smp > dmin) {
799 abovemin = smp;
800 }
801 if (smp > belowmax && smp < dmax) {
802 belowmax = smp;
803 }
804 }
805 // more than two different values - shift index by 2, i.e. use thresholds for non-const levels
806 int gainInd = (abovemin != dmax || belowmax != dmin) ? gain + 2 : gain;
807 bool big_jump = (dmaxmin > delta[gainInd]);
808 bool max_in_middle = (pmax > 0 && pmax < nSamp - 1);
809 bool min_in_middle = (pmin > 0 && pmin < nSamp - 1);
810
811 if (nover > 1 && belowmax < level1) { // at least two saturated. others - close to pedestal
812 error = 3;
813 } else if (nmax + nmin == nSamp && big_jump) {
814 if (nmax > 1 && nmin > 1) { // at least 2 samples at two distinct levels
815 error = 4;
816 } else if (nmax == 1) {
817 if (max_in_middle) { // jump up in one sample, but not at the edge
818 error = 5;
819 }
820 } else if (nmin == 1) { // jump down in one sample
821 error = 6;
822 }
823 }
824 if (error == 0 && dmaxmin > narrowLevel[gain]) {
825 float secondMax = dmaxmin * secondMaxLevel;
826 float dminPlus = dmin + secondMax;
827 float dmaxMinus = dmax - secondMax;
828 if (not_gap) { // jumps above two (or one) neighbour samples
829 if (max_in_middle && std::max(digits[pmax - 1], digits[pmax + 1]) < dminPlus) {
830 error = 7; // jump up in one sample in the middle, which is much higher than two neighbours
831 } else if (min_in_middle && std::min(digits[pmin - 1], digits[pmin + 1]) > dmaxMinus) {
832 error = 8; // jump down in one sample, which is much lower than two neighbours
833 } else if (big_jump && gain == 0) { // check first and last sample only in low gain
834 if (pmin == 0 && digits[1] > dmax - secondMax) {
835 error = 10; // jump down in first sample. which is much lower than next one
836 } else if (pmin == nSamp - 1 && digits[pmin - 1] > dmax - secondMax) {
837 error = 11; // jump down in last sample. which is much lower than previous one
838 }
839 }
840 }
841 if (!error && big_jump) { // jumps above all samples
842 if ((max_in_middle || gain == 0) && nmax == 1 && belowmax < dminPlus) {
843 error = 12; // jump up in one sample in the middle, which is much higher than all others
844 } else if ((min_in_middle || gain == 0) && nmin == 1 && abovemin > dmaxMinus) {
845 error = 13; // jump down in one sample, which is much lower than all others (
846 }
847 }
848 }
849 }
850
851 } else {
852 dmin = dmax = 0.0;
853 }
854
855 return error;
856}
const int nmax(200)
bool empty(TH1 *h)

◆ createContainer()

StatusCode TileRawChannelBuilder::createContainer ( const EventContext & ctx)
virtualinherited

Create container in SG with name given by parameter (m_rawChannelContainerKey)

Definition at line 233 of file TileRawChannelBuilder.cxx.

233 {
234 initLog(ctx);
235
236 // create TRC container
237 m_rawChannelCnt = std::make_unique<TileMutableRawChannelContainer>(true, m_rChType, m_rChUnit, SG::VIEW_ELEMENTS);
238 ATH_CHECK( m_rawChannelCnt->status() );
239 m_rawChannelCnt->set_bsflags(m_bsflags);
240
241 ATH_MSG_DEBUG( "Created TileRawChannelContainer '" << m_rawChannelContainerKey.key() << "'" );
242
243 return StatusCode::SUCCESS;
244}
TileRawChannelUnit::UNIT m_rChUnit
void initLog(const EventContext &ctx)
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ endLog()

void TileRawChannelBuilder::endLog ( )
inherited

Definition at line 639 of file TileRawChannelBuilder.cxx.

639 {
640 m_chCounter = 0;
641 m_nChL = m_nChH = 0;
642 m_RChSumL = m_RChSumH = 0.0;
643
644}

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ fill_drawer_errors()

void TileRawChannelBuilder::fill_drawer_errors ( const EventContext & ctx,
const TileDigitsCollection * collection )
privateinherited

Definition at line 300 of file TileRawChannelBuilder.cxx.

302{
303 const TileDQstatus* DQstatus = SG::makeHandle (m_DQstatusKey, ctx).get();
304
305 int frag = coll->identify();
306 int ros = (frag >> 8);
307 int drawer = (frag & 0xff);
308
309 m_lastDrawer = frag;
310
311 memset(m_error, 0, sizeof(m_error));
312 int dmuerr[MAX_DMUS] = {0};
313 int nch = 0;
314 bool bigain = DQstatus->isBiGain();
315 if (!bigain) { // in bigain runs we don't have DQ status fragment
316 for (int ch = 0; ch < MAX_CHANNELS; ch += 3) {
317 if (!DQstatus->isAdcDQgood(ros, drawer, ch, 0)) {
318 m_error[ch + 2] = m_error[ch + 1] = m_error[ch] = -3;
319 dmuerr[ch / 3] = 3;
320 nch += 3;
321 }
322 }
323 }
324 if (nch == MAX_CHANNELS) { // all bad - nothing to do
325 m_badDrawer = true;
326 ATH_MSG_VERBOSE( "Drawer 0x" << MSG::hex << frag << MSG::dec
327 << " is bad - skipping bad patterns check " );
328 return;
329 } else {
330 m_badDrawer = false;
331 ATH_MSG_VERBOSE( "Drawer 0x" << MSG::hex << frag << MSG::dec
332 << " looking for bad patterns in digits" );
333 }
334
335 float mindig, maxdig;
336 int nchbad[2] = { 0, 0 };
337
338 // Iterate over all digits in this collection
339 TileDigitsCollection::const_iterator digitItr = coll->begin();
340 TileDigitsCollection::const_iterator lastDigit = coll->end();
341
342 for (; digitItr != lastDigit; ++digitItr) {
343 const TileDigits * pDigits = (*digitItr);
344 HWIdentifier adcId = pDigits->adc_HWID();
345 int channel = m_tileHWID->channel(adcId);
346 int gain = m_tileHWID->adc(adcId);
347
348 if (m_error[channel]) {
349 ATH_MSG_VERBOSE( "BadCh " << ros
350 << "/" << drawer
351 << "/" << channel
352 << "/" << gain << " BAD DQ STATUS ");
353
354 } else {
355
356 int err = CorruptedData(ros, drawer, channel, gain, pDigits->samples(), mindig, maxdig, m_ADCmaxMinusEps, m_ADCmaskValueMinusEps);
357
358 if (err) {
359
361 if (err > -5) {
362 ++dmuerr[channel / 3];
363 ++nchbad[channel / 24];
364 }
365
366 if (msgLvl(MSG::VERBOSE)) {
367
368 msg(MSG::VERBOSE) << "BadCh " << ros
369 << "/" << drawer
370 << "/" << channel
371 << "/" << gain;
372 if (err < -5) msg(MSG::VERBOSE) << " Warning " << err;
373 else msg(MSG::VERBOSE) << " Error " << err;
374 if (mindig > m_ADCmaskValueMinusEps) msg(MSG::VERBOSE) << " BADDQ";
375 if (maxdig > m_ADCmaxMinusEps) msg(MSG::VERBOSE) << " Overflow";
376 if (mindig < 0.1) msg(MSG::VERBOSE) << " Underflow";
377 if (err < 0) msg(MSG::VERBOSE) << " Const";
378
379 msg(MSG::VERBOSE) << " samp=";
380 std::vector<float> digits = pDigits->samples();
381 for (unsigned int i = 0; i < digits.size(); ++i) {
382 msg(MSG::VERBOSE) << " " << digits[i];
383 }
384 msg(MSG::VERBOSE) << endmsg;
385 }
386
387 } else {
388 if (mindig < 0.01) err += 1;
389 if (maxdig > m_ADCmaxMinusEps) err += 2;
390 if (err) m_error[channel] = err - 10;
391 }
392 }
393 }
394
395 // check if we want to mask half a drawer
396 // in this case set error = -4 for channels which were good before
397
398 int ndmubad[2] = { 0, 0 };
399 int dmu = 0;
400 for (; dmu < MAX_DMUS / 2; ++dmu) { // first half
401 if (dmuerr[dmu] > 1)
402 ++ndmubad[0]; // count DMUs with at least two bad channels
403 }
404 for (; dmu < MAX_DMUS; ++dmu) { // second half
405 if (dmuerr[dmu] > 1)
406 ++ndmubad[1]; // count DMUs with at least two bad channels
407 }
408
409 int ndmulimit[2] = { 3, 3 }; // max number of bad DMUs when half-drawer is not yet masked
410 // if 4 DMUs will be bad - mask whole half-drawer
411 if (frag > 0x2ff) { // if extended barrel
412 if (frag == 0x30e || frag == 0x411)
413 ndmulimit[0] = 4; // in EB special one DMU is always bad (missing)
414 ndmulimit[1] = 5; // in second half of EB 4 DMUs ara always bad (missing)
415 // only if 7 DMUs are bad, mask whole half-drawer
416 }
417
418 bool printall = true;
419 for (int p = 0; p < 2; ++p) {
420 if (ndmubad[p] > ndmulimit[p] && nchbad[p] > 0) {
421 if (msgLvl(MSG::VERBOSE)) {
422 msg(MSG::VERBOSE) << "Drawer 0x" << MSG::hex << frag << MSG::dec
423 << " masking whole " << ((p) ? "second" : "first")
424 << " half" << endmsg;
425 if (printall) {
426 msg(MSG::VERBOSE) << "nDMuErr ";
427 for (int d = 0; d < MAX_DMUS; ++d) {
428 msg(MSG::VERBOSE) << " " << dmuerr[d];
429 }
430 msg(MSG::VERBOSE) << " total " << ndmubad[p] << " errors" << endmsg;
431
432 msg(MSG::VERBOSE) << "ChErr ";
433 int ch = 0;
434 while (ch < MAX_CHANNELS-2) {
435 msg(MSG::VERBOSE) << " " << m_error[ch++];
436 msg(MSG::VERBOSE) << " " << m_error[ch++];
437 msg(MSG::VERBOSE) << " " << m_error[ch++];
438 msg(MSG::VERBOSE) << " ";
439 }
440
441 msg(MSG::VERBOSE) << " total " << nchbad[p]
442 << " bad patterns" << endmsg;
443 printall = false;
444 }
445 }
446 int ch = (p) ? MAX_CHANNELS / 2 : 0;
447 int chmax = (p) ? MAX_CHANNELS : MAX_CHANNELS / 2;
448 for (; ch < chmax; ++ch) {
449 if (m_error[ch] == 0 || m_error[ch] < -5) { // channel was good before
450 m_error[ch] = -4;
451 }
452 }
453 }
454 }
455
456}
bool isAdcDQgood(int partition, int drawer, int ch, int gain) const
returns status of single ADC returns False if there are any errors
bool isBiGain() const
returns gain mode of run
const std::vector< float > & samples() const
Definition TileDigits.h:58
float m_ADCmaskValueMinusEps
indicates channels which were masked in background dataset
static int CorruptedData(int ros, int drawer, int channel, int gain, const std::vector< float > &digits, float &dmin, float &dmax, float ADCmaxMinusEps, float ADCmaskValueMinusEps)

◆ filter()

double TileRawChannelBuilderOpt2Filter::filter ( int ros,
int drawer,
int channel,
int & gain,
double & pedestal,
double & amplitude,
double & time,
const EventContext & ctx )
private

Definition at line 340 of file TileRawChannelBuilderOpt2Filter.cxx.

341 {
342
343 ATH_MSG_VERBOSE( "filter()" );
344
345 amplitude = 0.;
346 time = 0.;
347 double chi2 = 0.;
348
349 auto minMaxDigits = std::minmax_element(m_digits.begin(), m_digits.end());
350 float minDigit = *minMaxDigits.first;
351 float maxDigit = *minMaxDigits.second;
352
353 if (maxDigit - minDigit < 0.01) { // constant value in all samples
354
355 pedestal = minDigit;
356 chi2 = 0.;
357 ATH_MSG_VERBOSE( "CASE NO SIGNAL: maxdig-mindig = " << maxDigit << "-" << minDigit
358 << " = " << maxDigit - minDigit );
359
360 m_nConst++;
361
362 } else {
363
364 pedestal = getPedestal(ros, drawer, channel, gain, ctx);
365 double phase = 0.;
366 int nIterations = 0;
367
368 if (m_maxIterations == 1) { // Without iterations
369 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
370 // AA 3.10.08 --- take best phase from COOL
371 if (m_bestPhase) {
372 // AS 19.11.09 - note minus sign here - time in DB is opposite to best phase
373 phase = -m_tileToolTiming->getSignalPhase(drawerIdx, channel, gain);
374 ATH_MSG_VERBOSE( "Best phase: " << phase
375 << " drawerIdx " << drawerIdx
376 << " channel " << channel );
377 }
378
379 double ofcPhase(phase);
380 chi2 = compute(ros, drawer, channel, gain, pedestal, amplitude, time, ofcPhase, ctx);
381
382 // If weights for tau=0 are used, deviations are seen in the amplitude =>
383 // function to correct the amplitude
385 && amplitude > m_ampMinThresh
386 && time > m_timeMinThresh
387 && time < m_timeMaxThresh) {
388
389 amplitude *= correctAmp(time, m_of2);
390 ATH_MSG_VERBOSE( "Amplitude corrected by " << correctAmp(time, m_of2)
391 << " new amplitude is " << amplitude );
392 }
393
394 if (m_correctTimeNI ) {
395 ATH_MSG_VERBOSE( "Time " << time
396 << " is corrected by " << correctTime(time, m_of2)
397 << ", new time is " << time + correctTime(time, m_of2));
398
399 time += correctTime(time, m_of2);
400 }
401
402 time += (phase - ofcPhase); // correct time if actual phase used in the calculation is different from required
403
404 if (time > m_maxTime) time = m_maxTime;
405 if (time < m_minTime) time = m_minTime;
406
407 m_nSignal++;
408
409 } else { // With iterations => 3 cases defined for correct pedestal treatment
410
411 // values used for pedestal-like events when iterations are performed
412 //const int sigma_hi = 5;
413 //const int sigma_lo = 3;
415 int digits_size_1 = m_digits.size() - 1;
416
417 // Signal events: OF with iterations
418 if ((maxDigit - m_digits[0] > sigma)
419 || (m_digits[0] - m_digits[digits_size_1] > 4 * sigma)) {
420
421 ATH_MSG_VERBOSE( "CASE Signal: maxdig-OptFilterDigits[0]="
422 << maxDigit - m_digits[0]
423 << " OptFilterDigits[0]-OptFilterDigits[ digits_size_1]="
424 << m_digits[0] - m_digits[digits_size_1] );
425
426 nIterations = iterate(ros, drawer, channel, gain, pedestal, amplitude, time, chi2, ctx);
427
428 ATH_MSG_VERBOSE( "number of iterations= " << nIterations );
429
430 m_nSignal++;
431 } else if (m_digits[0] - minDigit > sigma) { //Pedestal events: OF with negative iterations
432
433 if (msgLvl(MSG::VERBOSE)) {
434 msg(MSG::VERBOSE) << "CASE NEGATIVE: maxdig-OptFilterDigits[0]="
435 << maxDigit - m_digits[0]
436 << " OptFilterDigits[0]-OptFilterDigits[digits_size_1]="
437 << m_digits[0] - m_digits[digits_size_1] << endmsg;
438 msg(MSG::VERBOSE) << "OptFilterDigits[0]-mindig="
439 << m_digits[0] - minDigit << endmsg;
440 }
441
442 for (int i = 0; i <= digits_size_1; i++) // Mirror around pedestal
443 m_digits[i] = pedestal - (m_digits[i] - pedestal);
444
445 nIterations = iterate(ros, drawer, channel, gain, pedestal, amplitude, time, chi2, ctx);
446
447 amplitude = -amplitude;
448
449 ++m_nNegative;
450
451 } else { // Gaussian center: no iterations and phase=0
452
453 if (msgLvl(MSG::VERBOSE)) {
454 msg(MSG::VERBOSE) << "CASE CENTER: maxdig-OptFilterDigits[0]="
455 << maxDigit - m_digits[0]
456 << " OptFilterDigits[0]-OptFilterDigits[digits_size_1]="
457 << m_digits[0] - m_digits[digits_size_1] << endmsg;
458 msg(MSG::VERBOSE) << "OptFilterDigits[0]-mindig="
459 << m_digits[0] - minDigit
460 << endmsg;
461 }
462
463 if (m_bestPhase) {
464 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
465 // AS 19.11.09 - note minus sign here - time in DB is opposite to best phase
466 phase = -m_tileToolTiming->getSignalPhase(drawerIdx, channel, gain);
467 ATH_MSG_VERBOSE( "Best phase: " << phase
468 << " drawerIdx " << drawerIdx
469 << " channel " << channel );
470 }
471
472 chi2 = compute(ros, drawer, channel, gain, pedestal, amplitude, time, phase, ctx);
473
474 // If weights for tau=0 are used, deviations are seen in the amplitude =>
475 // function to correct the amplitude
477 && amplitude > m_ampMinThresh
478 && time > m_timeMinThresh
479 && time < m_timeMaxThresh) {
480
481 amplitude *= correctAmp(time, m_of2);
482 ATH_MSG_VERBOSE( "Amplitude corrected by " << correctAmp(time, m_of2)
483 << " new amplitude is " << amplitude );
484 }
485
486 if (m_bestPhase) {
487 time = -phase;
488 chi2 = -chi2;
489 } else {
490 time = 0.;
491 }
492
493 m_nCenter++;
494
495 }
496
497 }
498
499 }
500
501 return chi2;
502}
int iterate(int ros, int drawer, int channel, int gain, double &pedestal, double &amplitude, double &time, double &chi2, const EventContext &ctx)
Computes A,time,ped using OF.
float getPedestal(int ros, int drawer, int channel, int gain, const EventContext &ctx)
Apply the number of iterations needed for reconstruction by calling the Filter method.
double compute(int ros, int drawer, int channel, int gain, double &pedestal, double &amplitude, double &time, double &phase, const EventContext &ctx)
ToolHandle< TileCondToolTiming > m_tileToolTiming
float m_timeMinThresh
correct amplitude is time is above time min threshold
static double correctTime(double phase, bool of2=true)
Time correction factor.
float m_ampMinThresh
correct amplitude if it's above amplitude threshold (in ADC counts)
float m_timeMaxThresh
correct amplitude is time is below time max threshold
static double correctAmp(double phase, bool of2=true)
Amplitude correction factor according to the time when using weights for tau=0 without iterations.

◆ finalize()

StatusCode TileRawChannelBuilderOpt2Filter::finalize ( )
virtual

Finalize method.

Reimplemented from TileRawChannelBuilder.

Definition at line 170 of file TileRawChannelBuilderOpt2Filter.cxx.

170 {
171
172 if (msgLvl(MSG::VERBOSE)) {
173 if (m_maxIterations == 1) { // Without iterations
174 msg(MSG::VERBOSE) << "Counters: Signal=" << m_nSignal
175 << " Constant=" << m_nConst
176 << " Total=" << m_nSignal + m_nConst << endmsg;
177 } else {
178 msg(MSG::VERBOSE) << "Counters: Signal=" << m_nSignal
179 << " Negat=" << m_nNegative
180 << " Center=" << m_nCenter
181 << " Constant=" << m_nConst
182 << " Total=" << m_nSignal + m_nNegative + m_nConst + m_nCenter << endmsg;
183 }
184 }
185
186 ATH_MSG_DEBUG( "Finalizing" );
187
188 return StatusCode::SUCCESS;
189}

◆ findMaxDigitPosition()

int TileRawChannelBuilderOpt2Filter::findMaxDigitPosition ( )
private

Finds maximum digit position in the pulse.

Gets pedestal estimation for OF1

Definition at line 270 of file TileRawChannelBuilderOpt2Filter.cxx.

270 {
271
272 ATH_MSG_VERBOSE( " findMaxDigitPosition()" );
273
274 int iMaxDigit = 0;
275 float maxDigit = 0.;
276 bool saturated = false;
277
278 for (unsigned int i = 0; i < m_digits.size(); i++) {
279 if (m_digits[i] > m_ADCmaxMinusEps) saturated = true;
280 if (maxDigit < m_digits[i]) {
281 maxDigit = m_digits[i];
282 iMaxDigit = i;
283 }
284 }
285
286 if (msgLvl(MSG::VERBOSE)) {
287 for (unsigned int i = 0; i < m_digits.size(); i++) {
288 msg(MSG::VERBOSE) << " " << m_digits[i];
289 }
290
291 msg(MSG::VERBOSE) << "; Max: digit[" << iMaxDigit << "]=" << maxDigit << endmsg;
292
293 if (saturated) msg(MSG::VERBOSE) << " Samples saturated" << endmsg;
294 }
295
296 return iMaxDigit;
297}
setScaleOne setStatusOne saturated

◆ getOverflowedChannels()

Overflows_t & TileRawChannelBuilder::getOverflowedChannels ( void )
inherited

Definition at line 38 of file TileRawChannelBuilder.cxx.

38 {
39 return m_overflows;
40}

◆ getPedestal()

float TileRawChannelBuilderOpt2Filter::getPedestal ( int ros,
int drawer,
int channel,
int gain,
const EventContext & ctx )
private

Apply the number of iterations needed for reconstruction by calling the Filter method.

Definition at line 300 of file TileRawChannelBuilderOpt2Filter.cxx.

300 {
301 float pedestal = 0.;
302
303 switch (m_pedestalMode) {
304 case -1:
305 // use pedestal from conditions DB
306 pedestal = m_tileToolNoiseSample->getPed(TileCalibUtils::getDrawerIdx(ros, drawer), channel, gain, TileRawChannelUnit::ADCcounts, ctx);
307 break;
308 case 7:
309 pedestal = m_digits[6];
310 break;
311 case 9:
312 pedestal = m_digits[8];
313 break;
314 case 12:
315 pedestal = .5 * (m_digits[0] + m_digits[1]);
316 break;
317 case 17:
318 pedestal = .5 * (m_digits[0] + m_digits[6]);
319 break;
320 case 19:
321 pedestal = .5 * (m_digits[0] + m_digits[8]);
322 break;
323 case 71:
324 pedestal = std::min(m_digits[0], m_digits[6]);
325 break;
326 case 7621:
327 pedestal = 0.5 * std::min(m_digits[0] + m_digits[1], m_digits[5] + m_digits[6]);
328 break;
329 default:
330 pedestal = m_digits[0];
331 break;
332 }
333
334 ATH_MSG_VERBOSE("getPedestal(): pedestal=" << pedestal);
335
336 return pedestal;
337}
ToolHandle< TileCondToolNoiseSample > m_tileToolNoiseSample
Applies OF algorithm.

◆ getTileRawChannelContainerID()

std::string TileRawChannelBuilder::getTileRawChannelContainerID ( void )
inherited

Definition at line 42 of file TileRawChannelBuilder.cxx.

42 {
43 return m_rawChannelContainerKey.key();
44}

◆ initialize()

StatusCode TileRawChannelBuilderOpt2Filter::initialize ( )
virtual

Initialize method.

Reimplemented from TileRawChannelBuilder.

Definition at line 90 of file TileRawChannelBuilderOpt2Filter.cxx.

90 {
91
92 ATH_MSG_INFO( "initialize()" );
93
94 m_rChType = TileFragHash::OptFilterOffline; // type for offline Opt Filter
95
96 // init in superclass
98
99 if (m_maxIterations != 1) m_correctTimeNI = false;
100
101 // bits 12-15 - various options
102 // if (m_correctTimeNI) m_bsflags |= 0x1000;
103 if (m_correctAmplitude) m_bsflags |= 0x2000;
104 if (m_maxIterations > 1) m_bsflags |= 0x4000;
105 if (m_bestPhase) m_bsflags |= 0x8000;
106
107 ATH_MSG_DEBUG( " MaxIterations=" << m_maxIterations
108 << " PedestalMode=" << m_pedestalMode
109 << " TimeForConvergence=" << m_timeForConvergence
110 << " ConfTB=" << m_confTB
111 << " OF2=" << m_of2
112 << " Minus1Iteration=" << m_minus1Iter
113 << " AmplitudeCorrection=" << m_correctAmplitude
114 << " TimeCorrection=" << m_correctTimeNI
115 << " Best Phase " << m_bestPhase );
116
117 ATH_MSG_DEBUG( " NoiseThresholdHG=" << m_noiseThresholdHG
118 << " NoiseThresholdLG=" << m_noiseThresholdLG);
119
120 m_nSamples = m_tileInfo->NdigitSamples();
121 m_t0SamplePosition = m_tileInfo->ItrigSample();
122 if (m_maxTime < m_minTime) { // set time window if it was not set from jobOptions
125 }
126 ATH_MSG_DEBUG(" NSamples=" << m_nSamples
127 << " T0Sample=" << m_t0SamplePosition
128 << " minTime=" << m_minTime
129 << " maxTime=" << m_maxTime );
130
131 if (m_pedestalMode % 10 > 2 && m_nSamples != m_pedestalMode % 10) {
132 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Changing PedestalMode from " << m_pedestalMode;
134 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " to " << m_pedestalMode << endmsg;
135 }
136
137
138 if (m_nSamples != 7 && (m_pedestalMode == 71 || m_pedestalMode == 7621)) {
139 ATH_MSG_ERROR( "Incompatable pedestal mode [" << m_pedestalMode
140 << "] and number of samples [" << m_nSamples << "]" );
141 return StatusCode::FAILURE;
142 }
143
144 m_nSignal = 0;
145 m_nNegative = 0;
146 m_nCenter = 0;
147 m_nConst = 0;
148
149 //=== get TileCondToolOfc
150 ATH_CHECK( m_tileCondToolOfc.retrieve() );
151
152 //=== get TileCondToolNoiseSample
153 ATH_CHECK( m_tileToolNoiseSample.retrieve(EnableTool{m_pedestalMode == -1}) );
154
155 if (m_bestPhase) {
156 //=== get TileToolTiming
157 // TileToolTiming can be disabled in the TileRawChannelBuilder
158 if (!m_tileToolTiming.isEnabled()) {
159 m_tileToolTiming.enable();
160 }
161 ATH_CHECK( m_tileToolTiming.retrieve() );
162 }
163
164 ATH_MSG_INFO( "initialization completed" );
165
166 return StatusCode::SUCCESS;
167}
#define ATH_MSG_INFO(x)
virtual StatusCode initialize()
Initializer.

◆ initLog()

void TileRawChannelBuilder::initLog ( const EventContext & ctx)
inherited

Definition at line 246 of file TileRawChannelBuilder.cxx.

246 {
247
248 const TileDQstatus* DQstatus = SG::makeHandle (m_DQstatusKey, ctx).get();
249
250 // update only if there is new event
251 if (m_evtCounter != ctx.evt()) {
252
253 m_evtCounter = ctx.evt();
254 if (m_runType != 0) m_trigType = m_runType;
255 else m_trigType = DQstatus->trigType();
256
257 if (0 == m_trigType) {
258 m_idophys = (DQstatus->calibMode() == 0);
259 m_idolas = false;
260 m_idoped = false;
261 m_idocis = (DQstatus->calibMode() == 1);
262 } else {
263 m_idophys = (m_trigType <= 1);
264 m_idolas = ((m_trigType == 2) || (m_trigType == 3));
265 m_idoped = ((m_trigType == 4) || (m_trigType == 5));
266 m_idocis = ((m_trigType == 8) || (m_trigType == 9));
267 }
268
269 const unsigned int *cispar = DQstatus->cispar();
270 if (0 == cispar[7]) { // if capdaq not set, it can't be CIS event
271 if (m_idocis) { // cis flag was set incorrectly, change to ped
272 m_idoped = true;
273 m_idocis = false;
274 }
275 m_capdaq = 0.0;
276 } else {
277 m_capdaq = (cispar[7] < 10) ? 5.2 : 100.0;
278 }
279 m_cischan = cispar[8] - 1; // channel where CIS is fired (-1 = all channels)
280
281 ATH_MSG_DEBUG( "Trig type is " << m_trigType
282 << "; dophys is " << ((m_idophys) ? "true" : "false")
283 << "; dolas is " << ((m_idolas) ? "true" : "false")
284 << "; doped is " << ((m_idoped) ? "true" : "false")
285 << "; docis is " << ((m_idocis) ? "true" : "false")
286 << "; capacitor is " << m_capdaq
287 << "; cis chan is " << m_cischan );
288 }
289}
int trigType() const
Trigger type.
uint32_t calibMode() const
Calibration mode.
const uint32_t * cispar() const
CIS parameters.

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

const InterfaceID & TileRawChannelBuilderOpt2Filter::interfaceID ( )
static

AlgTool InterfaceID.

Definition at line 45 of file TileRawChannelBuilderOpt2Filter.cxx.

45 {
46 return IID_ITileRawChannelBuilderOpt2Filter;
47}

◆ iterate()

int TileRawChannelBuilderOpt2Filter::iterate ( int ros,
int drawer,
int channel,
int gain,
double & pedestal,
double & amplitude,
double & time,
double & chi2,
const EventContext & ctx )
private

Computes A,time,ped using OF.

If iterations are required, the Iterator method is used

Definition at line 505 of file TileRawChannelBuilderOpt2Filter.cxx.

506 {
507
508 ATH_MSG_VERBOSE( "iterate()" );
509
510 int nIterations = 0;
511 double savePhase = 0.0;
512 double phase = 0.0;
513 time = -1000.;
514
515 // Mythic -1 iteration or DSP emulation case
516 if (m_minus1Iter || (m_emulateDsp && (m_maxIterations > 1)))
518
519 while ((time > m_timeForConvergence
520 || time < (-1.) * m_timeForConvergence
521 || m_emulateDsp)
522 && nIterations < m_maxIterations) {
523
524 chi2 = compute(ros, drawer, channel, gain, pedestal, amplitude, time, phase, ctx);
525
526 savePhase = phase;
527
528 if (m_emulateDsp)
529 phase -= round(time); // rounding phase to integer like in DSP
530 else
531 phase -= time; // no rounding at all for OFC on the fly
532
533 if (phase > m_maxTime) phase = m_maxTime;
534 if (phase < m_minTime) phase = m_minTime;
535
536 ++nIterations;
537 ATH_MSG_VERBOSE( " OptFilter computed with phase=" << savePhase
538 << " Time=" << time
539 << " END ITER=" << nIterations
540 << " new phase=" << phase
541 << " chi2=" << chi2
542 << " Amp=" << amplitude );
543 }
544
545 time -= savePhase;
546 if (time > m_maxTime) time = m_maxTime;
547 if (time < m_minTime) time = m_minTime;
548
549 ATH_MSG_VERBOSE( "OptFilterEne=" << amplitude
550 << " Phase=" << savePhase
551 << " Absolute Time=" << time );
552
553 return nIterations;
554}
int findMaxDigitPosition()
Finds maximum digit position in the pulse.

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ ofc2int()

void TileRawChannelBuilderOpt2Filter::ofc2int ( int nDigits,
double * w_off,
short * w_int,
short & scale )
private

Definition at line 717 of file TileRawChannelBuilderOpt2Filter.cxx.

717 {
718 // Number of bits of the integer word (signed -1 )
719 int numberBits = 16;
720 numberBits = numberBits - 1;
721
722 // Get Absolute Maximum
723 double max = -10000.;
724 double sum = 0.;
725 for (int i = 0; i < nDigits; i++) {
726 sum += w_off[i];
727 if (fabs(w_off[i]) > max) max = fabs(w_off[i]);
728 // printf("idig = %d weight = %f \n",i, w_off[i]);
729 }
730 if (fabs(sum) > max) max = fabs(sum);
731
732 // Get Scale at Maximum
733 scale = 0;
734 if (max != 0) scale = (int) truncf(log((std::pow(2., numberBits) - 1.) / max) / log(2.));
735
736 // Convert to Integer the weights and the sum
737 for (int i = 0; i < nDigits; i++)
738 w_int[i] = (short) roundf(w_off[i] * std::pow(2., scale));
739 //aa w_sum_dsp = (short) roundf(sum*std::pow(2.,scale));
740
741
742/*
743 if (msgLvl(MSG::VERBOSE)) {
744 printf("\nAbsolute Max value = %15.8f -> Scale = %3d\n",max,scale);
745
746 for (int i=0; i<ndigits; i++)
747 {
748 if ( i == 0){
749 printf("\n Offline Off*Scale Dsp/scale Dsp Scale \n");
750 printf("----------------------------------------------------------------------------------\n");
751 printf(" %17.10f %17.10f %17.10f 0x%04X %3d \n",
752 w_off[i],w_off[i]*std::pow(2.,scale), w_int[i]/std::pow(2.,scale),(unsigned int) w_int[i] ,scale);
753 } else {
754 printf(" %17.10f %17.10f %17.10f 0x%04X \n",
755 w_off[i],w_off[i]*std::pow(2.,scale), w_int[i]/std::pow(2.,scale),(unsigned int)w_int[i]);
756 }
757 }
758 //aa printf(" %17.10f %17.10f %17.10f 0x%04X <- SUM\n",
759 //aa sum,sum*std::pow(2.,scale),w_sum_dsp/std::pow(2.,scale),(unsigned int)w_sum_dsp);
760 }
761*/
762 return;
763}
#define max(a, b)
Definition cfImp.cxx:41

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ rawChannel()

TileRawChannel * TileRawChannelBuilderOpt2Filter::rawChannel ( const TileDigits * digits,
const EventContext & ctx )
virtual

Builder virtual method to be implemented by subclasses.

Parameters
digitsPointer to TileDigitsContainer

Reimplemented from TileRawChannelBuilder.

Definition at line 192 of file TileRawChannelBuilderOpt2Filter.cxx.

192 {
193
194 ++m_chCounter;
195
196 double pedestal = 0.;
197 double energy = 0.;
198 double time = 0.;
199 double chi2 = 0.;
200 m_digits = digits->samples();
201 m_digits.erase(m_digits.begin(),m_digits.begin()+m_firstSample);
202 m_digits.resize(m_nSamples);
203 const HWIdentifier adcId = digits->adc_HWID();
204 int gain = m_tileHWID->adc(adcId);
205
206 ATH_MSG_VERBOSE( "Building Raw Channel, with OptFilter, HWID:" << m_tileHWID->to_string(adcId)
207 << " gain=" << gain );
208
209 int ros = m_tileHWID->ros(adcId);
210 int drawer = m_tileHWID->drawer(adcId);
211 int channel = m_tileHWID->channel(adcId);
212
213 chi2 = filter(ros, drawer, channel, gain, pedestal, energy, time, ctx);
214
215 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
216
217 if (m_calibrateEnergy) {
218 energy = m_tileToolEmscale->doCalibCis(drawerIdx, channel, gain, energy);
219 }
220
221 if (msgLvl(MSG::VERBOSE)) {
222 msg(MSG::VERBOSE) << "Creating OptFilter RawChannel"
223 << " a=" << energy
224 << " t=" << time
225 << " ped=" << pedestal
226 << " q=" << chi2 << endmsg;
227
228 msg(MSG::VERBOSE) << "digits:";
229
230 for (unsigned int i = 0; i < m_digits.size(); ++i)
231 msg(MSG::VERBOSE) << " " << m_digits[i];
232
233 msg(MSG::VERBOSE) << " " << endmsg;
234 }
235
236 // return new TileRawChannel
237 // TileRawChannel *rawCh = new TileRawChannel(adcId,OptFilterEne,OptFilterTime,OptFilterChi2,OptFilterPed);
238 DataPool<TileRawChannel> tileRchPool(m_dataPoollSize);
239 TileRawChannel *rawCh = tileRchPool.nextElementPtr();
240 rawCh->assign (adcId,
241 energy,
242 time,
243 chi2,
244 pedestal);
245
246 if (m_correctTime
247 && (time != 0
248 && time < m_maxTime
249 && time > m_minTime)) {
250
251 time -= m_tileToolTiming->getSignalPhase(drawerIdx, channel, gain);
252 rawCh->insertTime(time);
253
254 ATH_MSG_VERBOSE( "Correcting time, new time=" << rawCh->time() );
255
256 }
257
258 if (TileID::HIGHGAIN == gain) {
259 ++m_nChH;
260 m_RChSumH += energy;
261 } else {
262 ++m_nChL;
263 m_RChSumL += energy;
264 }
265
266 return rawCh;
267}
double filter(int ros, int drawer, int channel, int &gain, double &pedestal, double &amplitude, double &time, const EventContext &ctx)
ToolHandle< TileCondToolEmscale > m_tileToolEmscale
void assign(const HWIdentifier &id, float amplitude, float time, float quality, float ped=0.0)
void insertTime(float time)
float time(int ind=0) const

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ resetDrawer()

void TileRawChannelBuilder::resetDrawer ( )
inherited

Definition at line 29 of file TileRawChannelBuilder.cxx.

29 {
30 m_lastDrawer = -1;
31 m_badDrawer = false;
32}

◆ resetOverflows()

void TileRawChannelBuilder::resetOverflows ( void )
inherited

Definition at line 34 of file TileRawChannelBuilder.cxx.

34 {
35 m_overflows.clear();
36}

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_ADCmaskValueMinusEps

float TileRawChannelBuilder::m_ADCmaskValueMinusEps
protectedinherited

indicates channels which were masked in background dataset

Definition at line 222 of file TileRawChannelBuilder.h.

◆ m_ADCmaxMinusEps

float TileRawChannelBuilder::m_ADCmaxMinusEps
protectedinherited

Definition at line 221 of file TileRawChannelBuilder.h.

◆ m_ampMinThresh

float TileRawChannelBuilder::m_ampMinThresh
protectedinherited

correct amplitude if it's above amplitude threshold (in ADC counts)

Definition at line 152 of file TileRawChannelBuilder.h.

◆ m_badDrawer

bool TileRawChannelBuilder::m_badDrawer = false
protectedinherited

Definition at line 210 of file TileRawChannelBuilder.h.

◆ m_bestPhase

bool TileRawChannelBuilderOpt2Filter::m_bestPhase
private

Definition at line 96 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_bsflags

unsigned int TileRawChannelBuilder::m_bsflags
protectedinherited

Definition at line 138 of file TileRawChannelBuilder.h.

◆ m_cabling

const TileCablingService* TileRawChannelBuilder::m_cabling
protectedinherited

TileCabling instance.

Definition at line 182 of file TileRawChannelBuilder.h.

◆ m_cablingSvc

ServiceHandle<TileCablingSvc> TileRawChannelBuilder::m_cablingSvc
protectedinherited
Initial value:
{ this,
"TileCablingSvc", "TileCablingSvc", "The Tile cabling service"}

Name of Tile cabling service.

Definition at line 179 of file TileRawChannelBuilder.h.

179 { this,
180 "TileCablingSvc", "TileCablingSvc", "The Tile cabling service"};

◆ m_calibrateEnergy

bool TileRawChannelBuilder::m_calibrateEnergy
protectedinherited

Definition at line 142 of file TileRawChannelBuilder.h.

◆ m_capdaq

double TileRawChannelBuilder::m_capdaq
protectedinherited

Definition at line 193 of file TileRawChannelBuilder.h.

◆ m_chCounter

unsigned int TileRawChannelBuilder::m_chCounter
protectedinherited

Definition at line 196 of file TileRawChannelBuilder.h.

◆ m_cischan

int TileRawChannelBuilder::m_cischan
protectedinherited

Definition at line 192 of file TileRawChannelBuilder.h.

◆ m_confTB

bool TileRawChannelBuilderOpt2Filter::m_confTB
private

use testbeam configuration

Definition at line 89 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_correctAmplitude

bool TileRawChannelBuilderOpt2Filter::m_correctAmplitude
private

If true, resulting amplitude is corrected when using weights for tau=0 without iteration.

Definition at line 93 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_correctTime

bool TileRawChannelBuilder::m_correctTime
protectedinherited

Definition at line 145 of file TileRawChannelBuilder.h.

◆ m_correctTimeNI

bool TileRawChannelBuilderOpt2Filter::m_correctTimeNI
private

If true, resulting time is corrected when using method without iteration.

Definition at line 94 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_dataPoollSize

int TileRawChannelBuilder::m_dataPoollSize
protectedinherited

Definition at line 204 of file TileRawChannelBuilder.h.

◆ m_demoFragIDs

Gaudi::Property<std::vector<int> > TileRawChannelBuilder::m_demoFragIDs
protectedinherited
Initial value:
{this,
"DemoFragIDs", {}, "List of Tile frag IDs with new electronics (demonstrator)"}

Definition at line 184 of file TileRawChannelBuilder.h.

184 {this,
185 "DemoFragIDs", {}, "List of Tile frag IDs with new electronics (demonstrator)"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_digits

std::vector<float> TileRawChannelBuilderOpt2Filter::m_digits
private

Definition at line 109 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_DQstatusKey

SG::ReadHandleKey<TileDQstatus> TileRawChannelBuilder::m_DQstatusKey
protectedinherited
Initial value:
{this, "TileDQstatus",
"TileDQstatus",
"TileDQstatus key"}

Definition at line 120 of file TileRawChannelBuilder.h.

120 {this, "TileDQstatus",
121 "TileDQstatus",
122 "TileDQstatus key"};

◆ m_DSPContainerKey

SG::ReadHandleKey<TileRawChannelContainer> TileRawChannelBuilder::m_DSPContainerKey {this, "DSPContainer", "", "DSP Container key"}
protectedinherited

Definition at line 125 of file TileRawChannelBuilder.h.

126{this, "DSPContainer", "", "DSP Container key"};

◆ m_emulateDsp

bool TileRawChannelBuilderOpt2Filter::m_emulateDsp
private

Definition at line 97 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_error

int TileRawChannelBuilder::m_error[MAX_CHANNELS]
protectedinherited

Definition at line 208 of file TileRawChannelBuilder.h.

◆ m_evtCounter

unsigned int TileRawChannelBuilder::m_evtCounter
protectedinherited

Definition at line 195 of file TileRawChannelBuilder.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_f_ADCmax

float TileRawChannelBuilder::m_f_ADCmax
protectedinherited

Definition at line 218 of file TileRawChannelBuilder.h.

◆ m_f_ADCmaxPlus1

float TileRawChannelBuilder::m_f_ADCmaxPlus1
protectedinherited

Definition at line 220 of file TileRawChannelBuilder.h.

◆ m_firstSample

int TileRawChannelBuilder::m_firstSample
protectedinherited

Definition at line 140 of file TileRawChannelBuilder.h.

◆ m_i_ADCmax

int TileRawChannelBuilder::m_i_ADCmax
protectedinherited

Definition at line 217 of file TileRawChannelBuilder.h.

◆ m_i_ADCmaxPlus1

int TileRawChannelBuilder::m_i_ADCmaxPlus1
protectedinherited

Definition at line 219 of file TileRawChannelBuilder.h.

◆ m_idocis

bool TileRawChannelBuilder::m_idocis
protectedinherited

Definition at line 191 of file TileRawChannelBuilder.h.

◆ m_idolas

bool TileRawChannelBuilder::m_idolas
protectedinherited

Definition at line 189 of file TileRawChannelBuilder.h.

◆ m_idoped

bool TileRawChannelBuilder::m_idoped
protectedinherited

Definition at line 190 of file TileRawChannelBuilder.h.

◆ m_idophys

bool TileRawChannelBuilder::m_idophys
protectedinherited

Definition at line 188 of file TileRawChannelBuilder.h.

◆ m_infoName

std::string TileRawChannelBuilder::m_infoName
protectedinherited

Definition at line 215 of file TileRawChannelBuilder.h.

◆ m_lastDrawer

int TileRawChannelBuilder::m_lastDrawer = -1
protectedinherited

Definition at line 209 of file TileRawChannelBuilder.h.

◆ m_maxIterations

int TileRawChannelBuilderOpt2Filter::m_maxIterations
private

maximum number of iteration to perform

Definition at line 87 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_maxTime

double TileRawChannelBuilderOpt2Filter::m_maxTime
private

max allowed time = 25*(m_nSamples-1)/2

Definition at line 105 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_minTime

double TileRawChannelBuilderOpt2Filter::m_minTime
private

min allowed time = -25*(m_nSamples-1)/2

Definition at line 106 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_minus1Iter

bool TileRawChannelBuilderOpt2Filter::m_minus1Iter
private

bool variable for whether to apply -1 iteration (initial phase guess)

Definition at line 92 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_nCenter

int TileRawChannelBuilderOpt2Filter::m_nCenter
private

internal counters

Definition at line 100 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_nChH

int TileRawChannelBuilder::m_nChH
protectedinherited

Definition at line 199 of file TileRawChannelBuilder.h.

◆ m_nChL

int TileRawChannelBuilder::m_nChL
protectedinherited

Definition at line 198 of file TileRawChannelBuilder.h.

◆ m_nConst

int TileRawChannelBuilderOpt2Filter::m_nConst
private

internal counters

Definition at line 101 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_nNegative

int TileRawChannelBuilderOpt2Filter::m_nNegative
private

internal counters

Definition at line 99 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_noiseFilterTools

ToolHandleArray<ITileRawChannelTool> TileRawChannelBuilder::m_noiseFilterTools
protectedinherited
Initial value:
{this,
"NoiseFilterTools", {}, "Tile noise filter tools"}

Definition at line 163 of file TileRawChannelBuilder.h.

163 {this,
164 "NoiseFilterTools", {}, "Tile noise filter tools"};

◆ m_noiseThresholdHG

int TileRawChannelBuilderOpt2Filter::m_noiseThresholdHG
private

Definition at line 111 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_noiseThresholdLG

int TileRawChannelBuilderOpt2Filter::m_noiseThresholdLG
private

Definition at line 112 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_notUpgradeCabling

bool TileRawChannelBuilder::m_notUpgradeCabling
protectedinherited

Definition at line 212 of file TileRawChannelBuilder.h.

◆ m_nSamples

int TileRawChannelBuilderOpt2Filter::m_nSamples
private

number of samples in the data

Definition at line 103 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_nSignal

int TileRawChannelBuilderOpt2Filter::m_nSignal
private

internal counters

Definition at line 98 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_of2

bool TileRawChannelBuilderOpt2Filter::m_of2
private

bool variable for OF method: true=> OF2; false=> OF1

Definition at line 91 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_overflows

Overflows_t TileRawChannelBuilder::m_overflows
protectedinherited

Definition at line 203 of file TileRawChannelBuilder.h.

◆ m_pedestalMode

int TileRawChannelBuilderOpt2Filter::m_pedestalMode
private

pedestal mode to use

Definition at line 88 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_rawChannelCnt

std::unique_ptr<TileMutableRawChannelContainer> TileRawChannelBuilder::m_rawChannelCnt
protectedinherited

Definition at line 133 of file TileRawChannelBuilder.h.

◆ m_rawChannelContainerKey

SG::WriteHandleKey<TileRawChannelContainer> TileRawChannelBuilder::m_rawChannelContainerKey
protectedinherited
Initial value:
{this,"TileRawChannelContainer","TileRawChannelFiltered",
"Output Tile raw channels container key"}

Definition at line 129 of file TileRawChannelBuilder.h.

129 {this,"TileRawChannelContainer","TileRawChannelFiltered",
130 "Output Tile raw channels container key"};

◆ m_RChSumH

double TileRawChannelBuilder::m_RChSumH
protectedinherited

Definition at line 201 of file TileRawChannelBuilder.h.

◆ m_RChSumL

double TileRawChannelBuilder::m_RChSumL
protectedinherited

Definition at line 200 of file TileRawChannelBuilder.h.

◆ m_rChType

TileFragHash::TYPE TileRawChannelBuilder::m_rChType
protectedinherited

Definition at line 136 of file TileRawChannelBuilder.h.

◆ m_rChUnit

TileRawChannelUnit::UNIT TileRawChannelBuilder::m_rChUnit
protectedinherited

Definition at line 137 of file TileRawChannelBuilder.h.

◆ m_runType

int TileRawChannelBuilder::m_runType
protectedinherited

Definition at line 157 of file TileRawChannelBuilder.h.

◆ m_t0SamplePosition

int TileRawChannelBuilderOpt2Filter::m_t0SamplePosition
private

position of peak sample = (m_nSamples-1)/2

Definition at line 104 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_tileCondToolOfc

ToolHandle<ITileCondToolOfc> TileRawChannelBuilderOpt2Filter::m_tileCondToolOfc
private
Initial value:
{this,
"TileCondToolOfc", "TileCondToolOfc", "Tile OFC tool"}

Definition at line 69 of file TileRawChannelBuilderOpt2Filter.h.

69 {this,
70 "TileCondToolOfc", "TileCondToolOfc", "Tile OFC tool"};

◆ m_tileHWID

const TileHWID* TileRawChannelBuilder::m_tileHWID
protectedinherited

Definition at line 161 of file TileRawChannelBuilder.h.

◆ m_tileID

const TileID* TileRawChannelBuilder::m_tileID
protectedinherited

Definition at line 160 of file TileRawChannelBuilder.h.

◆ m_tileIdTransforms

ToolHandle<TileCondIdTransforms> TileRawChannelBuilder::m_tileIdTransforms
protectedinherited
Initial value:
{this,
"TileCondIdTransforms", "TileCondIdTransforms",
"Tile tool to tranlate hardware identifier to the drawerIdx, channel, and adc"}

Definition at line 172 of file TileRawChannelBuilder.h.

172 {this,
173 "TileCondIdTransforms", "TileCondIdTransforms",
174 "Tile tool to tranlate hardware identifier to the drawerIdx, channel, and adc"};

◆ m_tileInfo

const TileInfo* TileRawChannelBuilder::m_tileInfo
protectedinherited

Definition at line 216 of file TileRawChannelBuilder.h.

◆ m_tileToolEmscale

ToolHandle<TileCondToolEmscale> TileRawChannelBuilder::m_tileToolEmscale
protectedinherited
Initial value:
{this,
"TileCondToolEmscale", "TileCondToolEmscale", "Tile EM scale calibration tool"}

Definition at line 166 of file TileRawChannelBuilder.h.

166 {this,
167 "TileCondToolEmscale", "TileCondToolEmscale", "Tile EM scale calibration tool"};

◆ m_tileToolNoiseSample

ToolHandle<TileCondToolNoiseSample> TileRawChannelBuilderOpt2Filter::m_tileToolNoiseSample
private
Initial value:
{this,
"TileCondToolNoiseSample", "TileCondToolNoiseSample", "Tile noise sample tool"}

Applies OF algorithm.

Definition at line 72 of file TileRawChannelBuilderOpt2Filter.h.

72 {this,
73 "TileCondToolNoiseSample", "TileCondToolNoiseSample", "Tile noise sample tool"};

◆ m_tileToolTiming

ToolHandle<TileCondToolTiming> TileRawChannelBuilder::m_tileToolTiming
protectedinherited
Initial value:
{this,
"TileCondToolTiming", "TileCondToolTiming", "Tile timing tool"}

Definition at line 169 of file TileRawChannelBuilder.h.

169 {this,
170 "TileCondToolTiming", "TileCondToolTiming", "Tile timing tool"};

◆ m_timeForConvergence

double TileRawChannelBuilderOpt2Filter::m_timeForConvergence
private

minimum time difference to quit iteration procedure

Definition at line 90 of file TileRawChannelBuilderOpt2Filter.h.

◆ m_timeMaxThresh

float TileRawChannelBuilder::m_timeMaxThresh
protectedinherited

correct amplitude is time is below time max threshold

Definition at line 154 of file TileRawChannelBuilder.h.

◆ m_timeMinThresh

float TileRawChannelBuilder::m_timeMinThresh
protectedinherited

correct amplitude is time is above time min threshold

Definition at line 153 of file TileRawChannelBuilder.h.

◆ m_trigType

int TileRawChannelBuilder::m_trigType
protectedinherited

Definition at line 187 of file TileRawChannelBuilder.h.

◆ m_useDSP

bool TileRawChannelBuilder::m_useDSP
protectedinherited

Definition at line 149 of file TileRawChannelBuilder.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ MAX_CHANNELS

const int TileRawChannelBuilder::MAX_CHANNELS = 48
staticprotectedinherited

Definition at line 206 of file TileRawChannelBuilder.h.

◆ MAX_DMUS

const int TileRawChannelBuilder::MAX_DMUS = 16
staticprotectedinherited

Definition at line 207 of file TileRawChannelBuilder.h.


The documentation for this class was generated from the following files: