ATLAS Offline Software
Loading...
Searching...
No Matches
BLM_Builder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
8
11
12#include "GeoModelKernel/GeoNameTag.h"
13#include "GeoModelKernel/GeoIdentifierTag.h"
14#include "GeoModelKernel/GeoTransform.h"
15#include "GeoModelKernel/GeoVPhysVol.h"
16#include "GeoModelKernel/GeoPhysVol.h"
17
18#include "GeoModelKernel/GeoFullPhysVol.h"
19
23
24#include "GaudiKernel/SystemOfUnits.h"
25
26//================ Constructor =================================================
27
29 const std::string& n,
30 const IInterface* p )
31 : base_class(t,n,p)
32{
33 //default settings
34 // Z R PHI ROT_X ROT_Y ROT_Z DIAM_TRANS_X DIAM_TRANS_Y DIAM_TRANS_Z
35 m_module0.push_back(3383.5); m_module0.push_back(62.825); m_module0.push_back(17); m_module0.push_back(180); m_module0.push_back(0); m_module0.push_back(287); m_module0.push_back(0); m_module0.push_back(0); m_module0.push_back(0);
36 m_moduleI.push_back(3383.5); m_moduleI.push_back(62.825); m_moduleI.push_back(45); m_moduleI.push_back(180); m_moduleI.push_back(0); m_moduleI.push_back(315); m_moduleI.push_back(0); m_moduleI.push_back(0); m_moduleI.push_back(0);
37 m_moduleII.push_back(3383.5); m_moduleII.push_back(62.825); m_moduleII.push_back(73); m_moduleII.push_back(180); m_moduleII.push_back(0); m_moduleII.push_back(343); m_moduleII.push_back(0); m_moduleII.push_back(0); m_moduleII.push_back(0);
38 m_moduleIII.push_back(3383.5); m_moduleIII.push_back(62.825); m_moduleIII.push_back(197); m_moduleIII.push_back(180); m_moduleIII.push_back(0); m_moduleIII.push_back(107); m_moduleIII.push_back(0); m_moduleIII.push_back(0); m_moduleIII.push_back(0);
39 m_moduleIV.push_back(3383.5); m_moduleIV.push_back(62.825); m_moduleIV.push_back(225); m_moduleIV.push_back(180); m_moduleIV.push_back(0); m_moduleIV.push_back(135); m_moduleIV.push_back(0); m_moduleIV.push_back(0); m_moduleIV.push_back(0);
40 m_moduleV.push_back(3383.5); m_moduleV.push_back(62.825); m_moduleV.push_back(253); m_moduleV.push_back(180); m_moduleV.push_back(0); m_moduleV.push_back(163); m_moduleV.push_back(0); m_moduleV.push_back(0); m_moduleV.push_back(0);
41 m_moduleVI.push_back(-3383.5); m_moduleVI.push_back(62.825); m_moduleVI.push_back(17); m_moduleVI.push_back(0); m_moduleVI.push_back(0); m_moduleVI.push_back(107); m_moduleVI.push_back(0); m_moduleVI.push_back(0); m_moduleVI.push_back(0);
42 m_moduleVII.push_back(-3383.5); m_moduleVII.push_back(62.825); m_moduleVII.push_back(45); m_moduleVII.push_back(0); m_moduleVII.push_back(0); m_moduleVII.push_back(135); m_moduleVII.push_back(0); m_moduleVII.push_back(0); m_moduleVII.push_back(0);
43 m_moduleVIII.push_back(-3383.5); m_moduleVIII.push_back(62.825); m_moduleVIII.push_back(73); m_moduleVIII.push_back(0); m_moduleVIII.push_back(0); m_moduleVIII.push_back(163); m_moduleVIII.push_back(0); m_moduleVIII.push_back(0); m_moduleVIII.push_back(0);
44 m_moduleIX.push_back(-3383.5); m_moduleIX.push_back(62.825); m_moduleIX.push_back(197); m_moduleIX.push_back(0); m_moduleIX.push_back(0); m_moduleIX.push_back(287); m_moduleIX.push_back(0); m_moduleIX.push_back(0); m_moduleIX.push_back(0);
45 m_moduleX.push_back(-3383.5); m_moduleX.push_back(62.825); m_moduleX.push_back(225); m_moduleX.push_back(0); m_moduleX.push_back(0); m_moduleX.push_back(315); m_moduleX.push_back(0); m_moduleX.push_back(0); m_moduleX.push_back(0);
46 m_moduleXI.push_back(-3383.5); m_moduleXI.push_back(62.825); m_moduleXI.push_back(253); m_moduleXI.push_back(0); m_moduleXI.push_back(0); m_moduleXI.push_back(343); m_moduleXI.push_back(0); m_moduleXI.push_back(0); m_moduleXI.push_back(0);
47
48 // template for property declaration
49 declareProperty("Modul0", m_module0);
50 declareProperty("ModulI", m_moduleI);
51 declareProperty("ModulII", m_moduleII);
52 declareProperty("ModulIII", m_moduleIII);
53 declareProperty("ModulIV", m_moduleIV);
54 declareProperty("ModulV", m_moduleV);
55 declareProperty("ModulVI", m_moduleVI);
56 declareProperty("ModulVII", m_moduleVII);
57 declareProperty("ModulVIII", m_moduleVIII);
58 declareProperty("ModulIX", m_moduleIX);
59 declareProperty("ModulX", m_moduleX);
60 declareProperty("ModulXI", m_moduleXI);
61 declareProperty("ModulesOn", m_moduleon=0xFFFF);
62 declareProperty("BLMon", m_blmon=true);
63 declareProperty("DBparameters", m_BDparameters=true);
64}
65
66//================ Initialisation =================================================
67
69{
70
71 StatusCode sc = AthAlgTool::initialize();
72 if (sc.isFailure()) return sc;
73
74 ATH_MSG_INFO("BLMBuilder initialize() successful in " << name());
75 return StatusCode::SUCCESS;
76}
77
78//================ Finalisation =================================================
79
81{
82 StatusCode sc = AthAlgTool::finalize();
83 return sc;
84}
85
86//================ Actual Work =================================================
87
88StatusCode InDetDD::BLM_Builder::build(GeoVPhysVol* pv)
89{
90 if(!m_blmon) {
91 ATH_MSG_INFO("BLM disabled.");
92 return StatusCode::SUCCESS;
93 }
94
95 // Unfortunately add is not part of the abstract interface of GeoVPhysVol so we have to dynamic cast
96 // to the concrete class.
97 GeoFullPhysVol* Phys = dynamic_cast<GeoFullPhysVol *>(pv);
98 if (!Phys) {
99 ATH_MSG_ERROR("Parent volume is not a GeoFullPhysVol as expected.");
100 return StatusCode::FAILURE;
101 }
102
103 StoredMaterialManager * materialManager{nullptr};
104 ATH_CHECK(detStore()->retrieve(materialManager, std::string("MATERIALS")));
105
106 //create geometry manager
107 std::unique_ptr<BLM_GeometryManager> manager = std::make_unique<BLM_GeometryManager>();
108
109 StatusCode sc;
111 {
112 DecodeVersionKey versionKey("InnerDetector");
113
114 // Issue error if AUTO.
115 if (versionKey.tag() == "AUTO") {
116 ATH_MSG_ERROR("AUTO Atlas version. Please select a version.");
117 return StatusCode::FAILURE;
118 }
119
120 ATH_MSG_INFO("Building BLM with Version Tag: "<< versionKey.tag() << " at Node: " << versionKey.node());
121 SmartIF<IRDBAccessSvc> accessSvc{Gaudi::svcLocator()->service("RDBAccessSvc")};
122 ATH_CHECK(accessSvc.isValid());
123
124 // Print the BLM version tag:
125 std::string BLMVersionTag;
126 BLMVersionTag = accessSvc->getChildTag("BLM", versionKey.tag(), versionKey.node());
127 ATH_MSG_INFO("BLM Version: " << BLMVersionTag);
128
129 // Check if version is empty. If so, then the BLM cannot be built. This may or may not be intentional. We just issue an INFO message.
130 if (BLMVersionTag.empty()) {
131 ATH_MSG_INFO("No BLM Version. BLM will not be built.");
132 return StatusCode::SUCCESS;
133 }
134
135 IRDBRecordset_ptr DBmodul = accessSvc->getRecordsetPtr("BLMModule", versionKey.tag(), versionKey.node());
136 ATH_MSG_DEBUG(" --> Number of records fetched = " << DBmodul->size());
137
138 //loop over all the records and putting them in module_property
139
140 unsigned int ind;
141 long moduleNo;
142 for(ind = 0; ind < DBmodul->size(); ind++)
143 {
144 const IRDBRecord* rec = (*DBmodul)[ind];
145 moduleNo = rec->getLong("MODULE_ID");
146
147 //check if this module is suposed to be builded
148 unsigned int mask = (1 << moduleNo);
149 if((mask & m_moduleon) != mask) {
150 //this module is not sopoused to be built
151 continue;
152 }
153
154 std::vector<double> module_property;
155 module_property.push_back(rec->getFloat("Z"));
156 module_property.push_back(rec->getFloat("R"));
157 module_property.push_back(rec->getFloat("PHI"));
158 module_property.push_back(rec->getFloat("ROT_X"));
159 module_property.push_back(rec->getFloat("ROT_Y"));
160 module_property.push_back(rec->getFloat("ROT_Z"));
161 module_property.push_back(rec->getFloat("DIAM_X"));
162 module_property.push_back(rec->getFloat("DIAM_Y"));
163 module_property.push_back(rec->getFloat("DIAM_Z"));
164
165 //set the BCM_GeometryManeger
166 manager->ModuleOn(moduleNo);
167 manager->Module(moduleNo)->Set(moduleNo, &module_property);
168 }
169 ATH_MSG_DEBUG(" --> Number succesfully read from DB");
170 }
171 else
172 {
173 ATH_MSG_DEBUG(" --> BLM parameters via jobOptions or default");
174 //parameters via jobOptions
175 int moduleNo;
176 const std::vector<double>* module_property = nullptr;
177 for(moduleNo = 0; moduleNo < 12; moduleNo++)
178 {
179 unsigned int mask = (1 << moduleNo);
180 if((mask & m_moduleon) != mask)
181 {
182 //this module is not sopoused to be built
183 continue;
184 }
185 if(moduleNo == 0) module_property = &m_module0;
186 else if(moduleNo == 1) module_property = &m_moduleI;
187 else if(moduleNo == 2) module_property = &m_moduleII;
188 else if(moduleNo == 3) module_property = &m_moduleIII;
189 else if(moduleNo == 4) module_property = &m_moduleIV;
190 else if(moduleNo == 5) module_property = &m_moduleV;
191 else if(moduleNo == 6) module_property = &m_moduleVI;
192 else if(moduleNo == 7) module_property = &m_moduleVII;
193 else if(moduleNo == 8) module_property = &m_moduleVIII;
194 else if(moduleNo == 9) module_property = &m_moduleIX;
195 else if(moduleNo == 10) module_property = &m_moduleX;
196 else if(moduleNo == 11) module_property = &m_moduleXI;
197
198 //set the BLM_GeometryManeger
199 manager->ModuleOn(moduleNo);
200 if (module_property){
201 manager->Module(moduleNo)->Set(moduleNo, module_property);
202 } else {
203 ATH_MSG_ERROR("module_property is null in BLM_Builder.cxx");
204 }
205 }
206 }
207
208 //we are now adding eight BLM modules
209 BLM_Module blm;
210
211 for(int i=0; i<12; i++)
212 {
213 //see if this module is to be built
214 if(!(manager->IsModuleOn(i)))
215 continue;
216
217 //the module should be build
218 BLM_ModuleParameters* parameters = manager->Module(i);
219
220 //setting transformation
221 GeoTrf::Translation3D pos(parameters->R()*cos(parameters->Phi()*Gaudi::Units::deg), parameters->R()*sin(parameters->Phi()*Gaudi::Units::deg), parameters->Z());
222 GeoTrf::Transform3D rm = GeoTrf::RotateZ3D(parameters->Rotation_Z()*Gaudi::Units::deg)
223 * GeoTrf::RotateY3D(parameters->Rotation_Y()*Gaudi::Units::deg)
224 * GeoTrf::RotateX3D(parameters->Rotation_X()*Gaudi::Units::deg);
225 GeoIntrusivePtr<GeoTransform> xform{new GeoTransform(GeoTrf::Transform3D(pos*rm))};
226 //building module
227 int k=i+222;
228
229 GeoIntrusivePtr<GeoNameTag> tag{new GeoNameTag("BLM Module")};
230 if (materialManager){
231 GeoVPhysVol* blmModPhys = blm.Build(materialManager, parameters, (msgLvl(MSG::INFO) ? &msg(MSG::INFO) : nullptr));
232 Phys->add(tag);
233 Phys->add(new GeoIdentifierTag(k));
234 Phys->add(xform);
235 Phys->add(blmModPhys);
236 ATH_MSG_DEBUG(" --> BUILD MODULE: " << i);
237 }
238 }
239
240 //save Geometry_manager in storegate
241 ATH_MSG_DEBUG("Registering BLM_GeometryManager.");
242 ATH_CHECK(detStore()->record(std::move(manager), "BLMParameters"));
243
244 return StatusCode::SUCCESS;
245}
246
247// Register callback function on ConDB object
248// Empty for now
250{
251 return StatusCode::SUCCESS;
252}
253
254// Callback function itself
255// Empty for now
257{
258 // Return Failure since no function has been registered
259 return StatusCode::FAILURE;
260}
261
262//============================================================================================
263
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
#define IOVSVC_CALLBACK_ARGS
short hand for IOVSvc call back argument list, to be used when no access to formal arguments is neede...
Definition IOVSvcDefs.h:24
Definition of the abstract IRDBAccessSvc interface.
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of the abstract IRDBRecord interface.
Definition of the abstract IRDBRecordset interface.
static Double_t sc
Beam Loss Monitor module parameters.
Beam Loss Monitor module builder.
Definition BLM_Module.h:22
GeoPhysVol * Build(StoredMaterialManager *mat_mgr, const BLM_ModuleParameters *parameters, MsgStream *msg)
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
const std::string & tag() const
Return version tag.
const std::string & node() const
Return the version node.
IRDBRecord is one record in the IRDBRecordset object.
Definition IRDBRecord.h:27
virtual long getLong(const std::string &fieldName) const =0
Get long field value.
virtual float getFloat(const std::string &fieldName) const =0
Get float field value.
virtual unsigned int size() const =0
std::vector< double > m_moduleII
Definition BLM_Builder.h:50
std::vector< double > m_moduleIII
Definition BLM_Builder.h:51
virtual StatusCode initialize() override
standard Athena-Algorithm method
virtual StatusCode finalize() override
standard Athena-Algorithm method
std::vector< double > m_moduleIX
Definition BLM_Builder.h:57
virtual StatusCode registerCallback(StoreGateSvc *detStore) override
For alignment.
std::vector< double > m_moduleV
Definition BLM_Builder.h:53
virtual StatusCode align(IOVSVC_CALLBACK_ARGS) override
std::vector< double > m_moduleVII
Definition BLM_Builder.h:55
unsigned int m_moduleon
Definition BLM_Builder.h:60
std::vector< double > m_moduleVIII
Definition BLM_Builder.h:56
std::vector< double > m_module0
member variables for algorithm properties:
Definition BLM_Builder.h:48
std::vector< double > m_moduleXI
Definition BLM_Builder.h:59
BLM_Builder(const std::string &, const std::string &, const IInterface *)
std::vector< double > m_moduleIV
Definition BLM_Builder.h:52
std::vector< double > m_moduleI
Definition BLM_Builder.h:49
virtual StatusCode build(GeoVPhysVol *parent) override
build the BCM geometry
std::vector< double > m_moduleX
Definition BLM_Builder.h:58
std::vector< double > m_moduleVI
Definition BLM_Builder.h:54
The Athena Transient Store API.
This class holds one or more material managers and makes them storeable, under StoreGate.
MsgStream & msg
Definition testRead.cxx:32