<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace = "http://projects.eml.org/bcb/sbml/level2"
     xmlns:sl2= "http://projects.eml.org/bcb/sbml/level2"   
     elementFormDefault="qualified">

<xsd:simpleType name="SId">
 <xsd:annotation>
  <xsd:documentation>The type SId is used throughout SBML as the type of the 'id' attributes on model elements.</xsd:documentation>
 </xsd:annotation>
 <xsd:restriction base="xsd:string">
  <xsd:pattern value="(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*"/>
 </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="posDouble">
  <xsd:restriction base="xsd:double">
    <xsd:minInclusive value="0.0" />
  </xsd:restriction>
</xsd:simpleType>  

<xsd:complexType name="SBase" abstract="true">
 <xsd:annotation>
  <xsd:documentation>The SBase type is the base type of all main components in SBML.  It supports attaching metadata, notes and annotations to components.</xsd:documentation>
 </xsd:annotation>
 <xsd:sequence>
  <xsd:element name="notes" minOccurs="0">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:any namespace="http://www.w3.org/1999/xhtml" processContents="skip" maxOccurs="unbounded"/>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:element>
  <xsd:element name="annotation" minOccurs="0">
   <xsd:complexType>
    <xsd:sequence>
     <xsd:any processContents="skip" maxOccurs="unbounded"/>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:element>
 </xsd:sequence>
 <xsd:attribute name="metaid" type="xsd:ID" use="optional"/>
</xsd:complexType>

<xsd:complexType name="Point">
 <xsd:complexContent>
  <xsd:extension base="SBase">
   <xsd:attribute name="id" type="SId" use="optional" />
   <xsd:attribute name="x"  type="xsd:double" />
   <xsd:attribute name="y"  type="xsd:double" />
   <xsd:attribute name="z"  type="xsd:double" use="optional" default="0.0" />
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="Dimensions">
 <xsd:complexContent>
  <xsd:extension base="SBase">
   <xsd:attribute name="id" type="SId" use="optional" />
   <xsd:attribute name="width"  type="posDouble" />
   <xsd:attribute name="height" type="posDouble" />
   <xsd:attribute name="depth"  type="posDouble" use="optional" default="0.0"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="BoundingBox">
 <xsd:complexContent>
  <xsd:extension base="SBase">
   <xsd:sequence>
     <xsd:element name="position" type="Point"/>
     <xsd:element name="dimensions" type="Dimensions"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="SId" use="optional" />
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="GraphicalObject">
 <xsd:complexContent>
  <xsd:extension base="SBase">
   <xsd:sequence>
     <xsd:element name="boundingBox" type="BoundingBox" />
   </xsd:sequence>
   <xsd:attribute name="id" type="SId"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="CompartmentGlyph">
 <xsd:complexContent>
  <xsd:extension base="sl2:GraphicalObject">
   <xsd:attribute name="compartment" type="sl2:SId" use="optional"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="SpeciesGlyph">
 <xsd:complexContent>
  <xsd:extension base="sl2:GraphicalObject">
   <xsd:attribute name="species" type="sl2:SId" use="optional"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>
    
<xsd:complexType name="LineSegment">
  <xsd:complexContent>
    <xsd:extension base="SBase">
    <xsd:sequence>
        <xsd:element name="start" type="Point" />
        <xsd:element name="end" type="Point" />
    </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="CubicBezier">
  <xsd:complexContent>
    <xsd:extension base="LineSegment">
        <xsd:element name="basePoint1" type="Point" minOccurs="0" />
        <xsd:element name="basePoint2" type="Point" minOccurs="0" />
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="ListOfCurveSegments">
    <xsd:sequence>
      <xsd:element name="curveSegment" type="sl2:LineSegment" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Curve">
  <xsd:complexContent>
    <xsd:extension base="sl2:SBase">
      <xsd:sequence>
        <xsd:element name="listOfCurceSegments" type="sl2:ListOfCurveSegments"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>


<xsd:simpleType name="RoleString">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="undefined"/>
    <xsd:enumeration value="substrate"/>
    <xsd:enumeration value="product"/>
    <xsd:enumeration value="sidesubstrate"/>
    <xsd:enumeration value="sideproduct"/>
    <xsd:enumeration value="modifier"/>
    <xsd:enumeration value="activator"/>
    <xsd:enumeration value="inhibitor"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="SpeciesReferenceGlyph">
 <xsd:complexContent>
  <xsd:extension base="sl2:GraphicalObject">
   <xsd:sequence>
     <xsd:element name="curve" type="sl2:Curve" minOccurs="0" maxOccurs="1"/>
   </xsd:sequence>
   <xsd:attribute name="speciesGlyph" type="sl2:SId" use="optional"/>
   <xsd:attribute name="speciesReference" type="sl2:SId" use="optional"/>
   <xsd:attribute name="role" type="sl2:RoleString" use="optional" default="undefined" />
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ListOfSpeciesReferenceGlyphs">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">  
   <xsd:sequence>
    <xsd:element name="speciesReferenceGlyph" type="sl2:SpeciesReferenceGlyph" minOccurs="1" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ReactionGlyph">
 <xsd:complexContent>
  <xsd:extension base="sl2:GraphicalObject">
   <xsd:sequence>
     <xsd:element name="curve" type="sl2:Curve" minOccurs="0" maxOccurs="1"/>
   </xsd:sequence>
   <xsd:sequence>
    <xsd:element name="listOfSpeciesReferenceGlyphs" 
                 type="sl2:ListOfSpeciesReferenceGlyphs" 
                 minOccurs="1" maxOccurs="1"/>
   </xsd:sequence>
   <xsd:attribute name="reaction" type="sl2:SId" use="optional"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="TextGlyph">
 <xsd:complexContent>
  <xsd:extension base="GraphicalObject">
   <xsd:attribute name="graphicalObject" type="SId" use="optional"/>
   <xsd:attribute name="text" type="xsd:string" use="optional"/>
   <xsd:attribute name="originOfText" type="SId" use="optional"/>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ListOfCompartmentGlyphs">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">
   <xsd:sequence>
    <xsd:element name="compartmentGlyph" type="sl2:CompartmentGlyph" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ListOfSpeciesGlyphs">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">
   <xsd:sequence>
    <xsd:element name="speciesGlyph" type="sl2:SpeciesGlyph" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ListOfReactionGlyphs">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">
   <xsd:sequence>
    <xsd:element name="reactionGlyph" type="sl2:ReactionGlyph" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="ListOfTextGlyphs">
 <xsd:complexContent>
  <xsd:extension base="SBase">
   <xsd:sequence>
    <xsd:element name="textGlyph" type="TextGlyph" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="ListOfAdditionalGraphicalObjects">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">
   <xsd:sequence>
    <xsd:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent>
</xsd:complexType>


<xsd:complexType name="Layout">
  <xsd:sequence>
    <xsd:element name="dimensions" type="Dimensions" />
    <xsd:element name="listOfCompartmentGlyphs" type="sl2:ListOfCompartmentGlyphs" minOccurs="0"/>
    <xsd:element name="listOfSpeciesGlyphs" type="sl2:ListOfSpeciesGlyphs" minOccurs="0"/>
    <xsd:element name="listOfReactionGlyphs" type="sl2:ListOfReactionGlyphs" minOccurs="0"/>
    <xsd:element name="listOfTextGlyphs" type="sl2:ListOfTextGlyphs" minOccurs="0"/>
    <xsd:element name="listOfAdditionalGraphicalObjects" type="sl2:ListOfAdditionalGraphicalObjects" minOccurs="0"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="sl2:SId"/>
</xsd:complexType>

<xsd:complexType name="ListOfLayouts">
 <xsd:complexContent>
  <xsd:extension base="sl2:SBase">
   <xsd:sequence>
    <xsd:element name="layout" type="sl2:Layout" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:extension>
 </xsd:complexContent> 
</xsd:complexType>

<xsd:element name="listOfLayouts" type="sl2:ListOfLayouts"/>

<xsd:complexType name="Transformation">
  <xsd:complexContent>
    <xsd:extension base="sl2:SBase">
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="SimpleTransformation">
  <xsd:complexContent>
    <xsd:extension base="sl2:Transformation">
      <xsd:attribute name="tx" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="ty" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="tz" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="rx" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="ry" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="rz" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="sx" type="xsd:double" use="optional" default="1.0"/>
      <xsd:attribute name="sy" type="xsd:double" use="optional" default="1.0"/>
      <xsd:attribute name="sz" type="xsd:double" use="optional" default="1.0"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="AffineTransformation">
  <xsd:complexContent>
    <xsd:extension base="sl2:Transformation">
      <xsd:attribute name="a0" type="xsd:double" use="optional" default="1.0"/>
      <xsd:attribute name="a1" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="a2" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="a3" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="b0" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="b1" type="xsd:double" use="optional" default="1.0"/>
      <xsd:attribute name="b2" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="b3" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="c0" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="c1" type="xsd:double" use="optional" default="0.0"/>
      <xsd:attribute name="c2" type="xsd:double" use="optional" default="1.0"/>
      <xsd:attribute name="c3" type="xsd:double" use="optional" default="0.0"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>


</xsd:schema>


