ATLAS Offline Software
DetectorGeometryBase.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Base class
7 
8 // Geant4 includes used in functions
9 #include "G4PVPlacement.hh"
10 #include "G4RotationMatrix.hh"
11 #include "G4LogicalVolumeStore.hh"
12 
13 DetectorGeometryBase::DetectorGeometryBase(const std::string& type, const std::string& name, const IInterface* parent)
14  : base_class(type,name,parent)
15 {
16 }
17 
18 // Athena method, called at initialization time
20 {
21  ATH_MSG_VERBOSE( name() << "::initialize(): starting." );
22  if(m_detectorName.empty())
23  {
24  m_detectorName = this->name();
25  // re-initialize m_detectorName in order to take the real detector name rather than the path to it
26  size_t ipos=m_detectorName.value().find_last_of('.');
27  size_t length=m_detectorName.value().size();
28  if (ipos<length)
29  {
30  ATH_MSG_VERBOSE( "m_detectorName: " << m_detectorName.value() << " needs to be reset.");
31  m_detectorName=m_detectorName.value().substr(ipos+1,length-ipos-1);
32  ATH_MSG_VERBOSE( "m_detectorName default value reset to " << m_detectorName.value());
33  }
34  }
35  ATH_MSG_DEBUG( name() << "::initialize() (Base class method): Detector name = " << m_detectorName.value() );
36  CHECK(m_notifierSvc.retrieve());
37 
38  // This fires initialize() for each of those tools
39  if (m_subDetTools.size())
40  {
41  ATH_MSG_DEBUG( name() << "::initialize(): Initializing list of " << m_subDetTools.size() << " detectors." );
42  CHECK( m_subDetTools.retrieve() );
43  }
44  else
45  {
46  ATH_MSG_DEBUG( name() << "::initialize(): no sub-detectors to initialize." );
47  }
48 
49  ATH_MSG_VERBOSE( name() << "::initialize(): finished." );
50  return StatusCode::SUCCESS;
51 }
52 
54 {
55  ATH_MSG_VERBOSE( name() << "::Build() (Base class method): Starting. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
56 
57  SetEnvelope();
58  ATH_MSG_VERBOSE( name() << "::Build() - Envelope set. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
59 
60  m_notifierSvc->SetCurrentDetectorName(m_detectorName.value());
61  BuildGeometry();
62  ATH_MSG_VERBOSE( name() << "::Build() - Geometry built. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
63 
65  ATH_MSG_VERBOSE( name() << "::Build() - Volume moved around. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
66 
68  ATH_MSG_VERBOSE( name() << "::Build() - Connected with parent. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
69 
71  ATH_MSG_VERBOSE( name() << "::Build() (Base class method): Finished. Number of registered volumes "<<G4LogicalVolumeStore::GetInstance()->size() );
72  return;
73 }
74 
76 {
77  ATH_MSG_VERBOSE( "DetectorGeometryBase::BuildGeometry(): Using base-class method. Anything going wrong?");
78 }
79 
81 {
82  ATH_MSG_VERBOSE( name() << "::SetRotationAndOffset() (Base class method)");
83  // Firstly do the rotation
85  {
86  // m_envelope.theRotation is null, so create an identity
87  // rotation first.
88  // FIXME probably a neater way to do this part.
89  m_envelope.theRotation=new G4RotationMatrix;
90  // add the extra rotations.
95  {
96  // Override the rotation for m_envelope.thePositionedVolume.
98  }
99  }
100  else
101  {
102  // m_envelope.theRotation already exists, so just add the
103  // extra rotations.
104  m_envelope.theRotation->rotateX(m_rotateX);
105  m_envelope.theRotation->rotateY(m_rotateY);
106  m_envelope.theRotation->rotateZ(m_rotateZ);
107  }
108  // Secondly add the additional position offset to the existing
109  // m_envelope.thePosition vector.
112  {
113  // Override the translation for m_envelope.thePositionedVolume.
115  }
116 
117  ATH_MSG_VERBOSE( name() << "::SetRotationAndOffset() (Base class method): Finished" );
118  return;
119 }
121 {
122  ATH_MSG_VERBOSE( name() << "::PositionInParent() (Base class method)");
123  if (m_isWorld)
124  {
125  // check that the detector is built
126  if (m_envelope.IsBuilt())
127  {
128  G4VPhysicalVolume* physWorld= new G4PVPlacement(0,G4ThreeVector(),
129  m_envelope.theEnvelope,m_envelope.theEnvelope->GetName(),0,false,0,false);
131  }
132  }
133  else
134  {
135  // check that there is a parent
136  if (!m_theParent)
137  {
138  ATH_MSG_ERROR("Parent not set for "<<m_detectorName.value()<<"!!!!!!!!!!");
139  }
140  else
141  {
143  {
144  // G4VPhysicalVolume *physVol = new G4PVPlacement(0,G4ThreeVector(),
145  // m_envelope.theEnvelope,m_envelope.theEnvelope->GetName(),m_theParent->GetEnvelope().theEnvelope,false,0,false);
146  // TODO: implement a possible rotation/displacement - something like this based on the old code?
147  G4VPhysicalVolume *physVol = new G4PVPlacement(m_envelope.theRotation,m_envelope.thePosition,
150  }
151  }
152  }
153 }
154 
156 {
157  ATH_MSG_VERBOSE( name() << "::BuildSubDetectors() (Base class method): Starting");
158  for (auto& subDetTool: m_subDetTools)
159  {
160  ATH_MSG_VERBOSE(name() << "::BuildSubDetectors() (Base class method): Positioning "<<subDetTool->GetDetectorName()<<" within "<<m_detectorName.value());
161  subDetTool->SetParent(this);
162  subDetTool->Build();
163  }
164  ATH_MSG_VERBOSE( name() << "::BuildSubDetectors() (Base class method): Finished");
165 }
166 
168 {
169 }
170 
172 {
173 }
174 
175 void DetectorGeometryBase::SetDetectorName(const std::string& s)
176 {
178 }
179 
181 {
182  return m_detectorName.value();
183 }
184 
186 {
187  m_isWorld=true;
188 }
189 
191 {
192  m_theParent=p;
193 }
194 
196 {
197  return m_envelope;
198 }
199 
201 {
202  if (m_isWorld)
204  else
205  {
206  ATH_MSG_ERROR("trying to get World from a DetectorTool which World is not!");
207  return 0;
208  }
209 }
Envelope
Definition: IDetectorGeometryTool.h:17
DetectorGeometryBase::SetEnvelope
virtual void SetEnvelope() override
Definition: DetectorGeometryBase.cxx:167
DetectorGeometryBase::m_rotateX
Gaudi::Property< double > m_rotateX
Definition: DetectorGeometryBase.h:73
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
Envelope::thePositionedVolume
G4VPhysicalVolume * thePositionedVolume
Definition: IDetectorGeometryTool.h:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
DetectorGeometryBase::GetDetectorName
std::string GetDetectorName() const override
Definition: DetectorGeometryBase.cxx:180
Envelope::IsBuilt
bool IsBuilt()
Definition: IDetectorGeometryTool.h:19
Envelope::theEnvelope
G4LogicalVolume * theEnvelope
Definition: IDetectorGeometryTool.h:20
DetectorGeometryBase::m_rotateZ
Gaudi::Property< double > m_rotateZ
Definition: DetectorGeometryBase.h:75
DetectorGeometryBase::BuildGeometry
virtual void BuildGeometry() override
Definition: DetectorGeometryBase.cxx:75
DetectorGeometryBase::SetDetectorName
void SetDetectorName(const std::string &) override
Definition: DetectorGeometryBase.cxx:175
DetectorGeometryBase::m_subDetTools
ToolHandleArray< IDetectorGeometryTool > m_subDetTools
Definition: DetectorGeometryBase.h:64
DetectorGeometryBase::initialize
StatusCode initialize() override
Athena method.
Definition: DetectorGeometryBase.cxx:19
DetectorGeometryBase::Build
virtual void Build() override
purely virtual methods being implemented here
Definition: DetectorGeometryBase.cxx:53
DetectorGeometryBase::m_isWorld
bool m_isWorld
Definition: DetectorGeometryBase.h:72
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
DetectorGeometryBase::SetRotationAndOffset
virtual void SetRotationAndOffset()
Definition: DetectorGeometryBase.cxx:80
DetectorGeometryBase::GetEnvelope
Envelope & GetEnvelope() override final
Definition: DetectorGeometryBase.cxx:195
DetectorGeometryBase::m_offsetZ
Gaudi::Property< double > m_offsetZ
Definition: DetectorGeometryBase.h:78
DetectorGeometryBase::SetAsWorld
virtual void SetAsWorld() override
Definition: DetectorGeometryBase.cxx:185
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
DetectorGeometryBase::GetWorldVolume
G4VPhysicalVolume * GetWorldVolume() override final
Definition: DetectorGeometryBase.cxx:200
DetectorGeometryBase::m_offsetY
Gaudi::Property< double > m_offsetY
Definition: DetectorGeometryBase.h:77
DetectorGeometryBase::SetParent
void SetParent(IDetectorGeometryTool *) override
Definition: DetectorGeometryBase.cxx:190
DetectorGeometryBase::m_offsetX
Gaudi::Property< double > m_offsetX
Definition: DetectorGeometryBase.h:76
Envelope::thePosition
G4ThreeVector thePosition
Definition: IDetectorGeometryTool.h:23
DetectorGeometryBase::ResetEnvelope
virtual void ResetEnvelope() override
Definition: DetectorGeometryBase.cxx:171
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
IDetectorGeometryTool
Definition: IDetectorGeometryTool.h:34
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
test_pyathena.parent
parent
Definition: test_pyathena.py:15
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
DetectorGeometryBase::DetectorGeometryBase
DetectorGeometryBase(const std::string &type, const std::string &name, const IInterface *parent)
Definition: DetectorGeometryBase.cxx:13
DetectorGeometryBase::m_notifierSvc
ServiceHandle< IG4GeometryNotifierSvc > m_notifierSvc
Definition: DetectorGeometryBase.h:66
DetectorGeometryBase.h
IDetectorGeometryTool::GetEnvelope
virtual Envelope & GetEnvelope()=0
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
DetectorGeometryBase::m_envelope
Envelope m_envelope
Definition: DetectorGeometryBase.h:70
DetectorGeometryBase::PositionInParent
virtual void PositionInParent() override
Definition: DetectorGeometryBase.cxx:120
DetectorGeometryBase::m_detectorName
Gaudi::Property< std::string > m_detectorName
Definition: DetectorGeometryBase.h:71
DetectorGeometryBase::BuildSubDetectors
virtual void BuildSubDetectors() override
Definition: DetectorGeometryBase.cxx:155
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Envelope::theRotation
G4RotationMatrix * theRotation
Definition: IDetectorGeometryTool.h:22
DetectorGeometryBase::m_rotateY
Gaudi::Property< double > m_rotateY
Definition: DetectorGeometryBase.h:74
DetectorGeometryBase::m_theParent
IDetectorGeometryTool * m_theParent
Definition: DetectorGeometryBase.h:68
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26