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

In This Package:

gen.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 """
00003 Generate Pool geometry files
00004 """
00005 
00006 # All the boxy volumes
00007 pool_element_names = ["Dead","Liner","OWS", "Curtain", "IWS" ]
00008 
00009 # Those that matter to reconstruction
00010 pool_detelem_data = [
00011     ("OWS","pv%(nf)sHallBot/pv%(nf)sPoolDead/pv%(nf)sPoolLiner/pv%(nf)sPoolOWS"),
00012     ("Curtain","pv%(nf)sPoolCurtain"),
00013     ("IWS","pv%(nf)sPoolIWS" )]
00014 
00015 
00016 gen_pool_pmts = True
00017 
00018 class Element:
00019     def __init__(self,name,nick,material,thickness="0*m",parent=None):
00020         self.name=name
00021         self.nick=nick
00022         self.thickness=thickness
00023         self.material=material
00024         self.parent=parent
00025         self.child=None
00026         if parent: parent.child = self
00027         self.params = {}
00028         self.logvol = {}
00029         self.physvol = {}
00030         return
00031 
00032     def param_fullname(self,param_name,site=""):
00033         if self.name == 'HallBot':
00034             return "%s%s%s"%(site,self.name,param_name)
00035         return "%sPool%s%s"%(site,self.name,param_name)
00036 
00037     def param_diffname(self,diffname,param_name,site=""):
00038         return "%sPool%s%s"%(site,diffname,param_name)
00039 
00040 
00041     def parameters(self):
00042         from XmlDetDescGen.parameter import Parameter
00043 
00044         if self.params: return self.params
00045 
00046         p = Parameter(self.param_fullname("Thickness"),self.thickness,"Thickness of %s"%self.nick)
00047         self.params[self.param_fullname("Thickness")] = p
00048         
00049 
00050         if self.parent.name == 'HallBot':
00051             parentThickness = "0*m"
00052         else:
00053             parentThickness = self.parent.param_fullname('Thickness')
00054         for site in ["Near","Far"]:
00055             for dim in ["X","Y"]:
00056                 pname = "Size"+dim
00057                 self.params[self.param_fullname(pname,site)] = \
00058                     Parameter(self.param_fullname(pname,site),
00059                               self.parent.param_fullname(pname,site)+"-2*"+parentThickness)
00060                 continue
00061             continue
00062 
00063         self.params[self.param_fullname('SizeZ')] = \
00064             Parameter(self.param_fullname('SizeZ'),
00065                       self.parent.param_fullname('SizeZ')+"-"+parentThickness)
00066 
00067         self.params[self.param_fullname('LiftSizeZ')] = \
00068             Parameter(self.param_fullname('LiftSizeZ'),"0.5*"+parentThickness)
00069 
00070         bevel = []
00071         elem = self
00072         while elem:
00073             bevel.append(elem.param_fullname('Thickness'))
00074             elem = elem.child
00075             continue
00076         self.params[self.param_fullname('BevelSize')] = \
00077             Parameter(self.param_fullname('BevelSize'),
00078                       "2*(sqrt(2)-1)*(%s)"%"+".join(bevel))
00079 
00080         return self.params
00081     
00082     def logical_volume(self,site):
00083         try:
00084             return self.logvol[site]
00085         except KeyError:
00086             pass
00087             
00088         from XmlDetDescGen.geometry import Box,Boolean,BooleanSecondary,Logvol,PosXYZ,RotXYZ
00089 
00090         # Make the subtracted ones first
00091         subtracted = []
00092         signX = ['0.5*%s', '0.5*%s','-0.5*%s','-0.5*%s']
00093         signY = ['0.5*%s','-0.5*%s', '0.5*%s','-0.5*%s']
00094         signX2 = ['0.5*%s', '0.5*%s','-0.5*%s','-0.5*%s']
00095         signY2 = ['0*%s', '0.5*%s','-0.5*%s', '0.5*%s','-0.5*%s']
00096         signR = ['0*%s', '0.5*%s','-0.5*%s', '0.5*%s','-0.5*%s']
00097 
00098         if self.name=="OWS":
00099             
00100             for ind in range(0,4):
00101                 subtracted.append(BooleanSecondary(
00102                     Box(site.lower()+'_pool_'+self.name.lower()+'_sub%d'%ind,
00103                         sizeX=self.param_diffname('Liner','BevelSize'),
00104                         sizeY=self.param_diffname('Liner','BevelSize'),
00105                         sizeZ="SubShift+" + self.param_fullname('SizeZ')),
00106                     PosXYZ(X=signX[ind]%self.param_diffname('Liner','SizeX',site),
00107                            Y=signY[ind]%self.param_diffname('Liner','SizeY',site),
00108                            Z="0*m"),
00109                     RotXYZ(rotZ="45*degree")))
00110 
00111             for ind in range(4,8):
00112                 subtracted.append(BooleanSecondary(
00113                     Box(site.lower()+'_pool_'+self.name.lower()+'_sub%d'%ind,
00114                         sizeX=self.param_fullname('BevelSize'),
00115                         sizeY=self.param_fullname('BevelSize'),
00116                         sizeZ=self.param_fullname('SizeZ')),
00117                     PosXYZ(X=signX[ind-4]%self.param_fullname('SizeX',site),
00118                            Y=signY[ind-4]%self.param_fullname('SizeY',site),
00119                            Z="-TopGapThickness"),
00120                     RotXYZ(rotZ="45*degree")))
00121                 
00122             subtracted.append(BooleanSecondary(
00123                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub8',
00124                     sizeX=self.param_fullname('SizeX',site),
00125                     sizeY="SubShift",
00126                     sizeZ=self.param_fullname('SizeZ')),
00127                 PosXYZ(X="0*cm",
00128                        Y=self.param_fullname('SizeY',site)+"/2."+"+SubShift/2.-PoolLinerThickness",
00129                        Z="-TopGapThickness"),
00130                 RotXYZ(rotZ="0*degree")))
00131 
00132             subtracted.append(BooleanSecondary(
00133                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub9',
00134                     sizeX=self.param_fullname('SizeX',site),
00135                     sizeY="SubShift",
00136                     sizeZ=self.param_fullname('SizeZ')),
00137                 PosXYZ(X="0*cm",
00138                        Y=self.param_fullname('SizeY',site)+"/(-2.)"+"-SubShift/2.+PoolLinerThickness",
00139                        Z="-TopGapThickness"),
00140                 RotXYZ(rotZ="0*degree")))
00141 
00142             subtracted.append(BooleanSecondary(
00143                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub10',
00144                     sizeX=self.param_fullname('SizeX',site),
00145                     sizeY="SubShift",
00146                     sizeZ=self.param_fullname('SizeZ')),
00147                 PosXYZ(X=self.param_fullname('SizeX',site)+"/2."+"+SubShift/2.-PoolLinerThickness",
00148                        Y="0*cm",
00149                        Z="-TopGapThickness"),
00150                 RotXYZ(rotZ="90*degree")))
00151 
00152             subtracted.append(BooleanSecondary(
00153                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub11',
00154                     sizeX=self.param_fullname('SizeX',site),
00155                     sizeY="SubShift",
00156                     sizeZ=self.param_fullname('SizeZ')),
00157                 PosXYZ(X=self.param_fullname('SizeX',site)+"/(-2.)"+"-SubShift/2.+PoolLinerThickness",
00158                        Y="0*cm",
00159                        Z="-TopGapThickness"),
00160                 RotXYZ(rotZ="90*degree")))
00161 
00162 
00163 
00164             # Make the subtraction
00165             sub = Boolean("subtraction",site.lower()+'_pool_'+self.name.lower()+'_box',
00166                           Box(site.lower()+'_pool_'+self.name.lower(),
00167                               sizeX=self.param_diffname('Liner','SizeX',site),
00168                               sizeY=self.param_diffname('Liner','SizeY',site),
00169                               sizeZ=self.param_fullname('SizeZ')),
00170                           subtracted)
00171 
00172         elif self.name=="IWS":
00173 
00174             for ind in range(0,4):
00175                 subtracted.append(BooleanSecondary(
00176                     Box(site.lower()+'_pool_'+self.name.lower()+'_sub%d'%ind,
00177                         sizeX=self.param_diffname('Curtain','BevelSize'),
00178                         sizeY=self.param_diffname('Curtain','BevelSize'),
00179                         sizeZ="SubShift+" + self.param_fullname('SizeZ')),
00180                     PosXYZ(X=signX[ind]%self.param_diffname('Curtain','SizeX',site),
00181                            Y=signY[ind]%self.param_diffname('Curtain','SizeY',site),
00182                            Z="0*m"),
00183                     RotXYZ(rotZ="45*degree")))
00184 
00185             for ind in range(4,8):
00186                 subtracted.append(BooleanSecondary(
00187                     Box(site.lower()+'_pool_'+self.name.lower()+'_sub%d'%ind,
00188                         sizeX=self.param_fullname('BevelSize'),
00189                         sizeY=self.param_fullname('BevelSize'),
00190                         sizeZ=self.param_fullname('SizeZ')),
00191                     PosXYZ(X=signX[ind-4]%self.param_fullname('SizeX',site),
00192                            Y=signY[ind-4]%self.param_fullname('SizeY',site),
00193                            Z="-TopGapThickness"),
00194                     RotXYZ(rotZ="45*degree")))
00195                 
00196             subtracted.append(BooleanSecondary(
00197                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub8',
00198                     sizeX=self.param_fullname('SizeX',site),
00199                     sizeY="SubShift",
00200                     sizeZ=self.param_fullname('SizeZ')),
00201                 PosXYZ(X="0*cm",
00202                        Y=self.param_fullname('SizeY',site)+"/2."+"+SubShift/2.-PoolCurtainThickness",
00203                        Z="-TopGapThickness"),
00204                 RotXYZ(rotZ="0*degree")))
00205 
00206             subtracted.append(BooleanSecondary(
00207                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub9',
00208                     sizeX=self.param_fullname('SizeX',site),
00209                     sizeY="SubShift",
00210                     sizeZ=self.param_fullname('SizeZ')),
00211                 PosXYZ(X="0*cm",
00212                        Y=self.param_fullname('SizeY',site)+"/(-2.)"+"-SubShift/2.+PoolCurtainThickness",
00213                        Z="-TopGapThickness"),
00214                 RotXYZ(rotZ="0*degree")))
00215 
00216             subtracted.append(BooleanSecondary(
00217                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub10',
00218                     sizeX=self.param_fullname('SizeX',site),
00219                     sizeY="SubShift",
00220                     sizeZ=self.param_fullname('SizeZ')),
00221                 PosXYZ(X=self.param_fullname('SizeX',site)+"/2."+"+SubShift/2.-PoolCurtainThickness",
00222                        Y="0*cm",
00223                        Z="-TopGapThickness"),
00224                 RotXYZ(rotZ="90*degree")))
00225 
00226             subtracted.append(BooleanSecondary(
00227                 Box(site.lower()+'_pool_'+self.name.lower()+'_sub11',
00228                     sizeX=self.param_fullname('SizeX',site),
00229                     sizeY="SubShift",
00230                     sizeZ=self.param_fullname('SizeZ')),
00231                 PosXYZ(X=self.param_fullname('SizeX',site)+"/(-2.)"+"-SubShift/2.+PoolCurtainThickness",
00232                        Y="0*cm",
00233                        Z="-TopGapThickness"),
00234                 RotXYZ(rotZ="90*degree")))
00235 
00236 
00237 
00238             # Make the subtraction
00239             sub = Boolean("subtraction",site.lower()+'_pool_'+self.name.lower()+'_box',
00240                           Box(site.lower()+'_pool_'+self.name.lower(),
00241                               sizeX=self.param_diffname('Curtain','SizeX',site),
00242                               sizeY=self.param_diffname('Curtain','SizeY',site),
00243                               sizeZ=self.param_fullname('SizeZ')),
00244                           subtracted)
00245 
00246         else:
00247             for ind in range(0,4):
00248                 subtracted.append(BooleanSecondary(
00249                     Box(site.lower()+'_pool_'+self.name.lower()+'_sub%d'%ind,
00250                         sizeX=self.param_fullname('BevelSize'),
00251                         sizeY=self.param_fullname('BevelSize'),
00252                         sizeZ="1*cm+"+self.param_fullname('SizeZ')),
00253                     PosXYZ(X=signX[ind]%self.param_fullname('SizeX',site),
00254                            Y=signY[ind]%self.param_fullname('SizeY',site),
00255                            Z="0*m"),
00256                     RotXYZ(rotZ="45*degree")))
00257 
00258             # Make the subtraction
00259             sub = Boolean("subtraction",site.lower()+'_pool_'+self.name.lower()+'_box',
00260                           Box(site.lower()+'_pool_'+self.name.lower(),
00261                               sizeX=self.param_fullname('SizeX',site),
00262                               sizeY=self.param_fullname('SizeY',site),
00263                               sizeZ=self.param_fullname('SizeZ')),
00264                           subtracted)
00265                 
00266 
00267         if self.child: 
00268             from XmlDetDescGen.geometry import Physvol
00269 
00270             pvs = self.child.physical_volume(site)
00271             if gen_pool_pmts and site=="Far" and self.name == "OWS":
00272                 pvs.append(Physvol("pv%sOutPTE"%site,"/dd/Geometry/PmtPanel/lv%sOutPTE"%site))
00273             if gen_pool_pmts and site=="Near" and self.name == "OWS":
00274                 pvs.append(Physvol("pvVetoPmt%sOutFacein"%site,"/dd/Geometry/PmtPanel/lvVetoPmt%sOutFacein"%site, PosXYZ(Z="-PoolOWSSizeZ/2.")))
00275                 pvs.append(Physvol("pvVetoPmt%sOutFaceout"%site,"/dd/Geometry/PmtPanel/lvVetoPmt%sOutFaceout"%site, PosXYZ(Z="-PoolOWSSizeZ/2.")))
00276             
00277         else:                   # must be OWS, add ADEs
00278             #from XmlDetDescGen.util import ExternalEntity
00279             #pvs = [ ExternalEntity('AD%sPlacements'%site) ]
00280 
00281             from XmlDetDescGen.geometry import Physvol, PosXYZ
00282             
00283             pvs = []
00284             if site == 'Near':
00285                 pvs.append(Physvol("pvNearADE1","/dd/Geometry/AD/lvADE",
00286                                    PosXYZ(X="1*(0.5*NearPoolIWSSizeX-PoolIWSThickness)",
00287                                           Z="ADadeZplace")));
00288                 pvs.append(Physvol("pvNearADE2","/dd/Geometry/AD/lvADE",
00289                                    PosXYZ(X="-1*(0.5*NearPoolIWSSizeX-PoolIWSThickness)",
00290                                           Z="ADadeZplace")));
00291             else:
00292                 pvs.append(Physvol("pvFarADE1","/dd/Geometry/AD/lvADE",
00293                                    PosXYZ(X="1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00294                                           Y="1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00295                                           Z="ADadeZplace")))
00296                 pvs.append(Physvol("pvFarADE2","/dd/Geometry/AD/lvADE",
00297                                    PosXYZ(X="-1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00298                                           Y="1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00299                                           Z="ADadeZplace")))
00300                 pvs.append(Physvol("pvFarADE3","/dd/Geometry/AD/lvADE",
00301                                    PosXYZ(X="-1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00302                                           Y="-1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00303                                           Z="ADadeZplace")))
00304                 pvs.append(Physvol("pvFarADE4","/dd/Geometry/AD/lvADE",
00305                                    PosXYZ(X="1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00306                                           Y="-1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00307                                           Z="ADadeZplace")))
00308             if gen_pool_pmts and site=="Far":
00309                 pvs.append(Physvol("pv%sInPTE"%site,"/dd/Geometry/PmtPanel/lv%sInPTE"%site))
00310             if gen_pool_pmts and site=="Near":
00311                 pvs.append(Physvol("pvVetoPmt%sInn"%site,"/dd/Geometry/PmtPanel/lvVetoPmt%sInn"%site, PosXYZ(Z="(PoolIWSSizeZ-PoolOWSSizeZ)/2.-PoolOWSSizeZ/2.")))
00312 
00313         from XmlDetDescGen.util import ExternalEntity
00314         pvs.append(ExternalEntity("%sHandWrittenPhysVols"%site))
00315 
00316         lv = Logvol('lv'+site+'Pool'+self.name,self.material,sub,pvs)
00317         self.logvol[site] = lv;
00318         return lv;
00319 
00320     def physical_volume(self,site):
00321         try:
00322             return self.physvol[site]
00323         except KeyError:
00324             pass
00325 
00326         from XmlDetDescGen.geometry import Physvol,PosXYZ
00327             
00328         lv = self.logical_volume(site)
00329         #print site,self.name,lv.name
00330         pv = Physvol('pv'+site+'Pool'+self.name,lv,
00331                      PosXYZ(X="0*m",Y="0*m",Z=self.param_fullname('LiftSizeZ')))
00332         self.physvol[site] = [pv]
00333         return self.physvol[site]
00334     
00335 
00336 
00337 class Pool:
00338     def __init__(self):
00339         self.parameters_filename="parameters.xml"
00340         self.geometry_filename="geometry.xml"
00341         self.structure_filename="structure.xml"
00342 
00343         hallbot = Element("HallBot","bottom of hall","Rock")
00344         dead = Element("Dead","dead space","DeadWater","84*mm",hallbot)
00345 #        liner = Element("Liner","tyvek liner","Tyvek","50*micrometer",dead)
00346         liner = Element("Liner","tyvek liner","Tyvek","4*mm",dead)
00347         ows = Element("OWS","outer water shield","OwsWater","1.0*m",liner)
00348 #        curtain = Element("Curtain","tyvek curtain","Tyvek","50*micrometer",ows)
00349         curtain = Element("Curtain","tyvek curtain","Tyvek","4*mm",ows)
00350         iws = Element("IWS","inner water shield","IwsWater","4.037*m",curtain)
00351 
00352         self.pool_elements = { "Dead":dead, "Liner":liner, "OWS":ows, "Curtain":curtain, "IWS":iws }
00353 
00354         #self.general_parameters = [
00355         #    Parameter("PoolLipHeight","0.2*m","Height of concrete lip around pool")
00356         #    ]
00357 
00358         self.geometry_cat = None
00359         self.outdir = "."
00360         return
00361 
00362     def geometry_catalog(self):
00363         if self.geometry_cat: return self.geometry_cat
00364 
00365         from XmlDetDescGen.catalog import Catalog
00366         from XmlDetDescGen.reference import Reference
00367 
00368         topcat = Catalog('Geometry');
00369         poolcat = Catalog('Pool');
00370 
00371         # This is fake, just to get the right /dd/Geometry path
00372         topcat.refs = [ Reference("#Pool",poolcat) ]
00373 
00374         for name in pool_element_names:
00375             ele = self.pool_elements[name]
00376             for site in ["Near","Far"]:
00377                 lv = ele.logical_volume(site)
00378                 poolcat.refs.append(Reference("%s.xml#%s"%(name,lv.name),lv))
00379                 continue
00380             continue
00381 
00382         # Important, needed so full_paths can be set
00383         topcat.update()
00384 
00385         self.geometry_cat = poolcat
00386         return poolcat
00387 
00388 
00389     def get_param_header(self):
00390 
00391         from XmlDetDescGen.util import Comment
00392 
00393         s = []
00394         s.append('''
00395      Define the water pool.  This is done by subsequently placing
00396      these volumes inside the bootom of the hall and then placing each
00397      in the previous.
00398 ''')
00399         for thing in pool_element_names:
00400             s.append('    - %s'%thing)
00401             continue
00402         s.append('''
00403      Each of these elements are specified by their thickness relative
00404      to their parents and the assumptions that they are concentric in
00405      X and Y and are lifted by one thickness when placed so that all
00406      their tops are coplanar.  In addition, a bevel size is
00407      calculated.  This is used to subtract out the corners of the
00408      boxes to make octagonal shapes.  It is assumed that Z sizes are
00409      site-independent.
00410 
00411      This all results in parameters looking like:
00412 
00413      NearPool_THING_SizeX
00414      NearPool_THING_SizeY
00415       FarPool_THING_SizeX
00416       FarPool_THING_SizeY
00417          Pool_THING_SizeZ
00418          Pool_THING_LiftZ
00419          Pool_THING_BevelSize
00420 
00421      Where _THING_ is
00422 ''')
00423         for thing in pool_element_names:
00424             ele = self.pool_elements[thing]
00425             s.append('    %s - %s'%(ele.name,ele.nick))
00426             continue
00427         return Comment('\n'.join(s))
00428 
00429     def get_pool_parameters(self):
00430         from XmlDetDescGen.parameter import Parameter
00431         ret = [Parameter('TableHeight','2.5*m','Distance from pool floor to AD table'),
00432                Parameter("ADadeZplace",'TableHeight+0.5*ADadeHeight-0.5*PoolIWSSizeZ-PoolDeadThickness-PoolLinerThickness-PoolOWSThickness-PoolCurtainThickness','A position of AD adeelopes'),]
00433         
00434         for thing in pool_element_names:
00435             ele = self.pool_elements[thing]
00436             params = ele.parameters()
00437             p = params[ele.param_fullname('Thickness')]
00438             ret.append(p)
00439             continue
00440         for thing in pool_element_names:
00441             ele = self.pool_elements[thing]
00442             for name,param in ele.params.iteritems():
00443                 if name == ele.param_fullname('Thickness'):continue
00444                 ret.append(param)
00445                 continue
00446             continue
00447         return ret
00448 
00449     def parameters_file(self):
00450         from XmlDetDescGen.util import XmlFile
00451         objects = [self.get_param_header()]
00452         objects.extend(self.get_pool_parameters())
00453         file = XmlFile(objects=objects)
00454         file.write(self.outdir+"/"+self.parameters_filename)
00455         return
00456 
00457     def geometry_files(self):
00458         from XmlDetDescGen.util import XmlFile,ExternalEntity
00459         file = XmlFile(dtd="../DTD/geometry.dtd",
00460                        objects=[ExternalEntity("SiteParameters"),
00461                                 ExternalEntity("PoolParameters"),
00462                                 ExternalEntity("PoolDetailsParameters"),
00463                                 self.geometry_catalog()],
00464                        external_entities=[("SiteParameters","../Sites/parameters.xml"),("PoolDetailsParameters","../PoolDetails/parameters.xml"),
00465                                           ("PoolParameters","parameters.xml")])
00466         file.write(self.outdir+"/"+self.geometry_filename)
00467         return
00468 
00469 
00470     def thing_files(self):
00471         from XmlDetDescGen.util import XmlFile,ExternalEntity
00472         for name in pool_element_names:
00473             ele = self.pool_elements[name]
00474 
00475             ees = [("SiteParameters","../Sites/parameters.xml"),("PoolDetailsParameters","../PoolDetails/parameters.xml"),
00476                    ("PoolParameters","parameters.xml"),
00477                    ("FarHandWrittenPhysVols","../PoolDetails/Far%sPhysVols.xml"%name),
00478                    ("NearHandWrittenPhysVols","../PoolDetails/Near%sPhysVols.xml"%name)]
00479 
00480             objects = [ExternalEntity("SiteParameters"),ExternalEntity("PoolDetailsParameters"),
00481                        ExternalEntity("PoolParameters")]
00482 
00483             if name == "IWS":
00484                 ees += [("ADParameters","../AD/parameters.xml")]
00485                 objects += [ExternalEntity("ADParameters")]
00486                 pass
00487 
00488             objects += [ele.logical_volume("Near"),
00489                         ele.logical_volume("Far")]
00490 
00491             file = XmlFile(dtd="../DTD/geometry.dtd",
00492                            objects=objects,
00493                            external_entities=ees)
00494             file.write("%s/%s.xml"%(self.outdir,name))
00495             continue
00496         return
00497 
00498     def detid(self,loc,det):
00499         # All hard coded numbers from Conventions/DetectorId.h
00500         if loc.lower() == 'db':
00501             iloc = 0x01
00502         elif loc.lower() == 'la':
00503             iloc = 0x02
00504         elif loc.lower() == 'far':
00505             iloc = 0x04
00506         else:
00507             iloc = 0x00
00508         if det.lower() == 'iws':
00509             idet = 5
00510         elif det.lower() == 'ows':
00511             idet = 6
00512         else:
00513             idet = 0
00514         detid = ((iloc<<24)|(idet<<16))
00515         from XmlDetDescGen.structure import UserParameter
00516         return UserParameter("DetectorID","int", ['0x%x'%detid],
00517                              desc="Packed Detector ID")
00518 
00519 
00520         
00521     def structure_file(self):
00522         from XmlDetDescGen.util import XmlFile,ExternalEntity
00523         from XmlDetDescGen.reference import Reference
00524         from XmlDetDescGen.structure import DetElem
00525         from XmlDetDescGen.catalog import Catalog
00526 
00527         ees = [ ("dbInnFinpmts", "../PoolPmtStructure/dbInnFin.xml"),
00528                 ("dbOutFinpmts", "../PoolPmtStructure/dbOutFin.xml"),
00529                 ("dbOutFoutpmts", "../PoolPmtStructure/dbOutFout.xml"),
00530                 ("laInnFinpmts", "../PoolPmtStructure/laInnFin.xml"),
00531                 ("laOutFinpmts", "../PoolPmtStructure/laOutFin.xml"),
00532                 ("laOutFoutpmts", "../PoolPmtStructure/laOutFout.xml"),
00533                 ("farInnFinpmts", "../PoolPmtStructure/farInnFin.xml"),
00534                 ("farOutFinpmts", "../PoolPmtStructure/farOutFin.xml"),
00535                 ("farOutFoutpmts", "../PoolPmtStructure/farOutFout.xml") 
00536                 ]
00537 
00538         file = XmlFile(dtd="../DTD/structure.dtd",
00539                        external_entities=ees)
00540 
00541         # To assure logical volume's full_path is set
00542         gc = self.geometry_catalog()
00543         gc.update()
00544 
00545         topcat = Catalog('Structure');
00546         poolcat = Catalog('Pool');
00547         # Clear our refs because some how this is filled with the
00548         # contents of the /Geometry/Pool catalog!  Python bug???
00549         poolcat.refs = []       
00550         topcat.refs = [ poolcat ]
00551 
00552         base = "/dd/Structure/Pool/"
00553 
00554         delist = {"DB":[],"LA":[],"Far":[]}
00555 
00556         last_support = "/dd/Structure/Sites/%(loc)s-rock"
00557 
00558         for (thing,npath) in pool_detelem_data:
00559             ele = self.pool_elements[thing]
00560             nf="Near"
00561             for loc,adn in zip(["DB","LA","Far"],[2,2,4]):
00562                 if loc == "Far": nf = "Far"
00563                 lv_name = '/dd/Geometry/Pool/'+ele.logical_volume(nf).name
00564                 de = DetElem(loc.lower()+'-'+thing.lower(),
00565                              lv_name,
00566                              npath%{"loc":loc,"nf":nf},
00567                              last_support%{'loc':loc.lower()})
00568                 de.refs = []
00569                 if thing == 'IWS':
00570                     for iad in range(0,adn):
00571                         iad+=1
00572                         href='../AD/structure.xml#%s-ade%d'%(loc.lower(),iad)
00573                         de.refs.append(Reference(href,de))
00574                         continue
00575                 if thing == 'IWS':
00576                     de.refs.append(ExternalEntity(loc.lower()+"InnFinpmts"))
00577                 if thing == 'OWS':
00578                     de.refs.append(ExternalEntity(loc.lower()+"OutFinpmts"))
00579                     de.refs.append(ExternalEntity(loc.lower()+"OutFoutpmts"))
00580 
00581                 if thing == 'IWS' or thing == 'OWS':
00582                     de.refs.append(self.detid(loc,thing))
00583                 poolcat.things.append(de)
00584                 delist[loc].append(de)
00585                 continue
00586             last_support = base+"%(loc)s-"+ thing.lower()
00587             continue
00588         
00589 
00590         # Fix up detelemrefs
00591         for (k,lst) in delist.iteritems():
00592             lst.reverse()
00593             while lst:
00594                 de = lst.pop()
00595                 try:
00596                     next_de = lst[-1]
00597                 except IndexError:
00598                     break
00599                 de.refs.insert(0,Reference("#%s"%next_de.name,next_de))
00600                 continue
00601             continue
00602 
00603         file.objects = [ poolcat ]
00604         file.write(self.outdir+"/"+self.structure_filename)
00605         return
00606 
00607 
00608 if '__main__' == __name__:
00609     pool = Pool()
00610     import sys
00611     import os
00612         
00613     try:
00614         xddroot = sys.argv[1]
00615     except IndexError:
00616         xddroot = os.getenv("XMLDETDESCROOT")
00617 
00618     if not xddroot:
00619         print "No XMLDETDESCROOT directory given by environment or command line"
00620         print "Using current working directory"
00621         xddroot="."
00622 
00623     outdir=xddroot + "/DDDB/Pool"
00624     if not os.path.exists(outdir):
00625         print "Directory does not exist, please make first"
00626         print outdir
00627         sys.exit(1)
00628 
00629     pool.outdir = outdir
00630 
00631     pool.parameters_file()
00632     pool.geometry_files()
00633     pool.thing_files()
00634     pool.structure_file()
00635 
00636 
00637     
00638 
| 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