12 #include "G4LogicalVolume.hh" 13 #include "G4Material.hh" 14 #include "G4PVPlacement.hh" 15 #include "G4ReflectionFactory.hh" 18 #include "G4VPhysicalVolume.hh" 19 #include "G4VSolid.hh" 21 #include "G4SystemOfUnits.hh" 22 #include "G4UnitsTable.hh" 40 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder::convertLV(): DDLogicalPart = " << part <<
"\n";
45 result =
new G4LogicalVolume(g4s, g4m, part.
name().
name());
49 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder::convertLV(): new G4LogicalVolume " << part.
name().
name()
50 <<
"\nDDG4Builder: newEvent: dd=" << part.
ddname() <<
" g4=" << result->GetName()
67 LogDebug(
"SimG4CoreGeometry") <<
"DDDetConstr::ConvertMaterial: material=" << material <<
"\n";
68 G4Material *
result =
nullptr;
71 if ((result =
mats_[material])) {
72 LogDebug(
"SimG4CoreGeometry") <<
" is already converted" 79 <<
" is not valid (in the DDD sense!)";
81 " material is not valid from the Detector Description: " + material.
toString());
86 LogDebug(
"SimG4CoreGeometry") <<
" creating a G4-composite material. c=" << c
87 <<
" d=" << material.
density() /
g * mole <<
"\n";
89 for (
int i = 0;
i <
c; ++
i) {
91 LogDebug(
"SimG4CoreGeometry") <<
" adding the composite=" << material.
name()
98 LogDebug(
"SimG4CoreGeometry") <<
" building an elementary material" 99 <<
" z=" << material.
z() <<
" a=" << material.
a() /
g * mole
100 <<
" d=" << material.
density() /
g * cm3 <<
"\n";
101 result =
new G4Material(material.
name().
name(), material.
z(), material.
a(), material.
density());
108 G4ReflectionFactory *refFact = G4ReflectionFactory::Instance();
109 refFact->SetScalePrecision(100. * refFact->GetScalePrecision());
118 for (; git != gend; ++git) {
121 edm::LogError(
"SimG4CoreGeometry") <<
"DDG4Builder::BuildGeometry() has encountered an undefined " 122 "DDLogicalPart named " 125 " DDG4Builder::BuildGeometry() has encountered an " 126 "undefined DDLogicalPart named " +
133 Graph::edge_list::const_iterator cit = git->begin();
134 Graph::edge_list::const_iterator cend = git->end();
135 for (; cit != cend; ++cit) {
139 std::string err =
" DDG4Builder::BuildGeometry() in processing \"children\" has ";
140 err +=
"encountered an undefined DDLogicalPart named " + ddcurLP.
toString() +
" is a child of " +
149 rm.GetComponents(x, y, z);
150 if ((x.Cross(y)).Dot(z) < 0)
152 <<
">>Reflection encountered: " << gra.edgeData(cit->second)->ddrot()
153 <<
">>Placement d=" << gra.nodeData(cit->first).ddname() <<
" m=" << ddLP.
ddname()
154 <<
" cp=" << gra.edgeData(cit->second)->copyno() <<
" r=" << gra.edgeData(cit->second)->ddrot().ddname();
155 G4ThreeVector tempTran(gra.edgeData(cit->second)->trans().X(),
156 gra.edgeData(cit->second)->trans().Y(),
157 gra.edgeData(cit->second)->trans().Z());
158 G4Translate3D transl = tempTran;
159 CLHEP::HepRep3x3
temp(x.X(), x.Y(), x.Z(), y.X(), y.Y(), y.Z(), z.X(), z.Y(), z.Z());
160 CLHEP::HepRotation
hr(
temp);
163 G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse());
165 refFact->Place(trfrm,
166 gra.nodeData(cit->first).name().name(),
170 gra.edgeData(cit->second)->copyno() + offset +
tag,
178 std::map<DDLogicalPart, G4LogicalVolume *>::const_iterator ddg4_it =
logs_.begin();
179 for (; ddg4_it !=
logs_.end(); ++ddg4_it) {
180 G4LogicalVolume *reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
181 if (reflLogicalVolume) {
187 <<
" g4=" << reflLogicalVolume->GetName();
205 bool foundIt =
false;
206 for (
auto stype : result) {
213 if (temp.size() != 1) {
214 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " << ss;
216 " DDG4Builder::getInt() Problem with Region tags - " 217 "one and only one allowed: " +
228 bool foundIt =
false;
229 for (
auto stype : result) {
236 if (temp.size() != 1) {
237 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " << ss;
239 " DDG4Builder::getDouble() Problem with Region tags " 240 "- one and only one allowed: " +
245 std::istringstream is(temp[0]);
247 v = v * G4UnitDefinition::GetValueOf(unit.substr(1, unit.size()));
double a() const
returns the atomic mass
std::map< DDLogicalPart, G4LogicalVolume * > logs_
std::vector< DDG4Dispatchable * > DDG4DispContainer
def_type isDefined() const
G4LogicalVolume * convertLV(const DDLogicalPart &dLogical)
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
std::vector< double >::size_type index_type
double getDouble(const std::string &s, const DDLogicalPart &dLogical)
DDMaterial is used to define and access material information.
const DDCompactView * compactView
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
std::map< DDSolid, G4VSolid * > sols_
Compact representation of the geometrical detector hierarchy.
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
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
A DDSolid represents the shape of a part.
std::vector< const DDsvalues_type * > specifics(void) const
returns the specific-data attached to the LogicalPart only (not to a DDExpandedNode) ...
double z() const
retruns the atomic number
G4Material * convertMaterial(const DDMaterial &dMaterial)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
A DD Translation is currently implemented with Root Vector3D.
std::map< DDMaterial, G4Material * > mats_
FractionV::value_type constituent(int i) const
returns the i-th compound material and its fraction-mass
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Graph::const_adj_iterator adjl_iterator
const std::vector< std::string > & strings() const
a reference to the std::string-valued values stored in the given instance of DDValue ...
static DDG4DispContainer * theVectorOfDDG4Dispatchables()
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
std::string toString() const
double density() const
returns the density
DDG4SolidConverter * solidConverter_
G4VSolid * convert(const DDSolid &)
SensitiveDetectorCatalog upDate(const DDG4DispContainer &ddg4s)
int noOfConstituents() const
returns the number of compound materials or 0 for elementary materials
DDGeometryReturnType BuildGeometry()
G4VSolid * convertSolid(const DDSolid &dSolid)
DDG4Builder(const DDCompactView *, bool check=false)
const DDLogicalPart & root() const
returns the DDLogicalPart representing the root of the geometrical hierarchy
math::Graph< DDLogicalPart, DDPosData * > Graph
adj_list::const_iterator const_adj_iterator
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
const std::string & name() const
Returns the name.
const DDMaterial & material(void) const
Returns a reference object of the material this LogicalPart is made of.
G4LogicalVolumeToDDLogicalPartMap map_
int getInt(const std::string &s, const DDLogicalPart &dLogical)