Files
geant4/examples/advanced/Tiara/source/py_modules/variableGeometry.py
T
2016-06-09 11:11:55 +02:00

138 lines
5.3 KiB
Python

# $Id: variableGeometry.py,v 1.2 2003/06/16 17:06:45 dressel Exp $
# -------------------------------------------------------------------
# GEANT4 tag $Name: geant4-07-00-cand-01 $
# -------------------------------------------------------------------
#
import G4Kernel
import parallelHall
import posLog
class VariableSlobedGeometry(object):
def __init__(self,\
tiaraSpecs,
cellSizeImportanceList,
parallelGeo):
self.arrPosLogVol = []
self.normalCellSolids = []
self.logNormCells = []
self.lastCellSolid = None
self.logLastCell = None
self.createCells(tiaraSpecs,
cellSizeImportanceList, parallelGeo)
def createCells(self, tiaraSpecs,
cellSizeImportanceList, parallelGeo):
nImps = len(cellSizeImportanceList)
zCellStart = tiaraSpecs.dimensions.targetPosZ + \
tiaraSpecs.dimensions.distTargetExperiment + \
tiaraSpecs.experiment.colWidth
zCellRegion = parallelGeo.halfLength - zCellStart
print "zCellStart", zCellStart, "zCellRegion", zCellRegion
vacuum = tiaraSpecs.materials.GetMaterial("vacuum")
for i in range(nImps):
ncsName = "cellBox_%(i)d" % vars()
print "i", i, "cswidth", cellSizeImportanceList[i]["width"]
ncs = G4Kernel.G4Box(ncsName,
parallelGeo.halfWidth,
parallelGeo.halfWidth,
0.5 * cellSizeImportanceList[i]["width"])
self.normalCellSolids.append(ncs)
nclName = "cellLog_%(i)d" % vars()
ncl = G4Kernel.G4LogicalVolume(ncs,
vacuum,
nclName)
self.logNormCells.append(ncl)
zPos = zCellStart
for i in range(nImps):
zPos += 0.5 * cellSizeImportanceList[i]["width"]
print "zPos", zPos, "cellNum", i
self.arrPosLogVol.append(posLog.PosLog(zPos, self.logNormCells[i]))
zPos += 0.5 * cellSizeImportanceList[i]["width"]
allCellWidth = 0.0
for i in range(nImps):
allCellWidth+=cellSizeImportanceList[i]["width"]
print "allCellWidth", allCellWidth
lengthLastCell = zCellRegion - allCellWidth
self.lastCellSolid = G4Kernel.G4Box("lastCellBox",
parallelGeo.halfWidth,
parallelGeo.halfWidth,
lengthLastCell/2)
self.logLastCell = G4Kernel.G4LogicalVolume(self.lastCellSolid,
vacuum,
"lastCellLog")
zPos += lengthLastCell/2
print "last cell zPos", zPos, "length", lengthLastCell
self.arrPosLogVol.append(posLog.PosLog(zPos, self.logLastCell))
def getArrPosLogVol(self):
return self.arrPosLogVol
class VariableImpSlabGeometry(object):
def __init__(self, tiaraSpecs,
parallelGeo = None):
self.tiaraSpecs = tiaraSpecs
self.cellSizeImportanceList = []
self.parallelGeo = parallelGeo
self.iStore = None
self.geometryCells = []
self.base = 0.0
self.nameExt = "-variableCellWidth"
def addCellImportance(self, width, faktor):
self.cellSizeImportanceList.append(
{"width":width, "faktor":faktor})
def construct(self):
nImps = len(self.cellSizeImportanceList)
if nImps>0:
for i in range(nImps):
self.base+=1.0*self.cellSizeImportanceList[i]["faktor"]
self.base/=nImps
self.createParallelGeometry(self.tiaraSpecs)
self.setImportances()
def createParallelGeometry(self, tiaraSpecs):
self.parallelGeo = parallelHall.ParallelHall(tiaraSpecs)
self.slobedGeo = VariableSlobedGeometry(\
tiaraSpecs,
self.cellSizeImportanceList,
self.parallelGeo)
self.parallelGeo.placeCells(self.slobedGeo.getArrPosLogVol())
self.iStore = G4Kernel.G4IStore(self.parallelGeo.getWorldVolume())
self.geometryCells = self.parallelGeo.getGeometryCells()
def setImportances(self):
worldCell = G4Kernel.G4GeometryCell(self.parallelGeo.\
getWorldVolume(), 0)
self.iStore.AddImportanceGeometryCell(1, worldCell)
nCells = len(self.geometryCells)
nImps = len(self.cellSizeImportanceList)
if ((nCells - 1) != nImps):
print "VariableImpSlabGeometry: ERROR importances and cells don't mach!", nCells, nImps
importance = 1
for i in range(nImps):
cell = self.geometryCells[i]
importance*=self.cellSizeImportanceList[i]["faktor"]
print "i=", importance
self.iStore.AddImportanceGeometryCell(importance, cell)
lastCell = self.geometryCells[nCells-1]
print "last cells i=", importance
self.iStore.AddImportanceGeometryCell(importance, lastCell)
def getWorldVolume(self):
return self.parallelGeo.getWorldVolume()
def getImportanceStore(self):
return self.iStore