68 self.volsUseCount = {}
73 self.geomgr = ROOT.gGeoManager
74 self.geomgr.SetAllIndex()
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:
218 self.solList[self.solList.index([solid.GetBoolNode().GetLeftShape(), 0])][1] = 1
219 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
221 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.solList:
222 self.solList[self.solList.index([solid.GetBoolNode().GetRightShape(), 0])][1] = 1
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:
239 self.solList[self.solList.index([solid.GetBoolNode().GetLeftShape(), 0])][1] = 1
240 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
242 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.solList:
243 self.solList[self.solList.index([solid.GetBoolNode().GetRightShape(), 0])][1] = 1
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:
260 self.solList[self.solList.index([solid.GetBoolNode().GetLeftShape(), 0])][1] = 1
261 eval(
'self.'+solid.GetBoolNode().GetLeftShape().__class__.__name__)(solid.GetBoolNode().GetLeftShape())
263 if ([solid.GetBoolNode().GetRightShape(), 0])
in self.solList:
264 self.solList[self.solList.index([solid.GetBoolNode().GetRightShape(), 0])][1] = 1
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)
290 self.elements.append(el)
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])
299 for sol
in self.solList:
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()
311 if len(self.sortedVols)<len(self.vols)
and self.volsUseCount[index]>0:
312 self.volsUseCount[index] = self.volsUseCount[index]-1
313 if self.volsUseCount[index]==0:
314 self.sortedVols.append(volume)
316 for node
in daughters:
318 self.nodeCount = self.nodeCount+1
319 if self.nodeCount%10000==0:
320 print '[FIRST STAGE] Node count: ', self.nodeCount
321 elif len(self.sortedVols)<len(self.volsUseCount)
and self.volsUseCount[index]==0:
322 self.sortedVols.append(volume)
324 for node
in daughters:
326 self.nodeCount = self.nodeCount+1
327 if self.nodeCount%10000==0:
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])
337 self.volsUseCount[index] = self.volsUseCount[index]+1
338 self.nodes.append(currentNode)
340 self.nodeCount = self.nodeCount+1
341 if self.nodeCount%10000==0:
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]'
364 self.sortedVols.reverse()
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)
421 for volume
in self.sortedVols:
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) )
436 self.nodeCount = self.nodeCount+1
437 if self.nodeCount%100==0:
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)
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.
double atan2(double, double)