CMS 3D CMS Logo

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