<!-- FORMAT ********************************************************** -->

<!-- RNAML: The root of any rnaml document. ************************** -->
<!ELEMENT rnaml (molecule | molecule-class | interactions | reference |
                 database-entry | analysis | revision)*>
<!ATTLIST rnaml
          version (1.1)   #REQUIRED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- MOLECULE: A given RNA molecule. ********************************* -->
<!ELEMENT molecule (identity?, sequence*, structure?)>
<!ATTLIST molecule
          id             ID           #REQUIRED
	  type	         (rna | dna)  "rna"
	  comment        CDATA        #IMPLIED   
          reference-ids  IDREFS       #IMPLIED
	  analysis-ids   IDREFS       #IMPLIED
          database-ids   IDREFS       #IMPLIED>


<!-- IDENTITY: The symbolic description of the RNA molecule.           -->
<!ELEMENT identity (name, taxonomy?)>
<!ATTLIST identity 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT name (#PCDATA)>		             <!-- type: string -->

<!-- SEQUENCE: A description of the rna sequence.                      -->
<!ELEMENT sequence (numbering-system*, seq-data?, seq-annotation?)>
<!ATTLIST sequence
	  strand    CDATA	   #IMPLIED
          length    CDATA          #IMPLIED
 	  circular  (true | false) #IMPLIED
          comment        CDATA     #IMPLIED
          reference-ids  IDREFS    #IMPLIED
	  analysis-ids   IDREFS    #IMPLIED
          database-ids   IDREFS    #IMPLIED>


<!-- NUMBERING SYSTEM: A numbering-system provides how the bases are   -->
<!-- numbered.  used-in-file indicates if the numbering-system is the  -->
<!-- one used throughout the file.  If no numbering system is provided -->
<!-- or used-in-file, the numbering from 1 to N is used.               -->
<!ELEMENT numbering-system ((numbering-range)* | numbering-table)>
<!ATTLIST numbering-system
          id            ID     #REQUIRED
          used-in-file  (true | false) "false"
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT numbering-range (start, (end | length))>
<!ATTLIST numbering-range 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT numbering-table (#PCDATA)> <!-- type: space delimited integers -->
<!ATTLIST numbering-table
          length    CDATA   #REQUIRED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- SEQ-DATA: The actual data for a sequence.  The IUPAC (1984)       -->
<!-- symbols should be used:                                           -->
<!--	G=G, A=A, U=U, C=C, R=G|A, Y=U|C, M=A|C, K=G|U,                -->
<!--	S=G|C, W=A|U, H=A|C|U, B=G|U|C,                                --> 
<!--	V=G|C|A, D=G|A|U, N=G|A|U|C                                    -->

<!ELEMENT seq-data (#PCDATA)>                        <!-- type: string -->
<!ATTLIST seq-data
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- SEQ-ANNOTATION                                                    -->
<!ELEMENT seq-annotation (modification | segment)*>
<!ATTLIST seq-annotation 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT modification  (base-id, modified-type)>
<!ATTLIST modification  
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT modified-type (#PCDATA)>                   <!-- type: string -->

<!ELEMENT segment  (seg-name?, base-id-5p, (base-id-3p | length))>
<!ATTLIST segment  
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT seg-name (#PCDATA)>                        <!-- type: string -->

<!-- STRUCTURE: A description of the structure of the rna.             -->
<!-- name: A description of the structure.                             -->
<!ELEMENT structure (model)*>
<!ATTLIST structure 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- MODEL: A model for the RNA structure.                             -->
<!ELEMENT model (model-info?, base*, str-annotation?, secondary-structure-display?)>
<!ATTLIST model
          id  ID  #IMPLIED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>
	  
<!ELEMENT model-info (method?, resolution?, free-energy*)> 
<!ATTLIST model-info 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT method      (#PCDATA)>                     <!-- type: string -->
<!ATTLIST method
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT resolution  (#PCDATA)>     <!-- type: float, unit: angstroms -->
<!ATTLIST resolution
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT free-energy (#PCDATA)>     <!-- type: float, unit: kcal/mole -->
<!ATTLIST free-energy
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- BASE: A base is a residue in secondary or tertiary structure.     -->
<!ELEMENT base      (strand?, position, base-type?, alt-loc?, insertion?, atom*)>
<!ATTLIST base      
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT base-type (#PCDATA)>                       <!-- type: string -->
<!ELEMENT alt-loc   (#PCDATA)>                       <!-- type: char   -->
<!ELEMENT insertion (#PCDATA)>                       <!-- type: char   -->


<!-- ATOM: An atom with support for PDB fields.                        -->
<!ELEMENT atom (atom-type, coordinates?, occupancy?, 
                temp-factor?, seg-id?, element?, charge?)>
<!ATTLIST atom 
          serial         CDATA   #IMPLIED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT atom-type   (#PCDATA)>                     <!-- type: string -->
<!ELEMENT coordinates (#PCDATA)>     <!-- three space delimited floats -->
<!ELEMENT occupancy   (#PCDATA)>                     <!-- type: float  -->
<!ELEMENT temp-factor (#PCDATA)>                     <!-- type: float  -->
<!ELEMENT seg-id      (#PCDATA)>                     <!-- type: string -->
<!ELEMENT element     (#PCDATA)>                     <!-- type: string -->
<!ELEMENT charge      (#PCDATA)>                     <!-- type: string -->


<!-- STR-ANNOTATION:                                                   -->
<!ELEMENT str-annotation ((base-conformation | base-pair |
                           base-triple | base-stack | helix |
			   pseudoknot |
			   single-strand | distance-constraint |
			   surface-constraint)*)>
<!ATTLIST str-annotation 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- BASE-CONFORMATION:                                                -->
<!ELEMENT base-conformation (base-id, pucker?, glycosyl?,
                             base-torsion-angles?)>
<!ATTLIST base-conformation  
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT pucker   (#PCDATA)>                        <!-- type: string -->
<!ELEMENT glycosyl (#PCDATA)>			     <!-- type: string -->

<!ELEMENT base-torsion-angles (alpha?, beta?, gamma?, delta?, epsilon?, 
                               zeta?, chi?, nu0?, nu1?, nu2?, nu3?, nu4?)>
<!ATTLIST base-torsion-angles 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT alpha   (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT beta    (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT gamma   (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT delta   (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT epsilon (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT zeta    (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT chi     (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT nu0     (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT nu1     (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT nu2     (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT nu3     (#PCDATA)>           <!-- type: float, unit: degrees -->
<!ELEMENT nu4     (#PCDATA)>           <!-- type: float, unit: degrees -->


<!-- BASE-PAIR: A base pair requires two bases from the same molecule  -->
<!-- (molecule id unnecessary) or from two molecules.                  -->
<!ELEMENT base-pair (base-id-5p, base-id-3p, edge-5p?, edge-3p?,
                     bond-orientation?, strand-orientation?)>
<!ATTLIST base-pair
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>
<!ELEMENT base-id-5p         (base-id)>              <!-- type: string -->
<!ELEMENT base-id-3p         (base-id)>              <!-- type: string -->
<!ELEMENT edge-5p            (#PCDATA)>              <!-- type: string -->
<!ELEMENT edge-3p            (#PCDATA)>              <!-- type: string -->
<!ELEMENT bond-orientation   (#PCDATA)>              <!-- type: string -->
<!ELEMENT strand-orientation (#PCDATA)>              <!-- type: string -->


<!-- BASE-TRIPLE: A base triple is formed of two or three base-pairs.  -->
<!ELEMENT base-triple ((base-pair | base-pair-id),
                       (base-pair | base-pair-id),
		       (base-pair | base-pair-id))>
<!ATTLIST base-triple
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- BASE-STACK:                                                       -->
<!ELEMENT base-stack (base-id, base-id)>
<!ATTLIST base-stack
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- HELIX:                                                            -->
<!ELEMENT helix (base-id-5p, base-id-3p, length)>
<!ATTLIST helix
          id ID  #IMPLIED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- PSEUDOKNOT:                                                       -->
<!ELEMENT pseudoknot (helix-id, helix-id)>
<!ATTLIST pseudoknot 
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!ELEMENT helix-id EMPTY>
<!ATTLIST helix-id
          ref            IDREF   #REQUIRED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- SINGLE-STRAND: A single strand is a segment!                      -->
<!ELEMENT single-strand (segment)>
<!ATTLIST single-strand 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- DISTANCE-CONSTRAINT:                                              -->
<!ELEMENT distance-constraint (base-id, atom-type, 
                               base-id, atom-type,
			       mean, range?, weight?)>
<!ATTLIST distance-constraint 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>	      
<!ELEMENT mean   (#PCDATA)>          <!-- type: float, unit: angstroms -->
<!ELEMENT range  (#PCDATA)>          <!-- type: float, unit: angstroms -->
<!ELEMENT weight (#PCDATA)>                           <!-- type: float -->


<!-- SURFACE-CONSTRAINT:                                               -->
<!ELEMENT surface-constraint (base-id, atom-type, surface-value?)>
<!ATTLIST surface-constraint 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>
<!ELEMENT surface-value (#PCDATA)>                    <!-- type: float -->


<!-- SECONDARY-STRUCTURE-DISPLAY                                       -->
<!-- X,Y coordinates can be defined for the sequence and then          -->
<!-- used to display the secondary structure.			       -->
<!ELEMENT secondary-structure-display (ss-base-coord)*>
<!ATTLIST secondary-structure-display comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>

<!-- This provides an x,y position for a base.  	               -->
<!ELEMENT ss-base-coord (base-id, coordinates)>
<!ATTLIST ss-base-coord 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- MOLECULE-CLASS ************************************************** -->
<!-- A molecule-class is used to group molecules that represents       -->
<!-- the same  RNA in various organisms.  The numbering system is a    -->
<!-- numbering accepted in all molecules of the class and used in the  -->
<!-- alignment.                                                        -->
<!ELEMENT molecule-class (identity?, (molecule | molecule-id | 
                          numbering-system |
                          consensus-molecule | alignment)*)>
<!ATTLIST molecule-class  
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- CONSENSUS MOLECULE:                                               -->
<!ELEMENT consensus-molecule (alignment-id, molecule)>
<!ATTLIST consensus-molecule 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- ALIGNMENT: An alignment is defined explicitly by using a          -->
<!-- numbering table.                                                  -->
<!ELEMENT alignment (ali-sequence*)>
<!ATTLIST alignment 
          id   ID   #REQUIRED
	  comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- ALI-SEQUENCE: A sequence description in the alignment             -->
<!ELEMENT ali-sequence (molecule-id, seq-data)>
<!ATTLIST ali-sequence 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- INTERACTIONS represent chemical interactions between two          -->
<!-- molecule and is implemented as structural annotation of the       -->
<!-- corresponding structures.                                         -->
<!ELEMENT interactions (str-annotation)*>
<!ATTLIST interactions 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>



<!-- TAXONOMY: The identification of the molecule. -->
<!ELEMENT taxonomy (domain?, kingdom?, phylum?, class?, 
                    order?, family?, genus?, species?, strain?)>
<!ATTLIST taxonomy 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>
<!ELEMENT domain  (#PCDATA)>                         <!-- type: string -->
<!ELEMENT kingdom (#PCDATA)>                         <!-- type: string -->
<!ELEMENT phylum  (#PCDATA)>                         <!-- type: string -->
<!ELEMENT class   (#PCDATA)>                         <!-- type: string -->
<!ELEMENT order   (#PCDATA)>                         <!-- type: string -->
<!ELEMENT family  (#PCDATA)>                         <!-- type: string -->
<!ELEMENT genus   (#PCDATA)>                         <!-- type: string -->
<!ELEMENT species (#PCDATA)>                         <!-- type: string -->
<!ELEMENT strain  (#PCDATA)>                         <!-- type: string -->


<!-- REFERENCE:                                                        -->
<!ELEMENT reference (author | title | journal | 
                     date | pubmed-id |
		     book-title | editor | volume | 
		     issue | pages | path)*>
<!ATTLIST reference
	  id       ID     #REQUIRED
	  comment  CDATA  #IMPLIED>

<!ELEMENT author     (person)>
<!ELEMENT title      (#PCDATA)>                      <!-- type: string -->
<!ELEMENT journal    (#PCDATA)>                      <!-- type: string -->
<!ELEMENT pubmed-id  (#PCDATA)>                      <!-- type: string -->
<!ELEMENT book-title (#PCDATA)>                      <!-- type: string -->
<!ELEMENT editor     (#PCDATA)>                      <!-- type: string -->
<!ELEMENT volume     (#PCDATA)>                     <!-- type: integer -->
<!ELEMENT issue      (#PCDATA)>                     <!-- type: integer -->
<!ELEMENT pages      (#PCDATA)>     <!-- type: comma delimited integers-->


<!-- DATABASE-ENTRY:                                                   -->
<!ELEMENT database-entry (database, entry, path?)>
<!ATTLIST database-entry 
          id       ID     #REQUIRED
	  comment  CDATA  #IMPLIED
	  reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>
<!ELEMENT database (#PCDATA)>                        <!-- type: string -->
<!ELEMENT entry    (#PCDATA)>                        <!-- type: string -->


<!-- ANALYSIS:                                                         -->
<!ELEMENT analysis (program | date | author | reference)*>
<!ATTLIST analysis 
          id      ID    #REQUIRED
	  comment        CDATA   #IMPLIED
	  reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- REVISION:                                                         -->
<!ELEMENT revision (#PCDATA | date)*>
<!ATTLIST revision 
          comment        CDATA   #IMPLIED
          reference-ids  IDREFS  #IMPLIED
	  analysis-ids   IDREFS  #IMPLIED
          database-ids   IDREFS  #IMPLIED>


<!-- GENERAL ELEMENTS ************************************************ -->

<!ELEMENT url  (#PCDATA)>                            <!-- type: string -->
<!ELEMENT file (#PCDATA)>                            <!-- type: string -->

<!ELEMENT path (url | file)>

<!ELEMENT person (first-name, last-name, affiliation*)>
<!ELEMENT first-name   (#PCDATA)>                    <!-- type: string -->
<!ELEMENT last-name    (#PCDATA)>		     <!-- type: string -->
<!ELEMENT affiliation (#PCDATA)>                     <!-- type: string -->

<!ELEMENT program (prog-name | prog-version | reference)*>
<!ELEMENT prog-name    (#PCDATA)>                    <!-- type: string -->
<!ELEMENT prog-version (#PCDATA)>		     <!-- type: string -->

<!ELEMENT date (day?, month?, year)>		     
<!ELEMENT day   (#PCDATA)>                          <!-- type: integer -->
<!ELEMENT month (#PCDATA)>			    <!-- type: integer -->
<!ELEMENT year  (#PCDATA)>			    <!-- type: integer -->

<!ELEMENT position (#PCDATA)>			    <!-- type: integer -->
<!ELEMENT start  (#PCDATA)>                         <!-- type: integer -->
<!ELEMENT end    (#PCDATA)>			    <!-- type: integer -->
<!ELEMENT length (#PCDATA)>			    <!-- type: integer -->

<!ELEMENT base-id (molecule-id?, model-id?, strand?, position)>

<!ELEMENT molecule-id EMPTY>
<!ATTLIST molecule-id
          ref  IDREF  #REQUIRED>

<!ELEMENT model-id EMPTY>
<!ATTLIST model-id
          ref  IDREF  #IMPLIED>

<!ELEMENT strand (#PCDATA)>			     <!-- type: string -->

<!ELEMENT base-pair-id EMPTY>
<!ATTLIST base-pair-id
          ref  IDREF  #REQUIRED>

<!ELEMENT alignment-id EMPTY>
<!ATTLIST alignment-id
          ref  IDREF  #REQUIRED>