ATLAS Offline Software
Loading...
Searching...
No Matches
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
13
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
43ITkPixelCablingAlg::ITkPixelCablingAlg(const std::string& name, ISvcLocator* pSvcLocator):
44 AthReentrantAlgorithm(name, pSvcLocator)
45{
46}
47
48//
49StatusCode
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
60 if (m_useTestCabling) ATH_CHECK(detStore()->retrieve(m_detManager, "ITkPixel"));
61 // Write Cond Handle
62 ATH_CHECK(m_writeKey.initialize());
63
64 return StatusCode::SUCCESS;
65}
66
67
68//
69StatusCode
70ITkPixelCablingAlg::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.
91 ATH_MSG_DEBUG("Using test cabling generated with ITkPixelCablingAlg::generateTestCabling(...)");
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
128StatusCode 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++){
136 Identifier id = m_idHelper->wafer_id(hash);
137 uint32_t onID = (id.get_compact() >> 32) & 0xFFFFFFFF;
138
139 const InDetDD::SiDetectorElement *element = m_detManager->getDetectorElement(id);
140 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign *>(&element->design());
141
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
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Fills an ITkPixelCablingData object and records it in Storegate.
This is an Identifier helper class for the Pixel subdetector.
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
SG::WriteCondHandleKey< ITkPixelCablingData > m_writeKey
StringProperty m_source
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
const InDetDD::PixelDetectorManager * m_detManager
const PixelID * m_idHelper
StatusCode generateTestCabling(std::unique_ptr< ITkPixelCablingData > &cabling) const
ITkPixelCablingAlg(const std::string &name, ISvcLocator *svc)
Gaudi::Property< bool > m_useTestCabling
Class used to describe the design of a module (diode segmentation and readout scheme)
int numberOfCircuits() const
Total number of circuits:
Class to hold geometrical description of a silicon detector element.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
const std::string & key() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())