Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PixelRDOTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // PixelRDOTool.cxx
8 // (c) ATLAS Detector software
10 
15 
16 #include <boost/container/flat_set.hpp>
17 
18 namespace InDet
19 {
20 
21  PixelRDOTool::PixelRDOTool(const std::string &type,
22  const std::string &name,
23  const IInterface *parent) :
25  {
26  }
27 
29  {
31 
32  bool disable_smry =
33  !m_useModuleMap ||
35 
36  ATH_CHECK(m_summaryTool.retrieve(DisableTool{disable_smry}));
37 
39  if (!m_pixelDetElStatus.empty()) {
40  ATH_CHECK( m_pixelReadout.retrieve() );
41  }
42  ATH_CHECK( detStore()->retrieve(m_pixelId, "PixelID") );
43 
44  return StatusCode::SUCCESS;
45  }
46 
47 
48  std::optional<Identifier>
50  const InDetDD::SiDetectorElement* element)
51  {
52  // If the pixel is ganged, returns a new identifier for it
53  InDetDD::SiCellId cellID = element->cellIdFromIdentifier(rdoID);
54  if (element->numberOfConnectedCells(cellID) > 1) {
55  InDetDD::SiCellId gangedCellID = element->connectedCell(cellID,1);
56  return element->identifierFromCellId(gangedCellID);
57  }
58  return {};
59  }
60 
62  const IdentifierHash& moduleHash,
63  const Identifier& rdoID, const EventContext& ctx,
64  const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const
65  {
67  m_useModuleMap && pixelDetElStatus,
68  pixelDetElStatus ? pixelDetElStatus->isChipGood(moduleHash,m_pixelReadout->getFE(rdoID, m_pixelId->wafer_id(rdoID))) : false,
69  m_summaryTool->isGood(moduleHash, rdoID, ctx, cacheEntry));
70 
71  if (!m_useModuleMap) {
72  return true;
73  }
74 
75  if (pixelDetElStatus) {
76  const auto waferId = m_pixelId->wafer_id(rdoID);
77  const auto fe = m_pixelReadout->getFE(rdoID, waferId);
78  return pixelDetElStatus->isChipGood(moduleHash, fe);
79  } else {
80  return m_summaryTool->isGood(moduleHash, rdoID, ctx, cacheEntry);
81  }
82  }
83 
84 
86  const IdentifierHash& moduleHash,
87  const InDetDD::SiDetectorElement* element,
88  const Identifier& rdoID, const EventContext& ctx,
89  const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const
90  {
91 
92 
94  m_useModuleMap && pixelDetElStatus,
95  pixelDetElStatus ? pixelDetElStatus->isChipGood(moduleHash,m_pixelReadout->getFE(rdoID, m_pixelId->wafer_id(rdoID))) : false,
96  m_summaryTool->isGood(moduleHash, rdoID, ctx, cacheEntry));
97 
98  if (!m_useModuleMap) {
99  return true;
100  }
101 
102  if (pixelDetElStatus) {
103  const auto waferId = element->identify();
104  const auto fe = m_pixelReadout->getFE(rdoID, waferId, element);
105 
106  return pixelDetElStatus->isChipGood(moduleHash, fe);
107  } else {
108  return m_summaryTool->isGood(moduleHash, rdoID, ctx, cacheEntry);
109  }
110  }
111 
112 
114  const Identifier& rdoID,
115  const int lvl1,
116  std::vector<UnpackedPixelRDO>& collectionID) const
117  {
119  return false;
120 
121  auto isDuplicate = [&pixelID,rdoID](const UnpackedPixelRDO& rc) -> bool {
122  return (pixelID.phi_index(rdoID) == pixelID.phi_index(rc.ID)) &&
123  (pixelID.eta_index(rdoID) == pixelID.eta_index(rc.ID));
124  };
125 
126  const auto pDuplicate = std::find_if(collectionID.begin(), collectionID.end(),isDuplicate);
127  const bool foundDuplicate {pDuplicate != collectionID.end()};
128  if (foundDuplicate)
129  pDuplicate->LVL1 = std::max(pDuplicate->LVL1, lvl1);
130 
131  return foundDuplicate;
132  }
133 
134 
136  {
137  if (m_pixelDetElStatus.empty()) {
138  return nullptr;
139  }
140 
141  SG::ReadHandle<InDet::SiDetectorElementStatus> status = SG::makeHandle<InDet::SiDetectorElementStatus>(m_pixelDetElStatus, ctx);
142  if (!status.isValid()) {
143  std::stringstream msg;
144  msg << "Failed to get " << m_pixelDetElStatus.key() << " from StoreGate in " << name();
145  throw std::runtime_error(msg.str());
146  }
147  return status.cptr();
148  }
149 
150 
151 
153  PixelRDOTool::checkCollection(const InDetRawDataCollection<PixelRDORawData> &collection, const EventContext& ctx) const
154  {
155  const unsigned int RDO_size = collection.size();
156  if ( RDO_size==0) {
157  ATH_MSG_DEBUG("Empty RDO collection");
158  return nullptr;
159  }
160 
161  IdentifierHash idHash = collection.identifyHash();
162 
163  const InDet::SiDetectorElementStatus *pixelDetElStatus = getPixelDetElStatus(ctx);
164  if (pixelDetElStatus){
165  // If module is bad, do not create a cluster collection
168  pixelDetElStatus->isGood(idHash),
169  m_summaryTool->isGood(idHash,ctx)
170  );
171  }
172  //
173  if (m_useModuleMap && (pixelDetElStatus ? !pixelDetElStatus->isGood(idHash): !(m_summaryTool->isGood(idHash, ctx)))) {
174  return nullptr;
175  }
176 
178  const InDetDD::SiDetectorElementCollection* pixelDetEle(*pixelDetEleHandle);
179  if (not pixelDetEleHandle.isValid() or pixelDetEle == nullptr) {
180  ATH_MSG_FATAL(m_pixelDetEleCollKey.fullKey() << " is not available.");
181  return nullptr;
182  }
183 
184  const InDetDD::SiDetectorElement* element = pixelDetEle->getDetectorElement(idHash);
185  const Trk::RectangleBounds *mybounds =
186  dynamic_cast<const Trk::RectangleBounds *>(&element->surface().bounds());
187  if (not mybounds) {
188  ATH_MSG_ERROR("Dynamic cast failed at "<<__LINE__<<" of PixelRDOTool.cxx.");
189  return nullptr;
190  }
191 
192  return element;
193  }
194 
195  std::vector<UnpackedPixelRDO>
197  const PixelID& pixelID,
198  const InDetDD::SiDetectorElement* element,
199  const EventContext& ctx,
200  int defaultLabel) const
201  {
202  std::vector<UnpackedPixelRDO> unpacked;
203  unpacked.reserve(collection.size());
204 
205  const IdentifierHash idHash = collection.identifyHash();
206  const InDet::SiDetectorElementStatus *pixelDetElStatus = getPixelDetElStatus(ctx);
207  IInDetConditionsTool::IDCCacheEntry* cacheEntry = (pixelDetElStatus ? nullptr : m_summaryTool->getCacheEntryOut(ctx));
208 
209  // For ttbar200 we have ~70 RDO in average per element, with a max of ~1000.
210  // A flat set brings marginal improvements wrt unordered set for those sizes.
211  //std::unordered_set<Identifier> > idset;
212 
213  // This is not used for ITk, still we are creating it for the moment and could be optimized away in the future
214  boost::container::flat_set<Identifier> idset;
215 
216  for(const auto *const rdo : collection) {
217  const Identifier rdoID = rdo->identify();
218 
219  if (!isGoodRDO(pixelDetElStatus,
220  idHash,
221  element,
222  rdoID,
223  ctx,
224  cacheEntry))
225  continue;
226 
227  const int lvl1 = rdo->getLVL1A();
228 
229  if (!m_isITk) {
230 
231  if (not idset.insert(rdoID).second) {
232  if (m_printDuplicate) ATH_MSG_WARNING("Discarded a duplicated RDO");
233  continue;
234  }
235 
236  if (m_checkDuplicatedRDO) {
237  if (checkDuplication(pixelID, rdoID, lvl1, unpacked))
238  continue;
239  }
240  }
241 
242  const int tot = rdo->getToT();
243 
244  unpacked.emplace_back(
245  defaultLabel,
246  pixelID.phi_index(rdoID),
247  pixelID.eta_index(rdoID),
248  tot,
249  lvl1,
250  rdoID
251 
252  );
253 
254  if (m_checkGanged) {
255  std::optional<Identifier> gangedID = isGanged(rdoID, element);
256  if (gangedID.has_value()) {
257  unpacked.emplace_back(
258  defaultLabel,
259  pixelID.phi_index(*gangedID),
260  pixelID.eta_index(*gangedID),
261  tot,
262  lvl1,
263  *gangedID
264 
265  );
266  }
267  }
268  }
269  return unpacked;
270  }
271 
272 
273 
274 }
InDet::PixelRDOTool::getPixelDetElStatus
const InDet::SiDetectorElementStatus * getPixelDetElStatus(const EventContext &ctx) const
Definition: PixelRDOTool.cxx:135
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
Trk::RectangleBounds
Definition: RectangleBounds.h:38
InDet::PixelRDOTool::initialize
virtual StatusCode initialize()
Definition: PixelRDOTool.cxx:28
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
PixelID::phi_index
int phi_index(const Identifier &id) const
Definition: PixelID.h:658
InDetDD::SolidStateDetectorElementBase::connectedCell
SiCellId connectedCell(const SiCellId cellId, int number) const
Get the cell ids sharing the readout for this cell.
Definition: SolidStateDetectorElementBase.cxx:250
InDet::PixelRDOTool::m_checkGanged
BooleanProperty m_checkGanged
Definition: PixelRDOTool.h:150
InDet::PixelRDOTool::m_pixelDetElStatus
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_pixelDetElStatus
Optional read handle to get status data to test whether a pixel detector element is good.
Definition: PixelRDOTool.h:120
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
RectangleBounds.h
InDet::PixelRDOTool::m_isITk
BooleanProperty m_isITk
Definition: PixelRDOTool.h:165
InDet::SiDetectorElementStatus::isChipGood
bool isChipGood(IdentifierHash hash, unsigned int chip) const
Definition: SiDetectorElementStatus.h:100
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
InDet
Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
InDet::PixelRDOTool::isGoodRDO
bool isGoodRDO(const InDet::SiDetectorElementStatus *pixelDetElStatus, const IdentifierHash &moduleHash, const Identifier &rdoID, const EventContext &ctx, const IInDetConditionsTool::IDCCacheEntry *cacheEntry) const
Definition: PixelRDOTool.cxx:61
InDetDD::SolidStateDetectorElementBase::surface
Trk::Surface & surface()
Element Surface.
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:210
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
InDet::PixelRDOTool::m_useModuleMap
BooleanProperty m_useModuleMap
Definition: PixelRDOTool.h:158
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
InDet::PixelRDOTool::checkCollection
const InDetDD::SiDetectorElement * checkCollection(const InDetRawDataCollection< PixelRDORawData > &collection, const EventContext &ctx) const
Definition: PixelRDOTool.cxx:153
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:364
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
InDetRawDataCollection::identifyHash
virtual IdentifierHash identifyHash() const override final
InDetDD::SiDetectorElement::cellIdFromIdentifier
virtual SiCellId cellIdFromIdentifier(const Identifier &identifier) const override final
SiCellId from Identifier.
Definition: SiDetectorElement.cxx:120
InDetDD::SolidStateDetectorElementBase::numberOfConnectedCells
int numberOfConnectedCells(const SiCellId cellId) const
Test if readout cell has more than one diode associated with it.
Definition: SolidStateDetectorElementBase.cxx:243
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ClusterMakerTool.h
VALIDATE_STATUS_ARRAY
#define VALIDATE_STATUS_ARRAY(use_info, info_val, summary_val)
Definition: SiDetectorElementStatus.h:51
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
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
InDetDD::SiDetectorElement::identifierFromCellId
virtual Identifier identifierFromCellId(const SiCellId &cellId) const override final
Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie s...
Definition: SiDetectorElement.cxx:89
InDetRawDataCollection
Definition: InDetRawDataCollection.h:31
InDet::PixelRDOTool::getUnpackedPixelRDOs
std::vector< UnpackedPixelRDO > getUnpackedPixelRDOs(const InDetRawDataCollection< PixelRDORawData > &collection, const PixelID &pixelID, const InDetDD::SiDetectorElement *element, const EventContext &ctx, int defaultLabel=-1) const
Definition: PixelRDOTool.cxx:196
test_pyathena.parent
parent
Definition: test_pyathena.py:15
VALIDATE_STATUS_ARRAY_ACTIVATED
#define VALIDATE_STATUS_ARRAY_ACTIVATED
Definition: SiDetectorElementStatus.h:50
PixelID::eta_index
int eta_index(const Identifier &id) const
Definition: PixelID.h:664
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
InDet::PixelRDOTool::m_checkDuplicatedRDO
BooleanProperty m_checkDuplicatedRDO
Definition: PixelRDOTool.h:136
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
InDet::PixelRDOTool::PixelRDOTool
PixelRDOTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: PixelRDOTool.cxx:21
InDet::PixelRDOTool::m_pixelReadout
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout
Definition: PixelRDOTool.h:127
InDet::SiDetectorElementStatus::isGood
bool isGood(IdentifierHash hash) const
Definition: SiDetectorElementStatus.h:97
Trk::Surface::bounds
virtual const SurfaceBounds & bounds() const =0
Surface Bounds method.
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
InDetDD::SiCellId
Definition: SiCellId.h:29
InDet::UnpackedPixelRDO
Definition: PixelRDOTool.h:31
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
merge.status
status
Definition: merge.py:17
InDet::PixelRDOTool::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Definition: PixelRDOTool.h:172
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
PixelID
Definition: PixelID.h:67
InDet::PixelRDOTool::checkDuplication
bool checkDuplication(const PixelID &pixelID, const Identifier &rdoID, const int lvl1, std::vector< UnpackedPixelRDO > &collectionID) const
Definition: PixelRDOTool.cxx:113
InDet::PixelRDOTool::m_printDuplicate
BooleanProperty m_printDuplicate
Definition: PixelRDOTool.h:143
DataVector< RawDataT >::size
size_type size() const noexcept
Returns the number of elements in the collection.
InDet::PixelRDOTool::m_summaryTool
ToolHandle< IInDetConditionsTool > m_summaryTool
Definition: PixelRDOTool.h:108
InDet::PixelRDOTool::isGanged
static std::optional< Identifier > isGanged(const Identifier &rdoID, const InDetDD::SiDetectorElement *element)
Definition: PixelRDOTool.cxx:49
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
IInDetConditionsTool::IDCCacheEntry
Definition: IInDetConditionsTool.h:33
InDet::PixelRDOTool::m_pixelId
const PixelID * m_pixelId
Definition: PixelRDOTool.h:134
PixelRDOTool.h
Identifier
Definition: IdentifierFieldParser.cxx:14