CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Attributes | Static Private Attributes
DDG4Builder Class Reference

#include <DDG4Builder.h>

Public Member Functions

DDGeometryReturnType BuildGeometry ()
 
 DDG4Builder (const DDCompactView *, bool check=false)
 
 ~DDG4Builder ()
 

Static Public Member Functions

static DDG4DispContainertheVectorOfDDG4Dispatchables ()
 

Protected Member Functions

G4LogicalVolume * convertLV (const DDLogicalPart &dLogical)
 
G4Material * convertMaterial (const DDMaterial &dMaterial)
 
G4VSolid * convertSolid (const DDSolid &dSolid)
 
double getDouble (const std::string &s, const DDLogicalPart &dLogical)
 
int getInt (const std::string &s, const DDLogicalPart &dLogical)
 

Protected Attributes

std::map< DDLogicalPart,
G4LogicalVolume * > 
logs_
 
std::map< DDMaterial,
G4Material * > 
mats_
 
DDG4SolidConvertersolidConverter_
 
std::map< DDSolid, G4VSolid * > sols_
 

Private Attributes

bool check_
 
const DDCompactViewcompactView
 
G4LogicalVolumeToDDLogicalPartMap map_
 

Static Private Attributes

static DDG4DispContainertheVectorOfDDG4Dispatchables_ = 0
 

Detailed Description

Definition at line 23 of file DDG4Builder.h.

Constructor & Destructor Documentation

DDG4Builder::DDG4Builder ( const DDCompactView cpv,
bool  check = false 
)

Definition at line 35 of file DDG4Builder.cc.

References theVectorOfDDG4Dispatchables_.

35  :
38 }
std::vector< DDG4Dispatchable * > DDG4DispContainer
const DDCompactView * compactView
Definition: DDG4Builder.h:45
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:46
bool check(const std::string &)
DDG4SolidConverter * solidConverter_
Definition: DDG4Builder.h:39
DDG4Builder::~DDG4Builder ( )

Definition at line 40 of file DDG4Builder.cc.

References solidConverter_.

40  {
41  delete solidConverter_;
42 }
DDG4SolidConverter * solidConverter_
Definition: DDG4Builder.h:39

Member Function Documentation

DDGeometryReturnType DDG4Builder::BuildGeometry ( )

Definition at line 109 of file DDG4Builder.cc.

References graph< N, E >::begin(), validate_alignment_devdb10_cfg::catalog, check_, compactView, convertLV(), DDBase< N, C >::ddname(), edm::hlt::Exception, getInt(), DDCompactView::graph(), AnalysisDataFormats_SUSYBSMObjects::hr, i, DDMapper< KeyType, ValueType >::insert(), DDBase< N, C >::isDefined(), LogDebug, logs_, map_, hltrates_dqm_sourceclient-live_cfg::offset, submit::rm, DDCompactView::root(), AlCaHLTBitMon_QueryRunRegistry::string, GlobalPosition_Frontier_DevDB_cff::tag, groupFilesInBlocks::temp, theVectorOfDDG4Dispatchables_, DDBase< N, C >::toString(), DDG4SensitiveConverter::upDate(), x, detailsBasic3DVector::y, and detailsBasic3DVector::z.

109  {
110  G4ReflectionFactory * refFact = G4ReflectionFactory::Instance();
111  refFact->SetScalePrecision(100.*refFact->GetScalePrecision());
112 
113  typedef DDCompactView::graph_type graph_type;
114  const graph_type & gra = compactView->graph();
115  typedef graph_type::const_adj_iterator adjl_iterator;
116  adjl_iterator git = gra.begin();
117  adjl_iterator gend = gra.end();
118 
119  graph_type::index_type i=0;
120  for (; git != gend; ++git) {
121  const DDLogicalPart & ddLP = gra.nodeData(git);
122  if ( !(ddLP.isDefined().second) ) {
123  edm::LogError("SimG4CoreGeometry") << "DDG4Builder::BuildGeometry() has encountered an undefined DDLogicalPart named " << ddLP.toString();
124  throw cms::Exception("SimG4CoreGeometry", " DDG4Builder::BuildGeometry() has encountered an undefined DDLogicalPart named " + ddLP.toString());
125  }
126  G4LogicalVolume * g4LV = convertLV(ddLP);
127  ++i;
128  if (git->size()) {
129  // ask for children of ddLP
130  graph_type::edge_list::const_iterator cit = git->begin();
131  graph_type::edge_list::const_iterator cend = git->end();
132  for (; cit != cend; ++cit) {
133  // fetch specific data
134  const DDLogicalPart & ddcurLP = gra.nodeData(cit->first);
135  if ( !ddcurLP.isDefined().second ) {
136  std::string err = " DDG4Builder::BuildGeometry() in processing \"children\" has ";
137  err += "encountered an undefined DDLogicalPart named " + ddLP.toString();
138  edm::LogError("SimG4CoreGeometry") << err;
139  throw cms::Exception("SimG4CoreGeometry", err) ;
140  }
141  int offset = getInt("CopyNoOffset",ddcurLP);
142  int tag = getInt("CopyNoTag",ddcurLP);
143  DDRotationMatrix rm(gra.edgeData(cit->second)->rot());
144  DD3Vector x, y, z;
145  rm.GetComponents(x, y, z);
146  if ((x.Cross(y)).Dot(z)<0)
147  LogDebug("SimG4CoreGeometry") << ">>Reflection encountered: " << gra.edgeData(cit->second)->rot_ ;
148  LogDebug("SimG4CoreGeometry") << ">>Placement d=" << gra.nodeData(cit->first).ddname()
149  << " m=" << ddLP.ddname() << " cp=" << gra.edgeData(cit->second)->copyno_
150  << " r=" << gra.edgeData(cit->second)->rot_.ddname() ;
151  G4ThreeVector tempTran(gra.edgeData(cit->second)->trans_.X(), gra.edgeData(cit->second)->trans_.Y(), gra.edgeData(cit->second)->trans_.Z());
152  G4Translate3D transl = tempTran;
153  CLHEP::HepRep3x3 temp( x.X(), x.Y(), x.Z(), y.X(), y.Y(), y.Z(), z.X(), z.Y(), z.Z() ); //matrix representation
154  CLHEP::HepRotation hr ( temp );
155 
156  // G3 convention of defining rot-matrices ...
157  G4Transform3D trfrm = transl * G4Rotate3D(hr.inverse());//.inverse();
158 
159  refFact->Place(trfrm, // transformation containing a possible reflection
160  gra.nodeData(cit->first).name().name(),
161  convertLV(gra.nodeData(cit->first)), // daugther
162  g4LV, // mother
163  false, // 'ONLY'
164  gra.edgeData(cit->second)->copyno_+offset+tag, // copy number
165  check_);
166  } // iterate over children
167  } // if (children)
168  } // iterate over graph nodes
169 
170  // Looking for in the G4ReflectionFactory secretly created reflected G4LogicalVolumes
171  std::map<DDLogicalPart, G4LogicalVolume*>::const_iterator ddg4_it = logs_.begin();
172  for (; ddg4_it != logs_.end(); ++ddg4_it) {
173  G4LogicalVolume * reflLogicalVolume = refFact->GetReflectedLV(ddg4_it->second);
174  if (reflLogicalVolume) {
175  DDLogicalPart ddlv = ddg4_it->first;
176  map_.insert(reflLogicalVolume,ddlv);
177  DDG4Dispatchable * disp = new DDG4Dispatchable(&(ddg4_it->first),reflLogicalVolume);
178  theVectorOfDDG4Dispatchables_->push_back(disp);
179  LogDebug("SimG4CoreGeometry") << "DDG4Builder: newEvent: dd="
180  << ddlv.ddname() << " g4="
181  << reflLogicalVolume->GetName();
182  }
183  }
184 
185  G4LogicalVolume * world = logs_[compactView->root()];
186 
187  //
188  // needed for building sensitive detectors
189  //
192 
193  return DDGeometryReturnType(world,map_,catalog);
194 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
def_type isDefined() const
Definition: DDBase.h:115
G4LogicalVolume * convertLV(const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:44
std::map< DDLogicalPart, G4LogicalVolume * > logs_
Definition: DDG4Builder.h:42
const DDCompactView * compactView
Definition: DDG4Builder.h:45
const graph_type & graph() const
Provides read-only access to the data structure of the compact-view.
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:46
float float float z
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
string rm
Definition: submit.py:76
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:88
std::string toString() const
Definition: DDBase.h:86
SensitiveDetectorCatalog upDate(const DDG4DispContainer &ddg4s)
const DDLogicalPart & root() const
returns the DDLogicalPart representing the root of the geometrical hierarchy
adj_iterator begin()
Definition: adjgraph.h:197
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
Definition: DDMapper.h:77
Definition: DDAxes.h:10
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
G4LogicalVolumeToDDLogicalPartMap map_
Definition: DDG4Builder.h:47
int getInt(const std::string &s, const DDLogicalPart &dLogical)
Definition: DDG4Builder.cc:196
const N & ddname() const
Definition: DDBase.h:84
G4LogicalVolume * DDG4Builder::convertLV ( const DDLogicalPart dLogical)
protected

Definition at line 44 of file DDG4Builder.cc.

References convertMaterial(), convertSolid(), DDBase< N, C >::ddname(), DDMapper< KeyType, ValueType >::insert(), LogDebug, logs_, visualization-live-secondInstance_cfg::m, map_, DDLogicalPart::material(), DDName::name(), DDBase< N, C >::name(), query::result, alignCSCRings::s, DDLogicalPart::solid(), and theVectorOfDDG4Dispatchables_.

Referenced by BuildGeometry().

44  {
45  LogDebug("SimG4CoreGeometry") << "DDG4Builder::convertLV(): DDLogicalPart = " << part;
46  G4LogicalVolume * result = logs_[part];
47  if (!result) {
48  G4VSolid * s = convertSolid(part.solid());
49  G4Material * m = convertMaterial(part.material());
50  result = new G4LogicalVolume(s,m,part.name().name());
51  map_.insert(result,part);
52  DDG4Dispatchable * disp = new DDG4Dispatchable(&part,result);
53  theVectorOfDDG4Dispatchables_->push_back(disp);
54  LogDebug("SimG4CoreGeometry") << "DDG4Builder::convertLV(): new G4LogicalVolume " << part.name().name()
55  << "\nDDG4Builder: newEvent: dd=" << part.ddname() << " g4=" << result->GetName();
56  logs_[part] = result; // DDD -> GEANT4
57  }
58  return result;
59 }
#define LogDebug(id)
std::map< DDLogicalPart, G4LogicalVolume * > logs_
Definition: DDG4Builder.h:42
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:46
G4Material * convertMaterial(const DDMaterial &dMaterial)
Definition: DDG4Builder.cc:69
tuple result
Definition: query.py:137
part
Definition: HCALResponse.h:20
G4VSolid * convertSolid(const DDSolid &dSolid)
Definition: DDG4Builder.cc:61
void insert(const KeyType &, const ValueType &)
insert a new key-value-pair
Definition: DDMapper.h:77
G4LogicalVolumeToDDLogicalPartMap map_
Definition: DDG4Builder.h:47
G4Material * DDG4Builder::convertMaterial ( const DDMaterial dMaterial)
protected

Definition at line 69 of file DDG4Builder.cc.

References DDMaterial::a(), EnergyCorrector::c, DDMaterial::constituent(), DDMaterial::density(), edm::hlt::Exception, g, i, LogDebug, mats_, DDName::name(), DDBase< N, C >::name(), DDMaterial::noOfConstituents(), query::result, DDBase< N, C >::toString(), and DDMaterial::z().

Referenced by convertLV().

69  {
70  LogDebug("SimG4CoreGeometry") << "DDDetConstr::ConvertMaterial: material=" << material;
71  G4Material * result = 0;
72  if (material) {
73  // only if it's a valid DDD-material
74  if ((result = mats_[material])) {
75  LogDebug("SimG4CoreGeometry") << " is already converted";
76  return result; }
77  } else {
78  // only if it's NOT a valid DDD-material
79  edm::LogError("SimG4CoreGeometry") << "DDG4Builder:: material " << material.toString() << " is not valid (in the DDD sense!)";
80  throw cms::Exception("SimG4CoreGeometry", " material is not valid from the Detector Description: " + material.toString());
81  }
82  int c = 0;
83  if ((c = material.noOfConstituents())) {
84  // it's a composite material
85  LogDebug("SimG4CoreGeometry") << " creating a G4-composite material. c=" << c
86  << " d=" << material.density()/g*mole ;
87  result = new G4Material(material.name().name(),material.density(),c);
88  for (int i=0 ; i<c; ++i) {
89  // recursive building of constituents
90  LogDebug("SimG4CoreGeometry") << " adding the composite=" << material.name()
91  << " fm=" << material.constituent(i).second;
92  result->AddMaterial
93  (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()
100  << " a=" << material.a()/g*mole
101  << " d=" << material.density()/g*cm3 ;
102  result = new G4Material
103  (material.name().name(),material.z(),material.a(),material.density());
104  }
105  mats_[material] = result;
106  return result;
107 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
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
G4Material * convertMaterial(const DDMaterial &dMaterial)
Definition: DDG4Builder.cc:69
tuple result
Definition: query.py:137
std::map< DDMaterial, G4Material * > mats_
Definition: DDG4Builder.h:40
G4VSolid * DDG4Builder::convertSolid ( const DDSolid dSolid)
protected

Definition at line 61 of file DDG4Builder.cc.

References DDG4SolidConverter::convert(), query::result, solidConverter_, and sols_.

Referenced by convertLV().

61  {
62  G4VSolid * result = sols_[solid];
63  if (!result) {
64  result = solidConverter_->convert(solid); sols_[solid] = result;
65  }
66  return result;
67 }
std::map< DDSolid, G4VSolid * > sols_
Definition: DDG4Builder.h:41
tuple result
Definition: query.py:137
DDG4SolidConverter * solidConverter_
Definition: DDG4Builder.h:39
G4VSolid * convert(const DDSolid &)
double DDG4Builder::getDouble ( const std::string &  s,
const DDLogicalPart dLogical 
)
protected

Definition at line 217 of file DDG4Builder.cc.

References DDfetch(), query::result, alignCSCRings::s, DDLogicalPart::specifics(), AlCaHLTBitMon_QueryRunRegistry::string, DDValue::strings(), groupFilesInBlocks::temp, csvLumiCalc::unit, and findQualityFiles::v.

218  {
219  DDValue val(s);
220  std::vector<const DDsvalues_type *> result = part.specifics();
221  std::vector<const DDsvalues_type *>::iterator it = result.begin();
222  bool foundIt = false;
223  for (; it != result.end(); ++it) {
224  foundIt = DDfetch(*it,val);
225  if (foundIt) break;
226  }
227  if (foundIt) {
228  std::vector<std::string> temp = val.strings();
229  if (temp.size() != 1) {
230  edm::LogError("SimG4CoreGeometry") << " DDG4Builder - ERROR: I need only 1 " << s ;
231  throw SimG4Exception("DDG4Builder: Problem with Region tags - one and only one allowed");
232  }
233  double v;
235  std::istringstream is(temp[0].c_str());
236  is >> v >> unit;
237  v = v*G4UnitDefinition::GetValueOf(unit.substr(1,unit.size()));
238  return v;
239  }
240  else return 0;
241 }
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:80
string unit
Definition: csvLumiCalc.py:46
tuple result
Definition: query.py:137
part
Definition: HCALResponse.h:20
int DDG4Builder::getInt ( const std::string &  s,
const DDLogicalPart dLogical 
)
protected

Definition at line 196 of file DDG4Builder.cc.

References DDfetch(), DDValue::doubles(), query::result, alignCSCRings::s, DDLogicalPart::specifics(), and groupFilesInBlocks::temp.

Referenced by BuildGeometry().

197 {
198  DDValue val(s);
199  std::vector<const DDsvalues_type *> result = part.specifics();
200  std::vector<const DDsvalues_type *>::iterator it = result.begin();
201  bool foundIt = false;
202  for (; it != result.end(); ++it) {
203  foundIt = DDfetch(*it,val);
204  if (foundIt) break;
205  }
206  if (foundIt) {
207  std::vector<double> temp = val.doubles();
208  if (temp.size() != 1) {
209  edm::LogError("SimG4CoreGeometry") << " DDG4Builder - ERROR: I need only 1 " << s ;
210  throw SimG4Exception("DDG4Builder: Problem with Region tags - one and only one allowed");
211  }
212  return int(temp[0]);
213  }
214  else return 0;
215 }
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
Definition: DDsvalues.cc:80
tuple result
Definition: query.py:137
part
Definition: HCALResponse.h:20
DDG4DispContainer * DDG4Builder::theVectorOfDDG4Dispatchables ( )
static

Definition at line 31 of file DDG4Builder.cc.

References theVectorOfDDG4Dispatchables_.

31  {
33 }
static DDG4DispContainer * theVectorOfDDG4Dispatchables_
Definition: DDG4Builder.h:46

Member Data Documentation

bool DDG4Builder::check_
private

Definition at line 48 of file DDG4Builder.h.

Referenced by BuildGeometry().

const DDCompactView* DDG4Builder::compactView
private

Definition at line 45 of file DDG4Builder.h.

Referenced by BuildGeometry().

std::map<DDLogicalPart,G4LogicalVolume*> DDG4Builder::logs_
protected

Definition at line 42 of file DDG4Builder.h.

Referenced by BuildGeometry(), and convertLV().

G4LogicalVolumeToDDLogicalPartMap DDG4Builder::map_
private

Definition at line 47 of file DDG4Builder.h.

Referenced by BuildGeometry(), and convertLV().

std::map<DDMaterial,G4Material*> DDG4Builder::mats_
protected

Definition at line 40 of file DDG4Builder.h.

Referenced by convertMaterial().

DDG4SolidConverter* DDG4Builder::solidConverter_
protected

Definition at line 39 of file DDG4Builder.h.

Referenced by convertSolid(), and ~DDG4Builder().

std::map<DDSolid,G4VSolid*> DDG4Builder::sols_
protected

Definition at line 41 of file DDG4Builder.h.

Referenced by convertSolid().

DDG4DispContainer * DDG4Builder::theVectorOfDDG4Dispatchables_ = 0
staticprivate

Definition at line 46 of file DDG4Builder.h.

Referenced by BuildGeometry(), convertLV(), DDG4Builder(), and theVectorOfDDG4Dispatchables().