<?xml version="1.0" encoding="UTF-8"?>

<!-- 	document	: rnastructAlignmentML schema definition
	version 		: 2.0
	date 		: 2006-05-15
	author		: Kai Loewenthal <kloewent@techfak.uni-bielefeld.de>
			  Sven Hartmeier <shartmei@techfak.uni-bielefeld.de>
			  Jan Krueger <jkrueger@techfak.uni-bielefeld.de>
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:bt="http://schemas.bioservices.net/2005/biotypes"
	xmlns:ht="http://hobit.sourceforge.net/xsds/20060403/hobitTypes"
	targetNamespace="http://hobit.sourceforge.net/xsds/20060515/rnastructAlignmentML"
	xmlns:rsa="http://hobit.sourceforge.net/xsds/20060515/rnastructAlignmentML"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	
	<!-- RNAStructAlignmentML is based on BioTypes 1.1 and HobitTypes -->
	<xs:import namespace="http://schemas.bioservices.net/2005/biotypes"
		schemaLocation="http://schemas.bioservices.net/2005/biotypes_1.1.xsd"/>
	<xs:import namespace="http://hobit.sourceforge.net/xsds/20060403/hobitTypes"
		schemaLocation="http://hobit.sourceforge.net/xsds/20060403/hobitTypes.xsd"/>
	
	<!--                    	-->
	<!-- ELEMENTS -->
	<!--                   	-->
	<xs:element name="rnastructAlignmentML" nillable="true">
		<xs:annotation>
			<xs:documentation> RNAStructAlignmentML is a format for storing rna secondary structure
				alignments as computed by e.g. the RNAforester
				{http://bibiserv.techfak.uni-bielefeld.de/rnaforester} or RNAalifold
				{http://www.tbi.univie.ac.at/~ivo/RNA/} tool. RNAStructAlignment uses a
				RNAStructML-like architecture, but uses AlignmentML instead of SequenceML as a basic
				type. </xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="rnastructurealignment"
					type="rsa:rnastructurealignmentWithProgramType" minOccurs="1"
					maxOccurs="unbounded">
					<xs:annotation>
						<xs:documentation>this element contains rna secondary structure alignment information along with sequence and program information</xs:documentation>
					</xs:annotation>
				</xs:element>
					
			</xs:sequence>
			<xs:attribute name="version" type="bt:version" use="optional">
				<xs:annotation>
					<xs:documentation>optional version tag</xs:documentation>
				</xs:annotation>
			</xs:attribute>
		</xs:complexType>
	</xs:element>
	
	<!--             	-->
	<!-- TYPES 	-->
	<!--             	-->
	<xs:complexType name="rnastructurealignmentWithProgramType">
		<xs:annotation>
			<xs:documentation>this type can contain rna secondary structure alignment information along with sequence and program information</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="rsa:rnastructurealignmentType">
				<xs:sequence>
					<xs:element name="program" type="ht:programType" minOccurs="0" maxOccurs="1">
						<xs:annotation>
							<xs:documentation>element for storing program/tool information e.g. command line calls</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	
	<xs:complexType name="rnastructurealignmentType">
		<xs:annotation>
			<xs:documentation>represents a rna structure alignment</xs:documentation>
		</xs:annotation>
		<xs:sequence maxOccurs="1">
			<xs:element name="sequence" type="rsa:sequenceType" minOccurs="2" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>element for storing sequence data. two sequences are required, since an alignment over one sequence does not make sense</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="comment" type="xs:string" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>this element can contain a comment</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="consensus" type="rsa:consensusType" minOccurs="0"
				maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>this element can contain consensus data for the alignment</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="score" type="xs:double">
			<xs:annotation>
				<xs:documentation>score value</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="id" type="xs:ID" use="optional">
			<xs:annotation>
				<xs:documentation>can contain identifier</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	
	<xs:complexType name="sequenceType">
		<xs:annotation>
			<xs:documentation>type describing sequence data for rna secondary structure alignments. inspired by AlignmentML.</xs:documentation>
		</xs:annotation>
		<xs:sequence maxOccurs="1">
			<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>name of the sequence</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="synonyms" type="xs:string" minOccurs="0" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>synonyms for the name</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>sequence description</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:choice maxOccurs="1">
				<xs:element name="alignedNucleicAcidSequence" type="rsa:alignedNucleotideSequence">
					<xs:annotation>
						<xs:documentation>element for storing aligned nucleotid sequences</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element name="alignedFreeSequence" type="rsa:alignedFreeSequence">
					<xs:annotation>
						<xs:documentation>element for storing unrestricted aligned sequences</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element name="emptySequence" fixed="">
					<xs:annotation>
						<xs:documentation>empty sequence element</xs:documentation>
					</xs:annotation>
				</xs:element>
			</xs:choice>
			<xs:element name="structure" type="rsa:structureType" minOccurs="1" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>element for storing rna secondary structure alignment belonging to the sequence</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="comment" type="xs:string" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>optional comment</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="seqID" type="bt:accessionNumber" use="required">
			<xs:annotation>
				<xs:documentation>mandatory sequence identifier</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:anyAttribute processContents="lax"/>
	</xs:complexType>
	
	<!-- Types, currently not within BioTypes -->
	<xs:simpleType name="alignedFreeSequence">
		<xs:annotation>
			<xs:documentation>inherit gappedFreeSequenceType from hobitTypes; does not allow
			gaps</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="replace"/>
			<xs:pattern value="[A-Z\-]{0,}"/>
		</xs:restriction>
	</xs:simpleType>
	
	<xs:complexType name="alignedNucleotideSequence">
		<xs:annotation>
			<xs:documentation>An aligned nucleic acid sequence.</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="bt:gappedAmbiguousNucleotideSequence">
				<xs:attributeGroup ref="bt:alignedSequenceAttrs"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	
	<xs:complexType name="structureType">
		<xs:annotation>
			<xs:documentation>type for containing rna secondary structure alignments</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="bt:gappedRnaSecondaryStructureSequence">
				<xs:attribute name="energy" type="xs:double" use="optional">
					<xs:annotation>
						<xs:documentation>energy value</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:attribute name="probability" type="rsa:probabilityType" use="optional">
					<xs:annotation>
						<xs:documentation>probability value</xs:documentation>
					</xs:annotation>
				</xs:attribute>
				<xs:anyAttribute processContents="lax"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	
	<xs:complexType name="consensusType">
		<xs:annotation>
			<xs:documentation>type for containing rna secondary structure alignment consensus data</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="structure" type="rsa:structureType" minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>consensus rna secondary structure</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="structureprobabilities" type="rsa:structureprobabilitylistType"
				minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>structure probabilities</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="sequence" type="rsa:consensussequenceType" minOccurs="0" maxOccurs="1" >
				<xs:annotation>
					<xs:documentation>consensus sequence</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="id" type="bt:accessionNumber" use="optional">
			<xs:annotation>
				<xs:documentation>optional identifier</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:anyAttribute processContents="lax"/>
	</xs:complexType>
	
	<xs:complexType name="consensussequenceType">
		<xs:annotation>
			<xs:documentation>type for consensus sequences</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="rsa:sequenceType">
				<xs:sequence>
					<xs:element name="probabilities" type="rsa:probabititylistType" minOccurs="0"
						maxOccurs="1">
						<xs:annotation>
							<xs:documentation>probability list describing consensus sequence probabilities</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	
	<xs:simpleType name="probabititylistType">
		<xs:annotation>
			<xs:documentation>probability list describing consensus sequence probabilities</xs:documentation>
		</xs:annotation>
		<xs:list itemType="rsa:probabilityType"/>
	</xs:simpleType>
	
	<xs:simpleType name="probabilityType">
		<xs:annotation>
			<xs:documentation>simple type for probabilities</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:double">
			<xs:maxInclusive value="1.0"/>
			<xs:minInclusive value="0.0"/>
		</xs:restriction>
	</xs:simpleType>
	
	<xs:complexType name="structureprobabilitylistType">
		<xs:annotation>
			<xs:documentation> Defines a list of structure probabilities, which is a triplet of two
				positions and and a probability. </xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="pt" type="rsa:structureprobabilityType" minOccurs="1"
				maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="structureprobabilityType">
		<xs:annotation>
			<xs:documentation> Defines a new type for structure probability. A structure probability
				is defined by two bases and a pairing probability between them. </xs:documentation>
		</xs:annotation>
		<xs:attribute name="a" type="xs:int" use="required">
			<xs:annotation>
				<xs:documentation> Position of the first base. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="b" type="xs:int" use="required">
			<xs:annotation>
				<xs:documentation> Position of the second base. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="probability" type="rsa:probabilityType" use="required">
			<xs:annotation>
				<xs:documentation> Probability of the base pair. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
</xs:schema>
