ATLAS Offline Software
Loading...
Searching...
No Matches
TileRawChannelOF1Corrector.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Tile includes
13
14// Atlas includes
17
18//========================================================
19// constructor
21 const std::string& name, const IInterface* parent)
22 : base_class(type, name, parent)
23 , m_tileHWID(0)
24{
25 declareProperty("ZeroAmplitudeWithoutDigits", m_zeroAmplitudeWithoutDigits = true);
26 declareProperty("CorrectPedestalDifference", m_correctPedestalDifference = true);
27}
28
29//========================================================
30// Initialize
32
33 ATH_MSG_INFO("Initializing...");
34
35 ATH_CHECK( detStore()->retrieve(m_tileHWID) );
36
39
41 //=== get TileCondToolOfc
42 ATH_CHECK( m_tileCondToolOfc.retrieve() );
43
44 //=== get TileToolTiming
45 ATH_CHECK( m_tileToolTiming.retrieve() );
46 } else {
47 m_tileCondToolOfc.disable();
48 m_tileToolTiming.disable();
49 }
50
52
54 //=== get TileToolTiming
55 ATH_CHECK( m_tileDspThreshold.retrieve() );
56 } else {
57 m_tileDspThreshold.disable();
58 }
59
61 ATH_CHECK( m_digitsContainerKey.initialize() );
62 } else {
64 }
65
66 return StatusCode::SUCCESS;
67}
68
69
70
71// ============================================================================
72// process container
73StatusCode
75{
76 ATH_MSG_DEBUG("in TileRawChannelOF1Corrector::process()");
77
78 TileFragHash::TYPE rawChannelType = rchCont.get_type();
79 uint32_t bsFlags = rchCont.get_bsflags();
80
81 if ((rawChannelType == TileFragHash::OptFilterDsp
82 || rawChannelType == TileFragHash::OptFilterDspCompressed) // DSP container
83 && (bsFlags & (1U << 26U)) == 0) { // OF1 method
84
85 TileRawChannelUnit::UNIT rawChannelUnit = rchCont.get_unit();
86 ATH_MSG_VERBOSE( "Units in container is " << rawChannelUnit );
87
88 const TileEMScale* emScale{nullptr};
89 const TileDigitsContainer* digitsContainer(nullptr);
90
93 ATH_CHECK( emScaleHandle.isValid() );
94 emScale = emScaleHandle.cptr();
95
98 digitsContainer = allDigits.cptr();
99 }
100 }
101
102 const TileSampleNoise* sampleNoise = nullptr;
103 const TileSampleNoise* onlineSampleNoise = nullptr;
106 ATH_CHECK( sampleNoiseHandle.isValid() );
107 sampleNoise = sampleNoiseHandle.retrieve();
108
110 ATH_CHECK( onlineSampleNoiseHandle.isValid() );
111 onlineSampleNoise = onlineSampleNoiseHandle.retrieve();
112 }
113
114
115 for (IdentifierHash hash : rchCont.GetAllCurrentHashes()) {
116 TileRawChannelCollection* rawChannelCollection = rchCont.indexFindPtr (hash);
117
118 int fragId = rawChannelCollection->identify();
119 unsigned int drawer = (fragId & 0x3F);
120 unsigned int ros = fragId >> 8;
121 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
122
123 bool checkDigits(false);
124 std::vector<bool> noDigits(TileCalibUtils::MAX_CHAN, true);
125 if (digitsContainer) {
126 IdentifierHash fragHash = (digitsContainer->hashFunc())(fragId);
127 const TileDigitsCollection* digitsCollection = digitsContainer->indexFindPtr(fragHash);
128 if (digitsCollection->getFragBCID() != 0xDEAD) {
129 ATH_MSG_VERBOSE(TileCalibUtils::getDrawerString(ros, drawer) << ": digits in bytestream => check digits");
130 checkDigits = true;
131 } else {
132 ATH_MSG_VERBOSE(TileCalibUtils::getDrawerString(ros, drawer) << ": no digits in bytestream => do not check digits");
133 }
134
135 for (const TileDigits* tile_digits : *digitsCollection) {
136 int channel = m_tileHWID->channel(tile_digits->adc_HWID());
137 noDigits[channel] = false;
138 }
139 }
140
141 for (TileRawChannel* rawChannel : *rawChannelCollection) {
142 HWIdentifier adcId = rawChannel->adc_HWID();
143 int channel = m_tileHWID->channel(adcId);
144 int gain = m_tileHWID->adc(adcId);
145
147
148 float pedestal = sampleNoise->getPed(drawerIdx, channel, gain);
149 float onlinePedestal = onlineSampleNoise->getPed(drawerIdx, channel, gain);
150 float onlinePedestalDifference = emScale->calibrateOnlineChannel(drawerIdx, channel, gain, (onlinePedestal - pedestal), rawChannelUnit);
151 float phase = -m_tileToolTiming->getSignalPhase(drawerIdx, channel, gain);
153 ATH_CHECK( m_tileCondToolOfc->getOfcWeights(drawerIdx, channel, gain, phase, false, weights, ctx) );
154 float weightsSum(0.0);
155 for (int i = 0; i < weights.n_samples; ++i) weightsSum += weights.w_a[i];
156 float energyCorrection = onlinePedestalDifference * weightsSum;
158 << " ch" << channel << (gain ? " HG: " : " LG: ")
159 << "online pedestal difference: " << onlinePedestalDifference
160 << "; OFC weights (a) sum: " << weightsSum
161 << " => energy correction: " << energyCorrection);
162
163 rawChannel->setAmplitude(rawChannel->amplitude() + energyCorrection);
164
165 }
166
167 if (checkDigits && noDigits[channel]) {
168
169 float amplitude = emScale->undoOnlineChannelCalibration(drawerIdx, channel, gain, rawChannel->amplitude(), rawChannelUnit);
170 float minimuAmplitudeThreshold(-99999.0);
171 float maximumAmplitudeThreshold(99999.0);
172 m_tileDspThreshold->getAmplitudeThresholds(drawerIdx, channel, gain, minimuAmplitudeThreshold, maximumAmplitudeThreshold);
173 if (amplitude < minimuAmplitudeThreshold
174 || amplitude > maximumAmplitudeThreshold)
175 {
176
178 << " ch" << channel << (gain ? " HG:" : " LG:")
179 << " amplitude: " << amplitude << " [ADC]"
180 << " outside range: " << minimuAmplitudeThreshold << ".." << maximumAmplitudeThreshold
181 << " without digits => set apmlitude/time/quality: 0.0/0.0/15.0");
182
183 rawChannel->insert(0.0F, 0.0F, 15.0F);
184
185 }
186
187 }
188
189 }
190 }
191
192 }
193
194 return StatusCode::SUCCESS;
195}
196
197// ============================================================================
198// finalize
200 return StatusCode::SUCCESS;
201}
202
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
Handle class for reading from StoreGate.
Helper for holding non-const raw data prior to recording in SG.
TileMutableDataContainer< TileRawChannelContainer > TileMutableRawChannelContainer
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,...
This is a "hash" representation of an Identifier.
const_pointer_type retrieve()
const_pointer_type cptr()
const_pointer_type cptr()
Dereference the pointer.
static std::string getDrawerString(unsigned int ros, unsigned int drawer)
Return the drawer name, e.g.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
static const unsigned int MAX_CHAN
Number of channels in drawer.
uint32_t getFragBCID() const
Get BCID.
Condition object to keep calibration factors of TileCal channels.
Definition TileEMScale.h:87
float undoOnlineChannelCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Undo the calibration applied in ROD signal reconstruction.
float calibrateOnlineChannel(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Calibrate an online Tile channel from OnlineADCcounts to an arbitrary Online unit,...
TYPE
initialize
Collection * indexFindPtr(IdentifierHash hash)
Look up a (non-const) collection via hash.
ToolHandle< ITileCondToolOfc > m_tileCondToolOfc
virtual StatusCode finalize() override
AlgTool finalize method.
ToolHandle< TileCondToolTiming > m_tileToolTiming
SG::ReadCondHandleKey< TileSampleNoise > m_onlineSampleNoiseKey
Name of online TileSampleNoise in condition store.
const TileHWID * m_tileHWID
Pointer to TileHWID.
TileRawChannelOF1Corrector(const std::string &type, const std::string &name, const IInterface *parent)
AlgTool like constructor.
SG::ReadCondHandleKey< TileSampleNoise > m_sampleNoiseKey
Name of TileSampleNoise in condition store.
virtual StatusCode process(TileMutableRawChannelContainer &rchCont, const EventContext &ctx) const override
Correct TileRawChannel amplitudes if pedestal changed.
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKey
ToolHandle< ITileCondToolDspThreshold > m_tileDspThreshold
virtual StatusCode initialize() override
AlgTool initialize method.
SG::ReadCondHandleKey< TileEMScale > m_emScaleKey
Name of TileEMScale in condition store.
const TileFragHash & hashFunc() const
uint32_t get_bsflags() const
Condition object to keep and provide Tile sample noise.
float getPed(unsigned int drawerIdx, unsigned int channel, unsigned int adc) const