ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetDetDescr
PixelGeoModelXml
src
ml/src/PixelDetectorTool.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
PixelGeoModelXml/PixelDetectorTool.h
"
6
#include "
PixelGeoModelXml/PixelGmxInterface.h
"
7
8
#include <
PixelReadoutGeometry/PixelDetectorManager.h
>
9
#include <
PixelReadoutGeometry/PixelModuleDesign.h
>
10
11
#include <
DetDescrConditions/AlignableTransformContainer.h
>
12
#include <GeoModelKernel/GeoPhysVol.h>
13
#include <
GeoModelUtilities/DecodeVersionKey.h
>
14
#include <
GeoModelUtilities/GeoModelExperiment.h
>
15
#include <
SGTools/DataProxy.h
>
16
#include <
StoreGate/StoreGateSvc.h
>
17
18
19
namespace
ITk
20
{
21
22
PixelDetectorTool::PixelDetectorTool
(
const
std::string &
type
,
23
const
std::string &name,
24
const
IInterface *parent)
25
:
GeoModelXmlTool
(
type
, name, parent)
26
{
27
}
28
29
30
StatusCode
PixelDetectorTool::create
()
31
{
32
// retrieve the common stuff
33
ATH_CHECK
(
createBaseTool
());
34
35
GeoModelExperiment
*theExpt =
nullptr
;
36
ATH_CHECK
(detStore()->retrieve(theExpt,
"ATLAS"
));
37
const
PixelID
*idHelper =
nullptr
;
38
ATH_CHECK
(detStore()->retrieve(idHelper,
"PixelID"
));
39
40
m_commonItems
= std::make_unique<InDetDD::SiCommonItems>(idHelper);
41
42
GeoModelIO::ReadGeoModel* sqlreader =
getSqliteReader
();
43
44
// If we are not taking the geo from sqlite, check the availability of tables
45
// (or that we have a local geometry)
46
std::string
node
{
"Pixel"
};
47
std::string table{
"PIXXDD"
};
48
49
if
(!sqlreader){
50
if
(!
isAvailable
(
node
, table)) {
51
ATH_MSG_INFO
(
"Trying new "
<<
m_detectorName
.value() <<
" database location."
);
52
node
=
"InnerDetector"
;
53
table =
"PixelXDD"
;
54
if
(!
isAvailable
(
node
, table)) {
55
ATH_MSG_ERROR
(
"No ITk Pixel geometry found. ITk Pixel can not be built."
);
56
return
StatusCode::FAILURE;
57
}
58
}
59
}
60
//
61
// Create the detector manager
62
//
63
// The * converts a ConstPVLink to a ref to a GeoVPhysVol
64
// The & takes the address of the GeoVPhysVol
65
GeoPhysVol *world = &*theExpt->
getPhysVol
();
66
auto
*
manager
=
new
InDetDD::PixelDetectorManager
(&*detStore(),
m_detectorName
,
"PixelID"
);
67
const
std::string topFolder(
m_alignmentFolderName
);
68
manager
->addFolder(topFolder);
69
if
(
m_alignable
) {
70
InDetDD::AlignFolderType
alignFolderType =
InDetDD::static_run1
;
71
manager
->addAlignFolderType(alignFolderType);
72
manager
->addChannel(topFolder +
"/ID"
, 2,
InDetDD::global
);
73
manager
->addChannel(topFolder +
"/PIX"
, 1,
InDetDD::global
);
74
manager
->addChannel(topFolder +
"/PIXB1"
, 0,
InDetDD::local
);
75
manager
->addChannel(topFolder +
"/PIXB2"
, 0,
InDetDD::local
);
76
manager
->addChannel(topFolder +
"/PIXB3"
, 0,
InDetDD::local
);
77
manager
->addChannel(topFolder +
"/PIXB4"
, 0,
InDetDD::local
);
78
manager
->addChannel(topFolder +
"/PIXB5"
, 0,
InDetDD::local
);
79
manager
->addChannel(topFolder +
"/PIXEA1"
, 0,
InDetDD::local
);
80
manager
->addChannel(topFolder +
"/PIXEA2"
, 0,
InDetDD::local
);
81
manager
->addChannel(topFolder +
"/PIXEA3"
, 0,
InDetDD::local
);
82
manager
->addChannel(topFolder +
"/PIXEA4"
, 0,
InDetDD::local
);
83
manager
->addChannel(topFolder +
"/PIXEA5"
, 0,
InDetDD::local
);
84
manager
->addChannel(topFolder +
"/PIXEA6"
, 0,
InDetDD::local
);
85
manager
->addChannel(topFolder +
"/PIXEA7"
, 0,
InDetDD::local
);
86
manager
->addChannel(topFolder +
"/PIXEA8"
, 0,
InDetDD::local
);
87
manager
->addChannel(topFolder +
"/PIXEA9"
, 0,
InDetDD::local
);
88
manager
->addChannel(topFolder +
"/PIXEC1"
, 0,
InDetDD::local
);
89
manager
->addChannel(topFolder +
"/PIXEC2"
, 0,
InDetDD::local
);
90
manager
->addChannel(topFolder +
"/PIXEC3"
, 0,
InDetDD::local
);
91
manager
->addChannel(topFolder +
"/PIXEC4"
, 0,
InDetDD::local
);
92
manager
->addChannel(topFolder +
"/PIXEC5"
, 0,
InDetDD::local
);
93
manager
->addChannel(topFolder +
"/PIXEC6"
, 0,
InDetDD::local
);
94
manager
->addChannel(topFolder +
"/PIXEC7"
, 0,
InDetDD::local
);
95
manager
->addChannel(topFolder +
"/PIXEC8"
, 0,
InDetDD::local
);
96
manager
->addChannel(topFolder +
"/PIXEC9"
, 0,
InDetDD::local
);
97
}
98
InDetDD::ITk::PixelGmxInterface
gmxInterface(
manager
,
m_commonItems
.get(), &
m_moduleTree
);
99
100
// Load the geometry, create the volume,
101
// node,table are the location in the DB to look for the clob
102
// empty strings are the (optional) containing detector and envelope names
103
// allowed to pass a null sqlreader ptr - it will be used to steer the source of the geometry
104
const
GeoVPhysVol* topVolume =
createTopVolume
(world, gmxInterface,
node
, table,
""
,
""
,sqlreader);
105
if
(sqlreader){
106
ATH_MSG_INFO
(
"Building Pixel Readout Geometry from SQLite using "
<<
m_geoDbTagSvc
->getParamSvcName());
107
gmxInterface.
buildReadoutGeometryFromSqlite
(
m_sqliteReadSvc
.operator->(),sqlreader);
108
}
109
if
(topVolume) {
//see that a valid pointer is returned
110
manager
->addTreeTop(topVolume);
111
doNumerology
(
manager
);
112
manager
->initNeighbours();
113
}
else
{
114
ATH_MSG_FATAL
(
"Could not find the Top Volume!!!"
);
115
return
StatusCode::FAILURE;
116
}
117
118
// set the manager
119
m_detManager
=
manager
;
120
121
ATH_CHECK
(detStore()->record(
m_detManager
,
m_detManager
->getName()));
122
theExpt->
addManager
(
m_detManager
);
123
124
// Create a symLink to the SiDetectorManager base class so it can be accessed as either SiDetectorManager or
125
// PixelDetectorManager
126
const
InDetDD::SiDetectorManager
*siDetManager =
m_detManager
;
127
ATH_CHECK
(detStore()->symLink(
m_detManager
, siDetManager));
128
129
return
StatusCode::SUCCESS;
130
}
131
132
133
StatusCode
PixelDetectorTool::clear
()
134
{
135
SG::DataProxy
* proxy = detStore()->proxy(
ClassID_traits<InDetDD::PixelDetectorManager>::ID
(),
m_detManager
->getName());
136
if
(proxy) {
137
proxy->reset();
138
m_detManager
=
nullptr
;
139
}
140
return
StatusCode::SUCCESS;
141
}
142
143
void
PixelDetectorTool::doNumerology
(
InDetDD::PixelDetectorManager
*
manager
)
144
{
145
ATH_MSG_INFO
(
"\n\nPixel Numerology:\n===============\n\nNumber of parts is "
<<
m_moduleTree
.nParts() );
146
InDetDD::SiNumerology
n;
147
148
bool
barrelDone =
false
;
149
for
(
int
b = -1; b <= 1; ++b) {
150
if
(
m_moduleTree
.count(b)) {
151
msg
(MSG::DEBUG) <<
" Found barrel with index "
<< b << std::endl;
152
n.addBarrel(b);
153
if
(!barrelDone) {
154
n.setNumLayers(
m_moduleTree
[b].nLayers());
155
msg
(MSG::DEBUG) <<
" Number of barrel layers = "
<< n.numLayers() << std::endl;
156
for
(LayerDisk::iterator l =
m_moduleTree
[b].begin(); l !=
m_moduleTree
[b].end(); ++l) {
157
n.setNumEtaModulesForLayer(l->first, l->second.nEtaModules());
158
// All staves within a layer are assumed identical, so we can just look at the first eta
159
n.setNumPhiModulesForLayer(l->first, l->second.begin()->second.nPhiModules());
160
msg
(MSG::DEBUG) <<
" layer = "
<< l->first <<
" has "
<< n.numEtaModulesForLayer(l->first) <<
161
" etaModules each with "
<< n.numPhiModulesForLayer(l->first) <<
" phi modules"
<< std::endl;
162
}
163
barrelDone =
true
;
164
}
165
}
166
167
}
168
169
bool
endcapDone =
false
;
170
for
(
int
ec = -2; ec <= 2; ec += 4) {
171
if
(
m_moduleTree
.count(ec)) {
172
msg
(MSG::DEBUG) <<
" Found endcap with index "
<< ec << std::endl;
173
n.addEndcap(ec);
174
if
(!endcapDone) {
175
n.setNumDiskLayers(
m_moduleTree
[ec].nLayers());
176
msg
(MSG::DEBUG) <<
" Number of endcap layers = "
<< n.numDiskLayers() << std::endl;
177
for
(LayerDisk::iterator l =
m_moduleTree
[ec].begin(); l !=
m_moduleTree
[ec].end(); ++l) {
178
n.setNumDisksForLayer(l->first, l->second.nEtaModules());
179
msg
(MSG::DEBUG) <<
" Layer "
<< l->first <<
" has "
<< n.numDisksForLayer(l->first) <<
" disks"
<< std::endl;
180
for
(EtaModule::iterator
eta
= l->second.begin();
eta
!= l->second.end(); ++
eta
) {
181
n.setNumPhiModulesForLayerDisk(l->first,
eta
->first,
eta
->second.nPhiModules());
182
msg
(MSG::DEBUG) <<
" Disk "
<<
eta
->first <<
" has "
<<
183
n.numPhiModulesForLayerDisk(l->first,
eta
->first) <<
" phi modules"
<< std::endl;
184
}
185
}
186
endcapDone =
true
;
187
}
188
}
189
}
190
191
msg
(MSG::INFO) <<
endmsg
;
192
193
int
totalWafers = 0;
194
for
(BarrelEndcap::iterator bec =
m_moduleTree
.begin(); bec !=
m_moduleTree
.end(); ++bec) {
195
for
(LayerDisk::iterator ld = bec->second.begin(); ld != bec->second.end(); ++ld) {
196
for
(EtaModule::iterator
eta
= ld->second.begin();
eta
!= ld->second.end(); ++
eta
) {
197
for
(PhiModule::iterator
phi
=
eta
->second.begin();
phi
!=
eta
->second.end(); ++
phi
) {
198
for
(Side::iterator side =
phi
->second.begin(); side !=
phi
->second.end(); ++side) {
199
totalWafers++;
200
}
201
}
202
}
203
}
204
}
205
ATH_MSG_INFO
(
"Total number of wafers added is "
<< totalWafers);
206
const
PixelID
*pixelIdHelper =
static_cast<
const
PixelID
*
>
(
m_commonItems
->getIdHelper());
207
ATH_MSG_INFO
(
"Total number of wafer identifiers is "
<< pixelIdHelper->
wafer_hash_max
());
208
209
// Used in digitization to create one vector big enough to hold all pixels
210
n.setMaxNumEtaCells(1);
211
for
(
int
d = 0; d <
manager
->numDesigns(); ++d) {
212
n.setMaxNumPhiCells(
manager
->getPixelDesign(d)->rows());
213
n.setMaxNumEtaCells(
manager
->getPixelDesign(d)->columns());
214
}
215
ATH_MSG_INFO
(
"Max. eta cells is "
<< n.maxNumEtaCells());
216
ATH_MSG_INFO
(
"Max. phi cells is "
<< n.maxNumPhiCells());
217
218
manager
->numerology() = std::move(n);
219
220
ATH_MSG_INFO
(
"End of numerology\n"
);
221
}
222
223
}
// namespace ITk
224
AlignableTransformContainer.h
eta
Scalar eta() const
pseudorapidity method
Definition
AmgMatrixBasePlugin.h:83
phi
Scalar phi() const
phi method
Definition
AmgMatrixBasePlugin.h:67
endmsg
#define endmsg
Definition
AnalysisConfig_Ntuple.cxx:54
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
DataProxy.h
DecodeVersionKey.h
GeoModelExperiment.h
PixelDetectorManager.h
PixelGmxInterface.h
PixelModuleDesign.h
StoreGateSvc.h
GeoModelExperiment
Definition
GeoModelExperiment.h:32
GeoModelExperiment::getPhysVol
GeoPhysVol * getPhysVol()
Destructor.
Definition
GeoModelExperiment.cxx:21
GeoModelExperiment::addManager
void addManager(const GeoVDetectorManager *)
Definition
GeoModelExperiment.cxx:40
GeoModelTool::manager
virtual GeoVDetectorManager * manager()
Definition
GeoModelTool.h:21
GeoModelXmlTool::m_sqliteReadSvc
ServiceHandle< IRDBAccessSvc > m_sqliteReadSvc
Definition
GeoModelXmlTool.h:44
GeoModelXmlTool::createBaseTool
StatusCode createBaseTool()
Definition
GeoModelXmlTool.cxx:26
GeoModelXmlTool::isAvailable
bool isAvailable(const std::string &versionNode, const std::string &tableNode) const
Definition
GeoModelXmlTool.cxx:78
GeoModelXmlTool::GeoModelXmlTool
GeoModelXmlTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition
GeoModelXmlTool.cxx:19
GeoModelXmlTool::createTopVolume
const GeoVPhysVol * createTopVolume(GeoPhysVol *worldVol, GmxInterface &interface, const std::string &versionNode, const std::string &tableNode, const std::string &containingDetector="", const std::string &envelopeName="", const GeoModelIO::ReadGeoModel *sqlreader=nullptr) const
Definition
GeoModelXmlTool.cxx:35
GeoModelXmlTool::m_detectorName
Gaudi::Property< std::string > m_detectorName
Definition
GeoModelXmlTool.h:42
GeoModelXmlTool::m_geoDbTagSvc
ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc
Definition
GeoModelXmlTool.h:45
GeoModelXmlTool::getSqliteReader
GeoModelIO::ReadGeoModel * getSqliteReader() const
Definition
GeoModelXmlTool.cxx:174
ITk::PixelDetectorTool::m_moduleTree
WaferTree m_moduleTree
Definition
ml/PixelGeoModelXml/PixelDetectorTool.h:36
ITk::PixelDetectorTool::m_commonItems
std::unique_ptr< InDetDD::SiCommonItems > m_commonItems
Definition
ml/PixelGeoModelXml/PixelDetectorTool.h:35
ITk::PixelDetectorTool::doNumerology
void doNumerology(InDetDD::PixelDetectorManager *manager)
Definition
ml/src/PixelDetectorTool.cxx:143
ITk::PixelDetectorTool::m_alignmentFolderName
Gaudi::Property< std::string > m_alignmentFolderName
Definition
ml/PixelGeoModelXml/PixelDetectorTool.h:40
ITk::PixelDetectorTool::create
virtual StatusCode create() override final
Definition
ml/src/PixelDetectorTool.cxx:30
ITk::PixelDetectorTool::m_alignable
Gaudi::Property< bool > m_alignable
Definition
ml/PixelGeoModelXml/PixelDetectorTool.h:38
ITk::PixelDetectorTool::clear
virtual StatusCode clear() override final
Definition
ml/src/PixelDetectorTool.cxx:133
ITk::PixelDetectorTool::m_detManager
const InDetDD::PixelDetectorManager * m_detManager
Definition
ml/PixelGeoModelXml/PixelDetectorTool.h:34
ITk::PixelDetectorTool::PixelDetectorTool
PixelDetectorTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition
ml/src/PixelDetectorTool.cxx:22
InDetDD::ITk::PixelGmxInterface
Definition
PixelGmxInterface.h:31
InDetDD::ITk::PixelGmxInterface::buildReadoutGeometryFromSqlite
void buildReadoutGeometryFromSqlite(IRDBAccessSvc *rdbAccessSvc, GeoModelIO::ReadGeoModel *sqlreader)
Definition
PixelGmxInterface.cxx:429
InDetDD::PixelDetectorManager
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
Definition
PixelDetectorManager.h:47
InDetDD::SiDetectorManager
Base class for Pixel and SCT Detector managers.
Definition
SiDetectorManager.h:60
InDetDD::SiNumerology
Class to extract numerology for Pixel and SCT.
Definition
SiNumerology.h:27
PixelID
This is an Identifier helper class for the Pixel subdetector.
Definition
PixelID.h:69
PixelID::wafer_hash_max
size_type wafer_hash_max() const
Definition
PixelID.cxx:703
SG::DataProxy
Definition
DataProxy.h:45
node
Definition
node.h:24
PixelDetectorTool.h
ITk
Definition
ITkPixelOfflineCalibCondAlg.cxx:13
InDetDD::global
@ global
Definition
InDetDD_Defs.h:16
InDetDD::local
@ local
Definition
InDetDD_Defs.h:16
InDetDD::AlignFolderType
AlignFolderType
Definition
InDetDD_Defs.h:19
InDetDD::static_run1
@ static_run1
Definition
InDetDD_Defs.h:19
ClassID_traits::ID
static constexpr CLID ID()
Definition
Control/AthenaKernel/AthenaKernel/ClassID_traits.h:44
type
msg
MsgStream & msg
Definition
testRead.cxx:32
Generated on
for ATLAS Offline Software by
1.17.0