ATLAS Offline Software
ITkPixelCablingAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
14 //package includes
15 #include "ITkPixelCablingAlg.h"
16 
17 //indet includes
22 
23 
24 //Athena includes
25 #include "Identifier/Identifier.h"
29 
30 
31 
32 // Gaudi include
33 #include "GaudiKernel/EventIDRange.h"
34 
35 
36 //STL
37 #include <iostream>
38 #include <fstream>
39 
40 
41 
42 // Constructor
43 ITkPixelCablingAlg::ITkPixelCablingAlg(const std::string& name, ISvcLocator* pSvcLocator):
44  AthReentrantAlgorithm(name, pSvcLocator)
45 {
46 }
47 
48 //
51  m_source = PathResolver::find_file(m_source.value(), "DATAPATH");
52  if (m_source.empty()) {
53  ATH_MSG_FATAL("The ITkPixel data file for cabling, " << m_source.value() << ", was not found.");
54  return StatusCode::FAILURE;
55  }
56  ATH_MSG_INFO("Reading cabling from " << m_source.value());
57  // ITkPixelID
58  ATH_CHECK(detStore()->retrieve(m_idHelper, "PixelID"));
59  // det manager
61  // Write Cond Handle
63 
64  return StatusCode::SUCCESS;
65 }
66 
67 
68 //
70 ITkPixelCablingAlg::execute(const EventContext& ctx) const {
71  // Write Cond Handle
73  if (writeHandle.isValid()) {
74  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
75  << ". In theory this should not be called, but may happen"
76  << " if multiple concurrent events are being processed out of order.");
77  return StatusCode::SUCCESS;
78  }
79 
80  // Construct the output Cond Object and fill it in
81  std::unique_ptr<ITkPixelCablingData> pCabling = std::make_unique<ITkPixelCablingData>();
82 
83  //For development purposes, generate a dummy cabling structure, using the existing
84  //offline IDs and dummy online ones. It's problematic to deal with quads easily, as
85  //they have one offline ID, but up to 4 online IDs. If there will be virtual elinks
86  //for merged quads or if there's no data merging, the situation is not mappable for
87  //the encoding offline -> online map. Once could at most map to certain bits that
88  //would be shared between the 4 online IDs. In the decoding direction, the
89  //online->offline will be always mappable, although it would be degenerate mapping.
90  if (m_useTestCabling){
91  ATH_MSG_DEBUG("Using test cabling generated with ITkPixelCablingAlg::generateTestCabling(...)");
92  ATH_CHECK(generateTestCabling(pCabling));
93  pCabling->print();
94  if (writeHandle.record(EventIDRange(IOVInfiniteRange::infiniteRunLB()), std::move(pCabling)).isFailure()) {
95  return StatusCode::FAILURE;
96  }
97 
98  return StatusCode::SUCCESS;
99  }
100 
101 
102 
103  auto inputFile = std::ifstream(m_source.value());
104  if (not inputFile.good()){
105  ATH_MSG_ERROR("The itk cabling file "<<m_source.value()<<" could not be opened.");
106  return StatusCode::FAILURE;
107  }
108 
109 
110  inputFile>>*pCabling;
111  const int numEntries = pCabling->size();
112  ATH_MSG_DEBUG(numEntries << " entries were made to the identifier map.");
113 
114  // Define validity of the output cond object and record it
115  const EventIDBase start{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, 0, 0, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
116  const EventIDBase stop{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
117  const EventIDRange rangeW{start, stop};
118  if (writeHandle.record(rangeW, std::move(pCabling)).isFailure()) {
119  ATH_MSG_FATAL("Could not record ITkPixelCablingData " << writeHandle.key()
120  << " with EventRange " << rangeW
121  << " into Conditions Store");
122  return StatusCode::FAILURE;
123  }
124  ATH_MSG_VERBOSE("recorded new conditions data object " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
125  return (numEntries==0) ? (StatusCode::FAILURE) : (StatusCode::SUCCESS);
126 }
127 
128 StatusCode ITkPixelCablingAlg::generateTestCabling(std::unique_ptr<ITkPixelCablingData>& cabling) const {
129  //We'll loop over all known hashes, and create a sensible cabling situation
130  //for testing purposes, create online ID by shifting the wafer ID by two bits, allowing
131  //to accommodate the non-merged quads with 4 online links vs. one offline entity.
132  //What's used as the online "base" (32 bit) is just the offline ID (64bit) >> 32.
133  //Lowest two bits are always 0 in the base - in fact, at least 2 bytes are. Fine for testing.
134 
135  for (size_t hash = 0; hash < m_idHelper->wafer_hash_max(); hash++){
137  uint32_t onID = (id.get_compact() >> 32) & 0xFFFFFFFF;
138 
140  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign *>(&element->design());
141 
142  ITkPixelCabling::ModuleType moduleType;
143  ITkPixelCabling::TransformType moduleTransform;
144  if (p_design->numberOfCircuits() == 4){
145  //it's a quad
146 
147  //Let's make the entire layer 1 and 2 non-merged.
148  //We can experiment with this, but we're also after
149  //a proof-of-principle here.
150  if (m_idHelper->barrel_ec(id) == 0 && (m_idHelper->layer_disk(id) == 1 || m_idHelper->layer_disk(id) == 2)){
151  //Non-merged quad has 4 online IDs mappend onto 1 offline,
152  //differentiated by 2-bit chip ID
155  cabling->addEntryOnOff(onID | 0b00, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
156  cabling->addEntryOnOff(onID | 0b01, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
157  cabling->addEntryOnOff(onID | 0b10, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
158  cabling->addEntryOnOff(onID | 0b11, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
159 
160  }
161  else{
162  //Merged quads have 1:1 online:offline correspondence.
163  //Don't need to invent any substructure, but keep it
164  //consistent with the quads
167  cabling->addEntryOnOff(onID, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
168  }
169 
170  //We can also fill in the offline->online map
171  //Were are creating the "base" online ID, i. e. without the chip ID
172  cabling->addEntryOffOn(id, ITkPixelCabling::ModuleInfo<ITkPixelOnlineId>(onID, moduleType, moduleTransform));
173 
174 
175  }
176  else {
177 
178  //All triplets map 1:1 to chips. Keeping the online
179  //"base" ID consistently shifted - we're dealing with chip 00
182  cabling->addEntryOnOff(onID, ITkPixelCabling::ModuleInfo(id, moduleType, moduleTransform));
183 
184  //We can also fill in the offline->online map
185  //Were are creating the "base" online ID, i. e. without the chip ID
186  cabling->addEntryOffOn(id, ITkPixelCabling::ModuleInfo<ITkPixelOnlineId>(onID, moduleType, moduleTransform));
187  }
188 
189  }
190 
191  return StatusCode::SUCCESS;
192 }
193 
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...
ITkPixelCabling::NominalQuad
@ NominalQuad
Definition: ITkPixelCablingData.h:39
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ITkPixelCabling::IBTriplet
@ IBTriplet
Definition: ITkPixelCablingData.h:29
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:45
ITkPixelCablingAlg::m_useTestCabling
Gaudi::Property< bool > m_useTestCabling
Definition: ITkPixelCablingAlg.h:56
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:615
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:13
ITkPixelCabling::SimpleQuad
@ SimpleQuad
Definition: ITkPixelCablingData.h:27
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
ITkPixelCablingAlg::m_detManager
const InDetDD::PixelDetectorManager * m_detManager
Definition: ITkPixelCablingAlg.h:59
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:161
ITkPixelCablingAlg::initialize
virtual StatusCode initialize() override
Definition: ITkPixelCablingAlg.cxx:50
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:360
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:74
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
ITkPixelCablingAlg.h
Fills an ITkPixelCablingData object and records it in Storegate.
PixelDetectorManager.h
SG::WriteCondHandle::fullKey
const DataObjID & fullKey() const
Definition: WriteCondHandle.h:45
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CaloCondBlobAlgs_fillNoiseFromASCII.inputFile
string inputFile
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:16
python.LArBadChannelDBAlg.xFFFFFFFF
xFFFFFFFF
Definition: LArBadChannelDBAlg.py:73
ITkPixelCabling::IECTriplet
@ IECTriplet
Definition: ITkPixelCablingData.h:30
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::PixelModuleDesign::numberOfCircuits
int numberOfCircuits() const
Total number of circuits:
Definition: PixelModuleDesign.h:306
IOVInfiniteRange::infiniteRunLB
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
Definition: IOVInfiniteRange.h:39
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ITkPixelCablingData::size
std::size_t size() const
Definition: ITkPixelCablingData.cxx:21
ITkPixelCablingData::print
void print() const
Definition: ITkPixelCablingData.cxx:33
PixelID::wafer_hash_max
size_type wafer_hash_max() const
Definition: PixelID.cxx:833
PixelID::layer_disk
int layer_disk(const Identifier &id) const
Definition: PixelID.h:622
IOVInfiniteRange.h
PathResolver.h
ITkPixelCablingAlg::m_idHelper
const PixelID * m_idHelper
Definition: ITkPixelCablingAlg.h:58
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
SG::WriteCondHandle::key
const std::string & key() const
Definition: WriteCondHandle.h:44
IdentifierHash.h
ITkPixelCabling::ModuleInfo
Definition: ITkPixelCablingData.h:49
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
ITkPixelCabling::NominalIBTriplet
@ NominalIBTriplet
Definition: ITkPixelCablingData.h:40
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
ITkPixelCablingAlg::m_source
StringProperty m_source
Definition: ITkPixelCablingAlg.h:55
SiDetectorElement.h
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:108
PixelModuleDesign.h
ITkPixelCabling::ModuleType
ModuleType
Definition: ITkPixelCablingData.h:26
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Definition: PathResolver.cxx:183
ITkPixelCablingAlg::ITkPixelCablingAlg
ITkPixelCablingAlg(const std::string &name, ISvcLocator *svc)
Definition: ITkPixelCablingAlg.cxx:43
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:252
ITkPixelCabling::TransformType
TransformType
Definition: ITkPixelCablingData.h:38
ITkPixelCablingAlg::m_writeKey
SG::WriteCondHandleKey< ITkPixelCablingData > m_writeKey
Definition: ITkPixelCablingAlg.h:57
InDetDD::PixelDetectorManager::getDetectorElement
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Definition: PixelDetectorManager.cxx:80
ITkPixelCablingAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: ITkPixelCablingAlg.cxx:70
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
ITkPixelCabling::NominalIECTriplet
@ NominalIECTriplet
Definition: ITkPixelCablingData.h:41
ITkPixelCabling::MergedQuad
@ MergedQuad
Definition: ITkPixelCablingData.h:28
ITkPixelCablingAlg::generateTestCabling
StatusCode generateTestCabling(std::unique_ptr< ITkPixelCablingData > &cabling) const
Definition: ITkPixelCablingAlg.cxx:128
Identifier
Definition: IdentifierFieldParser.cxx:14