00001
00002
00003 """
00004 Generate RPC Strip Detector Elements.
00005
00006 This generates the Structure XML for all RPC Strip files into DDDB/RpcStripStructure/*.xml.
00007
00008 This needs to match the hand-written XML in DDDB/RPC/geometry.xml.
00009
00010 """
00011
00012 class RpcStripStructure:
00013
00014 sites = ['db', 'la', 'far']
00015
00016 def write(self,outdir):
00017 from XmlDetDescGen.util import XmlFile, Comment
00018 from XmlDetDescGen.catalog import Catalog
00019 from XmlDetDescGen.reference import Reference
00020 from XmlDetDescGen.util import ExternalEntity
00021
00022 topcat = Catalog('Structure');
00023 rpccat = Catalog('RpcStripStructure');
00024 rpccat.refs = []
00025 rpccat.things = []
00026 topcat.refs = [ rpccat ]
00027 topcat.things = []
00028
00029 ees = []
00030 for site in RpcStripStructure.sites:
00031 cat = Catalog('%s-strip'%site);
00032 cat.refs=[]
00033 eename="%sstrips"%(site)
00034 ees.append((eename,"%s.xml"%(site)))
00035 cat.refs.append(ExternalEntity(eename))
00036 rpccat.refs.append(cat)
00037
00038 file = XmlFile(dtd="../DTD/structure.dtd",
00039 external_entities=ees)
00040 file.objects = [ rpccat ]
00041 file.write(outdir+"/structure.xml")
00042
00043 class RpcStrips:
00044
00045 lvname="/dd/Geometry/RPC/lvRPCStrip"
00046 siteids = [0x01,0x02,0x04]
00047 siteRpccol = [6,6,9]
00048 rpcid = 07
00049 siteRnames = ['Near','Near','Far']
00050
00051
00052 def __init__(self,site,siteid,sitecol,sitename):
00053 self.site = site
00054 self.siteid = siteid
00055 self.sitecol = sitecol
00056 self.sitename = sitename
00057 pass
00058
00059
00060 def stripid(self,site,rpc,irow,icol,ilay,istr):
00061 return (site<<24)|(rpc<<16)|(irow<<12)|(icol<<8)|(ilay<<4)|istr
00062
00063
00064 def write(self,outdir):
00065
00066 from XmlDetDescGen.util import XmlFile, Comment
00067 from XmlDetDescGen.structure import DetElem,UserParameter
00068 strips = []
00069 totmods = 0
00070 totstrips = 0
00071 for irow in range(0,9):
00072 irow += 1
00073 for icol in range(0,sitecol):
00074 icol +=1
00075 totmods += 1
00076 for ilay in range(0,4):
00077 ilay += 1
00078 for istr in range(0,8):
00079 istr += 1
00080 totstrips = totstrips+1
00081 stripid = self.stripid(siteid,self.rpcid,irow,icol,ilay,istr)
00082 if irow%2 == 1:
00083 rowloop = irow/2+1
00084 unup = 'Un'
00085 else:
00086 rowloop =irow/2
00087 unup = 'Up'
00088 if icol == 1:
00089 columnloop = icol
00090 horslope = 'HorMod'
00091 else:
00092 columnloop = icol-1
00093 horslope = 'SlopMod'
00094 if ilay%2 == 1:
00095 layloop = ilay/2+1
00096 laychoose = '13'
00097 else:
00098 layloop = ilay/2
00099 laychoose = '24'
00100 data ={ 'site':site, 'rownum':irow, 'columnnum':icol, 'layernum':ilay, 'strnum':istr, 'sitename':sitename, 'rowloop':rowloop, 'columnloop':columnloop, 'layloop':layloop,'laychoose':laychoose, 'unup':unup, 'horslope':horslope }
00101 if icol == 1:
00102 npath="pv%(sitename)s%(unup)sHorModArray/pv%(sitename)s%(unup)sHorModColumn:%(rowloop)d/pv%(sitename)s%(unup)sHorModUnit/pvRPCFoam/pvBarCham%(laychoose)sArray/pvBarCham%(laychoose)sArrayOne:%(layloop)d/pvBarCham%(laychoose)sUnit/pvRPCGasgap%(laychoose)s/pvStrip%(laychoose)sArray/pvStrip%(laychoose)sArrayOne:%(strnum)d/pvStrip%(laychoose)sUnit"%data
00103 elif irow%2 == 1:
00104 npath="pv%(sitename)sUnSlopModArray/pv%(sitename)sUnSlopModOne:%(rowloop)d/pv%(sitename)sUnSlopMod:%(columnloop)d/pv%(sitename)sSlopModUnit/pvRPCFoam/pvBarCham%(laychoose)sArray/pvBarCham%(laychoose)sArrayOne:%(layloop)d/pvBarCham%(laychoose)sUnit/pvRPCGasgap%(laychoose)s/pvStrip%(laychoose)sArray/pvStrip%(laychoose)sArrayOne:%(strnum)d/pvStrip%(laychoose)sUnit"%data
00105 else:
00106 npath="pv%(sitename)sUpSlopModArray/pv%(sitename)sUpSlopModOne:%(rowloop)d/pv%(sitename)sUpSlopMod/pv%(sitename)sUnSlopMod:%(columnloop)d/pv%(sitename)sSlopModUnit/pvRPCFoam/pvBarCham%(laychoose)sArray/pvBarCham%(laychoose)sArrayOne:%(layloop)d/pvBarCham%(laychoose)sUnit/pvRPCGasgap%(laychoose)s/pvStrip%(laychoose)sArray/pvStrip%(laychoose)sArrayOne:%(strnum)d/pvStrip%(laychoose)sUnit"%data
00107
00108 de = DetElem('%(site)s-rpc-row%(rownum)d-column%(columnnum)d-layer%(layernum)d-strip%(strnum)d'%data,
00109 self.lvname,
00110 npath,
00111 support="/dd/Structure/RPC/%(site)s-rpc"%data)
00112 de.refs = [UserParameter("RpcID","int",['0x%x'%stripid],desc="Packed RpcStrip ID")]
00113 strips.append(de)
00114 continue
00115 continue
00116 continue
00117 continue
00118 print "RPC at %s-site total module number is %d"%(self.site, totmods)
00119 print "RPC at %s-site total read-out-strip channel number is %d"%(self.site, totstrips)
00120 file = XmlFile()
00121 file.objects = strips
00122 file.write(outdir+"/%s.xml"%self.site)
00123
00124
00125 if '__main__' == __name__:
00126
00127 import sys,os
00128 try:
00129 xddroot = sys.argv[1]
00130 except IndexError:
00131 xddroot = os.getenv("XMLDETDESCROOT")
00132
00133 if not xddroot:
00134 print "No XMLDETDESCROOT directory given by environment or command line"
00135 print "Using current working directory"
00136 xddroot="."
00137
00138 outdir=xddroot + "/DDDB/RpcStripStructure"
00139 if not os.path.exists(outdir):
00140 print "Directory does not exist, please make first"
00141 print outdir
00142 sys.exit(1)
00143
00144 for site,siteid,sitecol,sitename in zip(RpcStripStructure.sites,RpcStrips.siteids,RpcStrips.siteRpccol,RpcStrips.siteRnames):
00145 aps = RpcStrips(site,siteid,sitecol,sitename)
00146 aps.write(outdir)
00147
00148 aps = RpcStripStructure()
00149 aps.write(outdir)
00150
00151
00152
00153