In designing this schema, I have used short, perhaps in cases somewhat cryptic element and attribute names. The reason for doing this is simply to reduce the size of the configuration documents, which may be several megabytes in size. The ultimate reason for the large size of the configuration documents is that each correlator output product (lag spectrum) must be specified in order that the backend correctly assembles the lag frames, and each correlator output product must be assigned to a spectral window.
start = config.elt # backend configuration # # Configuration is split into three parts: input configuration, # specifying the correlator hardware configuration w.r.t. the products # it produces; output configuration, specifying the subarrays and # spectral windows in the backend output; and pipeline configuration, # mapping correlator products to spectral windows and specifying the # processing pipeline into which the input products go. # config.elt = element config { # input configuration inputConfig.elt, # output configuration outputConfig.elt, # pipeline configuration pipelineConfig.elt } # backend input configuration # # Configuration is split into two parts: the specification of the # correlator baseline board input streams, and the products produced # by the baseline boards from their input streams. # inputConfig.elt = element inputConfig { # streams stream.elt*, # products (product4.elt | product7.elt)* } stream.elt = element strm { # product id attribute id { xsd:ID }, # station id attribute stn { xsd:positiveInteger }, # baseband id attribute bb { xsd:nonNegativeInteger }, # subband id attribute sb { xsd:nonNegativeInteger } } # 'product4' and 'product7' could be combined with the addition of a # 'mode' attribute to reflect 4 or 7 bit products, but this produces a # nondeterministic schema that cannot be accurately translated to # the W3C XML Schema language # # product = # element product { # attribute id { xsd:ID }, # attribute lags { xsd:positiveInteger }, # attribute bins { xsd:positiveInteger }, # attribute streamA { xsd:IDREF }, # attribute streamB { xsd:IDREF }, # ((attribute mode { xsd:integer "4" }, # corrIntegration, lagChainSegment+) # | (attribute mode { xsd:integer "7" }, # corrIntegration, # subProduct00, # subProduct01, # subProduct10, # subProduct11)) # } product.common.content = attribute id { xsd:ID }, # number of lags attribute nLg { xsd:positiveInteger }, # number of bins attribute nBn { xsd:positiveInteger }, # stream "A" reference attribute strmA { xsd:IDREF }, # stream "B" reference attribute strmB { xsd:IDREF }, corrIntegration.elt # four bit correlation product product4.elt = element prd4 { product.common.content, lagChainSegment.elt+ } # seven bit correlation product product7.elt = element prd7 { product.common.content, # LSN (least significant nibble) - LSN product subProduct00.elt, # LSN - MSN (most significant nibble) product subProduct01.elt, # MSN-LSN product subProduct10.elt, # MSN-MSN product subProduct11.elt } subProduct.elements = lagChainSegment.elt+ subProduct00.elt = element sPrd00 { subProduct.elements } subProduct01.elt = element sPrd01 { subProduct.elements } subProduct10.elt = element sPrd10 { subProduct.elements } subProduct11.elt = element sPrd11 { subProduct.elements } # correlator integration corrIntegration.elt = element cIntn { # minHW integration time (not sure this is needed) attribute minHW { xsd:positiveInteger }, # hardware integration time (TODO: units) attribute hw { xsd:positiveInteger }, # LTA integration time (TODO: units) attribute lta { xsd:positiveInteger } } # lag chain (spectrum) segment lagChainSegment.elt = element lcSeg { # rack id attribute rck { xsd:positiveInteger }, # crate id attribute crt { xsd:nonNegativeInteger }, # slot id attribute slt { xsd:nonNegativeInteger }, # corr chip x coordinate attribute x { xsd:nonNegativeInteger }, # corr chip y coordinate attribute y { xsd:nonNegativeInteger }, # first CCC attribute ccc0 { xsd:nonNegativeInteger }, # lasg CCC attribute cccN { xsd:nonNegativeInteger }, # recirculation factor attribute rec { xsd:positiveInteger }, # corr chip X input xInp.elt, # corr chip Y input yInp.elt } inp.content = # stream label attribute strm { "A" | "B" }, # lag block attribute inpBlk { xsd:nonNegativeInteger } xInp.elt = element xInp { inp.content } yInp.elt = element yInp { inp.content } # output configuration # # Comprises a number of subarray configurations. # outputConfig.elt = element outputConfig { subarray.elt* } # subarray configuration # # A subarray consists of a number of stations, and it has an # unchanging number of APC bins and integration time for all spectral # windows. Auto- and cross-correlation configurations are given # separately to account for different allowed values of the number of # polarization products (this could be simplified were we to ignore # W3C schema compatibility). # subarray.elt = element subarray { # subarray id attribute id { xsd:ID }, # station id list attribute stns { list { xsd:nonNegativeInteger+ } }, # num APC bins attribute nAPC { xsd:positiveInteger }, # integration (TODO: units?) attribute intn { xsd:positiveInteger }, # auto-correlation products autoCorrelations.elt?, # cross-correlation products crossCorrelations.elt? } # autocorrelations configuration # # Comprises a list of I/Fs and the spectral windows in each I/F. # autoCorrelations.elt = element aCorr { element if { # I/F id attribute val { xsd:nonNegativeInteger }, # spectral window element sw { # spectral window id attribute id { xsd:ID }, # number of (phase) bins attribute nBn { xsd:positiveInteger }, # number of spectral channels attribute nCh { xsd:positiveInteger }, # number of polarization attribute nPn { xsd:integer "1" | xsd:integer "2" } }+ }+ } # cross-correlations configuration # # Comprises a list of I/Fs and the spectral windows in each I/F. # crossCorrelations.elt = element xCorr { element if { # I/F id attribute val { xsd:nonNegativeInteger }, element sw { # spectral window id attribute id { xsd:ID }, # number of (phase) bins attribute nBn { xsd:positiveInteger }, # number of spectral channels attribute nCh { xsd:positiveInteger }, # number of polarization products attribute nPn { xsd:integer "1" | xsd:integer "2" | xsd:integer "4" } }+ }+ } # pipeline configuration # # Pipeline configuration has two functions: assigning input products # to spectral windows, and describing the pipeline used to move and # convert the input products to the spectral windows. The assignment # of input products to a baseline and polarization product in a # spectral window may make this element very large. Perhaps we could # create rules to describe the assignments in order to reduce the size # of this element. # pipelineConfig.elt = element pipelineConfig { pipeline.elt* } inputProduct.elt = element prd { attribute bbA { xsd:nonNegativeInteger }, attribute bbB { xsd:nonNegativeInteger } } pipeline.elt = element pln { # pipeline id attribute id { xsd:ID }, # (output) spectral window ref attribute sw { xsd:IDREF }, # pipeline description attribute desc { text }, # (baseband, subband)->(pol'n product, sw offset) mapping element map { # subband id attribute sb { xsd:nonNegativeInteger }, # offset of (subband) product in spectral window attribute off { xsd:nonNegativeInteger }, # LL polarization product element pLL { inputProduct.elt }?, # LR polarization product element pLR { inputProduct.elt }?, # RL polarization product element pRL { inputProduct.elt }?, # RR polarization product element pRR { inputProduct.elt }? }+ }
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <!-- backend configuration Configuration is split into three parts: input configuration, specifying the correlator hardware configuration w.r.t. the products it produces; output configuration, specifying the subarrays and spectral windows in the backend output; and pipeline configuration, mapping correlator products to spectral windows and specifying the processing pipeline into which the input products go. --> <xs:element name="config"> <xs:complexType> <xs:sequence> <xs:element ref="inputConfig"/> <xs:element ref="outputConfig"/> <xs:element ref="pipelineConfig"/> </xs:sequence> </xs:complexType> </xs:element> <!-- backend input configuration Configuration is split into two parts: the specification of the correlator baseline board input streams, and the products produced by the baseline boards from their input streams. --> <xs:element name="inputConfig"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="strm"/> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="prd4"/> <xs:element ref="prd7"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="strm"> <xs:complexType> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="stn" use="required" type="xs:positiveInteger"/> <xs:attribute name="bb" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="sb" use="required" type="xs:nonNegativeInteger"/> </xs:complexType> </xs:element> <!-- 'product4' and 'product7' could be combined with the addition of a 'mode' attribute to reflect 4 or 7 bit products, but this produces a nondeterministic schema that cannot be accurately translated to the W3C XML Schema language product = element product { attribute id { xsd:ID }, attribute lags { xsd:positiveInteger }, attribute bins { xsd:positiveInteger }, attribute streamA { xsd:IDREF }, attribute streamB { xsd:IDREF }, ((attribute mode { xsd:integer "4" }, corrIntegration, lagChainSegment+) | (attribute mode { xsd:integer "7" }, corrIntegration, subProduct00, subProduct01, subProduct10, subProduct11)) } --> <xs:element name="product.common.content" abstract="true"> <xs:complexType> <xs:attribute name="minHW" use="required" type="xs:positiveInteger"/> <xs:attribute name="hw" use="required" type="xs:positiveInteger"/> <xs:attribute name="lta" use="required" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <xs:complexType name="product.common.content"> <xs:sequence> <xs:element ref="product.common.content"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="nLg" use="required" type="xs:positiveInteger"/> <xs:attribute name="nBn" use="required" type="xs:positiveInteger"/> <xs:attribute name="strmA" use="required" type="xs:IDREF"/> <xs:attribute name="strmB" use="required" type="xs:IDREF"/> </xs:complexType> <!-- four bit correlation product --> <xs:element name="prd4"> <xs:complexType> <xs:complexContent> <xs:extension base="product.common.content"> <xs:sequence> <xs:element maxOccurs="unbounded" ref="lcSeg"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <!-- seven bit correlation product --> <xs:element name="prd7"> <xs:complexType> <xs:complexContent> <xs:extension base="product.common.content"> <xs:sequence> <xs:element ref="sPrd00"/> <xs:element ref="sPrd01"/> <xs:element ref="sPrd10"/> <xs:element ref="sPrd11"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:complexType name="subProduct.elements"> <xs:sequence> <xs:element maxOccurs="unbounded" ref="lcSeg"/> </xs:sequence> </xs:complexType> <xs:element name="sPrd00" type="subProduct.elements"/> <xs:element name="sPrd01" type="subProduct.elements"/> <xs:element name="sPrd10" type="subProduct.elements"/> <xs:element name="sPrd11" type="subProduct.elements"/> <!-- correlator integration --> <xs:complexType name="corrIntegration.elt"> <xs:sequence> <xs:element ref="cIntn"/> </xs:sequence> </xs:complexType> <xs:element name="cIntn" substitutionGroup="product.common.content"/> <!-- lag chain (spectrum) segment --> <xs:element name="lcSeg"> <xs:complexType> <xs:sequence> <xs:element ref="xInp"/> <xs:element ref="yInp"/> </xs:sequence> <xs:attribute name="rck" use="required" type="xs:positiveInteger"/> <xs:attribute name="crt" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="slt" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="x" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="y" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="ccc0" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="cccN" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="rec" use="required" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <xs:attributeGroup name="inp.content"> <xs:attribute name="strm" use="required"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="A"/> <xs:enumeration value="B"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="inpBlk" use="required" type="xs:nonNegativeInteger"/> </xs:attributeGroup> <xs:element name="xInp"> <xs:complexType> <xs:attributeGroup ref="inp.content"/> </xs:complexType> </xs:element> <xs:element name="yInp"> <xs:complexType> <xs:attributeGroup ref="inp.content"/> </xs:complexType> </xs:element> <!-- output configuration Comprises a number of subarray configurations. --> <xs:element name="outputConfig"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="subarray"/> </xs:sequence> </xs:complexType> </xs:element> <!-- subarray configuration A subarray consists of a number of stations, and it has an unchanging number of APC bins and integration time for all spectral windows. Auto- and cross-correlation configurations are given separately to account for different allowed values of the number of polarization products (this could be simplified were we to ignore W3C schema compatibility). --> <xs:element name="subarray"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="aCorr"/> <xs:element minOccurs="0" ref="xCorr"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="stns" use="required"> <xs:simpleType> <xs:restriction> <xs:simpleType> <xs:list itemType="xs:nonNegativeInteger"/> </xs:simpleType> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="nAPC" use="required" type="xs:positiveInteger"/> <xs:attribute name="intn" use="required" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <!-- autocorrelations configuration Comprises a list of I/Fs and the spectral windows in each I/F. --> <xs:element name="aCorr"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="if"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="sw"> <xs:complexType> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="nBn" use="required" type="xs:positiveInteger"/> <xs:attribute name="nCh" use="required" type="xs:positiveInteger"/> <xs:attribute name="nPn" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="val" use="required" type="xs:nonNegativeInteger"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- cross-correlations configuration Comprises a list of I/Fs and the spectral windows in each I/F. --> <xs:element name="xCorr"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="if"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="sw"> <xs:complexType> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="nBn" use="required" type="xs:positiveInteger"/> <xs:attribute name="nCh" use="required" type="xs:positiveInteger"/> <xs:attribute name="nPn" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="4"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="val" use="required" type="xs:nonNegativeInteger"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- pipeline configuration Pipeline configuration has two functions: assigning input products to spectral windows, and describing the pipeline used to move and convert the input products to the spectral windows. The assignment of input products to a baseline and polarization product in a spectral window may make this element very large. Perhaps we could create rules to describe the assignments in order to reduce the size of this element. --> <xs:element name="pipelineConfig"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="pln"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="inputProduct.elt"> <xs:sequence> <xs:element ref="prd"/> </xs:sequence> </xs:complexType> <xs:element name="prd"> <xs:complexType> <xs:attribute name="bbA" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="bbB" use="required" type="xs:nonNegativeInteger"/> </xs:complexType> </xs:element> <xs:element name="pln"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="map"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="sw" use="required" type="xs:IDREF"/> <xs:attribute name="desc" use="required"/> </xs:complexType> </xs:element> <xs:element name="map"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="pLL"/> <xs:element minOccurs="0" ref="pLR"/> <xs:element minOccurs="0" ref="pRL"/> <xs:element minOccurs="0" ref="pRR"/> </xs:sequence> <xs:attribute name="sb" use="required" type="xs:nonNegativeInteger"/> <xs:attribute name="off" use="required" type="xs:nonNegativeInteger"/> </xs:complexType> </xs:element> <xs:element name="pLL" type="inputProduct.elt"/> <xs:element name="pLR" type="inputProduct.elt"/> <xs:element name="pRL" type="inputProduct.elt"/> <xs:element name="pRR" type="inputProduct.elt"/> </xs:schema>