ATLAS Offline Software
BCM_Builder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 
9 #include "GeoModelKernel/GeoFullPhysVol.h"
10 #include "GeoModelKernel/GeoTransform.h"
11 #include "GeoModelKernel/GeoNameTag.h"
12 #include "GeoModelKernel/GeoIdentifierTag.h"
13 
16 
20 
21 #include "GaudiKernel/SystemOfUnits.h"
22 
23 //================ Constructor =================================================
24 
26  const std::string& n,
27  const IInterface* p )
28  :
29  base_class(t,n,p)
30 {
31 
32  //default settings
33  // TRANS_X TRANS_Y TRANS_Z ROT_X ROT_Y ROT_Z DIMENSION_Z DIAM_TRANS_Y DIAM_TRANS_Z DIAM_DIAM_X DIAM_DIAM_Y DIAM_DIAM_Z LAMEL_OFFSET_H LAMEL_OFFSET_I LAMEL_OFFSET_J
34  m_module0.push_back(95.744); m_module0.push_back(0); m_module0.push_back(1882.4); m_module0.push_back(0); m_module0.push_back(45); m_module0.push_back(0); m_module0.push_back(0.4); m_module0.push_back(0); m_module0.push_back(-59.785); m_module0.push_back(0.2); m_module0.push_back(0); m_module0.push_back(-0.4); m_module0.push_back(34.860); m_module0.push_back(29.509); m_module0.push_back(20.205); //F410
35  m_moduleI.push_back(0); m_moduleI.push_back(95.744); m_moduleI.push_back(1882.4); m_moduleI.push_back(0); m_moduleI.push_back(45); m_moduleI.push_back(90); m_moduleI.push_back(0.4); m_moduleI.push_back(0); m_moduleI.push_back(-59.785); m_moduleI.push_back(0.2); m_moduleI.push_back(0); m_moduleI.push_back(-0.4); m_moduleI.push_back(34.860); m_moduleI.push_back(29.509); m_moduleI.push_back(20.205); //F405
36  m_moduleII.push_back(-95.744); m_moduleII.push_back(0); m_moduleII.push_back(1882.4); m_moduleII.push_back(0); m_moduleII.push_back(45); m_moduleII.push_back(180); m_moduleII.push_back(0.4); m_moduleII.push_back(0); m_moduleII.push_back(-59.785); m_moduleII.push_back(0.2); m_moduleII.push_back(0); m_moduleII.push_back(-0.4); m_moduleII.push_back(34.860); m_moduleII.push_back(29.509); m_moduleII.push_back(20.205); //F413
37  m_moduleIII.push_back(0); m_moduleIII.push_back(-95.744); m_moduleIII.push_back(1882.4); m_moduleIII.push_back(0); m_moduleIII.push_back(45); m_moduleIII.push_back(270); m_moduleIII.push_back(0.4); m_moduleIII.push_back(0); m_moduleIII.push_back(-59.785); m_moduleIII.push_back(0.2); m_moduleIII.push_back(0); m_moduleIII.push_back(-0.4); m_moduleIII.push_back(34.860); m_moduleIII.push_back(29.509); m_moduleIII.push_back(20.205); //F404
38  m_moduleIV.push_back(95.744); m_moduleIV.push_back(0); m_moduleIV.push_back(-1882.4); m_moduleIV.push_back(180); m_moduleIV.push_back(-45); m_moduleIV.push_back(0); m_moduleIV.push_back(1.4); m_moduleIV.push_back(0); m_moduleIV.push_back(-59.785); m_moduleIV.push_back(0.2); m_moduleIV.push_back(0); m_moduleIV.push_back(-0.4); m_moduleIV.push_back(34.860); m_moduleIV.push_back(29.509); m_moduleIV.push_back(20.205); //F424
39  m_moduleV.push_back(0); m_moduleV.push_back(95.744); m_moduleV.push_back(-1882.4); m_moduleV.push_back(180); m_moduleV.push_back(-45); m_moduleV.push_back(90); m_moduleV.push_back(1.4); m_moduleV.push_back(0); m_moduleV.push_back(-59.785); m_moduleV.push_back(0.2); m_moduleV.push_back(0); m_moduleV.push_back(-0.4); m_moduleV.push_back(34.860); m_moduleV.push_back(29.509); m_moduleV.push_back(20.205); //F420
40  m_moduleVI.push_back(-95.744); m_moduleVI.push_back(0); m_moduleVI.push_back(-1882.4); m_moduleVI.push_back(180); m_moduleVI.push_back(-45); m_moduleVI.push_back(180); m_moduleVI.push_back(1.4); m_moduleVI.push_back(0); m_moduleVI.push_back(-59.785); m_moduleVI.push_back(0.2); m_moduleVI.push_back(0); m_moduleVI.push_back(-0.4); m_moduleVI.push_back(34.860); m_moduleVI.push_back(29.509); m_moduleVI.push_back(20.205); //F422
41  m_moduleVII.push_back(0); m_moduleVII.push_back(-95.744); m_moduleVII.push_back(-1882.4); m_moduleVII.push_back(180); m_moduleVII.push_back(-45); m_moduleVII.push_back(270); m_moduleVII.push_back(0.4); m_moduleVII.push_back(0); m_moduleVII.push_back(-59.785); m_moduleVII.push_back(0.2); m_moduleVII.push_back(0); m_moduleVII.push_back(-0.4); m_moduleVII.push_back(34.860); m_moduleVII.push_back(29.509); m_moduleVII.push_back(20.205); //F408
42 
43  // template for property decalration
44  declareProperty("Modul0", m_module0);
45  declareProperty("ModulI", m_moduleI);
46  declareProperty("ModulII", m_moduleII);
47  declareProperty("ModulIII", m_moduleIII);
48  declareProperty("ModulIV", m_moduleIV);
49  declareProperty("ModulV", m_moduleV);
50  declareProperty("ModulVI", m_moduleVI);
51  declareProperty("ModulVII", m_moduleVII);
52  declareProperty("ModulesOn", m_moduleon=255);
53  declareProperty("BCMon", m_bcmon=true);
54  declareProperty("DBparameters", m_BDparameters=true);
55 }
56 
57 //================ Initialisation =================================================
58 
60 {
61 
63  if (sc.isFailure()) return sc;
64 
65  ATH_MSG_INFO("BCMBuilder initialize() successful in " << name());
66  return StatusCode::SUCCESS;
67 }
68 
69 //================ Finalisation =================================================
70 
72 {
74  return sc;
75 }
76 
77 //================ Actual Work =================================================
78 
80 {
81  if(!m_bcmon) {
82  ATH_MSG_INFO("BCM disabled.");
83  return StatusCode::SUCCESS;
84  }
85 
86  // Unfortunately add is not part of the abstract interface of GeoVPhysVol so we have to dynamic cast
87  // to the concrete class.
88  GeoFullPhysVol* Phys = dynamic_cast<GeoFullPhysVol *>(pv);
89  if (!Phys) {
90  ATH_MSG_ERROR("Parent volume is not a GeoFullPhysVol as expected.");
91  return StatusCode::FAILURE;
92  }
93 
94 // ATH_MSG_INFO("BCMBuilder building..."); //commented out by D.Dobos on request by M.Elsing
95 
96  StoredMaterialManager * materialManager;
97  if (StatusCode::SUCCESS != detStore()->retrieve(materialManager, std::string("MATERIALS"))) {
98  ATH_MSG_ERROR("Failed to retrieve Material Manager");
99  return StatusCode::FAILURE;
100  }
101 
102  //create geometry manager
104 
105  StatusCode sc;
106 
107  if(m_BDparameters)
108  {
109  DecodeVersionKey versionKey("InnerDetector");
110 
111  // Issue error if AUTO.
112  if (versionKey.tag() == "AUTO")
113  {
114  ATH_MSG_ERROR("AUTO Atlas version. Please select a version.");
115  }
116 
117  ATH_MSG_INFO("Building BCM with Version Tag: " << versionKey.tag() << " at Node: " << versionKey.node());
118 
119  IRDBAccessSvc *accessSvc;
120  sc = service("RDBAccessSvc",accessSvc);
121  if (sc.isFailure())
122  {
123  ATH_MSG_FATAL("Could not locate RDBAccessSvc");
124  delete manager;
125  return StatusCode::FAILURE;
126  }
127 
128  // Print the BCM version tag:
129  std::string BCMVersionTag;
130  BCMVersionTag = accessSvc->getChildTag("BCM", versionKey.tag(), versionKey.node());
131  ATH_MSG_INFO("BCM Version: " << BCMVersionTag);
132 
133  // Check if version is empty. If so, then the BCM cannot be built. This may or may not be intentional. We just issue an INFO message.
134  if (BCMVersionTag.empty())
135  {
136  ATH_MSG_INFO("No BCM Version. BCM will not be built.");
137  delete manager;
138  return StatusCode::SUCCESS;
139  }
140 
141  IRDBRecordset_ptr DBmodul = accessSvc->getRecordsetPtr("BCMModule", versionKey.tag(), versionKey.node());
142  //DBmodul = accessSvc->getRecordset("BCMModule", "InnerDetector-DC3-Dev", "InnerDetector");
143 
144  ATH_MSG_DEBUG(" --> Number of records fetched = " << DBmodul->size());
145 
146  unsigned int ind;
147  long moduleNo;
148  //std::vector<double>* module_property = NULL;
149  for(ind = 0; ind < DBmodul->size(); ind++)
150  {
151  const IRDBRecord* rec = (*DBmodul)[ind];
152 
153  moduleNo = rec->getLong("MODULE_ID");
154  //check if this module is suposed to be builded
155 
156  unsigned int mask = (1 << moduleNo);
157  if((mask & m_moduleon) != mask)
158  {
159  //this module is not sopoused to be built
160  continue;
161  }
162 
163  std::vector<double> module_property;
164  module_property.push_back(rec->getFloat("TRANS_X"));
165  module_property.push_back(rec->getFloat("TRANS_Y"));
166  module_property.push_back(rec->getFloat("TRANS_Z"));
167  module_property.push_back(rec->getFloat("ROT_X"));
168  module_property.push_back(rec->getFloat("ROT_Y"));
169  module_property.push_back(rec->getFloat("ROT_Z"));
170  module_property.push_back(rec->getFloat("DIMESION_Z"));
171  module_property.push_back(rec->getFloat("DIAM_TRANS_Y"));
172  module_property.push_back(rec->getFloat("DIAM_TRANS_Z"));
173  module_property.push_back(rec->getFloat("DIAM_DIAM_X"));
174  module_property.push_back(rec->getFloat("DIAM_DAIM_Y"));
175  module_property.push_back(rec->getFloat("DIAM_DIAM_Z"));
176  module_property.push_back(rec->getFloat("OFF_H"));
177  module_property.push_back(rec->getFloat("OFF_I"));
178  module_property.push_back(rec->getFloat("OFF_J"));
179 
180  //set the BCM_GeometryManeger
181  manager->ModuleOn(moduleNo);
182  manager->Module(moduleNo)->Set(moduleNo, &module_property);
183  }
184  ATH_MSG_DEBUG(" --> Number succesfully read from DB");
185  }
186  else
187  {
188  //parameters via jobOptions
189  int moduleNo;
190  const std::vector<double>* module_property = nullptr;
191  for(moduleNo = 0; moduleNo < 8; moduleNo++)
192  {
193  unsigned int mask = (1 << moduleNo);
194  if((mask & m_moduleon) != mask)
195  {
196  //this module is not sopoused to be built
197  continue;
198  }
199  if(moduleNo == 0) module_property = &m_module0;
200  else if(moduleNo == 1) module_property = &m_moduleI;
201  else if(moduleNo == 2) module_property = &m_moduleII;
202  else if(moduleNo == 3) module_property = &m_moduleIII;
203  else if(moduleNo == 4) module_property = &m_moduleIV;
204  else if(moduleNo == 5) module_property = &m_moduleV;
205  else if(moduleNo == 6) module_property = &m_moduleVI;
206  else if(moduleNo == 7) module_property = &m_moduleVII;
207 
208  //set the BCM_GeometryManeger
209  manager->ModuleOn(moduleNo);
210  if (module_property){
211  manager->Module(moduleNo)->Set(moduleNo, module_property);
212  } else {
213  ATH_MSG_ERROR("module_property pointer is null in BCM_Builder.cxx");
214  }
215  }
216  }
217 
218  //we are now adding eight BCM modules
219  BCM_Module bcm;
220 
221  for(int i=0; i<8; i++)
222  {
223  //see if this module is to be built
224  if(!(manager->IsModuleOn(i)))
225  continue;
226 
227  //the module should be build
229 
230  //setting transformation
231  GeoTrf::Translation3D pos(parameters->Position_X(), parameters->Position_Y(), parameters->Position_Z());
232  GeoTrf::Transform3D rm = GeoTrf::RotateZ3D(parameters->Rotation_Z()*Gaudi::Units::deg)
233  * GeoTrf::RotateY3D(parameters->Rotation_Y()*Gaudi::Units::deg)
234  * GeoTrf::RotateX3D(parameters->Rotation_X()*Gaudi::Units::deg)
235  * GeoTrf::RotateZ3D(-90.*Gaudi::Units::deg)
236  * GeoTrf::RotateY3D(-90.*Gaudi::Units::deg);
237  GeoIntrusivePtr<GeoTransform> xform{new GeoTransform(GeoTrf::Transform3D(pos*rm))};
238  ATH_MSG_DEBUG(" --> Module " << i << " build!");
239 
240  //building module
241  int k=i+951;
242 
243  GeoIntrusivePtr<GeoNameTag> tag{new GeoNameTag("BCM Module")};
244  if (materialManager){
245  GeoVPhysVol* bcmModPhys = bcm.Build(materialManager, parameters, (msgLvl(MSG::INFO) ? &msg(MSG::INFO) : nullptr));
246  Phys->add(tag);
247  Phys->add(new GeoIdentifierTag(k));
248  Phys->add(xform);
249  Phys->add(bcmModPhys);
250  }
251  }
252 
253  ATH_MSG_DEBUG("Registering BCM_GeometryManager.");
254  sc = detStore()->record(manager, "BCMParameters");
255 
256  if (sc.isFailure())
257  {
258  ATH_MSG_ERROR("Could not register BCM_GeometryManager");
259  return StatusCode::FAILURE ;
260  }
261  return StatusCode::SUCCESS;
262 
263 }
264 
265 
266 // Register callback function on ConDB object
267 // Empty for now
269 {
270  return StatusCode::SUCCESS;
271 }
272 
273 // Callback function itself
274 // Empty for now
276 {
277  // Return Failure since no function has been registered
278  return StatusCode::FAILURE;
279 }
280 
281 
282 
283 //============================================================================================
284 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
InDetDD::BCM_Builder::m_moduleV
std::vector< double > m_moduleV
Definition: BCM_Builder.h:60
InDetDD::BCM_Builder::m_moduleVI
std::vector< double > m_moduleVI
Definition: BCM_Builder.h:61
InDetDD::BCM_Builder::m_bcmon
bool m_bcmon
Definition: BCM_Builder.h:64
InDetDD::BCM_Builder::m_BDparameters
bool m_BDparameters
Definition: BCM_Builder.h:65
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:53
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
IRDBAccessSvc::getRecordsetPtr
virtual IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
Provides access to the Recordset object containing HVS-tagged data.
initialize
void initialize()
Definition: run_EoverP.cxx:894
deg
#define deg
Definition: SbPolyhedron.cxx:17
InDetDD::BCM_Builder::build
virtual StatusCode build(GeoVPhysVol *parent)
build the BCM geometry
Definition: BCM_Builder.cxx:79
BCM_Module
Definition: BCM_Module.h:25
BCM_ModuleParameters
Definition: BCM_ModuleParameters.h:20
BCM_Module::Build
GeoPhysVol * Build(StoredMaterialManager *mat_mgr, const BCM_ModuleParameters *parameters, MsgStream *msg)
Definition: BCM_Module.cxx:18
DecodeVersionKey::node
const std::string & node() const
Return the version node.
Definition: DecodeVersionKey.cxx:99
BCM_GeometryManager
Definition: BCM_GeometryManager.h:20
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDetDD::BCM_Builder::m_moduleIV
std::vector< double > m_moduleIV
Definition: BCM_Builder.h:59
IOVSVC_CALLBACK_ARGS
#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
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:460
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
InDetDD::BCM_Builder::registerCallback
virtual StatusCode registerCallback(StoreGateSvc *detStore)
For alignment.
Definition: BCM_Builder.cxx:268
InDetDD::BCM_Builder::m_moduleII
std::vector< double > m_moduleII
Definition: BCM_Builder.h:57
InDetDD::BCM_Builder::m_moduleVII
std::vector< double > m_moduleVII
Definition: BCM_Builder.h:62
InDetDD::BCM_Builder::align
virtual StatusCode align(IOVSVC_CALLBACK_ARGS)
Definition: BCM_Builder.cxx:275
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
IRDBAccessSvc.h
Definition of the abstract IRDBAccessSvc interface.
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
BCM_GeometryManager.h
IRDBAccessSvc::getChildTag
virtual std::string getChildTag(const std::string &childNode, const std::string &parentTag, const std::string &parentNode, const std::string &connName="ATLASDD")=0
Gets the tag name for the node by giving its parent node tag.
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
IRDBAccessSvc
IRDBAccessSvc is an abstract interface to the athena service that provides the following functionalit...
Definition: IRDBAccessSvc.h:45
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
DecodeVersionKey
This is a helper class to query the version tags from GeoModelSvc and determine the appropriate tag a...
Definition: DecodeVersionKey.h:18
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
DecodeVersionKey::tag
const std::string & tag() const
Return version tag.
Definition: DecodeVersionKey.cxx:93
IRDBRecord::getLong
virtual long getLong(const std::string &fieldName) const =0
Get long field value.
InDetDD::BCM_Builder::finalize
virtual StatusCode finalize()
standard Athena-Algorithm method
Definition: BCM_Builder.cxx:71
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
InDetDD::BCM_Builder::m_module0
std::vector< double > m_module0
member variables for algorithm properties:
Definition: BCM_Builder.h:55
BCM_Builder.h
InDetDD::BCM_Builder::initialize
virtual StatusCode initialize()
standard Athena-Algorithm method
Definition: BCM_Builder.cxx:59
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
InDetDD::BCM_Builder::m_moduleI
std::vector< double > m_moduleI
Definition: BCM_Builder.h:56
InDetDD::BCM_Builder::m_moduleIII
std::vector< double > m_moduleIII
Definition: BCM_Builder.h:58
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
StoredMaterialManager.h
DecodeVersionKey.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
IRDBRecord.h
Definition of the abstract IRDBRecord interface.
IRDBRecord
IRDBRecord is one record in the IRDBRecordset object.
Definition: IRDBRecord.h:27
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
InDetDD::BCM_Builder::BCM_Builder
BCM_Builder(const std::string &, const std::string &, const IInterface *)
Definition: BCM_Builder.cxx:25
python.changerun.pv
pv
Definition: changerun.py:81
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
IRDBRecordset.h
Definition of the abstract IRDBRecordset interface.
InDetDD::BCM_Builder::m_moduleon
unsigned int m_moduleon
Definition: BCM_Builder.h:63
IRDBRecord::getFloat
virtual float getFloat(const std::string &fieldName) const =0
Get float field value.
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
BCM_Module.h
fitman.k
k
Definition: fitman.py:528