00001
00002 """
00003 Module to assist in writing geometry.xml content.
00004 """
00005
00006 import reference
00007
00008 class Logvol(reference.Referable):
00009 "A <logvol>"
00010 def __init__(self,name,material,shape,physvols=[]):
00011 reference.Referable.__init__(self,name)
00012 self.material = material
00013 self.shape = shape
00014 self.physvols = physvols
00015 return
00016
00017 def xml(self,fo,pre):
00018 "Output self as XML to file object fo, prefacing each line with pre"
00019 fo.write('%s<logvol name="%s" material="%s">\n'%(pre,self.name,self.material))
00020 self.shape.xml(fo,pre+' ')
00021 for pv in self.physvols:
00022 pv.xml(fo,pre+' ')
00023 fo.write('%s</logvol>\n'%pre)
00024 return
00025
00026 class Physvol:
00027 "A <physvol>"
00028 def __init__(self,name,logvol,pos=None,rot=None):
00029 self.name = name
00030 self.logvol = logvol
00031 self.pos = pos
00032 self.rot = rot
00033 return
00034
00035 def xml(self,fo,pre):
00036
00037 if self.logvol.__class__ == Logvol:
00038 lvname = self.logvol.full_path
00039 else:
00040 lvname = self.logvol
00041
00042 fo.write('%s<physvol name="%s" logvol="%s">\n'%(pre,self.name,lvname))
00043 if self.pos: self.pos.xml(fo,pre+' ')
00044 if self.rot: self.rot.xml(fo,pre+' ')
00045 fo.write('%s</physvol>\n'%pre)
00046 return
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 class Boolean:
00060 "A boolean shape, <subtraction>, etc"
00061 def __init__(self,type,name,primary,secondaries=[]):
00062 self.type = type
00063 self.name = name
00064 self.primary = primary
00065 self.secondaries = secondaries
00066 return
00067
00068 def xml(self,fo,pre):
00069 "Output self as XML to file object fo, prefacing each line with pre"
00070 fo.write('%s<%s name="%s">\n'%(pre,self.type,self.name))
00071 self.primary.xml(fo,pre+' ')
00072 for sec in self.secondaries:
00073 sec.xml(fo,pre+' ')
00074 fo.write('%s</%s>\n'%(pre,self.type))
00075 return
00076
00077 class BooleanSecondary:
00078 "A shape + position + rotation"
00079 def __init__(self,shape,pos,rot):
00080 self.shape = shape
00081 self.pos = pos
00082 self.rot = rot
00083 return
00084 def xml(self,fo,pre):
00085 "Output self as XML to file object fo, prefacing each line with pre"
00086 for thing in [self.shape, self.pos, self.rot]:
00087 thing.xml(fo,pre)
00088 return
00089
00090 class Box:
00091 "A box shape"
00092 def __init__(self,name,sizeX=None,sizeY=None,sizeZ=None):
00093 self.name = name
00094 self.sizeX = sizeX
00095 self.sizeY = sizeY
00096 self.sizeZ = sizeZ
00097 return
00098 def xml(self,fo,pre):
00099 fo.write('%s<box name="%s"'%(pre,self.name))
00100 if self.sizeX: fo.write(' sizeX="%s"'%self.sizeX)
00101 if self.sizeY: fo.write(' sizeY="%s"'%self.sizeY)
00102 if self.sizeZ: fo.write(' sizeZ="%s"'%self.sizeZ)
00103 fo.write(' />\n')
00104 return
00105
00106 class Tubs:
00107 "A cylindrical shape"
00108 def __init__(self,name,sizeZ,outerRad,innerRad=None,initPhi=None,dPhi=None):
00109 self.name=name
00110 self.sizeZ=sizeZ
00111 self.outerRad=outerRad
00112 self.innerRad=innerRad
00113 self.initPhi=initPhi
00114 self.dPhi=dPhi
00115 return
00116
00117 def xml(self,fo,pre):
00118 fo.write('%s<tubs name="%s"'%(pre,self.name))
00119 fo.write(' sizeZ="%s"'%self.sizeZ)
00120 if self.outerRad: fo.write(' outerRadius="%s"'%self.outerRad)
00121 if self.innerRad: fo.write(' innerRadius="%s"'%self.innerRad)
00122 if self.initPhi: fo.write(' startPhiAngle="%s"'%self.initPhi)
00123 if self.dPhi: fo.write(' deltaPhiAngle="%s"'%self.dPhi)
00124 fo.write(' />\n')
00125 return;
00126
00127 class zPlane:
00128 "A zplane element for PolyCone"
00129 def __init__(self, z, outerRadius, innerRadius=None):
00130 self.z=z
00131 self.outerRadius=outerRadius
00132 self.innerRadius=innerRadius
00133 return
00134
00135 def xml(self, fo, pre):
00136 fo.write('%s<zplane'%pre+' ')
00137 fo.write('z="%s"\n'%self.z)
00138 fo.write('%souterRadius="%s"\n'%(pre+" ", self.outerRadius))
00139 if self.innerRadius:
00140 fo.write('%sinnerRadius="%s"\n'%(pre+" ", self.innerRadius))
00141 fo.write('%s />\n'%pre)
00142 return
00143
00144 class polyCone:
00145 "A PolyCone with N sections"
00146 def __init__(self, name, zPos, outerRad,
00147 innerRad=None, initPhi=None, dPhi=None):
00148 self.zP=[]
00149 self.name=name
00150 self.initPhi=initPhi
00151 self.dPhi=dPhi
00152 self.nSection=len(zPos)
00153 print "polyCone # of zPlanes: ", self.nSection
00154 for i in range(self.nSection):
00155 if innerRad:
00156 self.zP.append(zPlane(zPos[i], outerRad[i], innerRad[i]))
00157 else:
00158 self.zP.append(zPlane(zPos[i], outerRad[i]))
00159 return
00160 """
00161 def xml(self, fo, pre):
00162 fo.write('%s<polycone name="%s"'%(pre,self.name))
00163 if self.initPhi:
00164 fo.write('\n%sstartPhiAngle="%s"'%(pre+' ', self.initPhi))
00165 if self.dPhi:
00166 fo.write('\n%sdeltaPhiAngle="%s"'%(pre+' ', self.dPhi))
00167 fo.write('>\n')
00168 for i in range(self.nSection):
00169 self.zP[i].xml(fo, pre+' ')
00170 fo.write('%s</polycone>\n'%pre)
00171 return;
00172 """
00173 def xml(self, fo, pre):
00174 if self.name in ["oav","lso","iav","gds"]:
00175
00176 fo.write('%s<union name="%s">\n'%(pre,self.name))
00177 fo.write('%s<tubs name="%s_cyl"\n'%(pre+' ',self.name))
00178 fo.write('%s sizeZ="%s"\n'%(pre+' ',self.zP[1].z))
00179 fo.write('%s outerRadius="%s"\n'%(pre+' ',self.zP[1].outerRadius))
00180 fo.write('%s />\n'%(pre+' '))
00181 fo.write('%s<polycone name="%s_polycone"'%(pre+' ',self.name))
00182 if self.initPhi:
00183 fo.write('\n%sstartPhiAngle="%s"'%(pre+' ', self.initPhi))
00184 if self.dPhi:
00185 fo.write('\n%sdeltaPhiAngle="%s"'%(pre+' ', self.dPhi))
00186 fo.write('>\n')
00187 for i in range(2,self.nSection):
00188 self.zP[i].xml(fo, pre+' ')
00189 fo.write('%s</polycone>\n'%(pre+' '))
00190 fo.write('%s<posXYZ z="-(%s)/2"/>\n'%(pre+' ',self.zP[1].z))
00191 fo.write('%s</union>\n'%pre)
00192 return
00193 else:
00194 fo.write('%s<polycone name="%s"'%(pre,self.name))
00195 if self.initPhi:
00196 fo.write('\n%sstartPhiAngle="%s"'%(pre+' ', self.initPhi))
00197 if self.dPhi:
00198 fo.write('\n%sdeltaPhiAngle="%s"'%(pre+' ', self.dPhi))
00199 fo.write('>\n')
00200 for i in range(self.nSection):
00201 self.zP[i].xml(fo, pre+' ')
00202 fo.write('%s</polycone>\n'%pre)
00203 return
00204
00205
00206 class PosXYZ:
00207 'A cartesian placement'
00208 def __init__(self,X=None,Y=None,Z=None):
00209 self.X = X
00210 self.Y = Y
00211 self.Z = Z
00212 return
00213 def xml(self,fo,pre):
00214 fo.write('%s<posXYZ'%pre)
00215 if self.X: fo.write(' x="%s"'%self.X)
00216 if self.Y: fo.write(' y="%s"'%self.Y)
00217 if self.Z: fo.write(' z="%s"'%self.Z)
00218 fo.write(' />\n')
00219 return
00220
00221 class RotXYZ:
00222 'A rotation about the axes'
00223 def __init__(self,rotX=None,rotY=None,rotZ=None):
00224 self.rotX = rotX
00225 self.rotY = rotY
00226 self.rotZ = rotZ
00227 return
00228 def xml(self,fo,pre):
00229 fo.write('%s<rotXYZ'%pre)
00230 if self.rotX: fo.write(' rotX="%s"'%self.rotX)
00231 if self.rotY: fo.write(' rotY="%s"'%self.rotY)
00232 if self.rotZ: fo.write(' rotZ="%s"'%self.rotZ)
00233 fo.write(' />\n')
00234 return
00235
00236 if '__main__' == __name__:
00237 import sys
00238
00239
00240 world = Logvol('lvWorld','Air',Box('world_box','10*m','10*m','10*m'))
00241 sd = Logvol('lvSubDetector','Water',Box('subdet_box','1*m','1*m','1*m'))
00242 ssd = Logvol('lvSubSubDetector','Iron',Box('subsubdet_box','10*cm','10*cm','10*cm'))
00243
00244
00245 from catalog import *
00246 from reference import *
00247 top = Catalog("Geometry", [world])
00248 sc = Catalog("Sub",[sd])
00249 ssc = Catalog("SubSub",[ssd])
00250 top.refs=[Reference("#Sub",sc),Reference("#SubSub",ssc)]
00251
00252
00253 world.physvols = [Physvol('pvSubDet1',sd,PosXYZ(Z="5*m")),
00254 Physvol('pvSubDet2',sd,PosXYZ(Z="-5*m"))]
00255 sd.physvols = [Physvol('pvSubSubDet',ssd,RotXYZ(rotZ="45*degree"))]
00256
00257
00258 for c in [top, sc, ssc]:
00259 c.xml(sys.stdout,'')
00260
00261 pass