| 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 self.name == "OWS":
00272                 pvs.append(Physvol("pv%sOutPTE"%site,"/dd/Geometry/PmtPanel/lv%sOutPTE"%site))
00273 
00274             
00275         else:                   # must be OWS, add ADEs
00276             #from XmlDetDescGen.util import ExternalEntity
00277             #pvs = [ ExternalEntity('AD%sPlacements'%site) ]
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         #print site,self.name,lv.name
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 # for mini-dry run change the material of the pool from Dead/Ows/Iws/Water to Vacuum
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 #        liner = Element("Liner","tyvek liner","Tyvek","50*micrometer",dead)
00345         liner = Element("Liner","tyvek liner","Tyvek","4*mm",dead)
00346         ows = Element("OWS","outer water shield","Vacuum","1.0*m",liner)
00347 #        curtain = Element("Curtain","tyvek curtain","Tyvek","50*micrometer",ows)
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         #self.general_parameters = [
00354         #    Parameter("PoolLipHeight","0.2*m","Height of concrete lip around pool")
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         # This is fake, just to get the right /dd/Geometry path
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         # Important, needed so full_paths can be set
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         # All hard coded numbers from Conventions/DetectorId.h
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         # To assure logical volume's full_path is set
00541         gc = self.geometry_catalog()
00542         gc.update()
00543 
00544         topcat = Catalog('Structure');
00545         poolcat = Catalog('Pool');
00546         # Clear our refs because some how this is filled with the
00547         # contents of the /Geometry/Pool catalog!  Python bug???
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         # Fix up detelemrefs
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     # to fix the local vs systematic path problem. --- Wei, Jan, 2010
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:13:45 2011 for MiniDryRunXmlDetDesc by doxygen 1.4.7