| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

geometry.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
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 ### this isn't actually supported.
00050 # class Physvolref:
00051 #     "A <physvolref/>"
00052 #     def __init__(self,url):
00053 #         self.url = url
00054 #         return
00055 #
00056 #     def xml(self,fo,pre):
00057 #         fo.write('%s<physvolref href="%s"/>\n'%(pre,self.url))
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             # Hack to use union of cylinder plus polycone
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     # Logical volumes
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     # Catalogs
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     # Physical volumes
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     # Dump
00258     for c in [top, sc, ssc]:
00259         c.xml(sys.stdout,'')
00260 
00261     pass
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:14:01 2011 for XmlDetDesc by doxygen 1.4.7