CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DDG4Builder.cc
Go to the documentation of this file.
2 
7 
10 
11 #include "G4LogicalVolume.hh"
12 #include "G4Material.hh"
13 #include "G4PVPlacement.hh"
14 #include "G4ReflectionFactory.hh"
15 #include "G4VPhysicalVolume.hh"
16 #include "G4VSolid.hh"
17 
18 #include "G4SystemOfUnits.hh"
19 #include "G4UnitsTable.hh"
20 
21 #include <sstream>
22 
24 
26  : solidConverter_(new DDG4SolidConverter), compactView_(cpv), map_(lvmap), check_(check) {
28 }
29 
31 
32 G4LogicalVolume *DDG4Builder::convertLV(const DDLogicalPart &part) {
33  edm::LogVerbatim("SimG4CoreGeometry") << "DDG4Builder::convertLV(): DDLogicalPart = " << part;
34  G4LogicalVolume *result = logs_[part];
35  if (!result) {
36  G4VSolid *g4s = convertSolid(part.solid());
37  G4Material *g4m = convertMaterial(part.material());
38  result = new G4LogicalVolume(g4s, g4m, part.name().name());
39  map_.insert(result, part);
40  DDG4Dispatchable *disp = new DDG4Dispatchable(&part, result);
41  theVectorOfDDG4Dispatchables_->push_back(disp);
42  edm::LogVerbatim("SimG4CoreGeometry")
43  << "DDG4Builder::convertLV(): new G4LogicalVolume " << part.name().name()
44  << "\nDDG4Builder: newEvent: dd=" << part.ddname() << " g4=" << result->GetName();
45  logs_[part] = result; // DDD -> GEANT4
46  }
47  return result;
48 }
49 
50 G4VSolid *DDG4Builder::convertSolid(const DDSolid &solid) {
51  G4VSolid *result = sols_[solid];
52  if (!result) {
53  result = solidConverter_->convert(solid);
54  sols_[solid] = result;
55  }
56  return result;
57 }
58 
59 G4Material *DDG4Builder::convertMaterial(const DDMaterial &material) {
60  edm::LogVerbatim("SimG4CoreGeometry") << "DDDetConstr::ConvertMaterial: material=" << material;
61  G4Material *result = nullptr;
62  if (material) {
63  // only if it's a valid DDD-material
64  if ((result = mats_[material])) {
65  edm::LogVerbatim("SimG4CoreGeometry") << " is already converted";
66  return result;
67  }
68  } else {
69  // only if it's NOT a valid DDD-material
70  throw cms::Exception("SimG4CoreGeometry",
71  " material is not valid from the Detector Description: " + material.toString());
72  }
73  int c = 0;
74  if ((c = material.noOfConstituents())) {
75  // it's a composite material
76  edm::LogVerbatim("SimG4CoreGeometry")
77  << " creating a G4-composite material. c=" << c << " d=" << material.density() / CLHEP::g * CLHEP::mole;
78  result = new G4Material(material.name().name(), material.density(), c);
79  for (int i = 0; i < c; ++i) {
80  // recursive building of constituents
81  edm::LogVerbatim("SimG4CoreGeometry")
82  << " adding the composite=" << material.name() << " fm=" << material.constituent(i).second;
83  result->AddMaterial(convertMaterial(material.constituent(i).first),
84  material.constituent(i).second); // fractionmass
85  }
86  } else {
87  // it's an elementary material
88  edm::LogVerbatim("SimG4CoreGeometry") << " building an elementary material"
89  << " z=" << material.z() << " a=" << material.a() / CLHEP::g * CLHEP::mole
90  << " d=" << material.density() / CLHEP::g * CLHEP::cm3;
91  result = new G4Material(material.name().name(), material.z(), material.a(), material.density());
92  }
93  mats_[material] = result;
94  return result;
95 }
96 
98  G4ReflectionFactory *refFact = G4ReflectionFactory::Instance();
99  refFact->SetScalePrecision(100. * refFact->GetScalePrecision());
100 
101  using Graph = DDCompactView::Graph;
102  const auto &gra = compactView_->graph();
104  adjl_iterator git = gra.begin();
105  adjl_iterator gend = gra.end();
106 
107  Graph::index_type i = 0;
108  for (; git != gend; ++git) {
109  const DDLogicalPart &ddLP = gra.nodeData(git);
110  if (!(ddLP.isDefined().second)) {
111  throw cms::Exception("SimG4CoreGeometry",
112  " DDG4Builder::BuildGeometry() has encountered an "
113  "undefined DDLogicalPart named " +
114  ddLP.toString());
115  }
116  G4LogicalVolume *g4LV = convertLV(ddLP);
117  ++i;
118  if (!git->empty()) {
119  // ask for children of ddLP
120  Graph::edge_list::const_iterator cit = git->begin();
121  Graph::edge_list::const_iterator cend = git->end();
122  for (; cit != cend; ++cit) {
123  // fetch specific data
124  const DDLogicalPart &ddcurLP = gra.nodeData(cit->first);
125  if (!ddcurLP.isDefined().second) {
126  std::string err = " DDG4Builder::BuildGeometry() in processing \"children\" has ";
127  err += "encountered an undefined DDLogicalPart named " + ddcurLP.toString() + " is a child of " +
128  ddLP.toString();
129  throw cms::Exception("SimG4CoreGeometry", err);
130  }
131  int offset = getInt("CopyNoOffset", ddcurLP);
132  int tag = getInt("CopyNoTag", ddcurLP);
133  DDRotationMatrix rm(gra.edgeData(cit->second)->rot());
134  DD3Vector x, y, z;
135  rm.GetComponents(x, y, z);
136  if ((x.Cross(y)).Dot(z) < 0)
137  edm::LogVerbatim("SimG4CoreGeometry")
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()); // matrix
146  CLHEP::HepRotation hr(temp);
147  edm::LogVerbatim("SimG4CoreGeometry")
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() << ")";
152 
153  // G3 convention of defining rot-matrices ...
154  G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse()); //.inverse();
155 
156  refFact->Place(trfrm, // transformation containing a possible reflection
157  gra.nodeData(cit->first).name().name(),
158  convertLV(gra.nodeData(cit->first)), // daugther
159  g4LV, // mother
160  false, // 'ONLY'
161  gra.edgeData(cit->second)->copyno() + offset + tag, // copy number
162  check_);
163  } // iterate over children
164  } // if (children)
165  } // iterate over graph nodes
166 
167  // Looking for in the G4ReflectionFactory secretly created reflected
168  // G4LogicalVolumes
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) {
173  DDLogicalPart ddlv = ddg4_it->first;
174  map_.insert(reflLogicalVolume, ddlv);
175  DDG4Dispatchable *disp = new DDG4Dispatchable(&(ddg4_it->first), reflLogicalVolume);
176  theVectorOfDDG4Dispatchables_->push_back(disp);
177  edm::LogVerbatim("SimG4CoreGeometry")
178  << "DDG4Builder: dd=" << ddlv.ddname() << " g4=" << reflLogicalVolume->GetName();
179  }
180  }
181 
182  G4LogicalVolume *world = logs_[compactView_->root()];
183 
184  //
185  // needed for building sensitive detectors
186  //
188  conv.upDate(*theVectorOfDDG4Dispatchables_, catalog);
189 
190  return world;
191 }
192 
194  DDValue val(ss);
195  std::vector<const DDsvalues_type *> result = part.specifics();
196  bool foundIt = false;
197  for (auto stype : result) {
198  foundIt = DDfetch(stype, val);
199  if (foundIt)
200  break;
201  }
202  if (foundIt) {
203  std::vector<double> temp = val.doubles();
204  if (temp.size() != 1) {
205  throw cms::Exception("SimG4CoreGeometry",
206  " DDG4Builder::getInt() Problem with Region tags - "
207  "one and only one allowed: " +
208  ss);
209  }
210  return int(temp[0]);
211  } else
212  return 0;
213 }
214 
216  DDValue val(ss);
217  std::vector<const DDsvalues_type *> result = part.specifics();
218  bool foundIt = false;
219  for (auto stype : result) {
220  foundIt = DDfetch(stype, val);
221  if (foundIt)
222  break;
223  }
224  if (foundIt) {
225  std::vector<std::string> temp = val.strings();
226  if (temp.size() != 1) {
227  throw cms::Exception("SimG4CoreGeometry",
228  " DDG4Builder::getDouble() Problem with Region tags "
229  "- one and only one allowed: " +
230  ss);
231  }
232  double v;
234  std::istringstream is(temp[0]);
235  is >> v >> unit;
236  v = v * G4UnitDefinition::GetValueOf(unit.substr(1, unit.size()));
237  return v;
238  } else
239  return 0;
240 }
Log< level::Info, true > LogVerbatim
double a() const
returns the atomic mass
Definition: DDMaterial.cc:76
std::map< DDLogicalPart, G4LogicalVolume * > logs_
Definition: DDG4Builder.h:39
math::Graph< DDLogicalPart, DDPosData * > Graph
Definition: DDCompactView.h:83
def_type isDefined() const
Definition: DDBase.h:90
G4LogicalVolume * convertLV(const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:32
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
Definition: DDValue.cc:111
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double >> DD3Vector
const edm::EventSetup & c
std::vector< double >::size_type index_type
Definition: Graph.h:15
const N & name() const
Definition: DDBase.h:59
double getDouble(const std::string &s, const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:215
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:45
G4LogicalVolumeToDDLogicalPartMap & map_
Definition: DDG4Builder.h:42
G4LogicalVolume * BuildGeometry(SensitiveDetectorCatalog &)
Definition: DDG4Builder.cc:97
std::vector< DDG4Dispatchable * > DDG4DispContainer
void upDate(const DDG4DispContainer &ddg4s, SensitiveDetectorCatalog &)
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
std::map< DDSolid, G4VSolid * > sols_
Definition: DDG4Builder.h:38
const DDCompactView * compactView_
Definition: DDG4Builder.h:41
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:79
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
Definition: Activities.doc:4
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
std::vector< const DDsvalues_type * > specifics(void) const
returns the specific-data attached to the LogicalPart only (not to a DDExpandedNode) ...
tuple result
Definition: mps_fire.py:311
double z() const
retruns the atomic number
Definition: DDMaterial.cc:78
G4Material * convertMaterial(const DDMaterial &dMaterial)
Definition: DDG4Builder.cc:59
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
DDG4Builder(const DDCompactView *, G4LogicalVolumeToDDLogicalPartMap &, bool check)
Definition: DDG4Builder.cc:25
std::map< DDMaterial, G4Material * > mats_
Definition: DDG4Builder.h:37
FractionV::value_type constituent(int i) const
returns the i-th compound material and its fraction-mass
Definition: DDMaterial.cc:74
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
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 ...
Definition: DDValue.h:61
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
std::string toString() const
Definition: DDBase.h:63
double density() const
returns the density
Definition: DDMaterial.cc:80
DDG4SolidConverter * solidConverter_
Definition: DDG4Builder.h:36
part
Definition: HCALResponse.h:20
G4VSolid * convert(const DDSolid &)
int noOfConstituents() const
returns the number of compound materials or 0 for elementary materials
Definition: DDMaterial.cc:72
EPOS::IO_EPOS conv
G4VSolid * convertSolid(const DDSolid &dSolid)
Definition: DDG4Builder.cc:50
const DDLogicalPart & root() const
returns the DDLogicalPart representing the root of the geometrical hierarchy
def rm
Definition: eostools.py:363
adj_list::const_iterator const_adj_iterator
Definition: Graph.h:105
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
Definition: DDMapper.h:74
const std::string & name() const
Returns the name.
Definition: DDName.cc:41
const DDMaterial & material(void) const
Returns a reference object of the material this LogicalPart is made of.
DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:43
Basic3DVector unit() const
int getInt(const std::string &s, const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:193
const N & ddname() const
Definition: DDBase.h:61