10 #include "G4VSolid.hh" 15 #include "G4Material.hh" 16 #include "G4LogicalVolume.hh" 17 #include "G4VPhysicalVolume.hh" 18 #include "G4PVPlacement.hh" 19 #include "G4ReflectionFactory.hh" 21 #include "G4UnitsTable.hh" 22 #include "G4SystemOfUnits.hh" 44 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder::convertLV(): DDLogicalPart = " << part <<
"\n";
49 result =
new G4LogicalVolume(s,m,part.
name().
name());
53 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder::convertLV(): new G4LogicalVolume " << part.
name().
name()
54 <<
"\nDDG4Builder: newEvent: dd=" << part.
ddname() <<
" g4=" << result->GetName() <<
"\n";
69 LogDebug(
"SimG4CoreGeometry") <<
"DDDetConstr::ConvertMaterial: material=" << material <<
"\n";
70 G4Material *
result =
nullptr;
73 if ((result =
mats_[material])) {
74 LogDebug(
"SimG4CoreGeometry") <<
" is already converted" <<
"\n";
78 edm::LogError(
"SimG4CoreGeometry") <<
"DDG4Builder:: material " << material.
toString() <<
" is not valid (in the DDD sense!)";
79 throw cms::Exception(
"SimG4CoreGeometry",
" material is not valid from the Detector Description: " + material.
toString());
84 LogDebug(
"SimG4CoreGeometry") <<
" creating a G4-composite material. c=" << c
85 <<
" d=" << material.
density()/
g*mole <<
"\n";
87 for (
int i=0 ;
i<
c; ++
i) {
89 LogDebug(
"SimG4CoreGeometry") <<
" adding the composite=" << material.
name()
97 LogDebug(
"SimG4CoreGeometry") <<
" building an elementary material" 98 <<
" z=" << material.
z()
99 <<
" a=" << material.
a()/
g*mole
100 <<
" d=" << material.
density()/
g*cm3 <<
"\n";
101 result =
new G4Material
109 G4ReflectionFactory * refFact = G4ReflectionFactory::Instance();
110 refFact->SetScalePrecision(100.*refFact->GetScalePrecision());
119 for (; git != gend; ++git) {
122 edm::LogError(
"SimG4CoreGeometry") <<
"DDG4Builder::BuildGeometry() has encountered an undefined DDLogicalPart named " << ddLP.
toString();
123 throw cms::Exception(
"SimG4CoreGeometry",
" DDG4Builder::BuildGeometry() has encountered an undefined DDLogicalPart named " + ddLP.
toString());
125 G4LogicalVolume * g4LV =
convertLV(ddLP);
129 Graph::edge_list::const_iterator cit = git->begin();
130 Graph::edge_list::const_iterator cend = git->end();
131 for (; cit != cend; ++cit) {
135 std::string err =
" DDG4Builder::BuildGeometry() in processing \"children\" has ";
136 err +=
"encountered an undefined DDLogicalPart named " + ddcurLP.
toString()
137 +
" is a child of " + ddLP.
toString();
145 rm.GetComponents(x, y, z);
146 if ((x.Cross(y)).Dot(z)<0)
147 edm::LogInfo(
"SimG4CoreGeometry") <<
">>Reflection encountered: " 148 << gra.edgeData(cit->second)->ddrot()
149 <<
">>Placement d=" << gra.nodeData(cit->first).ddname()
150 <<
" m=" << ddLP.
ddname() <<
" cp=" << gra.edgeData(cit->second)->copyno()
151 <<
" r=" << gra.edgeData(cit->second)->ddrot().ddname();
152 G4ThreeVector tempTran(gra.edgeData(cit->second)->trans().X(), gra.edgeData(cit->second)->trans().Y(), gra.edgeData(cit->second)->trans().Z());
153 G4Translate3D transl = tempTran;
154 CLHEP::HepRep3x3
temp( x.X(), x.Y(), x.Z(), y.X(), y.Y(), y.Z(), z.X(), z.Y(), z.Z() );
155 CLHEP::HepRotation
hr (
temp );
158 G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse());
160 refFact->Place(trfrm,
161 gra.nodeData(cit->first).name().name(),
165 gra.edgeData(cit->second)->copyno()+offset+
tag,
172 std::map<DDLogicalPart, G4LogicalVolume*>::const_iterator ddg4_it =
logs_.begin();
173 for (; ddg4_it !=
logs_.end(); ++ddg4_it) {
174 G4LogicalVolume * reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
175 if (reflLogicalVolume) {
180 edm::LogInfo(
"SimG4CoreGeometry")<<
"DDG4Builder: newEvent: dd=" 181 << ddlv.
ddname() <<
" g4=" 182 << reflLogicalVolume->GetName();
201 std::vector<const DDsvalues_type *>::iterator it = result.begin();
202 bool foundIt =
false;
203 for (; it != result.end(); ++it) {
209 if (temp.size() != 1) {
210 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " <<
s;
211 throw cms::Exception(
"SimG4CoreGeometry",
" DDG4Builder::getInt() Problem with Region tags - one and only one allowed: " + s);
222 std::vector<const DDsvalues_type *>::iterator it = result.begin();
223 bool foundIt =
false;
224 for (; it != result.end(); ++it) {
230 if (temp.size() != 1) {
231 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " <<
s ;
232 throw cms::Exception(
"SimG4CoreGeometry",
" DDG4Builder::getDouble() Problem with Region tags - one and only one allowed: " + s);
236 std::istringstream is(temp[0]);
238 v = v*G4UnitDefinition::GetValueOf(unit.substr(1,unit.size()));
double a() const
returns the atomic mass
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
std::map< DDSolid, G4VSolid * > sols_
double getDouble(const std::string &s, const DDLogicalPart &dLogical)
DDMaterial is used to define and access material information.
std::map< DDLogicalPart, G4LogicalVolume * > logs_
const DDCompactView * compactView
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
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.
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
std::map< DDMaterial, G4Material * > mats_
adj_list::const_iterator const_adj_iterator
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
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)