ATLAS Offline Software
Loading...
Searching...
No Matches
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
7
10
12#include <GeoModelKernel/GeoPhysVol.h>
15#include <SGTools/DataProxy.h>
17
18
19namespace ITk
20{
21
23 const std::string &name,
24 const IInterface *parent)
25 : GeoModelXmlTool(type, name, parent)
26{
27}
28
29
31{
32 // retrieve the common stuff
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) {
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 }
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);
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
120
121 ATH_CHECK(detStore()->record(m_detManager, m_detManager->getName()));
122 theExpt->addManager(m_detManager);
123
124 return StatusCode::SUCCESS;
125}
126
127
129{
131 if (proxy) {
132 proxy->reset();
133 m_detManager = nullptr;
134 }
135 return StatusCode::SUCCESS;
136}
137
139{
140 ATH_MSG_INFO( "\n\nPixel Numerology:\n===============\n\nNumber of parts is " << m_moduleTree.nParts() );
142
143 bool barrelDone = false;
144 for (int b = -1; b <= 1; ++b) {
145 if (m_moduleTree.count(b)) {
146 msg(MSG::DEBUG) << " Found barrel with index " << b << std::endl;
147 n.addBarrel(b);
148 if (!barrelDone) {
149 n.setNumLayers(m_moduleTree[b].nLayers());
150 msg(MSG::DEBUG) << " Number of barrel layers = " << n.numLayers() << std::endl;
151 for (LayerDisk::iterator l = m_moduleTree[b].begin(); l != m_moduleTree[b].end(); ++l) {
152 n.setNumEtaModulesForLayer(l->first, l->second.nEtaModules());
153 // All staves within a layer are assumed identical, so we can just look at the first eta
154 n.setNumPhiModulesForLayer(l->first, l->second.begin()->second.nPhiModules());
155 msg(MSG::DEBUG) << " layer = " << l->first << " has " << n.numEtaModulesForLayer(l->first) <<
156 " etaModules each with " << n.numPhiModulesForLayer(l->first) << " phi modules" << std::endl;
157 }
158 barrelDone = true;
159 }
160 }
161
162 }
163
164 bool endcapDone = false;
165 for (int ec = -2; ec <= 2; ec += 4) {
166 if (m_moduleTree.count(ec)) {
167 msg(MSG::DEBUG) << " Found endcap with index " << ec << std::endl;
168 n.addEndcap(ec);
169 if (!endcapDone) {
170 n.setNumDiskLayers(m_moduleTree[ec].nLayers());
171 msg(MSG::DEBUG) << " Number of endcap layers = " << n.numDiskLayers() << std::endl;
172 for (LayerDisk::iterator l = m_moduleTree[ec].begin(); l != m_moduleTree[ec].end(); ++l) {
173 n.setNumDisksForLayer(l->first, l->second.nEtaModules());
174 msg(MSG::DEBUG) << " Layer " << l->first << " has " << n.numDisksForLayer(l->first) << " disks" << std::endl;
175 for (EtaModule::iterator eta = l->second.begin(); eta != l->second.end(); ++eta) {
176 n.setNumPhiModulesForLayerDisk(l->first, eta->first, eta->second.nPhiModules());
177 msg(MSG::DEBUG) << " Disk " << eta->first << " has " <<
178 n.numPhiModulesForLayerDisk(l->first, eta->first) << " phi modules" << std::endl;
179 }
180 }
181 endcapDone = true;
182 }
183 }
184 }
185
186 msg(MSG::INFO) << endmsg;
187
188 int totalWafers = 0;
189 for (BarrelEndcap::iterator bec = m_moduleTree.begin(); bec != m_moduleTree.end(); ++bec) {
190 for (LayerDisk::iterator ld = bec->second.begin(); ld != bec->second.end(); ++ld) {
191 for (EtaModule::iterator eta = ld->second.begin(); eta != ld->second.end(); ++eta) {
192 for (PhiModule::iterator phi = eta->second.begin(); phi != eta->second.end(); ++phi) {
193 for (Side::iterator side =phi->second.begin(); side != phi->second.end(); ++side) {
194 totalWafers++;
195 }
196 }
197 }
198 }
199 }
200 ATH_MSG_INFO("Total number of wafers added is " << totalWafers);
201 const PixelID *pixelIdHelper = static_cast<const PixelID *> (m_commonItems->getIdHelper());
202 ATH_MSG_INFO("Total number of wafer identifiers is " << pixelIdHelper->wafer_hash_max());
203
204 // Used in digitization to create one vector big enough to hold all pixels
205 n.setMaxNumEtaCells(1);
206 for (int d = 0; d < manager->numDesigns(); ++d) {
207 n.setMaxNumPhiCells(manager->getPixelDesign(d)->rows());
208 n.setMaxNumEtaCells(manager->getPixelDesign(d)->columns());
209 }
210 ATH_MSG_INFO("Max. eta cells is " << n.maxNumEtaCells());
211 ATH_MSG_INFO("Max. phi cells is " << n.maxNumPhiCells());
212
213 manager->numerology() = std::move(n);
214
215 ATH_MSG_INFO("End of numerology\n");
216}
217
218} // namespace ITk
219
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
GeoPhysVol * getPhysVol()
Destructor.
void addManager(const GeoVDetectorManager *)
virtual GeoVDetectorManager * manager()
ServiceHandle< IRDBAccessSvc > m_sqliteReadSvc
StatusCode createBaseTool()
bool isAvailable(const std::string &versionNode, const std::string &tableNode) const
GeoModelXmlTool(const std::string &type, const std::string &name, const IInterface *parent)
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
Gaudi::Property< std::string > m_detectorName
ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc
GeoModelIO::ReadGeoModel * getSqliteReader() const
std::unique_ptr< InDetDD::SiCommonItems > m_commonItems
void doNumerology(InDetDD::PixelDetectorManager *manager)
Gaudi::Property< std::string > m_alignmentFolderName
virtual StatusCode create() override final
virtual StatusCode clear() override final
const InDetDD::PixelDetectorManager * m_detManager
PixelDetectorTool(const std::string &type, const std::string &name, const IInterface *parent)
void buildReadoutGeometryFromSqlite(IRDBAccessSvc *rdbAccessSvc, GeoModelIO::ReadGeoModel *sqlreader)
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
Class to extract numerology for Pixel and SCT.
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:69
size_type wafer_hash_max() const
Definition PixelID.cxx:703
Definition node.h:24
MsgStream & msg
Definition testRead.cxx:32