|
|
Go to the documentation of this file.
11 #include "G4LogicalVolume.hh"
12 #include "G4Material.hh"
13 #include "G4PVPlacement.hh"
14 #include "G4ReflectionFactory.hh"
15 #include "G4VPhysicalVolume.hh"
16 #include "G4VSolid.hh"
18 #include "G4SystemOfUnits.hh"
19 #include "G4UnitsTable.hh"
38 result =
new G4LogicalVolume(g4s, g4m,
part.name().name());
43 <<
"DDG4Builder::convertLV(): new G4LogicalVolume " <<
part.name().name()
44 <<
"\nDDG4Builder: newEvent: dd=" <<
part.ddname() <<
" g4=" <<
result->GetName();
60 edm::LogVerbatim(
"SimG4CoreGeometry") <<
"DDDetConstr::ConvertMaterial: material=" << material;
61 G4Material *
result =
nullptr;
71 " material is not valid from the Detector Description: " + material.
toString());
77 <<
" creating a G4-composite material. c=" <<
c <<
" d=" << material.
density() /
CLHEP::g * CLHEP::mole;
79 for (
int i = 0;
i <
c; ++
i) {
82 <<
" adding the composite=" << material.
name() <<
" fm=" << material.
constituent(
i).second;
89 <<
" z=" << material.
z() <<
" a=" << material.
a() /
CLHEP::g * CLHEP::mole
98 G4ReflectionFactory *refFact = G4ReflectionFactory::Instance();
99 refFact->SetScalePrecision(100. * refFact->GetScalePrecision());
108 for (; git != gend; ++git) {
112 " DDG4Builder::BuildGeometry() has encountered an "
113 "undefined DDLogicalPart named " +
120 Graph::edge_list::const_iterator cit = git->begin();
121 Graph::edge_list::const_iterator cend = git->end();
122 for (; cit != cend; ++cit) {
126 std::string err =
" DDG4Builder::BuildGeometry() in processing \"children\" has ";
127 err +=
"encountered an undefined DDLogicalPart named " + ddcurLP.
toString() +
" is a child of " +
135 rm.GetComponents(
x,
y,
z);
136 if ((
x.Cross(
y)).Dot(
z) < 0)
138 <<
"DDG4Builder: Reflection: " << gra.edgeData(cit->second)->ddrot()
139 <<
">>Placement d=" << gra.nodeData(cit->first).ddname() <<
" m=" << ddLP.
ddname()
140 <<
" cp=" << gra.edgeData(cit->second)->copyno() <<
" r=" << gra.edgeData(cit->second)->ddrot().ddname();
141 G4ThreeVector tempTran(gra.edgeData(cit->second)->trans().X(),
142 gra.edgeData(cit->second)->trans().Y(),
143 gra.edgeData(cit->second)->trans().Z());
144 G4Translate3D transl = tempTran;
145 CLHEP::HepRep3x3
temp(
x.X(),
x.Y(),
x.Z(),
y.X(),
y.Y(),
y.Z(),
z.X(),
z.Y(),
z.Z());
146 CLHEP::HepRotation hr(
temp);
148 <<
"Position " << gra.nodeData(cit->first).name().name() <<
":"
149 << gra.edgeData(cit->second)->copyno() +
offset +
tag <<
" in " << g4LV->GetName() <<
" at " << tempTran
150 <<
" with rotation matrix (" <<
x.X() <<
", " <<
x.Y() <<
", " <<
x.Z() <<
", " <<
y.X() <<
", " <<
y.Y()
151 <<
", " <<
y.Z() <<
", " <<
z.X() <<
", " <<
z.Y() <<
", " <<
z.Z() <<
")";
154 G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse());
156 refFact->Place(trfrm,
157 gra.nodeData(cit->first).name().name(),
161 gra.edgeData(cit->second)->copyno() +
offset +
tag,
169 std::map<DDLogicalPart, G4LogicalVolume *>::const_iterator ddg4_it =
logs_.begin();
170 for (; ddg4_it !=
logs_.end(); ++ddg4_it) {
171 G4LogicalVolume *reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
172 if (reflLogicalVolume) {
178 <<
"DDG4Builder: dd=" << ddlv.
ddname() <<
" g4=" << reflLogicalVolume->GetName();
195 std::vector<const DDsvalues_type *>
result =
part.specifics();
196 bool foundIt =
false;
197 for (
auto stype :
result) {
203 std::vector<double>
temp =
val.doubles();
204 if (
temp.size() != 1) {
206 " DDG4Builder::getInt() Problem with Region tags - "
207 "one and only one allowed: " +
217 std::vector<const DDsvalues_type *>
result =
part.specifics();
218 bool foundIt =
false;
219 for (
auto stype :
result) {
225 std::vector<std::string>
temp =
val.strings();
226 if (
temp.size() != 1) {
228 " DDG4Builder::getDouble() Problem with Region tags "
229 "- one and only one allowed: " +
234 std::istringstream is(
temp[0]);
236 v =
v * G4UnitDefinition::GetValueOf(
unit.substr(1,
unit.size()));
int getInt(const std::string &s, const DDLogicalPart &dLogical)
std::map< DDLogicalPart, G4LogicalVolume * > logs_
double getDouble(const std::string &s, const DDLogicalPart &dLogical)
G4LogicalVolume * convertLV(const DDLogicalPart &dLogical)
std::vector< DDG4Dispatchable * > DDG4DispContainer
DDG4DispContainer * theVectorOfDDG4Dispatchables_
def_type isDefined() const
double density() const
returns the density
double z() const
retruns the atomic number
int noOfConstituents() const
returns the number of compound materials or 0 for elementary materials
FractionV::value_type constituent(int i) const
returns the i-th compound material and its fraction-mass
G4LogicalVolumeToDDLogicalPartMap & map_
const DDCompactView * compactView_
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
DDMaterial is used to define and access material information.
G4LogicalVolume * BuildGeometry(SensitiveDetectorCatalog &)
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
std::string toString() const
Graph::const_adj_iterator adjl_iterator
Compact representation of the geometrical detector hierarchy.
std::map< DDSolid, G4VSolid * > sols_
double a() const
returns the atomic mass
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
DDG4Builder(const DDCompactView *, G4LogicalVolumeToDDLogicalPartMap &, bool check)
math::Graph< DDLogicalPart, DDPosData * > Graph
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
DDG4SolidConverter * solidConverter_
G4Material * convertMaterial(const DDMaterial &dMaterial)
A DDLogicalPart aggregates information concerning material, solid and sensitveness ....
std::map< DDMaterial, G4Material * > mats_
const std::string & name() const
Returns the name.
Basic3DVector unit() const
const DDLogicalPart & root() const
returns the DDLogicalPart representing the root of the geometrical hierarchy
G4VSolid * convertSolid(const DDSolid &dSolid)
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
G4VSolid * convert(const DDSolid &)
std::vector< double >::size_type index_type
Log< level::Info, true > LogVerbatim
A DDSolid represents the shape of a part.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
adj_list::const_iterator const_adj_iterator