11 #include "G4VSolid.hh"
16 #include "G4Material.hh"
17 #include "G4LogicalVolume.hh"
18 #include "G4VPhysicalVolume.hh"
19 #include "G4PVPlacement.hh"
20 #include "G4ReflectionFactory.hh"
22 #include "G4UnitsTable.hh"
44 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder::convertLV(): DDLogicalPart = " <<
part;
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();
69 LogDebug(
"SimG4CoreGeometry") <<
"DDDetConstr::ConvertMaterial: material=" << material;
73 if ((result =
mats_[material])) {
74 LogDebug(
"SimG4CoreGeometry") <<
" is already converted";
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 ;
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 ;
101 result =
new G4Material
109 G4ReflectionFactory * refFact = G4ReflectionFactory::Instance();
110 refFact->SetScalePrecision(100.*refFact->GetScalePrecision());
114 typedef graph_type::const_adj_iterator adjl_iterator;
115 adjl_iterator git = gra.
begin();
116 adjl_iterator gend = gra.end();
118 graph_type::index_type
i=0;
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_type::edge_list::const_iterator cit = git->begin();
130 graph_type::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 " + ddLP.
toString();
144 rm.GetComponents(x, y, z);
145 if ((x.Cross(y)).Dot(z)<0)
146 LogDebug(
"SimG4CoreGeometry") <<
">>Reflection encountered: " << gra.edgeData(cit->second)->rot_ ;
147 LogDebug(
"SimG4CoreGeometry") <<
">>Placement d=" << gra.nodeData(cit->first).ddname()
148 <<
" m=" << ddLP.
ddname() <<
" cp=" << gra.edgeData(cit->second)->copyno_
149 <<
" r=" << gra.edgeData(cit->second)->rot_.ddname() ;
150 G4ThreeVector tempTran(gra.edgeData(cit->second)->trans_.X(), gra.edgeData(cit->second)->trans_.Y(), gra.edgeData(cit->second)->trans_.Z());
151 G4Translate3D transl = tempTran;
152 CLHEP::HepRep3x3
temp( x.X(), x.Y(), x.Z(), y.X(), y.Y(), y.Z(), z.X(), z.Y(), z.Z() );
153 CLHEP::HepRotation hr (
temp );
156 G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse());
158 refFact->Place(trfrm,
159 gra.nodeData(cit->first).name().name(),
163 gra.edgeData(cit->second)->copyno_+offset+
tag,
170 std::map<DDLogicalPart, G4LogicalVolume*>::const_iterator ddg4_it =
logs_.begin();
171 for (; ddg4_it !=
logs_.end(); ++ddg4_it) {
172 G4LogicalVolume * reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
173 if (reflLogicalVolume) {
178 LogDebug(
"SimG4CoreGeometry") <<
"DDG4Builder: newEvent: dd="
179 << ddlv.
ddname() <<
" g4="
180 << reflLogicalVolume->GetName();
199 std::vector<const DDsvalues_type *>::iterator it = result.begin();
200 bool foundIt =
false;
201 for (; it != result.end(); ++it) {
207 if (temp.size() != 1) {
208 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " <<
s ;
209 throw SimG4Exception(
"DDG4Builder: Problem with Region tags - one and only one allowed");
220 std::vector<const DDsvalues_type *>::iterator it = result.begin();
221 bool foundIt =
false;
222 for (; it != result.end(); ++it) {
228 if (temp.size() != 1) {
229 edm::LogError(
"SimG4CoreGeometry") <<
" DDG4Builder - ERROR: I need only 1 " <<
s ;
230 throw SimG4Exception(
"DDG4Builder: Problem with Region tags - one and only one allowed");
234 std::istringstream is(temp[0].c_str());
236 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::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
const graph_type & graph() const
Provides read-only access to the data structure of the compact-view.
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
type of data representation of DDCompactView
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.
bool check(const DataFrame &df, bool capcheck, bool dvercheck)
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 ...
unsigned int offset(bool)
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()
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
std::map< DDMaterial, G4Material * > mats_
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)