<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<!-- we define a hierarchy of properties .They will all inherit from the root property. -->
	<!-- in the specs, they are described in chapter 3 and they are named machine element attributes -->
	<xs:include schemaLocation="expressions.xsd"/>
	<xs:element name="elementproperty" abstract="true"/>
	<!--aperture property -->
	<xs:element name="aperture" substitutionGroup="elementproperty">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="x_limit" type="limit"/>
				<xs:element name="y_limit" type="limit"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
			<xs:attribute name="at" type="aperturelocationtype"/>
			<xs:attribute name="shape" type="apertureshape" use="required"/>
			<xs:attribute name="orientation_dependent" type="orientationtype" default="FALSE"/>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="limit">
		<xs:attribute name="side" type="sidelimit"/>
		<xs:attribute name="value" type="arglist"/>
	</xs:complexType>
	<xs:complexType name="valuetype">
		<xs:attribute name="value" type="arglist"/>
	</xs:complexType>
	<xs:simpleType name="aperturelocationtype">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ENTRANCE END"/>
			<xs:enumeration value="EXIT END"/>
			<xs:enumeration value="BOTH ENDS"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="orientationtype">
		<xs:restriction base="xs:string">
			<xs:enumeration value="TRUE"/>
			<xs:enumeration value="FALSE"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="sidelimit">
		<xs:restriction base="xs:string">
			<xs:enumeration value="+"/>
			<xs:enumeration value="-"/>
			<xs:enumeration value="BOTH"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="apertureshape">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ELLIPTICAL"/>
			<xs:enumeration value="RECTANGULAR"/>
			<xs:enumeration value="DIAMOND"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- orientation element defined in positioning.xsd -->
	<!-- position element defined in positioning.xsd -->
	<!--global position element defined in positioning.xsd -->
	<!-- twiss element defined in initial.xsd -->
	<!--description element -->
	<xs:element name="description" substitutionGroup="elementproperty">
		<xs:complexType>
			<xs:sequence maxOccurs="unbounded">
				<xs:element name="type" type="xs:string" minOccurs="0"/>
				<xs:element name="alias" type="xs:ID" minOccurs="0"/>
				<xs:element name="ref" type="xs:anyURI" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- multipole property -->
	<!-- support both a,b,r and KL,T array descriptions. -->
	<xs:element name="multipole" substitutionGroup="elementproperty">
		<xs:complexType>
			<xs:choice>
				<xs:group ref="Krep"/>
				<xs:group ref="abrep"/>
			</xs:choice>
		</xs:complexType>
	</xs:element>
	<!-- we allow math expressions in there. -->
	<xs:group name="Krep">
		<xs:sequence>
			<xs:element name="KL" type="valuetype"/>
			<xs:element name="T" type="valuetype"/>
		</xs:sequence>
	</xs:group>
	<xs:group name="abrep">
		<xs:sequence>
			<xs:element name="a" type="valuetype"/>
			<xs:element name="b" type="valuetype"/>
			<xs:element name="radius" type="valuetype"/>
		</xs:sequence>
	</xs:group>
	<!-- methods property. -->
	<xs:element name="methods">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="tracking_method" type="xs:string"/>
				<xs:element name="transfer_map_calc_method" type="xs:string"/>
				<xs:element name="number_steps" type="valuetype"/>
				<xs:element name="relative_tolerance" type="valuetype"/>
				<xs:element name="absolute_tolerance" type="valuetype"/>
				<xs:element name="integrator_order" type="valuetype"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
		</xs:complexType>
	</xs:element>
	<!-- pole face property -->
	<xs:element name="poleface">
		<xs:complexType>
			<xs:sequence maxOccurs="unbounded">
				<xs:element name="e" type="valuetype"/>
				<xs:element name="h" type="valuetype"/>
				<xs:element name="f_int" type="valuetype"/>
				<xs:element name="h_gap" type="valuetype"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
			<xs:attribute name="end" type="polefacelocation" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="polefacelocation">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ENTRANCE END"/>
			<xs:enumeration value="EXIT END"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- kicks property -->
	<xs:element name="kicks"/>
	<!-- control property -->
	<xs:element name="control">
		<xs:complexType>
			<xs:attribute name="element" type="xs:string"/>
			<xs:attribute name="attribute" type="xs:string"/>
			<xs:attribute name="coefficient" type="arglist"/>
		</xs:complexType>
	</xs:element>
	<!-- mode property -->
	<xs:element name="mode">
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:enumeration value="ABSOLUTE"/>
				<xs:enumeration value="DELTA"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<!-- wake property -->
	<xs:element name="wake">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="wake_modes"/>
				<xs:element ref="wake_table"/>
				<xs:element name="e_loss" type="valuetype"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
			<xs:attribute name="range" type="wakerangetype"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="wake_table">
		<xs:complexType>
			<xs:sequence maxOccurs="unbounded">
				<xs:element ref="form" maxOccurs="1"/>
				<xs:element ref="row" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="form">
		<xs:complexType>
			<xs:attribute name="c1" type="xs:string" use="required"/>
			<xs:attribute name="c2" type="xs:string"/>
			<xs:attribute name="c3" type="xs:string"/>
			<xs:attribute name="c4" type="xs:string"/>
			<xs:attribute name="c5" type="xs:string"/>
			<xs:attribute name="c6" type="xs:string"/>
			<xs:attribute name="c7" type="xs:string"/>
			<xs:attribute name="c8" type="xs:string"/>
			<xs:attribute name="c9" type="xs:string"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="row">
		<xs:complexType>
			<xs:attribute name="c1" type="xs:double" use="required"/>
			<xs:attribute name="c2" type="xs:double"/>
			<xs:attribute name="c3" type="xs:double"/>
			<xs:attribute name="c4" type="xs:double"/>
			<xs:attribute name="c5" type="xs:double"/>
			<xs:attribute name="c6" type="xs:double"/>
			<xs:attribute name="c7" type="xs:double"/>
			<xs:attribute name="c8" type="xs:double"/>
			<xs:attribute name="c9" type="xs:double"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="wake_modes">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="mode">
					<xs:complexType>
						<xs:attribute name="freq" type="xs:double" use="required"/>
						<xs:attribute name="R_over_Q" type="xs:double" use="required"/>
						<xs:attribute name="Q" type="xs:double" use="required"/>
						<xs:attribute name="polarization_angle" type="xs:double"/>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="wakerangetype">
		<xs:restriction base="xs:string">
			<xs:enumeration value="SHORT_RANGE"/>
			<xs:enumeration value="LONG-RANGE"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="RF">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="rf_freq" type="valuetype"/>
				<xs:element name="phase0" type="valuetype"/>
				<xs:element name="phase0_offset" type="valuetype"/>
				<xs:element name="gradient" type="valuetype"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
		</xs:complexType>
	</xs:element>
	<!-- taylor_map and taylor_series property -->
	<xs:element name="taylor_map">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="taylor_series" minOccurs="6" maxOccurs="6"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="mapid">
		<xs:restriction base="xs:integer">
			<xs:enumeration value="1"/>
			<xs:enumeration value="2"/>
			<xs:enumeration value="3"/>
			<xs:enumeration value="4"/>
			<xs:enumeration value="5"/>
			<xs:enumeration value="6"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- go through extra steps to make sure user enters a valid taylor map -->
	<!-- coefficient -->
	<xs:simpleType name="zeroonelistbase">
		<xs:restriction base="xs:integer">
			<xs:maxInclusive value="1"/>
			<xs:minInclusive value="0"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="zeroonelist">
		<xs:list itemType="zeroonelistbase"/>
	</xs:simpleType>
	<xs:simpleType name="taylorcoeflist">
		<xs:restriction base="zeroonelist">
			<xs:maxLength value="6"/>
			<xs:minLength value="6"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="taylor_series">
		<xs:complexType>
			<xs:sequence maxOccurs="unbounded">
				<xs:element name="term" maxOccurs="unbounded">
					<xs:complexType>
						<xs:attribute name="coef" type="xs:double"/>
						<xs:attribute name="exp" type="taylorcoeflist"/>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="out" type="mapid" use="required"/>
		</xs:complexType>
	</xs:element>
</xs:schema>
