00001
00002 """
00003 Generate Pool geometry files
00004 """
00005
00006
00007 pool_element_names = ["Dead","Liner","OWS", "Curtain", "IWS" ]
00008
00009
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
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
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
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
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:
00278
00279
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
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
00346 liner = Element("Liner","tyvek liner","Tyvek","4*mm",dead)
00347 ows = Element("OWS","outer water shield","OwsWater","1.0*m",liner)
00348
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
00355
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
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
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
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
00542 gc = self.geometry_catalog()
00543 gc.update()
00544
00545 topcat = Catalog('Structure');
00546 poolcat = Catalog('Pool');
00547
00548
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
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