ATLAS Offline Software
Loading...
Searching...
No Matches
LArReadoutGeometryBuilder.h File Reference

Helper function for building readout geometries of all LAr subsystems. More...

#include <tuple>
Include dependency graph for LArReadoutGeometryBuilder.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

std::tuple< EMBDetectorManager *, EMECDetectorManager *, HECDetectorManager *, FCALDetectorManager * > buildLArReadoutGeometry (StoreGateSvc *detStore, const LArHVManager *hvManager, IMessageSvc *msgSvc, int testbeam, double projectivityDisplacement)

Detailed Description

Helper function for building readout geometries of all LAr subsystems.

Definition in file LArReadoutGeometryBuilder.h.

Function Documentation

◆ buildLArReadoutGeometry()

std::tuple< EMBDetectorManager *, EMECDetectorManager *, HECDetectorManager *, FCALDetectorManager * > buildLArReadoutGeometry ( StoreGateSvc * detStore,
const LArHVManager * hvManager,
IMessageSvc * msgSvc,
int testbeam,
double projectivityDisplacement )

Definition at line 37 of file LArReadoutGeometryBuilder.cxx.

42{
43 MsgStream log(msgSvc, "buildLArReadoutGeometry");
44
45 EMBDetectorManager* embDetectorManager{nullptr};
46 EMECDetectorManager* emecDetectorManager{nullptr};
47 HECDetectorManager* hecDetectorManager{nullptr};
48 FCALDetectorManager* fcalDetectorManager{nullptr};
49
50 { // FCAL
51 fcalDetectorManager = new FCALDetectorManager(&(hvManager->getFCALHVManager()));
52 std::string fcalModName[2][3]={{"FCAL1_NEG","FCAL2_NEG","FCAL3_NEG"},
53 {"FCAL1_POS","FCAL2_POS","FCAL3_POS"}};
54 for (int e=0;e<2;e++) {
55 for (int m=0;m<3;m++) {
56 StoredPhysVol *vol;
57 if(detStore->contains<StoredPhysVol>(fcalModName[e][m])){
58 if (detStore->retrieve(vol,fcalModName[e][m])==StatusCode::SUCCESS) {
59 FCALModule *module=new FCALModule(vol->getPhysVol(),FCALModule::Module(m+1),FCALModule::Endcap(e),projectivityDisplacement);
60 fcalDetectorManager->addModule(module);
61 }
62 }
63 else {
64 log << MSG::DEBUG << " No Stored PV for " << fcalModName[e][m] << " in Detector Store" << endmsg;
65 }
66 }
67 }
68 }
69
70 { // HEC
71 hecDetectorManager = new HECDetectorManager(&(hvManager->getHECHVManager()));
72 for (unsigned int s=0;s<4;s++) {
73 for (unsigned int r=0;r<2;r++) {
74 unsigned int nPhi = r==0? 2:1;
75 for (unsigned int endcap=0;endcap<2;endcap++) {
76 StoredPhysVol *vol;
77 std::string nameTag= endcap==0 ? (s<2 ? "HEC1_NEG":"HEC2_NEG") : (s<2 ? "HEC1_POS":"HEC2_POS");
78 if(detStore->contains<StoredPhysVol>(nameTag)){
79 if (StatusCode::SUCCESS==detStore->retrieve(vol, nameTag)) {
80 unsigned int width = 32;
81 double startPhi = endcap==0? M_PI : 0;
82 double endPhi = endcap==0? -M_PI : 2*M_PI ;
83
84 CellBinning phiBinning(startPhi, endPhi, width*nPhi);
85 HECDetDescr *d = new HECDetDescr(hecDetectorManager,s,r,phiBinning);
86
87 HECDetectorRegion::DetectorSide side = (HECDetectorRegion::DetectorSide) endcap;
88 HECDetectorRegion *region = new HECDetectorRegion(vol->getPhysVol(),d,side,projectivityDisplacement);
89 hecDetectorManager->addDetectorRegion(region);
90 }
91 }
92 else
93 log << MSG::DEBUG << " No Stored PV for " << nameTag
94 << " in Detector Store" << endmsg;
95 }
96 }
97 }
98 }
99
100 { // EMEC
101 emecDetectorManager = new EMECDetectorManager(&(hvManager->getEMECHVManager(EMECHVModule::INNER))
103 ,&(hvManager->getEMECPresamplerHVManager()));
104
105 // Here is a table of min and max eta for different sampling layers, radial part (i/o) and region.
106
107 for (int e=0;e<2;e++) {
108
109 double startPhi = e==0? M_PI-2*M_PI/768/2 : -2*M_PI/768/2;
110 double endPhi = e==0? -M_PI-2*M_PI/768/2 : 2*M_PI-2*M_PI/768/2 ;
111
112
113 StoredPhysVol *sPhys;
114
115 if(detStore->contains<StoredPhysVol>(e==0 ? "EMEC_OUTER_WHEEL_NEG" : "EMEC_OUTER_WHEEL_POS")) {
116 if (detStore->retrieve(sPhys,e==0 ? "EMEC_OUTER_WHEEL_NEG" : "EMEC_OUTER_WHEEL_POS")==StatusCode::SUCCESS) {
117 GeoIntrusivePtr<GeoFullPhysVol>emecEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
118
119 {
120 CellBinning phiBinning(startPhi,endPhi,64);
121 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,0,0,phiBinning);
122 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
123 emecDetectorManager->addDetectorRegion(region);
124 }
125
126 // Outer Wheel Sampling 1 Region 1:
127 {
128 CellBinning phiBinning(startPhi,endPhi,64);
129 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,1,0,phiBinning);
130 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
131 emecDetectorManager->addDetectorRegion(region);
132 }
133 // Outer Wheel Sampling 1 Region 2:
134 {
135 CellBinning phiBinning(startPhi,endPhi,64);
136 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,2,0,phiBinning);
137 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
138 emecDetectorManager->addDetectorRegion(region);
139 }
140 // Outer Wheel Sampling 1 Region 3:
141 {
142 CellBinning phiBinning(startPhi,endPhi,64);
143 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,3,0,phiBinning);
144 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
145 emecDetectorManager->addDetectorRegion(region);
146 }
147 // Outer Wheel Sampling 1 Region 4:
148 {
149 CellBinning phiBinning(startPhi,endPhi,64);
150 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,4,0,phiBinning);
151 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
152 emecDetectorManager->addDetectorRegion(region);
153 }
154 // Outer Wheel Sampling 1 Region 5:
155 {
156 CellBinning phiBinning(startPhi,endPhi,64);
157 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,5,0,phiBinning);
158 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
159 emecDetectorManager->addDetectorRegion(region);
160 }
161 // Outer Wheel Sampling 2 Region 0:
162 {
163 CellBinning phiBinning(startPhi,endPhi,256);
164 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,2,0,0,phiBinning);
165 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
166 emecDetectorManager->addDetectorRegion(region);
167 }
168 // Outer Wheel Sampling 2 Region 1:
169 {
170 CellBinning phiBinning(startPhi,endPhi,256);
171 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,2,1,0,phiBinning);
172 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
173 emecDetectorManager->addDetectorRegion(region);
174 }
175 // Outer Wheel Sampling 3 Region 0:
176 {
177 CellBinning phiBinning(startPhi,endPhi,256);
178 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,3,0,0,phiBinning);
179 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
180 emecDetectorManager->addDetectorRegion(region);
181 }
182 }
183 }
184 else {
185 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMEC_OUTER_WHEEL_NEG" : "EMEC_OUTER_WHEEL_POS")
186 << " in Detector Store" << endmsg;
187 }
188
189 if(detStore->contains<StoredPhysVol>(e==0 ? "EMEC_INNER_WHEEL_NEG" : "EMEC_INNER_WHEEL_POS")) {
190 if (detStore->retrieve(sPhys,e==0 ? "EMEC_INNER_WHEEL_NEG" : "EMEC_INNER_WHEEL_POS")==StatusCode::SUCCESS) {
191
192 GeoIntrusivePtr<GeoFullPhysVol>emecEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
193
194 // Inner Wheel Sampling 1 Region 0:
195 {
196 CellBinning phiBinning(startPhi,endPhi,64);
197 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,1,0,1,phiBinning);
198 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
199 emecDetectorManager->addDetectorRegion(region);
200 }
201 // Inner Wheel Sampling 2 Region 0:
202
203 {
204 CellBinning phiBinning(startPhi,endPhi,64);
205 EMECDetDescr *detDescr = new EMECDetDescr(emecDetectorManager,2,0,1,phiBinning);
206 EMECDetectorRegion *region = new EMECDetectorRegion(emecEnvelope,detDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
207 emecDetectorManager->addDetectorRegion(region);
208 }
209
210 }
211 }
212 else {
213 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMEC_INNER_WHEEL_NEG" : "EMEC_INNER_WHEEL_POS")
214 << " in Detector Store" << endmsg;
215 }
216
217 StoredPhysVol *sPresamplerEnvelope;
218
219 if(detStore->contains<StoredPhysVol>(e==0 ? "PRESAMPLER_EC_NEG":"PRESAMPLER_EC_POS" )) {
220 if (StatusCode::SUCCESS==detStore->retrieve(sPresamplerEnvelope, e==0 ? "PRESAMPLER_EC_NEG":"PRESAMPLER_EC_POS" )) {
221 GeoIntrusivePtr<GeoFullPhysVol> PresamplerEnvelope=sPresamplerEnvelope->getPhysVol();
222 CellBinning presamplerPhiBinning(startPhi,endPhi,64);
223 EMECDetDescr *presamplerDetDescr = new EMECDetDescr(emecDetectorManager,0,0,0,presamplerPhiBinning);
224 EMECDetectorRegion *presamplerRegion = new EMECDetectorRegion(PresamplerEnvelope,presamplerDetDescr,EMECDetectorRegion::DetectorSide(e),projectivityDisplacement);
225 emecDetectorManager->addDetectorRegion(presamplerRegion);
226 }
227 }
228 else {
229 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "PRESAMPLER_EC_NEG":"PRESAMPLER_EC_POS")
230 << " in Detector Store" << endmsg;
231 }
232 }
233 }
234
235 { // EMB
236 embDetectorManager = new EMBDetectorManager(hvManager->getEMBHVManager(),hvManager->getEMBPresamplerHVManager());
237 int firstEndcap= testbeam==0 ? 0:1;
238 int endEndcap=2;
239
240 for (int e= firstEndcap ;e<endEndcap;e++) {
241
242 double startPhi = e==0? M_PI-2*M_PI/1024/2 : -2*M_PI/1024/2;
243 double endPhi = e==0? -M_PI-2*M_PI/1024/2 : 2*M_PI-2*M_PI/1024/2 ;
244 int NDIV = 1;
245 if (testbeam==1) {
246 startPhi=0*M_PI/180;
247 endPhi =22.5*M_PI/180;
248 NDIV=16;
249 }
250
251 // Sampling layer 3 region 0:
252 {
253 StoredPhysVol *sPhys;
254 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
255 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
256 CellBinning phiBinning(startPhi,endPhi,256/NDIV);
257 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,3,0,phiBinning);
258 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
259 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
260 embDetectorManager->addDetectorRegion(region);
261 }
262 }
263 else {
264 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS" )<< " in Detector Store" << endmsg;
265 }
266 }
267 // Sampling layer 2 region 0:
268 {
269 StoredPhysVol *sPhys;
270 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
271 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
272 CellBinning phiBinning(startPhi,endPhi,256/NDIV);
273 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,2,0,phiBinning);
274 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
275 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
276 embDetectorManager->addDetectorRegion(region);
277 }
278 }
279 else {
280 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS" )<< " in Detector Store" << endmsg;
281 }
282 }
283 // Sampling layer 2 region 1:
284 {
285 StoredPhysVol *sPhys;
286 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
287 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
288 CellBinning phiBinning(startPhi,endPhi,256/NDIV);
289 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,2,1,phiBinning);
290 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
291 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
292 embDetectorManager->addDetectorRegion(region);
293 }
294 }
295 else {
296 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS") << " in Detector Store" << endmsg;
297 }
298 }
299 // Sampling layer 1 region 0:
300 {
301 StoredPhysVol *sPhys;
302 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
303 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
304 CellBinning phiBinning(startPhi,endPhi,64/NDIV);
305 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,1,0,phiBinning);
306 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
307 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
308 embDetectorManager->addDetectorRegion(region);
309 }
310 }
311 else {
312 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS") << " in Detector Store" << endmsg;
313 }
314 }
315 // Sampling layer 1 region 0:
316 {
317 StoredPhysVol *sPhys;
318 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
319 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
320 CellBinning phiBinning(startPhi,endPhi,256/NDIV);
321 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,1,1,phiBinning);
322 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
323 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
324 embDetectorManager->addDetectorRegion(region);
325 }
326 }
327 else {
328 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS") << " in Detector Store" << endmsg;
329 }
330 }
331 // Sampling layer 0 region 0:
332 {
333 StoredPhysVol *sPhys;
334 if(detStore->contains<StoredPhysVol>(e==0 ? "EMB_NEG" : "EMB_POS")) {
335 if (detStore->retrieve(sPhys,e==0 ? "EMB_NEG" : "EMB_POS")==StatusCode::SUCCESS) {
336 CellBinning phiBinning(startPhi,endPhi,64/NDIV);
337 EMBDetDescr *detDescr = new EMBDetDescr(embDetectorManager,0,0,phiBinning);
338 GeoIntrusivePtr<GeoFullPhysVol>embEnvelope=(GeoIntrusivePtr<GeoFullPhysVol>) sPhys->getPhysVol();
339 EMBDetectorRegion *region = new EMBDetectorRegion(embEnvelope,detDescr,EMBDetectorRegion::DetectorSide(e));
340 embDetectorManager->addDetectorRegion(region);
341 }
342 }
343 else {
344 log << MSG::DEBUG << " No Stored PV for " << (e==0 ? "EMB_NEG" : "EMB_POS") << " in Detector Store" << endmsg;
345 }
346 }
347 }
348 }
349
350 bool allOk{true};
351 StatusCode sc = detStore->record(embDetectorManager, embDetectorManager->getName());
352 if(sc.isFailure()) {
353 log << MSG::ERROR << "Unable to record embDetectorManager" << endmsg;
354 allOk = false;
355 }
356
357 sc = detStore->record(emecDetectorManager, emecDetectorManager->getName());
358 if(sc.isFailure()) {
359 log << MSG::ERROR << "Unable to record emecDetectorManager" << endmsg;
360 allOk = false;
361 }
362
363 sc = detStore->record(hecDetectorManager, hecDetectorManager->getName());
364 if(sc.isFailure()) {
365 log << MSG::ERROR << "Unable to record hecDetectorManager" << endmsg;
366 allOk = false;
367 }
368
369 sc = detStore->record(fcalDetectorManager, fcalDetectorManager->getName());
370 if(sc.isFailure()) {
371 log << MSG::ERROR << "Unable to record fcalDetectorManager" << endmsg;
372 allOk = false;
373 }
374
375 if(!allOk) {
376 delete embDetectorManager;
377 delete emecDetectorManager;
378 delete hecDetectorManager;
379 delete fcalDetectorManager;
380
381 embDetectorManager=nullptr;
382 emecDetectorManager=nullptr;
383 hecDetectorManager=nullptr;
384 fcalDetectorManager=nullptr;
385 }
386
387 return std::make_tuple(embDetectorManager,emecDetectorManager,hecDetectorManager,fcalDetectorManager);
388}
#define M_PI
#define endmsg
static Double_t sc
Descriptor for regions of the electromagnetic barrel calorimeter.
Definition EMBDetDescr.h:27
A manager class providing access to readout geometry information for the electromagnetic barrel calor...
void addDetectorRegion(const EMBDetectorRegion *region)
Add a new Detector Region.
Descriptor for regions of the electromagnetic endcap calorimeter.
A manager class providing access to readout geometry information for the electromagnetic endcap calor...
void addDetectorRegion(const EMECDetectorRegion *region)
Add a new HEC Detector Region.
A manager class providing access to readout geometry information for the forward calorimeter.
void addModule(FCALModule *fcalModule)
Adds an FCAL Module.
A manager class providing access to readout geometry information for the hadronic endcap calorimeter.
const HECHVManager & getHECHVManager() const
const EMECHVManager & getEMECHVManager(IOType IO) const
const EMECPresamplerHVManager & getEMECPresamplerHVManager() const
const FCALHVManager & getFCALHVManager() const
const EMBHVManager & getEMBHVManager() const
const EMBPresamplerHVManager & getEMBPresamplerHVManager() const
GeoFullPhysVol * getPhysVol()
Destructor.
int r
Definition globals.cxx:22
constexpr int nPhi
Default bin number of phi for vertex map.