CMS 3D CMS Logo

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());
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 
148  // G3 convention of defining rot-matrices ...
149  G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse()); //.inverse();
150 
151  refFact->Place(trfrm, // transformation containing a possible reflection
152  gra.nodeData(cit->first).name().name(),
153  convertLV(gra.nodeData(cit->first)), // daugther
154  g4LV, // mother
155  false, // 'ONLY'
156  gra.edgeData(cit->second)->copyno() + offset + tag, // copy number
157  check_);
158  } // iterate over children
159  } // if (children)
160  } // iterate over graph nodes
161 
162  // Looking for in the G4ReflectionFactory secretly created reflected
163  // G4LogicalVolumes
164  std::map<DDLogicalPart, G4LogicalVolume *>::const_iterator ddg4_it = logs_.begin();
165  for (; ddg4_it != logs_.end(); ++ddg4_it) {
166  G4LogicalVolume *reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
167  if (reflLogicalVolume) {
168  DDLogicalPart ddlv = ddg4_it->first;
169  map_.insert(reflLogicalVolume, ddlv);
170  DDG4Dispatchable *disp = new DDG4Dispatchable(&(ddg4_it->first), reflLogicalVolume);
171  theVectorOfDDG4Dispatchables_->push_back(disp);
172  edm::LogVerbatim("SimG4CoreGeometry")
173  << "DDG4Builder: dd=" << ddlv.ddname() << " g4=" << reflLogicalVolume->GetName();
174  }
175  }
176 
177  G4LogicalVolume *world = logs_[compactView_->root()];
178 
179  //
180  // needed for building sensitive detectors
181  //
184 
185  return world;
186 }
187 
189  DDValue val(ss);
190  std::vector<const DDsvalues_type *> result = part.specifics();
191  bool foundIt = false;
192  for (auto stype : result) {
193  foundIt = DDfetch(stype, val);
194  if (foundIt)
195  break;
196  }
197  if (foundIt) {
198  std::vector<double> temp = val.doubles();
199  if (temp.size() != 1) {
200  throw cms::Exception("SimG4CoreGeometry",
201  " DDG4Builder::getInt() Problem with Region tags - "
202  "one and only one allowed: " +
203  ss);
204  }
205  return int(temp[0]);
206  } else
207  return 0;
208 }
209 
211  DDValue val(ss);
212  std::vector<const DDsvalues_type *> result = part.specifics();
213  bool foundIt = false;
214  for (auto stype : result) {
215  foundIt = DDfetch(stype, val);
216  if (foundIt)
217  break;
218  }
219  if (foundIt) {
220  std::vector<std::string> temp = val.strings();
221  if (temp.size() != 1) {
222  throw cms::Exception("SimG4CoreGeometry",
223  " DDG4Builder::getDouble() Problem with Region tags "
224  "- one and only one allowed: " +
225  ss);
226  }
227  double v;
229  std::istringstream is(temp[0]);
230  is >> v >> unit;
231  v = v * G4UnitDefinition::GetValueOf(unit.substr(1, unit.size()));
232  return v;
233  } else
234  return 0;
235 }
DDG4SensitiveConverter.h
DDAxes::y
DDG4Builder::getInt
int getInt(const std::string &s, const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:188
DDG4SensitiveConverter
Definition: DDG4SensitiveConverter.h:13
mps_fire.i
i
Definition: mps_fire.py:428
MessageLogger.h
DDG4Builder::logs_
std::map< DDLogicalPart, G4LogicalVolume * > logs_
Definition: DDG4Builder.h:39
DDG4Builder::getDouble
double getDouble(const std::string &s, const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:210
getEcalConditions_orcoffint2r_cff.catalog
catalog
Definition: getEcalConditions_orcoffint2r_cff.py:40
DDG4Builder::convertLV
G4LogicalVolume * convertLV(const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:32
DDG4DispContainer
std::vector< DDG4Dispatchable * > DDG4DispContainer
Definition: DDG4DispContainer.h:8
DDMapper< G4LogicalVolume *, DDLogicalPart >
DDG4Builder::theVectorOfDDG4Dispatchables_
DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:43
conv
static HepMC::IO_HEPEVT conv
Definition: BeamHaloProducer.cc:48
DDBase::isDefined
def_type isDefined() const
Definition: DDBase.h:90
DDMaterial::density
double density() const
returns the density
Definition: DDMaterial.cc:80
DDMaterial::z
double z() const
retruns the atomic number
Definition: DDMaterial.cc:78
DDMaterial::noOfConstituents
int noOfConstituents() const
returns the number of compound materials or 0 for elementary materials
Definition: DDMaterial.cc:72
DDMaterial::constituent
FractionV::value_type constituent(int i) const
returns the i-th compound material and its fraction-mass
Definition: DDMaterial.cc:74
DDG4Builder::map_
G4LogicalVolumeToDDLogicalPartMap & map_
Definition: DDG4Builder.h:42
DDG4Builder::compactView_
const DDCompactView * compactView_
Definition: DDG4Builder.h:41
DDAxes::x
findQualityFiles.v
v
Definition: findQualityFiles.py:179
groupFilesInBlocks.temp
list temp
Definition: groupFilesInBlocks.py:142
DDG4Dispatchable
Definition: DDG4Dispatchable.h:8
DDCompactView.h
DDMapper::insert
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
Definition: DDMapper.h:74
DDG4Builder::~DDG4Builder
~DDG4Builder()
Definition: DDG4Builder.cc:30
contentValuesCheck.ss
ss
Definition: contentValuesCheck.py:33
RPCNoise_example.check
check
Definition: RPCNoise_example.py:71
DDMaterial
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:45
part
part
Definition: HCALResponse.h:20
DDG4Builder::BuildGeometry
G4LogicalVolume * BuildGeometry(SensitiveDetectorCatalog &)
Definition: DDG4Builder.cc:97
DDCompactView::graph
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
Definition: DDCompactView.cc:59
GlobalPosition_Frontier_DevDB_cff.tag
tag
Definition: GlobalPosition_Frontier_DevDB_cff.py:11
DDBase::toString
std::string toString() const
Definition: DDBase.h:63
adjl_iterator
Graph::const_adj_iterator adjl_iterator
Definition: GeometryInfoDump.cc:19
DDCompactView
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
DDBase::name
const N & name() const
Definition: DDBase.h:59
DDAxes::z
DDG4Builder::sols_
std::map< DDSolid, G4VSolid * > sols_
Definition: DDG4Builder.h:38
DDMaterial::a
double a() const
returns the atomic mass
Definition: DDMaterial.cc:76
DDG4Builder::check_
bool check_
Definition: DDG4Builder.h:44
SensitiveDetectorCatalog
Definition: SensitiveDetectorCatalog.h:10
DDfetch
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:79
submit.rm
rm
Definition: submit.py:77
DDG4Builder::DDG4Builder
DDG4Builder(const DDCompactView *, G4LogicalVolumeToDDLogicalPartMap &, bool check)
Definition: DDG4Builder.cc:25
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
DDCompactView::Graph
math::Graph< DDLogicalPart, DDPosData * > Graph
Definition: DDCompactView.h:83
DD3Vector
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
Definition: PGeometricDetBuilder.cc:19
DDG4Builder::solidConverter_
DDG4SolidConverter * solidConverter_
Definition: DDG4Builder.h:36
DDBase::ddname
const N & ddname() const
Definition: DDBase.h:61
DDG4Builder::convertMaterial
G4Material * convertMaterial(const DDMaterial &dMaterial)
Definition: DDG4Builder.cc:59
DDSpecifics.h
DDLogicalPart
A DDLogicalPart aggregates information concerning material, solid and sensitveness ....
Definition: DDLogicalPart.h:93
SensitiveDetectorCatalog.h
createfilelist.int
int
Definition: createfilelist.py:10
DDG4Builder::mats_
std::map< DDMaterial, G4Material * > mats_
Definition: DDG4Builder.h:37
DDName::name
const std::string & name() const
Returns the name.
Definition: DDName.cc:41
HltBtagPostValidation_cff.c
c
Definition: HltBtagPostValidation_cff.py:31
submitPVResolutionJobs.err
err
Definition: submitPVResolutionJobs.py:85
unit
Basic3DVector unit() const
Definition: Basic3DVectorLD.h:162
DDG4SolidConverter.h
DDCompactView::root
const DDLogicalPart & root() const
returns the DDLogicalPart representing the root of the geometrical hierarchy
Definition: DDCompactView.cc:63
DDG4Builder::convertSolid
G4VSolid * convertSolid(const DDSolid &dSolid)
Definition: DDG4Builder.cc:50
heppy_batch.val
val
Definition: heppy_batch.py:351
DDRotationMatrix
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
Definition: DDRotationMatrix.h:8
DDG4SolidConverter::convert
G4VSolid * convert(const DDSolid &)
Definition: DDG4SolidConverter.cc:38
DDValue
Definition: DDValue.h:21
math::Graph< DDLogicalPart, DDPosData * >::index_type
std::vector< double >::size_type index_type
Definition: Graph.h:15
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
Exception
Definition: hltDiff.cc:246
DDSolid
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
Exception.h
math::Graph< DDLogicalPart, DDPosData * >
mps_fire.result
result
Definition: mps_fire.py:311
hltrates_dqm_sourceclient-live_cfg.offset
offset
Definition: hltrates_dqm_sourceclient-live_cfg.py:82
edm::Log
Definition: MessageLogger.h:70
DDG4Builder.h
g
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
DDG4SolidConverter
Definition: DDG4SolidConverter.h:14
math::Graph< DDLogicalPart, DDPosData * >::const_adj_iterator
adj_list::const_iterator const_adj_iterator
Definition: Graph.h:105