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 self.name == "OWS":
00272 pvs.append(Physvol("pv%sOutPTE"%site,"/dd/Geometry/PmtPanel/lv%sOutPTE"%site))
00273
00274
00275 else:
00276
00277
00278
00279 from XmlDetDescGen.geometry import Physvol, PosXYZ
00280
00281 pvs = []
00282 if site == 'Near':
00283 pvs.append(Physvol("pvNearADE1","/dd/Geometry/AD/lvADE",
00284 PosXYZ(X="1*(0.5*NearPoolIWSSizeX-PoolIWSThickness)",
00285 Z="ADadeZplace")));
00286 pvs.append(Physvol("pvNearADE2","/dd/Geometry/AD/lvADE",
00287 PosXYZ(X="-1*(0.5*NearPoolIWSSizeX-PoolIWSThickness)",
00288 Z="ADadeZplace")));
00289 else:
00290 pvs.append(Physvol("pvFarADE1","/dd/Geometry/AD/lvADE",
00291 PosXYZ(X="1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00292 Y="1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00293 Z="ADadeZplace")))
00294 pvs.append(Physvol("pvFarADE2","/dd/Geometry/AD/lvADE",
00295 PosXYZ(X="-1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00296 Y="1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00297 Z="ADadeZplace")))
00298 pvs.append(Physvol("pvFarADE3","/dd/Geometry/AD/lvADE",
00299 PosXYZ(X="-1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00300 Y="-1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00301 Z="ADadeZplace")))
00302 pvs.append(Physvol("pvFarADE4","/dd/Geometry/AD/lvADE",
00303 PosXYZ(X="1*(0.5*FarPoolIWSSizeX-PoolIWSThickness)",
00304 Y="-1*(0.5*FarPoolIWSSizeY-PoolIWSThickness)",
00305 Z="ADadeZplace")))
00306 if gen_pool_pmts:
00307 pvs.append(Physvol("pv%sInPTE"%site,"/dd/Geometry/PmtPanel/lv%sInPTE"%site))
00308
00309 from XmlDetDescGen.util import ExternalEntity
00310 pvs.append(ExternalEntity("%sHandWrittenPhysVols"%site))
00311
00312 lv = Logvol('lv'+site+'Pool'+self.name,self.material,sub,pvs)
00313 self.logvol[site] = lv;
00314 return lv;
00315
00316 def physical_volume(self,site):
00317 try:
00318 return self.physvol[site]
00319 except KeyError:
00320 pass
00321
00322 from XmlDetDescGen.geometry import Physvol,PosXYZ
00323
00324 lv = self.logical_volume(site)
00325
00326 pv = Physvol('pv'+site+'Pool'+self.name,lv,
00327 PosXYZ(X="0*m",Y="0*m",Z=self.param_fullname('LiftSizeZ')))
00328 self.physvol[site] = [pv]
00329 return self.physvol[site]
00330
00331
00332
00333 class Pool:
00334 def __init__(self):
00335 self.parameters_filename="parameters.xml"
00336 self.geometry_filename="geometry.xml"
00337 self.structure_filename="structure.xml"
00338
00339
00340
00341 print " --------- for mini-dry run change the material of the pool from Dead/Ows/Iws/Water to Vacuum ------ "
00342 hallbot = Element("HallBot","bottom of hall","Rock")
00343 dead = Element("Dead","dead space","Vacuum","84*mm",hallbot)
00344
00345 liner = Element("Liner","tyvek liner","Tyvek","4*mm",dead)
00346 ows = Element("OWS","outer water shield","Vacuum","1.0*m",liner)
00347
00348 curtain = Element("Curtain","tyvek curtain","Tyvek","4*mm",ows)
00349 iws = Element("IWS","inner water shield","Vacuum","4.037*m",curtain)
00350
00351 self.pool_elements = { "Dead":dead, "Liner":liner, "OWS":ows, "Curtain":curtain, "IWS":iws }
00352
00353
00354
00355
00356
00357 self.geometry_cat = None
00358 self.outdir = "."
00359 return
00360
00361 def geometry_catalog(self):
00362 if self.geometry_cat: return self.geometry_cat
00363
00364 from XmlDetDescGen.catalog import Catalog
00365 from XmlDetDescGen.reference import Reference
00366
00367 topcat = Catalog('Geometry');
00368 poolcat = Catalog('Pool');
00369
00370
00371 topcat.refs = [ Reference("#Pool",poolcat) ]
00372
00373 for name in pool_element_names:
00374 ele = self.pool_elements[name]
00375 for site in ["Near","Far"]:
00376 lv = ele.logical_volume(site)
00377 poolcat.refs.append(Reference("%s.xml#%s"%(name,lv.name),lv))
00378 continue
00379 continue
00380
00381
00382 topcat.update()
00383
00384 self.geometry_cat = poolcat
00385 return poolcat
00386
00387
00388 def get_param_header(self):
00389
00390 from XmlDetDescGen.util import Comment
00391
00392 s = []
00393 s.append('''
00394 Define the water pool. This is done by subsequently placing
00395 these volumes inside the bootom of the hall and then placing each
00396 in the previous.
00397 ''')
00398 for thing in pool_element_names:
00399 s.append(' - %s'%thing)
00400 continue
00401 s.append('''
00402 Each of these elements are specified by their thickness relative
00403 to their parents and the assumptions that they are concentric in
00404 X and Y and are lifted by one thickness when placed so that all
00405 their tops are coplanar. In addition, a bevel size is
00406 calculated. This is used to subtract out the corners of the
00407 boxes to make octagonal shapes. It is assumed that Z sizes are
00408 site-independent.
00409
00410 This all results in parameters looking like:
00411
00412 NearPool_THING_SizeX
00413 NearPool_THING_SizeY
00414 FarPool_THING_SizeX
00415 FarPool_THING_SizeY
00416 Pool_THING_SizeZ
00417 Pool_THING_LiftZ
00418 Pool_THING_BevelSize
00419
00420 Where _THING_ is
00421 ''')
00422 for thing in pool_element_names:
00423 ele = self.pool_elements[thing]
00424 s.append(' %s - %s'%(ele.name,ele.nick))
00425 continue
00426 return Comment('\n'.join(s))
00427
00428 def get_pool_parameters(self):
00429 from XmlDetDescGen.parameter import Parameter
00430 ret = [Parameter('TableHeight','2.5*m','Distance from pool floor to AD table'),
00431 Parameter("ADadeZplace",'TableHeight+0.5*ADadeHeight-0.5*PoolIWSSizeZ-PoolDeadThickness-PoolLinerThickness-PoolOWSThickness-PoolCurtainThickness','A position of AD adeelopes'),]
00432
00433 for thing in pool_element_names:
00434 ele = self.pool_elements[thing]
00435 params = ele.parameters()
00436 p = params[ele.param_fullname('Thickness')]
00437 ret.append(p)
00438 continue
00439 for thing in pool_element_names:
00440 ele = self.pool_elements[thing]
00441 for name,param in ele.params.iteritems():
00442 if name == ele.param_fullname('Thickness'):continue
00443 ret.append(param)
00444 continue
00445 continue
00446 return ret
00447
00448 def parameters_file(self):
00449 from XmlDetDescGen.util import XmlFile
00450 objects = [self.get_param_header()]
00451 objects.extend(self.get_pool_parameters())
00452 file = XmlFile(objects=objects)
00453 file.write(self.outdir+"/"+self.parameters_filename)
00454 return
00455
00456 def geometry_files(self):
00457 from XmlDetDescGen.util import XmlFile,ExternalEntity
00458 file = XmlFile(dtd="../DTD/geometry.dtd",
00459 objects=[ExternalEntity("SiteParameters"),
00460 ExternalEntity("PoolParameters"),
00461 ExternalEntity("PoolDetailsParameters"),
00462 self.geometry_catalog()],
00463 external_entities=[("SiteParameters","../Sites/parameters.xml"),("PoolDetailsParameters","../PoolDetails/parameters.xml"),
00464 ("PoolParameters","parameters.xml")])
00465 file.write(self.outdir+"/"+self.geometry_filename)
00466 return
00467
00468
00469 def thing_files(self):
00470 from XmlDetDescGen.util import XmlFile,ExternalEntity
00471 for name in pool_element_names:
00472 ele = self.pool_elements[name]
00473
00474 ees = [("SiteParameters","../Sites/parameters.xml"),("PoolDetailsParameters","../PoolDetails/parameters.xml"),
00475 ("PoolParameters","parameters.xml"),
00476 ("FarHandWrittenPhysVols","../PoolDetails/Far%sPhysVols.xml"%name),
00477 ("NearHandWrittenPhysVols","../PoolDetails/Near%sPhysVols.xml"%name)]
00478
00479 objects = [ExternalEntity("SiteParameters"),ExternalEntity("PoolDetailsParameters"),
00480 ExternalEntity("PoolParameters")]
00481
00482 if name == "IWS":
00483 ees += [("ADParameters","../AD/parameters.xml")]
00484 objects += [ExternalEntity("ADParameters")]
00485 pass
00486
00487 objects += [ele.logical_volume("Near"),
00488 ele.logical_volume("Far")]
00489
00490 file = XmlFile(dtd="../DTD/geometry.dtd",
00491 objects=objects,
00492 external_entities=ees)
00493 file.write("%s/%s.xml"%(self.outdir,name))
00494 continue
00495 return
00496
00497 def detid(self,loc,det):
00498
00499 if loc.lower() == 'db':
00500 iloc = 0x01
00501 elif loc.lower() == 'la':
00502 iloc = 0x02
00503 elif loc.lower() == 'far':
00504 iloc = 0x04
00505 else:
00506 iloc = 0x00
00507 if det.lower() == 'iws':
00508 idet = 5
00509 elif det.lower() == 'ows':
00510 idet = 6
00511 else:
00512 idet = 0
00513 detid = ((iloc<<24)|(idet<<16))
00514 from XmlDetDescGen.structure import UserParameter
00515 return UserParameter("DetectorID","int", ['0x%x'%detid],
00516 desc="Packed Detector ID")
00517
00518
00519
00520 def structure_file(self):
00521 from XmlDetDescGen.util import XmlFile,ExternalEntity
00522 from XmlDetDescGen.reference import Reference
00523 from XmlDetDescGen.structure import DetElem
00524 from XmlDetDescGen.catalog import Catalog
00525
00526 ees = [ ("dbInnFinpmts", "../PoolPmtStructure/dbInnFin.xml"),
00527 ("dbOutFinpmts", "../PoolPmtStructure/dbOutFin.xml"),
00528 ("dbOutFoutpmts", "../PoolPmtStructure/dbOutFout.xml"),
00529 ("laInnFinpmts", "../PoolPmtStructure/laInnFin.xml"),
00530 ("laOutFinpmts", "../PoolPmtStructure/laOutFin.xml"),
00531 ("laOutFoutpmts", "../PoolPmtStructure/laOutFout.xml"),
00532 ("farInnFinpmts", "../PoolPmtStructure/farInnFin.xml"),
00533 ("farOutFinpmts", "../PoolPmtStructure/farOutFin.xml"),
00534 ("farOutFoutpmts", "../PoolPmtStructure/farOutFout.xml")
00535 ]
00536
00537 file = XmlFile(dtd="../DTD/structure.dtd",
00538 external_entities=ees)
00539
00540
00541 gc = self.geometry_catalog()
00542 gc.update()
00543
00544 topcat = Catalog('Structure');
00545 poolcat = Catalog('Pool');
00546
00547
00548 poolcat.refs = []
00549 topcat.refs = [ poolcat ]
00550
00551 base = "/dd/Structure/Pool/"
00552
00553 delist = {"DB":[],"LA":[],"Far":[]}
00554
00555 last_support = "/dd/Structure/Sites/%(loc)s-rock"
00556
00557 for (thing,npath) in pool_detelem_data:
00558 ele = self.pool_elements[thing]
00559 nf="Near"
00560 for loc,adn in zip(["DB","LA","Far"],[2,2,4]):
00561 if loc == "Far": nf = "Far"
00562 lv_name = '/dd/Geometry/Pool/'+ele.logical_volume(nf).name
00563 de = DetElem(loc.lower()+'-'+thing.lower(),
00564 lv_name,
00565 npath%{"loc":loc,"nf":nf},
00566 last_support%{'loc':loc.lower()})
00567 de.refs = []
00568 if thing == 'IWS':
00569 for iad in range(0,adn):
00570 iad+=1
00571 href='../AD/structure.xml#%s-ade%d'%(loc.lower(),iad)
00572 de.refs.append(Reference(href,de))
00573 continue
00574 if thing == 'IWS':
00575 de.refs.append(ExternalEntity(loc.lower()+"InnFinpmts"))
00576 if thing == 'OWS':
00577 de.refs.append(ExternalEntity(loc.lower()+"OutFinpmts"))
00578 de.refs.append(ExternalEntity(loc.lower()+"OutFoutpmts"))
00579
00580 if thing == 'IWS' or thing == 'OWS':
00581 de.refs.append(self.detid(loc,thing))
00582 poolcat.things.append(de)
00583 delist[loc].append(de)
00584 continue
00585 last_support = base+"%(loc)s-"+ thing.lower()
00586 continue
00587
00588
00589
00590 for (k,lst) in delist.iteritems():
00591 lst.reverse()
00592 while lst:
00593 de = lst.pop()
00594 try:
00595 next_de = lst[-1]
00596 except IndexError:
00597 break
00598 de.refs.insert(0,Reference("#%s"%next_de.name,next_de))
00599 continue
00600 continue
00601
00602 file.objects = [ poolcat ]
00603 file.write(self.outdir+"/"+self.structure_filename)
00604 return
00605
00606
00607 if '__main__' == __name__:
00608 pool = Pool()
00609 import sys
00610 import os
00611
00612 try:
00613 xddroot = sys.argv[1]
00614 except IndexError:
00615 xddroot = os.getenv("XMLDETDESCROOT")
00616
00617 if not xddroot:
00618 print "No XMLDETDESCROOT directory given by environment or command line"
00619 print "Using current working directory"
00620 xddroot="."
00621
00622
00623 xddroot = ".."
00624
00625 outdir=xddroot + "/DDDB/Pool"
00626 if not os.path.exists(outdir):
00627 print "Directory does not exist, please make first"
00628 print outdir
00629 sys.exit(1)
00630
00631 pool.outdir = outdir
00632
00633 pool.parameters_file()
00634 pool.geometry_files()
00635 pool.thing_files()
00636 pool.structure_file()
00637
00638
00639
00640