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)
examineVol2(self, volume)
dumpSolids(self, shapelist)
orderVolumes(self, volume)
dumpMaterials(self, matlist)
An arbitrary trapezoid with less than 8 vertices standing on two parallel planes perpendicular to Z a...
Class handling Boolean composition of shapes.
A phi segment of a conical tube.
A tube segment cut with 2 planes.
Gtra is a twisted trapezoid.
Hyperboloid class defined by 5 parameters.
TRAP is a general trapezoid, i.e.
A trapezoid with only x length varying with z.
A trapezoid with both x and y lengths varying with z.
An extrusion with fixed outline shape in x-y and a sequence of z extents (segments).