00001
00002
00003 """
00004 Generate AD PMT Detector Elements.
00005
00006 This generates the Structure XML for all AD PMTs into the TDS at
00007 /dd/Structure/AdPmts and files in to DDDB/AdPmtStructure/*.xml.
00008
00009 This needs to match the hand-written XML in DDDB/AdPmts/geometry.xml.
00010
00011 """
00012
00013 class AdPmtStructure:
00014
00015 sites = ['db', 'la', 'far']
00016
00017 def write(self,outdir):
00018 from XmlDetDescGen.util import XmlFile, Comment
00019 from XmlDetDescGen.catalog import Catalog
00020 from XmlDetDescGen.reference import Reference
00021 from XmlDetDescGen.util import ExternalEntity
00022
00023 topcat = Catalog('Structure');
00024 adcat = Catalog('AdPmtStructure');
00025 adcat.refs = []
00026 adcat.things = []
00027 topcat.refs = [ adcat ]
00028 topcat.things = []
00029
00030 ees = []
00031 for site,adcount in zip(AdPmtStructure.sites,AdPmts.adcounts):
00032 cat = Catalog('%s-ad'%site);
00033 cat.refs=[]
00034 for iad in range(0,adcount):
00035 iad += 1
00036 eename="%s%dpmts"%(site,iad)
00037 ees.append((eename,"%s%d.xml"%(site,iad)))
00038 cat.refs.append(ExternalEntity(eename))
00039 continue
00040 adcat.refs.append(cat)
00041
00042 file = XmlFile(dtd="../DTD/structure.dtd",
00043 external_entities=ees)
00044 file.objects = [ adcat ]
00045 file.write(outdir+"/structure.xml")
00046
00047
00048 class AdPmts:
00049
00050 lvname="/dd/Geometry/PMT/lvPmtHemiwPmtHolder"
00051 lvname2="/dd/Geometry/PMT/lvHeadonPmtFrame"
00052 siteids = [0x01,0x02,0x04]
00053 adcounts = [ 2, 2, 4]
00054
00055 def __init__(self,site,siteid,adcount):
00056 self.site = site
00057 self.siteid = siteid
00058 self.adcount = adcount
00059 pass
00060
00061
00062 def pmtid(self,site,adn,icol,iring):
00063 return (site<<24)|(adn<<16)|(iring<<8)|icol
00064
00065
00066 def write(self,outdir):
00067
00068 from XmlDetDescGen.util import XmlFile, Comment
00069 from XmlDetDescGen.structure import DetElem,UserParameter
00070
00071 for adn in range(0,self.adcount):
00072 adn += 1
00073
00074 pmts = []
00075
00076 ipmt = 0
00077 for iring in range(0,8):
00078 iring += 1
00079
00080 for icol in range(0,24):
00081 icol += 1
00082 ipmt = ipmt+1
00083 pmtid = self.pmtid(siteid,adn,icol,iring)
00084 data = {
00085 'site':site,
00086 'siteid':siteid,
00087 'adnum':adn,
00088 'ringnum':iring,
00089 'columnnum':icol,
00090 'pmtid':pmtid
00091 }
00092
00093 de = DetElem('%(site)s-ad%(adnum)d-ring%(ringnum)d-column%(columnnum)d'%data,
00094 self.lvname,
00095 npath="pvAdPmtArray/pvAdPmtArrayRotated/pvAdPmtRingInCyl:%(ringnum)s/pvAdPmtInRing:%(columnnum)d/pvAdPmtUnit"%data,
00096 support="/dd/Structure/AD/%(site)s-oil%(adnum)d"%data)
00097
00098 de.refs = [UserParameter("PmtID","int",['0x%x'%pmtid],desc="Packed PMT ID")]
00099
00100 pmts.append(de)
00101 continue
00102 continue
00103
00104 iring = 0
00105 for icol in range(0,6):
00106 icol += 1
00107 ipmt = ipmt+1
00108 pmtid = self.pmtid(siteid,adn,icol,iring)
00109 data = {
00110 'site':site,
00111 'siteid':siteid,
00112 'adnum':adn,
00113 'ringnum':iring,
00114 'columnnum':icol,
00115 'pmtid':pmtid
00116 }
00117
00118 de = DetElem('%(site)s-ad%(adnum)d-ring%(ringnum)d-column%(columnnum)d'%data,
00119 self.lvname2,
00120 npath="pvAdPmtArray/pvAd2inPmt:%(columnnum)d"%data,
00121 support="/dd/Structure/AD/%(site)s-oil%(adnum)d"%data)
00122
00123 de.refs = [UserParameter("PmtID","int",['0x%x'%pmtid],desc="Packed PMT ID")]
00124
00125 pmts.append(de)
00126 continue
00127
00128 file = XmlFile()
00129 file.objects = pmts
00130 file.write(outdir+"/%s%d.xml"%(self.site,adn))
00131 continue
00132
00133 if '__main__' == __name__:
00134
00135 import sys,os
00136 try:
00137 xddroot = sys.argv[1]
00138 except IndexError:
00139 xddroot = os.getenv("XMLDETDESCROOT")
00140
00141 if not xddroot:
00142 print "No XMLDETDESCROOT directory given by environment or command line"
00143 print "Using current working directory"
00144 xddroot="."
00145
00146 xddroot = ".."
00147
00148 outdir=xddroot + "/DDDB/AdPmtStructure"
00149 if not os.path.exists(outdir):
00150 print "Directory does not exist, please make first"
00151 print outdir
00152 sys.exit(1)
00153
00154
00155 for site,siteid,adcount in zip(AdPmtStructure.sites,AdPmts.siteids,AdPmts.adcounts):
00156 aps = AdPmts(site,siteid,adcount)
00157 aps.write(outdir)
00158
00159 aps = AdPmtStructure()
00160 aps.write(outdir)
00161
00162