ATLAS Offline Software
TileDigitsFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //*****************************************************************************
6 // Filename : TileDigitsFilter.cxx
7 // Author : Alexander Solodkov
8 // Created : June 2008
9 //
10 // DESCRIPTION
11 //
12 // Copy TileDigits and TileRawChannel from input container to output container
13 // keeping only channels with (max-min) sample above threshold
14 //
15 // HISTORY:
16 //
17 // BUGS:
18 //
19 //*****************************************************************************
20 
21 // Tile includes
22 #include "TileDigitsFilter.h"
23 
24 // Atlas includes
26 #include "StoreGate/ReadHandle.h"
27 #include "StoreGate/WriteHandle.h"
29 
30 //C++ STL includes
31 #include <vector>
32 #include <set>
33 
34 //
35 // Constructor
36 //
37 TileDigitsFilter::TileDigitsFilter(const std::string& name, ISvcLocator* pSvcLocator)
38  : AthReentrantAlgorithm(name, pSvcLocator)
39  , m_tileHWID(0)
40 {
41 }
42 
44 }
45 
46 //
47 // Alg standard initialize function
48 //
50 
51  ATH_CHECK( m_cablingSvc.retrieve() );
52 
54 
55  ATH_MSG_INFO( "Input digits container: '" << m_inputDigitsContainerKey.key()
56  << "' output container: '" << m_outputDigitsContainerKey.key() << "'" );
57 
58  ATH_MSG_INFO( "Input raw channel container: '" << m_inputRawChannelContainerKey.key()
59  << "' output container: '" << m_outputRawChannelContainerKey.key() << "'" );
60 
63 
64  ATH_MSG_INFO( "Threshold low gain: " << m_threshold[0]
65  << " counts, high gain: " << m_threshold[1] << " counts" );
66 
67 
68  if (!m_inputDigitsContainerKey.key().empty()) {
70  }
71 
72  if (!m_outputDigitsContainerKey.key().empty()) {
74  }
75 
76  if (!m_inputRawChannelContainerKey.key().empty()) {
78  }
79 
80  if (!m_outputRawChannelContainerKey.key().empty()) {
82  }
83 
84 
85  ATH_MSG_INFO( "initialization completed" );
86 
87  return StatusCode::SUCCESS;
88 }
89 /*==========================================================================*/
90 //
91 // Begin Execution Phase.
92 //
93 StatusCode TileDigitsFilter::execute(const EventContext& ctx) const {
94 
95  ATH_MSG_DEBUG( "in execute()" );
96 
97  int digCounter = 0;
98  int rchCounter = 0;
99 
100 
101  // Create new container for filtered digits
102  auto outputCont = std::make_unique<TileDigitsContainer>(false, SG::VIEW_ELEMENTS);
103  if (!outputCont) {
104  ATH_MSG_FATAL( "Could not create a new TileDigitsContainer instance as requested!" );
105  return StatusCode::FAILURE;
106  }
107 
108  // Initialize iterators to some dummy values
109  TileDigitsContainer::const_iterator collItr, lastColl;
110  collItr = lastColl = outputCont->end();
111 
112  // Get digit container from TES
113  if (!m_inputDigitsContainerKey.key().empty()) {
115 
116  if (inputDigitsContainer.isValid()) {
117  collItr = inputDigitsContainer->begin();
118  lastColl = inputDigitsContainer->end();
119  } else {
120  ATH_MSG_WARNING( "can't retrieve TileDigitsContainer with name '"
121  << m_inputDigitsContainerKey.key() << "' from TDS" );
122  }
123 
124  }
125 
126  TileRawChannelContainer::const_iterator firstRchColl, lastRchColl, collRchItr;
129  bool emptyRch = true;
130 
131  // Get rawChannel container from TES
132  if (!m_inputRawChannelContainerKey.key().empty()) {
134 
135  if (inputRawChannelContainer.isValid()) {
136  collRchItr = firstRchColl = inputRawChannelContainer->begin();
137  lastRchColl = inputRawChannelContainer->end();
138  emptyRch = (firstRchColl == lastRchColl);
139  type = inputRawChannelContainer->get_type();
140  unit = inputRawChannelContainer->get_unit();
141  } else {
142  ATH_MSG_WARNING( "can't retrieve TileRawChannelContainer with name '"
143  << m_inputRawChannelContainerKey.key() << "' from TDS" );
144  }
145 
146  }
147 
148  // Create new container for filtered raw channels
149  auto outRchCont = std::make_unique<TileRawChannelContainer>(false, type, unit, SG::VIEW_ELEMENTS);
150 
151  // Iterate over all collections (drawers)
152  for (; collItr != lastColl; ++collItr) {
153 
154  const TileDigitsCollection* coll = *collItr;
155  std::set<HWIdentifier> ids;
156 
157  auto outColl = std::make_unique<ConstDataVector<TileDigitsCollection> >
158  (SG::VIEW_ELEMENTS, coll->identify());
159 
160  // Iterate over all digits in this collection
161  for (const TileDigits* digit : *coll) {
162  float smin = 99999., smax = -99999.;
163  for (float samp : digit->samples()) {
164  smin = std::min(samp, smin);
165  smax = std::max(samp, smax);
166  }
167  HWIdentifier adcId = digit->adc_HWID();
168  if (smax - smin > m_threshold[m_tileHWID->adc(adcId)]) {
169  outColl->push_back(digit);
170  ids.insert(adcId);
171  ++digCounter;
172  if (msgLvl(MSG::VERBOSE)) {
173  msg(MSG::VERBOSE) << (m_tileHWID->adc(adcId) ? " HG " : " LG ")
174  << "id=" << m_tileHWID->to_string(adcId)
175  << " samples=";
176 
177  for (float samp : digit->samples()) {
178  msg(MSG::VERBOSE) << " " << samp;
179  }
180 
181  msg(MSG::VERBOSE) << endmsg;
182  }
183  }
184 
185  // else if (msgLvl(MSG::VERBOSE)){
186  // msg(MSG::VERBOSE) << "Filtered Out "
187  // << (m_tileHWID->adc(adcId) ? " HG " : " LG ")
188  // << "id=" << m_tileHWID->to_string(adcId)
189  // << " samples=";
190  // for(idig=digits.begin(); idig!=iend; ++idig)
191  // msg(MSG::VERBOSE) << " " << (*idig);
192  //
193  // msg(MSG::VERBOSE) << endmsg;
194  // }
195 
196  }
197 
198  ATH_CHECK( outputCont->addCollection (outColl.release()->asDataVector(),
199  collItr.hashId()) );
200 
201  if (ids.size() == 0 || emptyRch)
202  continue;
203 
204  while (collRchItr != lastRchColl
205  && (*collRchItr)->identify() < (*collItr)->identify()) {
206  ++collRchItr;
207  }
208  if (collRchItr == lastRchColl) {
209  ATH_MSG_WARNING( MSG::hex
210  << "TileDigitsCollection ID 0x" << (*collItr)->identify()
211  << " but corresponding TileRawChannelCollection is missing"
212  << MSG::dec );
213 
214  } else if ((*collItr)->identify() != (*collRchItr)->identify()) {
215  ATH_MSG_WARNING( MSG::hex
216  << "TileDigitsCollection ID 0x" << (*collItr)->identify()
217  << " and TileRawChannelCollection ID 0x" << (*collRchItr)->identify()
218  << " do not match " << MSG::dec );
219 
220  } else {
221  const TileRawChannelCollection* collRch = *collRchItr;
222  auto outRchColl = std::make_unique<ConstDataVector<TileRawChannelCollection> >
223  (SG::VIEW_ELEMENTS, collRch->identify());
224 
225  // Iterate over all rawChannels in this collection
226  for (const TileRawChannel* rch : *collRch) {
227  HWIdentifier adcId = rch->adc_HWID();
228  if (ids.find(adcId) != ids.end()) {
229  outRchColl->push_back (rch);
230  ++rchCounter;
231  ATH_MSG_VERBOSE( (m_tileHWID->adc(adcId) ? " HG " : " LG ")
232  << "id=" << m_tileHWID->to_string(adcId)
233  << " amp=" << rch->amplitude() );
234  }
235  }
236  ATH_CHECK( outRchCont->addCollection (outRchColl.release()->asDataVector(),
237  collRchItr.hashId()) );
238  }
239  }
240 
241  ATH_MSG_DEBUG( digCounter << " digits and "
242  << rchCounter << " raw channels stored in output containers");
243 
244  if (!m_outputDigitsContainerKey.key().empty()) {
245  // register new container in the TES
247  ATH_CHECK( outputDigitsContainer.record(std::move(outputCont)) );
248 
249  ATH_MSG_DEBUG( "TileDigitsContainer registered successfully (" << m_outputDigitsContainerKey.key() << ")");
250 
251  }
252 
253  if (!m_outputRawChannelContainerKey.key().empty()) {
254  // register new container in the TES
256  ATH_CHECK( outputRawChannelContainer.record(std::move(outRchCont)) );
257 
258  ATH_MSG_DEBUG( "TileRawChannelContainer registered successfully ("
259  << m_outputRawChannelContainerKey.key() << ")");
260  }
261 
262  // Execution completed.
263  ATH_MSG_DEBUG( "execution completed" );
264 
265  return StatusCode::SUCCESS;
266 }
267 
269 
270  ATH_MSG_INFO( "in finalize()" );
271 
272  return StatusCode::SUCCESS;
273 }
274 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
max
#define max(a, b)
Definition: cfImp.cxx:41
TileDigitsFilter::m_inputDigitsContainerKey
SG::ReadHandleKey< TileDigitsContainer > m_inputDigitsContainerKey
Definition: TileDigitsFilter.h:70
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
TileDigitsFilter.h
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TileDigitsFilter::m_lowGainThreashold
Gaudi::Property< int > m_lowGainThreashold
Definition: TileDigitsFilter.h:82
TileFragHash::TYPE
TYPE
initialize
Definition: TileFragHash.h:33
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
TileDigitsFilter::m_cablingSvc
ServiceHandle< TileCablingSvc > m_cablingSvc
Name of Tile cabling service.
Definition: TileDigitsFilter.h:93
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
TileFragHash::Digitizer
@ Digitizer
Definition: TileFragHash.h:33
HWIdentifier
Definition: HWIdentifier.h:13
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
WriteHandle.h
Handle class for recording to StoreGate.
TileHWID::adc
int adc(const HWIdentifier &id) const
extract adc field from HW identifier
Definition: TileHWID.h:193
TileDigitsFilter::m_tileHWID
const TileHWID * m_tileHWID
Definition: TileDigitsFilter.h:88
TileDigitsFilter::m_highGainThreashold
Gaudi::Property< int > m_highGainThreashold
Definition: TileDigitsFilter.h:85
TileDigitsFilter::initialize
virtual StatusCode initialize() override
initialize method
Definition: TileDigitsFilter.cxx:49
TileDigitsFilter::~TileDigitsFilter
virtual ~TileDigitsFilter()
Definition: TileDigitsFilter.cxx:43
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TileRawChannel
Definition: TileRawChannel.h:35
TileDigitsFilter::m_threshold
int m_threshold[2]
Threshold value for low and high gain.
Definition: TileDigitsFilter.h:96
TileDigitsFilter::m_outputRawChannelContainerKey
SG::WriteHandleKey< TileRawChannelContainer > m_outputRawChannelContainerKey
Definition: TileDigitsFilter.h:79
TileDigitsFilter::TileDigitsFilter
TileDigitsFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TileDigitsFilter.cxx:37
TileDigitsFilter::finalize
virtual StatusCode finalize() override
finalize method
Definition: TileDigitsFilter.cxx:268
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IdentifiableContainerMT::end
const_iterator end() const
return const_iterator for end of container
Definition: IdentifiableContainerMT.h:242
IdentifiableContainerMT::const_iterator
Definition: IdentifiableContainerMT.h:82
IdentifiableContainerMT::begin
const_iterator begin() const
return const_iterator for first entry
Definition: IdentifiableContainerMT.h:236
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
TileRawChannelUnit::UNIT
UNIT
Definition: TileRawChannelUnit.h:16
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
min
#define min(a, b)
Definition: cfImp.cxx:40
TileRawDataCollection::identify
ID identify() const
Definition: TileRawDataCollection.h:71
TileDigitsFilter::m_inputRawChannelContainerKey
SG::ReadHandleKey< TileRawChannelContainer > m_inputRawChannelContainerKey
Definition: TileDigitsFilter.h:76
TileDigitsCollection
Definition: TileDigitsCollection.h:18
IdentifiableContainerMT::const_iterator::hashId
IdentifierHash hashId() const
hashId of the pointed-to element
Definition: IdentifiableContainerMT.h:130
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TileDigits
Definition: TileDigits.h:30
python.subdetectors.mmg.ids
ids
Definition: mmg.py:8
errorcheck.h
Helpers for checking error return status codes and reporting errors.
TileRawChannelCollection
Definition: TileRawChannelCollection.h:12
TileRawDataContainer::get_type
TYPE get_type() const
Definition: TileRawDataContainer.h:62
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
TileRawDataContainer::get_unit
UNIT get_unit() const
Definition: TileRawDataContainer.h:60
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
unit
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
Definition: AmgMatrixBasePlugin.h:20
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
TileDigitsFilter::execute
virtual StatusCode execute(const EventContext &ctx) const override
execute method
Definition: TileDigitsFilter.cxx:93
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
TileHWID::to_string
std::string to_string(const HWIdentifier &id, int level=0) const
extract all fields from HW identifier HWIdentifier get_all_fields ( const HWIdentifier & id,...
Definition: TileHWID.cxx:49
ReadHandle.h
Handle class for reading from StoreGate.
TileDigitsFilter::m_outputDigitsContainerKey
SG::WriteHandleKey< TileDigitsContainer > m_outputDigitsContainerKey
Definition: TileDigitsFilter.h:73
TileRawChannelUnit::ADCcounts
@ ADCcounts
Definition: TileRawChannelUnit.h:17