Repository 'sbml2sbol'
hg clone https://toolshed.g2.bx.psu.edu/repos/tduigou/sbml2sbol

Changeset 0:f0a06f526c7f (2021-12-09)
Next changeset 1:83108f3c65aa (2022-02-09)
Commit message:
"planemo upload commit 2f1af427fa4c4f2aad53ab94c4cdb51456c66019-dirty"
added:
sbml2sbol.xml
test-data/lycopene.xml
test-data/sbol_lycopene_output.xml
b
diff -r 000000000000 -r f0a06f526c7f sbml2sbol.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbml2sbol.xml Thu Dec 09 14:21:48 2021 +0000
[
@@ -0,0 +1,83 @@
+<tool id="sbml2sbol" name="SbmlToSbol" version="0.1.12">
+    <description>Convert sbml to sbol format</description>
+    <requirements>
+        <requirement type="package" version="0.1.12">sbml2sbol</requirement>
+    </requirements>
+    <command detect_errors="exit_code"><![CDATA[
+        python -m sbml2sbol
+            --input '$sbml_single_input'
+            --outfile '$sbol_outfile'
+        #if str($adv.rbs) == "true"
+            --rbs True
+        #else
+            --rbs False
+        #end if
+        --max_prot_per_react '$adv.max_prot_per_react'
+        #if $adv.tirs 
+            --tirs $adv.tirs
+        #end if
+        --pathway_id '$adv.pathway_id'
+        --uniprotID_key '$adv.uniprotID_key'
+    ]]></command>
+    <inputs>
+        <param name="sbml_single_input" type="data" format="xml" label="Pathway (SBML)" />
+        <section name="adv" title="Advanced Options" expanded="false">
+            <param name="rbs" type="boolean" label="Calculate the RBS strength?" checked="true" />
+            <param name="max_prot_per_react" type="integer" value="3" label="The maximum number of proteins per reaction" />
+            <param name="tirs" type="text" optional="true" label="Space separated RBS strength values" />
+            <param name="pathway_id" type="text" value="rp_pathway" label="Group ID of the heterologous pathway" />
+            <param name="uniprotID_key" type="text" value="selenzy" label="Uniprot ID" />
+        </section>
+    </inputs>
+    <outputs>
+        <data name="sbol_outfile" format="xml" label="${tool.name}: sbol outfile" />
+    </outputs>
+    <tests>
+        <test>
+        <!-- test 1: check if identical outputs are produced with default parameters  -->
+            <param name="sbml_single_input" value="lycopene.xml" />
+            <output name="sbol_outfile" file="sbol_lycopene_output.xml" ftype="xml" compare="diff" sort="true"/>
+        </test>
+    </tests>
+    <help><![CDATA[
+SBML to SBOL
+================
+
+Convert a single or multiple SBML files to SBOL.
+
+Input
+-----
+
+Required:
+
+* **input**\ : (string) path to folder(s) containing rpSBML files and/or rpSBML file path(s).
+
+Advanced options:
+
+* **rbs**\ : (boolean) Calculate or not the RBS strength (default: True).
+* **max_prot_per_react**\ : (int) The maximum number of proteins per reaction (default: 3).
+* **tirs**\ : (int) The RBS strength values (default: None)
+* **pathway_id**\ : (string) Group ID of the heterologous pathway (default: rp_pathway)
+* **uniprotID_key**\ : (string) Group ID of the heterologous pathway (default: selenzy)
+
+Output
+------
+
+* **outfile**\ : (string) specify output (SBOL) file.
+
+Project Links
+------------------
+
+* `GitHub <https://github.com/neilswainston/SbmlToSbol>`_
+
+Version
+----------
+0.1.12
+
+License
+-------
+
+* `MIT <https://raw.githubusercontent.com/neilswainston/SbmlToSbol/master/LICENSE>`_
+
+    ]]></help>
+</tool>
\ No newline at end of file
b
diff -r 000000000000 -r f0a06f526c7f test-data/lycopene.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/lycopene.xml Thu Dec 09 14:21:48 2021 +0000
[
b'@@ -0,0 +1,625 @@\n+<?xml version="1.0" encoding="UTF-8"?>\n+<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" xmlns:groups="http://www.sbml.org/sbml/level3/version1/groups/version1" xmlns:fbc="http://www.sbml.org/sbml/level3/version1/fbc/version2" level="3" version="1" groups:required="false" fbc:required="false">\n+  <model metaid="f9b1ff022aa2133fc1e5e5d1fbac90ac29a744e960a2774be646bc71471ed597" id="RP_model_002_0001" name="002_0001" substanceUnits="mole" timeUnits="second" extentUnits="mole" fbc:strict="true">\n+    <listOfCompartments>\n+      <compartment metaid="_2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6" sboTerm="SBO:0000290" id="c" name="cytosol" size="1" constant="true">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:Description rdf:about="#_2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6">\n+              <bqbiol:is>\n+                <rdf:Bag>\n+                  <rdf:li rdf:resource="http://identifiers.org/bigg.compartment/c"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/bigg.compartment/c_c"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/metanetx.compartment/MNXC3"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/seed/c"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/seed/c0"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/seed/cytosol"/>\n+                  <rdf:li rdf:resource="http://identifiers.org/name/cytosol"/>\n+                </rdf:Bag>\n+              </bqbiol:is>\n+            </rdf:Description>\n+          </rdf:RDF>\n+        </annotation>\n+      </compartment>\n+    </listOfCompartments>\n+    <listOfSpecies>\n+      <species metaid="b0098569a07f786a6e9b2294639668cd4ee564dd642a38bdf429c4c6bb560b46" id="CMPD_0000000001" name="CMPD_0000000001" compartment="c" initialConcentration="1" hasOnlySubstanceUnits="false" boundaryCondition="false" constant="false">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:Description rdf:about="#b0098569a07f786a6e9b2294639668cd4ee564dd642a38bdf429c4c6bb560b46">\n+              <bqbiol:is>\n+                <rdf:Bag/>\n+              </bqbiol:is>\n+            </rdf:Description>\n+            <rdf:BRSynth rdf:about="#b0098569a07f786a6e9b2294639668cd4ee564dd642a38bdf429c4c6bb560b46">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu">\n+                <brsynth:smiles value="[H]C(=C([H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])[H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])C([H])([H])C([H])=C(C([H])([H])[H])C([H])([H])[H]"/>\n+                <brsynth:inchi value="InChI=1S/C40H64/c1-33(2)19-13-23-37(7)27-17-31-39(9)29-15-25-35(5)21-11-12-22-36(6)26-16-30-40(10)32-18-28-38(8)24-14-20-34(3)4/h11-12,19-22,27-30H,13-18,23-26,31-32H2,1-10H3"/>\n+                <brsynth:inchikey value="YVLPJIGOMTXXLP-UHFFFAOYSA-N"/>\n+                <brsynth:fba_biomass_shadow_price>\n+                  <brsynth:value value="-0.0"/>\n+                </brsynth:fba_biomass_shadow_price>\n+                <brsynth:fba_fraction_shadow_price>\n+                  <brsynth:value value="-1.0"/>\n+                </brsynth:fba_fraction_shadow_price>\n+                <brsynth:thermo_standard_dg_formation>\n+                  <brsynth:value value="936.7141451846444"/>\n+                  <brsynth:units value="kilojoule / mole"/>\n+                </brsynth:thermo_standard_dg_formation>\n+              </brsynth:brsynth>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+      </species>\n+      <spec'..b'es" groups:kind="collection">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:BRSynth rdf:about="#_564fce39b23c6cf87d12dc2c612448384fd2cd980fe3fc07829e2ef802645579">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu"/>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+        <groups:listOfMembers>\n+          <groups:member groups:idRef="CMPD_0000000001"/>\n+          <groups:member groups:idRef="MNXM100"/>\n+          <groups:member groups:idRef="TARGET_0000000001"/>\n+          <groups:member groups:idRef="CMPD_0000000003"/>\n+          <groups:member groups:idRef="MNXM83"/>\n+        </groups:listOfMembers>\n+      </groups:group>\n+      <groups:group metaid="_9e3154173c97366b3980dd1642e1e35d0bdfc3274abc744e89ecb518bcd48378" groups:id="rp_completed_species" groups:kind="collection">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:BRSynth rdf:about="#_9e3154173c97366b3980dd1642e1e35d0bdfc3274abc744e89ecb518bcd48378">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu"/>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+        <groups:listOfMembers>\n+          <groups:member groups:idRef="MNXM8975"/>\n+          <groups:member groups:idRef="MNXM24"/>\n+          <groups:member groups:idRef="MNXM11"/>\n+        </groups:listOfMembers>\n+      </groups:group>\n+      <groups:group metaid="_58b3b59284e0d918d6d3f3bcadc2d757726da7594cd899cad4e745836ac967a3" groups:id="rp_sink_species" groups:kind="collection">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:BRSynth rdf:about="#_58b3b59284e0d918d6d3f3bcadc2d757726da7594cd899cad4e745836ac967a3">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu"/>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+        <groups:listOfMembers>\n+          <groups:member groups:idRef="MNXM83"/>\n+          <groups:member groups:idRef="MNXM100"/>\n+          <groups:member groups:idRef="MNXM11"/>\n+        </groups:listOfMembers>\n+      </groups:group>\n+      <groups:group metaid="a0f48a6fe4f833a3d15abd7ee5b944b97d629570ac09588e9fb6fdf6196ab189" groups:id="rp_fba_ignored_species" groups:kind="collection">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:BRSynth rdf:about="#a0f48a6fe4f833a3d15abd7ee5b944b97d629570ac09588e9fb6fdf6196ab189">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu"/>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+        <groups:listOfMembers>\n+          <groups:member groups:idRef="MNXM24"/>\n+          <groups:member groups:idRef="MNXM8975"/>\n+        </groups:listOfMembers>\n+      </groups:group>\n+      <groups:group metaid="fb9b29ba20af773fed953f1d6726905a453f235c9a4baa7217f02760bc2057f8" groups:id="rp_thermo_substituted_species" groups:kind="collection">\n+        <annotation>\n+          <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/">\n+            <rdf:BRSynth rdf:about="#fb9b29ba20af773fed953f1d6726905a453f235c9a4baa7217f02760bc2057f8">\n+              <brsynth:brsynth xmlns:brsynth="http://brsynth.eu"/>\n+            </rdf:BRSynth>\n+          </rdf:RDF>\n+        </annotation>\n+        <groups:listOfMembers>\n+          <groups:member groups:idRef="MNXM24"/>\n+          <groups:member groups:idRef="TARGET_0000000001"/>\n+          <groups:member groups:idRef="MNXM8975"/>\n+        </groups:listOfMembers>\n+      </groups:group>\n+    </groups:listOfGroups>\n+  </model>\n+</sbml>\n'
b
diff -r 000000000000 -r f0a06f526c7f test-data/sbol_lycopene_output.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/sbol_lycopene_output.xml Thu Dec 09 14:21:48 2021 +0000
b
b'@@ -0,0 +1,1518 @@\n+<?xml version="1.0" ?>\n+<rdf:RDF xmlns:sys-bio="http://sys-bio.org#" xmlns:sbol="http://sbols.org/v2#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:prov="http://www.w3.org/ns/prov#">\n+  <sbol:ComponentDefinition rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_30000_rbs/1">\n+    <sbol:displayId>P21687_30000_rbs</sbol:displayId>\n+    <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_30000_rbs"/>\n+    <sbol:role rdf:resource="http://identifiers.org/so/SO:0000139"/>\n+    <sbol:type rdf:resource="http://www.biopax.org/release/biopax-level3.owl#DnaRegion"/>\n+    <sbol:version>1</sbol:version>\n+  </sbol:ComponentDefinition>\n+  <sbol:ComponentDefinition rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/1">\n+    <sbol:displayId>P21687_10000_gene</sbol:displayId>\n+    <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene"/>\n+    <sbol:role rdf:resource="http://identifiers.org/so/SO:0000704"/>\n+    <sbol:type rdf:resource="http://www.biopax.org/release/biopax-level3.owl#DnaRegion"/>\n+    <sbol:type rdf:resource="http://identifiers.org/so/SO:0000987"/>\n+    <sbol:version>1</sbol:version>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/rxn_3_5_prime_assembly_0/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/rxn_3_5_prime_assembly/1"/>\n+        <sbol:displayId>rxn_3_5_prime_assembly_0</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/rxn_3_5_prime_assembly_0"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/P21687_10000_rbs_0/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_rbs/1"/>\n+        <sbol:displayId>P21687_10000_rbs_0</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/P21687_10000_rbs_0"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/P21687_10000_cds_0/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_cds/1"/>\n+        <sbol:displayId>P21687_10000_cds_0</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/P21687_10000_cds_0"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/rxn_3_3_prime_assembly_0/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/rxn_3_3_prime_assembly/1"/>\n+        <sbol:displayId>rxn_3_3_prime_assembly_0</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21687_10000_gene/rxn_3_3_prime_assembly_0"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+ '..b'_2</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_rbs_2"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_cds_2/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_cds/1"/>\n+        <sbol:displayId>P21683_30000_cds_2</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_cds_2"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:component>\n+      <sbol:Component rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/rxn_3_3_prime_assembly_0/1">\n+        <sbol:access rdf:resource="http://sbols.org/v2#public"/>\n+        <sbol:definition rdf:resource="http://liverpool.ac.uk/ComponentDefinition/rxn_3_3_prime_assembly/1"/>\n+        <sbol:displayId>rxn_3_3_prime_assembly_0</sbol:displayId>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/rxn_3_3_prime_assembly_0"/>\n+        <sbol:roleIntegration rdf:resource="http://sbols.org/v2#mergeRoles"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:Component>\n+    </sbol:component>\n+    <sbol:sequenceConstraint>\n+      <sbol:SequenceConstraint rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_0/1">\n+        <sbol:displayId>constraint_0</sbol:displayId>\n+        <sbol:object rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_rbs_2/1"/>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_0"/>\n+        <sbol:restriction rdf:resource="http://sbols.org/v2#precedes"/>\n+        <sbol:subject rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/rxn_3_5_prime_assembly_0/1"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:SequenceConstraint>\n+    </sbol:sequenceConstraint>\n+    <sbol:sequenceConstraint>\n+      <sbol:SequenceConstraint rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_1/1">\n+        <sbol:displayId>constraint_1</sbol:displayId>\n+        <sbol:object rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_cds_2/1"/>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_1"/>\n+        <sbol:restriction rdf:resource="http://sbols.org/v2#precedes"/>\n+        <sbol:subject rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_rbs_2/1"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:SequenceConstraint>\n+    </sbol:sequenceConstraint>\n+    <sbol:sequenceConstraint>\n+      <sbol:SequenceConstraint rdf:about="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_2/1">\n+        <sbol:displayId>constraint_2</sbol:displayId>\n+        <sbol:object rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/rxn_3_3_prime_assembly_0/1"/>\n+        <sbol:persistentIdentity rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/constraint_2"/>\n+        <sbol:restriction rdf:resource="http://sbols.org/v2#precedes"/>\n+        <sbol:subject rdf:resource="http://liverpool.ac.uk/ComponentDefinition/P21683_30000_gene/P21683_30000_cds_2/1"/>\n+        <sbol:version>1</sbol:version>\n+      </sbol:SequenceConstraint>\n+    </sbol:sequenceConstraint>\n+  </sbol:ComponentDefinition>\n+</rdf:RDF>\n'