90 cosb = math.sqrt( r[0]*r[0] + r[1]*r[1] )
92 a =
atan2( r[5], r[8] ) * rad
93 b =
atan2( -r[2], cosb ) * rad
94 c =
atan2( r[1], r[0] ) * rad
96 a =
atan2( -r[7], r[4] ) * rad
97 b =
atan2( -r[2], cosb ) * rad
102 self.
writer.addBox(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDX(), 2*solid.GetDY(), 2*solid.GetDZ())
105 self.
writer.addParaboloid(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRlo(), solid.GetRhi(), solid.GetDz())
108 self.
writer.addSphere(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRmin(), solid.GetRmax(),
109 solid.GetPhi1(), solid.GetPhi2() - solid.GetPhi1(),
110 solid.GetTheta1(), solid.GetTheta2() - solid.GetTheta1())
113 self.
writer.addArb8(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]),
114 solid.GetVertices()[0],
115 solid.GetVertices()[1],
116 solid.GetVertices()[2],
117 solid.GetVertices()[3],
118 solid.GetVertices()[4],
119 solid.GetVertices()[5],
120 solid.GetVertices()[6],
121 solid.GetVertices()[7],
122 solid.GetVertices()[8],
123 solid.GetVertices()[9],
124 solid.GetVertices()[10],
125 solid.GetVertices()[11],
126 solid.GetVertices()[12],
127 solid.GetVertices()[13],
128 solid.GetVertices()[14],
129 solid.GetVertices()[15],
133 self.
writer.addCone(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDz(), solid.GetRmin1(), solid.GetRmin2(),
134 solid.GetRmax1(), solid.GetRmax2(), solid.GetPhi1(), solid.GetPhi2() - solid.GetPhi1())
137 self.
writer.addCone(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDz(), solid.GetRmin1(), solid.GetRmin2(),
138 solid.GetRmax1(), solid.GetRmax2(), 0, 360)
141 self.
writer.addPara(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetX(), solid.GetY(), solid.GetZ(),
142 solid.GetAlpha(), solid.GetTheta(), solid.GetPhi())
145 self.
writer.addTrap(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDz(), solid.GetTheta(), solid.GetPhi(),
146 2*solid.GetH1(), 2*solid.GetBl1(), 2*solid.GetTl1(), solid.GetAlpha1(),
147 2*solid.GetH2(), 2*solid.GetBl2(), 2*solid.GetTl2(), solid.GetAlpha2())
150 self.
writer.addTwistedTrap(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDz(), solid.GetTheta(), solid.GetPhi(),
151 2*solid.GetH1(), 2*solid.GetBl1(), 2*solid.GetTl1(), solid.GetAlpha1(),
152 2*solid.GetH2(), 2*solid.GetBl2(), 2*solid.GetTl2(), solid.GetAlpha2(), solid.GetTwistAngle())
155 self.
writer.addTrd(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDx1(), 2*solid.GetDx2(), 2*solid.GetDy(),
156 2*solid.GetDy(), 2*solid.GetDz())
159 self.
writer.addTrd(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), 2*solid.GetDx1(), 2*solid.GetDx2(), 2*solid.GetDy1(),
160 2*solid.GetDy2(), 2*solid.GetDz())
163 self.
writer.addTube(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRmin(), solid.GetRmax(),
164 2*solid.GetDz(), solid.GetPhi1(), solid.GetPhi2()-solid.GetPhi1())
167 self.
writer.addCutTube(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRmin(), solid.GetRmax(),
168 2*solid.GetDz(), solid.GetPhi1(), solid.GetPhi2()-solid.GetPhi1(),
177 self.
writer.addTube(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRmin(), solid.GetRmax(),
178 2*solid.GetDz(), 0, 360)
182 for i
in range(solid.GetNz()):
183 zplanes.append( (solid.GetZ(i), solid.GetRmin(i), solid.GetRmax(i)) )
184 self.
writer.addPolycone(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetPhi1(), solid.GetDphi(), zplanes)
187 self.
writer.addTorus(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetR(), solid.GetRmin(), solid.GetRmax(),
188 solid.GetPhi1(), solid.GetDphi())
192 for i
in range(solid.GetNz()):
193 zplanes.append( (solid.GetZ(i), solid.GetRmin(i), solid.GetRmax(i)) )
194 self.
writer.addPolyhedra(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetPhi1(), solid.GetDphi(),
195 solid.GetNedges(), zplanes)
200 for i
in range(solid.GetNvert()):
201 vertices.append( (solid.GetX(i), solid.GetY(i)) )
202 for i
in range(solid.GetNz()):
203 sections.append( (i, solid.GetZ(i), solid.GetXOffset(i), solid.GetYOffset(i), solid.GetScale(i)) )
204 self.
writer.addXtrusion(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), vertices, sections)
207 self.
writer.addEltube(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetA(), solid.GetB(), solid.GetDz())
210 self.
writer.addHype(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]), solid.GetRmin(), solid.GetRmax(),
211 solid.GetStIn(), solid.GetStOut(), 2*solid.GetDz())
214 lrot = self.
rotXYZ(solid.GetBoolNode().GetLeftMatrix().
Inverse().GetRotationMatrix())
215 rrot = self.
rotXYZ(solid.GetBoolNode().GetRightMatrix().
Inverse().GetRotationMatrix())
217 if ([solid.GetBoolNode().GetLeftShape(), 0])
in self.
solList:
219 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
221 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.
solList:
223 eval(
'self.'+solid.GetBoolNode().GetRightShape().__class__.__name__)(solid.GetBoolNode().GetRightShape())
226 self.
writer.addUnion(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]),
227 solid.GetBoolNode().GetLeftShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetLeftShape())[0]),
228 solid.GetBoolNode().GetLeftMatrix().GetTranslation(),
230 solid.GetBoolNode().GetRightShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetRightShape())[0]),
231 solid.GetBoolNode().GetRightMatrix().GetTranslation(),
235 lrot = self.
rotXYZ(solid.GetBoolNode().GetLeftMatrix().
Inverse().GetRotationMatrix())
236 rrot = self.
rotXYZ(solid.GetBoolNode().GetRightMatrix().
Inverse().GetRotationMatrix())
238 if ([solid.GetBoolNode().GetLeftShape(), 0])
in self.
solList:
240 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
242 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.
solList:
244 eval(
'self.'+solid.GetBoolNode().GetRightShape().__class__.__name__)(solid.GetBoolNode().GetRightShape())
247 self.
writer.addIntersection(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]),
248 solid.GetBoolNode().GetLeftShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetLeftShape())[0]),
249 solid.GetBoolNode().GetLeftMatrix().GetTranslation(),
251 solid.GetBoolNode().GetRightShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetRightShape())[0]),
252 solid.GetBoolNode().GetRightMatrix().GetTranslation(),
256 lrot = self.
rotXYZ(solid.GetBoolNode().GetLeftMatrix().
Inverse().GetRotationMatrix())
257 rrot = self.
rotXYZ(solid.GetBoolNode().GetRightMatrix().
Inverse().GetRotationMatrix())
259 if ([solid.GetBoolNode().GetLeftShape(), 0])
in self.
solList:
261 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
263 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.
solList:
265 eval(
'self.'+solid.GetBoolNode().GetRightShape().__class__.__name__)(solid.GetBoolNode().GetRightShape())
268 self.
writer.addSubtraction(self.
genName(solid.GetName())+
'_'+str(libPyROOT.AddressOf(solid)[0]),
269 solid.GetBoolNode().GetLeftShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetLeftShape())[0]),
270 solid.GetBoolNode().GetLeftMatrix().GetTranslation(),
272 solid.GetBoolNode().GetRightShape().
GetName()+
'_'+str(libPyROOT.AddressOf(solid.GetBoolNode().GetRightShape())[0]),
273 solid.GetBoolNode().GetRightMatrix().GetTranslation(),
277 eval(
'self.'+solid.GetBoolNode().__class__.__name__)(solid)
280 print 'Info in <TPython::Exec>: Found ', matlist.GetSize(),
' materials'
282 if not mat.IsMixture():
283 self.
writer.addMaterial(self.
genName(mat.GetName()), mat.GetA(), mat.GetZ(), mat.GetDensity())
286 for index
in range(mat.GetNelements()):
287 elems[mat.GetElement(index).
GetName()] = mat.GetWmixt()[index]
288 el = mat.GetElement(index)
291 self.
writer.addElement(mat.GetElement(index).GetTitle(), mat.GetElement(index).
GetName(), mat.GetZmixt()[index], mat.GetAmixt()[index])
293 self.
writer.addMixture(self.
genName(mat.GetName()), mat.GetDensity(), elems)
296 print 'Info in <TPython::Exec>: Found ', shapelist.GetEntries(),
' shapes'
297 for shape
in shapelist:
298 self.
solList.append([shape, 0])
303 eval(
'self.'+sol[0].__class__.__name__)(sol[0])
305 print 'Info in <TPython::Exec>: Dumped ', self.
shapesCount,
' shapes'
309 index = str(volume.GetNumber())+
"_"+str(libPyROOT.AddressOf(volume)[0])
310 daughters = volume.GetNodes()
316 for node
in daughters:
320 print '[FIRST STAGE] Node count: ', self.
nodeCount
324 for node
in daughters:
328 print '[FIRST STAGE] Node count: ', self.
nodeCount
331 nd = volume.GetNdaughters()
334 currentNode = volume.GetNode(i)
335 nextVol = currentNode.GetVolume()
336 index = str(nextVol.GetNumber())+
"_"+str(libPyROOT.AddressOf(nextVol)[0])
338 self.
nodes.append(currentNode)
342 print '[ZEROTH STAGE] Analysing node: ', self.
nodeCount
346 print '[RETRIEVING VOLUME LIST]'
348 self.
bvols = geomgr.GetListOfVolumes()
350 print '[INITIALISING VOLUME USE COUNT]'
351 for vol
in self.
bvols:
352 self.
vols.append(vol)
353 self.
volsUseCount[str(vol.GetNumber())+
"_"+str(libPyROOT.AddressOf(vol)[0])]=0
355 print '[CALCULATING VOLUME USE COUNT]'
359 print '[ORDERING VOLUMES]'
363 print '[DUMPING GEOMETRY TREE]'
373 if volume.GetNodes():
374 for node
in volume.GetNodes():
375 subvol = node.GetVolume()
378 if not subvol.TestAttBit(524288):
379 subvol.SetAttBit(524288)
380 self.
vols.append(subvol)
382 name = node.GetName()+str(libPyROOT.AddressOf(subvol)[0])+
'in'+volume.GetName()+str(libPyROOT.AddressOf(volume)[0])
383 pos = node.GetMatrix().GetTranslation()
384 self.
writer.addPosition(name+
'pos', pos[0], pos[1], pos[2])
385 r = self.
rotXYZ(node.GetMatrix().GetRotationMatrix())
387 if r[0]!=0.0
or r[1]!=0.0
or r[2]!=0.0:
388 self.
writer.addRotation(name+
'rot', r[0], r[1], r[2])
391 reflection = node.GetMatrix().IsReflection()
394 rotmat = node.GetMatrix().GetRotationMatrix()
397 self.
writer.addReflSolid(
'refl_'+node.GetVolume().GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume().GetShape())[0]), node.GetVolume().GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume().GetShape())[0]), 0, 0, 0, rotmat[0], rotmat[4], rotmat[8], 0, 0, 0)
401 self.
writer.addVolume(
'refl_'+node.GetVolume().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume())[0]),
'refl_'+node.GetVolume().GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume().GetShape())[0]), self.
genName(node.GetVolume().GetMaterial().
GetName()), emptyd)
404 daughters.append( (
'refl_'+node.GetVolume().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume())[0]), name+
'pos', rotname) )
407 daughters.append( (node.GetVolume().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume())[0]), name+
'pos', rotname) )
409 if volume.IsTopVolume():
410 if not volume.IsAssembly():
411 self.
writer.addVolume(volume.GetName(), volume.GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(volume.GetShape())[0]), self.
genName(volume.GetMaterial().
GetName()), daughters)
413 self.
writer.addAssembly(volume.GetName(), daughters)
415 if not volume.IsAssembly():
416 self.
writer.addVolume(volume.GetName()+
'_'+str(libPyROOT.AddressOf(volume)[0]), volume.GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(volume.GetShape())[0]), self.
genName(volume.GetMaterial().
GetName()), daughters)
418 self.
writer.addAssembly(volume.GetName()+
'_'+str(libPyROOT.AddressOf(volume)[0]), daughters)
422 nd = volume.GetNdaughters()
426 node = volume.GetNode(i)
427 name = node.GetName()+
'in'+volume.GetName()
428 pos = node.GetMatrix().GetTranslation()
429 self.
writer.addPosition(name+
'pos', pos[0], pos[1], pos[2])
430 r = self.
rotXYZ(node.GetMatrix().GetRotationMatrix())
432 if r[0]!=0.0
or r[1]!=0.0
or r[2]!=0.0:
433 self.
writer.addRotation(name+
'rot', r[0], r[1], r[2])
435 daughters.append( (node.GetVolume().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume())[0]), name+
'pos', rotname) )
438 print '[SECOND STAGE] Volume Count: ', self.
nodeCount, node.GetVolume().
GetName()+
'_'+str(libPyROOT.AddressOf(node.GetVolume())[0])
440 if volume.IsTopVolume():
441 if not volume.IsAssembly():
442 self.
writer.addVolume(volume.GetName(), volume.GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(volume.GetShape())[0]), self.
genName(volume.GetMaterial().
GetName()), daughters)
444 self.
writer.addAssembly(volume.GetName(), daughters)
446 if not volume.IsAssembly():
447 self.
writer.addVolume(volume.GetName()+
'_'+str(libPyROOT.AddressOf(volume)[0]), volume.GetShape().
GetName()+
'_'+str(libPyROOT.AddressOf(volume.GetShape())[0]), self.
genName(volume.GetMaterial().
GetName()), daughters)
449 self.
writer.addAssembly(volume.GetName()+
'_'+str(libPyROOT.AddressOf(volume)[0]), daughters)
double atan2(double, double)
def TGeoPgon(self, solid)
def TGeoPcon(self, solid)
def dumpMaterials(self, matlist)
def TGeoTrd2(self, solid)
def TGeoUnion(self, solid)
def getNodes(self, volume)
def TGeoSphere(self, solid)
def dumpSolids(self, shapelist)
def TGeoTrd1(self, solid)
def TGeoSubtraction(self, solid)
def TGeoArb8(self, solid)
def TGeoCtub(self, solid)
def TGeoPara(self, solid)
def TGeoXtru(self, solid)
def TGeoHype(self, solid)
def TGeoCompositeShape(self, solid)
def TGeoTubeSeg(self, solid)
def TGeoTorus(self, solid)
def TGeoBBox(self, solid)
def TGeoIntersection(self, solid)
def TGeoGtra(self, solid)
def TGeoParaboloid(self, solid)
def TGeoEltu(self, solid)
def examineVol(self, volume)
def TGeoCone(self, solid)
def TGeoTube(self, solid)
def __init__(self, writer)
def TGeoTrap(self, solid)
def orderVolumes(self, volume)
def examineVol2(self, volume)
def TGeoConeSeg(self, solid)
std::string GetName(const std::string &scope_name)
ABObj< sym, MatrixInverse< sym, ABObj< sym, LASymMatrix, double >, double >, double > Inverse(const ABObj< sym, LASymMatrix, double > &obj)
LAPACK Algebra functions specialize the Invert function for LASymMatrix.