ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetDetDescr
ITkPixelCabling
src
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
18
#include "
InDetIdentifier/PixelID.h
"
19
#include "
PixelReadoutGeometry/PixelDetectorManager.h
"
20
#include "
InDetReadoutGeometry/SiDetectorElement.h
"
21
#include "
PixelReadoutGeometry/PixelModuleDesign.h
"
22
23
24
//Athena includes
25
#include "Identifier/Identifier.h"
26
#include "
Identifier/IdentifierHash.h
"
27
#include "
PathResolver/PathResolver.h
"
28
#include "
AthenaKernel/IOVInfiniteRange.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
AthCondAlgorithm
(name, pSvcLocator)
45
{
46
}
47
48
//
49
StatusCode
50
ITkPixelCablingAlg::initialize
() {
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
//
69
StatusCode
70
ITkPixelCablingAlg::execute
(
const
EventContext& ctx)
const
{
71
// Write Cond Handle
72
SG::WriteCondHandle<ITkPixelCablingData>
writeHandle =
SG::makeHandle
(
m_writeKey
, ctx);
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++){
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
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
153
moduleType =
ITkPixelCabling::ModuleType::SimpleQuad
;
154
moduleTransform =
ITkPixelCabling::TransformType::NominalQuad
;
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
165
moduleType =
ITkPixelCabling::ModuleType::MergedQuad
;
166
moduleTransform =
ITkPixelCabling::TransformType::NominalQuad
;
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
180
ITkPixelCabling::ModuleType
moduleType =
m_idHelper
->barrel_ec(
id
) == 0 ?
ITkPixelCabling::ModuleType::IBTriplet
:
ITkPixelCabling::ModuleType::IECTriplet
;
181
ITkPixelCabling::TransformType
moduleTransform =
m_idHelper
->barrel_ec(
id
) == 0 ?
ITkPixelCabling::TransformType::NominalIBTriplet
:
ITkPixelCabling::TransformType::NominalIECTriplet
;
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
ATH_CHECK
#define ATH_CHECK
Evaluate an expression and check for errors.
Definition
AthCheckMacros.h:40
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition
AthMsgStreamMacros.h:33
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition
AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition
AthMsgStreamMacros.h:31
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition
AthMsgStreamMacros.h:28
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition
AthMsgStreamMacros.h:29
IOVInfiniteRange.h
ITkPixelCablingAlg.h
Fills an ITkPixelCablingData object and records it in Storegate.
IdentifierHash.h
PathResolver.h
PixelDetectorManager.h
PixelID.h
This is an Identifier helper class for the Pixel subdetector.
PixelModuleDesign.h
SiDetectorElement.h
AthCommonAlgorithm< Gaudi::Algorithm >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
Definition
AthCommonDataStore.h:95
AthCondAlgorithm
Base class for conditions algorithms.
Definition
AthCondAlgorithm.h:22
IOVInfiniteRange::infiniteRunLB
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
Definition
IOVInfiniteRange.h:39
ITkPixelCablingAlg::m_writeKey
SG::WriteCondHandleKey< ITkPixelCablingData > m_writeKey
Definition
ITkPixelCablingAlg.h:57
ITkPixelCablingAlg::m_source
StringProperty m_source
Definition
ITkPixelCablingAlg.h:55
ITkPixelCablingAlg::initialize
virtual StatusCode initialize() override
Definition
ITkPixelCablingAlg.cxx:50
ITkPixelCablingAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition
ITkPixelCablingAlg.cxx:70
ITkPixelCablingAlg::m_detManager
const InDetDD::PixelDetectorManager * m_detManager
Definition
ITkPixelCablingAlg.h:59
ITkPixelCablingAlg::m_idHelper
const PixelID * m_idHelper
Definition
ITkPixelCablingAlg.h:58
ITkPixelCablingAlg::generateTestCabling
StatusCode generateTestCabling(std::unique_ptr< ITkPixelCablingData > &cabling) const
Definition
ITkPixelCablingAlg.cxx:128
ITkPixelCablingAlg::ITkPixelCablingAlg
ITkPixelCablingAlg(const std::string &name, ISvcLocator *svc)
Definition
ITkPixelCablingAlg.cxx:43
ITkPixelCablingAlg::m_useTestCabling
Gaudi::Property< bool > m_useTestCabling
Definition
ITkPixelCablingAlg.h:56
InDetDD::PixelModuleDesign
Class used to describe the design of a module (diode segmentation and readout scheme).
Definition
PixelModuleDesign.h:45
InDetDD::PixelModuleDesign::numberOfCircuits
int numberOfCircuits() const
Total number of circuits:
Definition
PixelModuleDesign.h:306
InDetDD::SiDetectorElement
Class to hold geometrical description of a silicon detector element.
Definition
SiDetectorElement.h:109
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Definition
PathResolver.cxx:220
SG::WriteCondHandle
Definition
WriteCondHandle.h:26
SG::WriteCondHandle::key
const std::string & key() const
Definition
WriteCondHandle.h:44
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition
WriteCondHandle.h:161
SG::WriteCondHandle::isValid
bool isValid() const
Definition
WriteCondHandle.h:252
SG::WriteCondHandle::fullKey
const DataObjID & fullKey() const
Definition
WriteCondHandle.h:45
ITkPixelCabling::TransformType
TransformType
Definition
ITkPixelCablingData.h:38
ITkPixelCabling::NominalIBTriplet
@ NominalIBTriplet
Definition
ITkPixelCablingData.h:40
ITkPixelCabling::NominalIECTriplet
@ NominalIECTriplet
Definition
ITkPixelCablingData.h:41
ITkPixelCabling::NominalQuad
@ NominalQuad
Definition
ITkPixelCablingData.h:39
ITkPixelCabling::ModuleType
ModuleType
Definition
ITkPixelCablingData.h:26
ITkPixelCabling::IECTriplet
@ IECTriplet
Definition
ITkPixelCablingData.h:30
ITkPixelCabling::IBTriplet
@ IBTriplet
Definition
ITkPixelCablingData.h:29
ITkPixelCabling::MergedQuad
@ MergedQuad
Definition
ITkPixelCablingData.h:28
ITkPixelCabling::SimpleQuad
@ SimpleQuad
Definition
ITkPixelCablingData.h:27
Identifier
Definition
IdentifierFieldParser.cxx:14
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition
ReadCondHandle.h:269
ITkPixelCabling::ModuleInfo
Definition
ITkPixelCablingData.h:49
Generated on
for ATLAS Offline Software by
1.17.0