ena-upload-cli 0.7.0__tar.gz → 0.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {ena-upload-cli-0.7.0/ena_upload_cli.egg-info → ena_upload_cli-0.7.2}/PKG-INFO +3 -3
  2. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/README.md +1 -1
  3. ena_upload_cli-0.7.2/ena_upload/_version.py +1 -0
  4. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/ena_upload.py +7 -1
  5. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/characteristic.py +2 -2
  6. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA.project.xsd +1 -9
  7. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_PLATFORM.xml +20 -0
  8. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000012.xml +164 -165
  9. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000013.xml +226 -167
  10. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000014.xml +208 -183
  11. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000015.xml +196 -171
  12. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000016.xml +199 -168
  13. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000017.xml +196 -171
  14. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000018.xml +203 -171
  15. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000019.xml +191 -192
  16. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000020.xml +320 -183
  17. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000021.xml +260 -182
  18. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000022.xml +288 -268
  19. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000023.xml +199 -179
  20. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000024.xml +216 -189
  21. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000025.xml +185 -186
  22. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000027.xml +183 -184
  23. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000029.xml +23 -22
  24. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000030.xml +33 -25
  25. ena_upload_cli-0.7.2/ena_upload/templates/ENA_template_samples_ERC000031.xml +1437 -0
  26. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000032.xml +13 -12
  27. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000033.xml +13 -12
  28. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000035.xml +24 -24
  29. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000036.xml +50 -51
  30. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000037.xml +204 -211
  31. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000038.xml +63 -69
  32. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000039.xml +19 -18
  33. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000040.xml +30 -28
  34. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000041.xml +44 -45
  35. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000043.xml +48 -49
  36. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000044.xml +7 -6
  37. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000047.xml +98 -104
  38. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000048.xml +128 -134
  39. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000049.xml +149 -155
  40. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000050.xml +87 -93
  41. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000051.xml +27 -27
  42. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000052.xml +41 -47
  43. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000053.xml +55 -55
  44. ena_upload_cli-0.7.2/ena_upload/templates/ENA_template_samples_ERC000055.xml +1135 -0
  45. ena_upload_cli-0.7.2/ena_upload/templates/ENA_template_samples_ERC000056.xml +1796 -0
  46. ena_upload_cli-0.7.2/ena_upload/templates/ENA_template_samples_ERC000057.xml +746 -0
  47. ena_upload_cli-0.7.2/ena_upload/templates/ENA_template_samples_ERC000058.xml +1009 -0
  48. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.common.xsd +77 -24
  49. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2/ena_upload_cli.egg-info}/PKG-INFO +3 -3
  50. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload_cli.egg-info/SOURCES.txt +4 -0
  51. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/setup.py +1 -1
  52. ena-upload-cli-0.7.0/ena_upload/_version.py +0 -1
  53. ena-upload-cli-0.7.0/ena_upload/templates/ENA_template_samples_ERC000031.xml +0 -533
  54. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/LICENSE +0 -0
  55. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/MANIFEST.in +0 -0
  56. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/__init__.py +0 -0
  57. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/check_remote.py +0 -0
  58. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/__init__.py +0 -0
  59. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_experiment.py +0 -0
  60. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_run.py +0 -0
  61. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_sample.py +0 -0
  62. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_std_lib.py +0 -0
  63. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_study.py +0 -0
  64. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/ena_submission.py +0 -0
  65. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/assay_schema.json +0 -0
  66. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/comment_schema.json +0 -0
  67. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/data_schema.json +0 -0
  68. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/factor_schema.json +0 -0
  69. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/factor_value_schema.json +0 -0
  70. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/investigation_schema.json +0 -0
  71. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/material_attribute_schema.json +0 -0
  72. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/material_attribute_value_schema.json +0 -0
  73. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/material_schema.json +0 -0
  74. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/ontology_annotation_schema.json +0 -0
  75. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/ontology_source_reference_schema.json +0 -0
  76. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/organization_schema.json +0 -0
  77. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/person_schema.json +0 -0
  78. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/process_parameter_value_schema.json +0 -0
  79. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/process_schema.json +0 -0
  80. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/protocol_parameter_schema.json +0 -0
  81. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/protocol_schema.json +0 -0
  82. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/publication_schema.json +0 -0
  83. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/sample_schema.json +0 -0
  84. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/source_schema.json +0 -0
  85. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/json_schemas/study_schema.json +0 -0
  86. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/json_parsing/other_material.py +0 -0
  87. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_FILE.xml +0 -0
  88. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_LIBRARY_SELECTION.xml +0 -0
  89. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_LIBRARY_SOURCE.xml +0 -0
  90. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_LIBRARY_STRATEGY.xml +0 -0
  91. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_experiments.xml +0 -0
  92. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_runs.xml +0 -0
  93. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000011.xml +0 -0
  94. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000028.xml +0 -0
  95. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000034.xml +0 -0
  96. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_samples_ERC000045.xml +0 -0
  97. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_studies.xml +0 -0
  98. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/ENA_template_submission.xml +0 -0
  99. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.experiment.xsd +0 -0
  100. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.run.xsd +0 -0
  101. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.sample.xsd +0 -0
  102. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.study.xsd +0 -0
  103. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload/templates/SRA.submission.xsd +0 -0
  104. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload_cli.egg-info/dependency_links.txt +0 -0
  105. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload_cli.egg-info/entry_points.txt +0 -0
  106. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload_cli.egg-info/requires.txt +0 -0
  107. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/ena_upload_cli.egg-info/top_level.txt +0 -0
  108. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/requirements.txt +0 -0
  109. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/setup.cfg +0 -0
  110. {ena-upload-cli-0.7.0 → ena_upload_cli-0.7.2}/tests/test_ena_objects.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ena-upload-cli
3
- Version: 0.7.0
3
+ Version: 0.7.2
4
4
  Summary: Command Line Interface to upload data to the European Nucleotide Archive
5
5
  Home-page: https://github.com/usegalaxy-eu/ena-upload-cli
6
6
  Author: Dilmurat Yusuf
@@ -8,7 +8,7 @@ Author-email: bjoern.gruening@gmail.com
8
8
  License: MIT
9
9
  Keywords: pip,ena-upload-cli,cli,ENA,upload
10
10
  Classifier: Operating System :: OS Independent
11
- Requires-Python: >=3.5
11
+ Requires-Python: >=3.7
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: genshi==0.7.*
@@ -29,7 +29,7 @@ Requires-Dist: pytest==7.4.*
29
29
 
30
30
  # ENA upload tool
31
31
 
32
- This command line tool (CLI) allows easy submission of experimental data and respective metadata to the European Nucleotide Archive (ENA) using tabular files or one of the excel spreadsheets that can be found on this [template repo](https://github.com/ELIXIR-Belgium/ENA-metadata-templates). The supported metadata that can be submitted includes study, sample, run and experiment info so you can use the tool for programmatic submission of everything ENA needs without the need of logging in to the Webin interface. This also includes client side validation using ENA checklists and releasing the ENA objects. This command line tool is also available as a [Galaxy tool](https://toolshed.g2.bx.psu.edu/view/iuc/ena_upload/) and can be added to you own Galaxy instance or you can make use of one of the existing Galaxy instances, like [usegalaxy.eu](https://usegalaxy.eu/root?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload).
32
+ This command line tool (CLI) allows easy submission of experimental data and respective metadata to the European Nucleotide Archive (ENA) using tabular files or one of the excel spreadsheets that can be found on this [template repo](https://github.com/ELIXIR-Belgium/ENA-metadata-templates). The supported metadata that can be submitted includes study, sample, run and experiment info so you can use the tool for programmatic submission of everything ENA needs without the need of logging in to the Webin interface. This also includes client side validation using ENA checklists and releasing the ENA objects. This command line tool is also available as a [Galaxy tool](https://toolshed.g2.bx.psu.edu/view/iuc/ena_upload/) and can be added to you own Galaxy instance or you can make use of one of the existing Galaxy instances, like [usegalaxy.eu](https://usegalaxy.eu/root?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload) or [usegalaxy.be](https://usegalaxy.be/?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload).
33
33
 
34
34
  ## Overview
35
35
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  # ENA upload tool
9
9
 
10
- This command line tool (CLI) allows easy submission of experimental data and respective metadata to the European Nucleotide Archive (ENA) using tabular files or one of the excel spreadsheets that can be found on this [template repo](https://github.com/ELIXIR-Belgium/ENA-metadata-templates). The supported metadata that can be submitted includes study, sample, run and experiment info so you can use the tool for programmatic submission of everything ENA needs without the need of logging in to the Webin interface. This also includes client side validation using ENA checklists and releasing the ENA objects. This command line tool is also available as a [Galaxy tool](https://toolshed.g2.bx.psu.edu/view/iuc/ena_upload/) and can be added to you own Galaxy instance or you can make use of one of the existing Galaxy instances, like [usegalaxy.eu](https://usegalaxy.eu/root?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload).
10
+ This command line tool (CLI) allows easy submission of experimental data and respective metadata to the European Nucleotide Archive (ENA) using tabular files or one of the excel spreadsheets that can be found on this [template repo](https://github.com/ELIXIR-Belgium/ENA-metadata-templates). The supported metadata that can be submitted includes study, sample, run and experiment info so you can use the tool for programmatic submission of everything ENA needs without the need of logging in to the Webin interface. This also includes client side validation using ENA checklists and releasing the ENA objects. This command line tool is also available as a [Galaxy tool](https://toolshed.g2.bx.psu.edu/view/iuc/ena_upload/) and can be added to you own Galaxy instance or you can make use of one of the existing Galaxy instances, like [usegalaxy.eu](https://usegalaxy.eu/root?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload) or [usegalaxy.be](https://usegalaxy.be/?tool_id=toolshed.g2.bx.psu.edu/repos/iuc/ena_upload/ena_upload).
11
11
 
12
12
  ## Overview
13
13
 
@@ -0,0 +1 @@
1
+ __version__ = "0.7.2"
@@ -39,6 +39,12 @@ class MyFTP_TLS(ftplib.FTP_TLS):
39
39
  conn = self.context.wrap_socket(conn,
40
40
  server_hostname=self.host,
41
41
  session=self.sock.session)
42
+ # fix reuse of ssl socket:
43
+ # https://stackoverflow.com/a/53456626/10971151 and
44
+ # https://stackoverflow.com/a/70830916/10971151
45
+ def custom_unwrap():
46
+ pass
47
+ conn.unwrap = custom_unwrap
42
48
  return conn, size
43
49
 
44
50
 
@@ -407,7 +413,7 @@ def submit_data(file_paths, password, webin_id):
407
413
 
408
414
  print("\nConnecting to ftp.webin2.ebi.ac.uk....")
409
415
  try:
410
- ftps = MyFTP_TLS(timeout=10)
416
+ ftps = MyFTP_TLS(timeout=120)
411
417
  ftps.context.set_ciphers('HIGH:!DH:!aNULL')
412
418
  ftps.connect(ftp_host, port=21)
413
419
  ftps.auth()
@@ -11,8 +11,8 @@ class IsaBase:
11
11
 
12
12
  @classmethod
13
13
  def validate_json(self, isa_json: Dict[str, str], schema):
14
- schema_path = os.path.join(os.curdir, "ena_upload", "json_parsing", "json_schemas", schema)
15
-
14
+ base_path = os.path.abspath(os.path.dirname(__file__))
15
+ schema_path = os.path.join(base_path, 'json_schemas', schema)
16
16
  json_file = open(schema_path)
17
17
  json_schema = json.load(json_file)
18
18
 
@@ -157,15 +157,7 @@
157
157
  </xs:annotation>
158
158
  <xs:complexType>
159
159
  <xs:sequence maxOccurs="unbounded" minOccurs="1">
160
- <xs:element name="PROJECT_LINK">
161
- <xs:complexType>
162
- <xs:choice>
163
- <xs:element name="XREF_LINK" type="com:XRefType"/>
164
- <xs:element name="URL_LINK" type="com:URLType">
165
- </xs:element>
166
- </xs:choice>
167
- </xs:complexType>
168
- </xs:element>
160
+ <xs:element name="PROJECT_LINK" type="com:LinkType" />
169
161
  </xs:sequence>
170
162
  </xs:complexType>
171
163
  </xs:element>
@@ -111,4 +111,24 @@
111
111
  <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'ug 100'">UG 100</INSTRUMENT_MODEL>
112
112
  <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'unspecified'">unspecified</INSTRUMENT_MODEL>
113
113
  </ULTIMA>
114
+ <VELA_DIAGNOSTICS py:when="row.platform.lower().strip() == 'vela_diagnostics'" py:choose="">
115
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'sentosa sq301'">Sentosa SQ301</INSTRUMENT_MODEL>
116
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'unspecified'">unspecified</INSTRUMENT_MODEL>
117
+ </VELA_DIAGNOSTICS>
118
+ <GENAPSYS py:when="row.platform.lower().strip() == 'genapsys'" py:choose="">
119
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'genius'">GENIUS</INSTRUMENT_MODEL>
120
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'genapsys sequencer'">Genapsys Sequencer</INSTRUMENT_MODEL>
121
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'gs111'">GS111</INSTRUMENT_MODEL>
122
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'unspecified'">unspecified</INSTRUMENT_MODEL>
123
+ </GENAPSYS>
124
+ <GENEMIND py:when="row.platform.lower().strip() == 'genemind'" py:choose="">
125
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'genocare 1600'">GenoCare 1600</INSTRUMENT_MODEL>
126
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'genolab m'">GenoLab M</INSTRUMENT_MODEL>
127
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'fastaseq 300'">FASTASeq 300</INSTRUMENT_MODEL>
128
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'unspecified'">unspecified</INSTRUMENT_MODEL>
129
+ </GENEMIND>
130
+ <TAPESTRI py:when="row.platform.lower().strip() == 'tapestri'" py:choose="">
131
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'tapestri'">Tapestri</INSTRUMENT_MODEL>
132
+ <INSTRUMENT_MODEL py:when="row.instrument_model.lower().strip() == 'unspecified'">unspecified</INSTRUMENT_MODEL>
133
+ </TAPESTRI>
114
134
  </PLATFORM>
@@ -33,101 +33,95 @@ def mandatorytest(row, column, index):
33
33
  <DESCRIPTION>${row.sample_description}</DESCRIPTION>
34
34
  </py:if>
35
35
  <SAMPLE_ATTRIBUTES>
36
- <py:if test="mandatorytest(row, 'project name', index)">
37
- <SAMPLE_ATTRIBUTE>
38
- <TAG>project name</TAG>
39
- <VALUE>${row['project name']}</VALUE>
40
- </SAMPLE_ATTRIBUTE>
41
- </py:if>
42
- <py:if test="attributetest(row, 'experimental factor')">
36
+ <py:if test="attributetest(row, 'trophic level')">
43
37
  <SAMPLE_ATTRIBUTE>
44
- <TAG>experimental factor</TAG>
45
- <VALUE>${row['experimental factor']}</VALUE>
38
+ <TAG>trophic level</TAG>
39
+ <VALUE>${row['trophic level']}</VALUE>
46
40
  </SAMPLE_ATTRIBUTE>
47
41
  </py:if>
48
- <py:if test="attributetest(row, 'ploidy')">
42
+ <py:if test="attributetest(row, 'observed biotic relationship')">
49
43
  <SAMPLE_ATTRIBUTE>
50
- <TAG>ploidy</TAG>
51
- <VALUE>${row['ploidy']}</VALUE>
44
+ <TAG>observed biotic relationship</TAG>
45
+ <VALUE>${row['observed biotic relationship']}</VALUE>
52
46
  </SAMPLE_ATTRIBUTE>
53
47
  </py:if>
54
- <py:if test="attributetest(row, 'number of replicons')">
48
+ <py:if test="attributetest(row, 'known pathogenicity')">
55
49
  <SAMPLE_ATTRIBUTE>
56
- <TAG>number of replicons</TAG>
57
- <VALUE>${row['number of replicons']}</VALUE>
50
+ <TAG>known pathogenicity</TAG>
51
+ <VALUE>${row['known pathogenicity']}</VALUE>
58
52
  </SAMPLE_ATTRIBUTE>
59
53
  </py:if>
60
- <py:if test="attributetest(row, 'extrachromosomal elements')">
54
+ <py:if test="attributetest(row, 'relationship to oxygen')">
61
55
  <SAMPLE_ATTRIBUTE>
62
- <TAG>extrachromosomal elements</TAG>
63
- <VALUE>${row['extrachromosomal elements']}</VALUE>
56
+ <TAG>relationship to oxygen</TAG>
57
+ <VALUE>${row['relationship to oxygen']}</VALUE>
64
58
  </SAMPLE_ATTRIBUTE>
65
59
  </py:if>
66
- <py:if test="attributetest(row, 'estimated size')">
60
+ <py:if test="attributetest(row, 'propagation')">
67
61
  <SAMPLE_ATTRIBUTE>
68
- <TAG>estimated size</TAG>
69
- <VALUE>${row['estimated size']}</VALUE>
62
+ <TAG>propagation</TAG>
63
+ <VALUE>${row['propagation']}</VALUE>
70
64
  </SAMPLE_ATTRIBUTE>
71
65
  </py:if>
72
- <py:if test="attributetest(row, 'reference for biomaterial')">
66
+ <py:if test="attributetest(row, 'sample collection device')">
73
67
  <SAMPLE_ATTRIBUTE>
74
- <TAG>reference for biomaterial</TAG>
75
- <VALUE>${row['reference for biomaterial']}</VALUE>
68
+ <TAG>sample collection device</TAG>
69
+ <VALUE>${row['sample collection device']}</VALUE>
76
70
  </SAMPLE_ATTRIBUTE>
77
71
  </py:if>
78
- <py:if test="attributetest(row, 'annotation source')">
72
+ <py:if test="attributetest(row, 'sample collection method')">
79
73
  <SAMPLE_ATTRIBUTE>
80
- <TAG>annotation source</TAG>
81
- <VALUE>${row['annotation source']}</VALUE>
74
+ <TAG>sample collection method</TAG>
75
+ <VALUE>${row['sample collection method']}</VALUE>
82
76
  </SAMPLE_ATTRIBUTE>
83
77
  </py:if>
84
- <py:if test="attributetest(row, 'sample volume or weight for DNA extraction')">
78
+ <py:if test="attributetest(row, 'sample storage temperature')">
85
79
  <SAMPLE_ATTRIBUTE>
86
- <TAG>sample volume or weight for DNA extraction</TAG>
87
- <VALUE>${row['sample volume or weight for DNA extraction']}</VALUE>
88
- <UNITS>ng</UNITS>
80
+ <TAG>sample storage temperature</TAG>
81
+ <VALUE>${row['sample storage temperature']}</VALUE>
82
+ <UNITS>°C</UNITS>
89
83
  </SAMPLE_ATTRIBUTE>
90
84
  </py:if>
91
- <py:if test="attributetest(row, 'nucleic acid extraction')">
85
+ <py:if test="attributetest(row, 'sample storage location')">
92
86
  <SAMPLE_ATTRIBUTE>
93
- <TAG>nucleic acid extraction</TAG>
94
- <VALUE>${row['nucleic acid extraction']}</VALUE>
87
+ <TAG>sample storage location</TAG>
88
+ <VALUE>${row['sample storage location']}</VALUE>
95
89
  </SAMPLE_ATTRIBUTE>
96
90
  </py:if>
97
- <py:if test="attributetest(row, 'nucleic acid amplification')">
91
+ <py:if test="attributetest(row, 'oxygenation status of sample')">
98
92
  <SAMPLE_ATTRIBUTE>
99
- <TAG>nucleic acid amplification</TAG>
100
- <VALUE>${row['nucleic acid amplification']}</VALUE>
93
+ <TAG>oxygenation status of sample</TAG>
94
+ <VALUE>${row['oxygenation status of sample']}</VALUE>
101
95
  </SAMPLE_ATTRIBUTE>
102
96
  </py:if>
103
- <py:if test="attributetest(row, 'library size')">
97
+ <py:if test="mandatorytest(row, 'project name', index)">
104
98
  <SAMPLE_ATTRIBUTE>
105
- <TAG>library size</TAG>
106
- <VALUE>${row['library size']}</VALUE>
99
+ <TAG>project name</TAG>
100
+ <VALUE>${row['project name']}</VALUE>
107
101
  </SAMPLE_ATTRIBUTE>
108
102
  </py:if>
109
- <py:if test="attributetest(row, 'library reads sequenced')">
103
+ <py:if test="attributetest(row, 'ploidy')">
110
104
  <SAMPLE_ATTRIBUTE>
111
- <TAG>library reads sequenced</TAG>
112
- <VALUE>${row['library reads sequenced']}</VALUE>
105
+ <TAG>ploidy</TAG>
106
+ <VALUE>${row['ploidy']}</VALUE>
113
107
  </SAMPLE_ATTRIBUTE>
114
108
  </py:if>
115
- <py:if test="attributetest(row, 'library construction method')">
109
+ <py:if test="attributetest(row, 'number of replicons')">
116
110
  <SAMPLE_ATTRIBUTE>
117
- <TAG>library construction method</TAG>
118
- <VALUE>${row['library construction method']}</VALUE>
111
+ <TAG>number of replicons</TAG>
112
+ <VALUE>${row['number of replicons']}</VALUE>
119
113
  </SAMPLE_ATTRIBUTE>
120
114
  </py:if>
121
- <py:if test="attributetest(row, 'library vector')">
115
+ <py:if test="attributetest(row, 'extrachromosomal elements')">
122
116
  <SAMPLE_ATTRIBUTE>
123
- <TAG>library vector</TAG>
124
- <VALUE>${row['library vector']}</VALUE>
117
+ <TAG>extrachromosomal elements</TAG>
118
+ <VALUE>${row['extrachromosomal elements']}</VALUE>
125
119
  </SAMPLE_ATTRIBUTE>
126
120
  </py:if>
127
- <py:if test="attributetest(row, 'library screening strategy')">
121
+ <py:if test="attributetest(row, 'estimated size')">
128
122
  <SAMPLE_ATTRIBUTE>
129
- <TAG>library screening strategy</TAG>
130
- <VALUE>${row['library screening strategy']}</VALUE>
123
+ <TAG>estimated size</TAG>
124
+ <VALUE>${row['estimated size']}</VALUE>
131
125
  </SAMPLE_ATTRIBUTE>
132
126
  </py:if>
133
127
  <py:if test="attributetest(row, 'target gene')">
@@ -142,36 +136,12 @@ def mandatorytest(row, column, index):
142
136
  <VALUE>${row['target subfragment']}</VALUE>
143
137
  </SAMPLE_ATTRIBUTE>
144
138
  </py:if>
145
- <py:if test="attributetest(row, 'pcr primers')">
146
- <SAMPLE_ATTRIBUTE>
147
- <TAG>pcr primers</TAG>
148
- <VALUE>${row['pcr primers']}</VALUE>
149
- </SAMPLE_ATTRIBUTE>
150
- </py:if>
151
139
  <py:if test="attributetest(row, 'multiplex identifiers')">
152
140
  <SAMPLE_ATTRIBUTE>
153
141
  <TAG>multiplex identifiers</TAG>
154
142
  <VALUE>${row['multiplex identifiers']}</VALUE>
155
143
  </SAMPLE_ATTRIBUTE>
156
144
  </py:if>
157
- <py:if test="attributetest(row, 'adapters')">
158
- <SAMPLE_ATTRIBUTE>
159
- <TAG>adapters</TAG>
160
- <VALUE>${row['adapters']}</VALUE>
161
- </SAMPLE_ATTRIBUTE>
162
- </py:if>
163
- <py:if test="attributetest(row, 'pcr conditions')">
164
- <SAMPLE_ATTRIBUTE>
165
- <TAG>pcr conditions</TAG>
166
- <VALUE>${row['pcr conditions']}</VALUE>
167
- </SAMPLE_ATTRIBUTE>
168
- </py:if>
169
- <py:if test="attributetest(row, 'sequencing method')">
170
- <SAMPLE_ATTRIBUTE>
171
- <TAG>sequencing method</TAG>
172
- <VALUE>${row['sequencing method']}</VALUE>
173
- </SAMPLE_ATTRIBUTE>
174
- </py:if>
175
145
  <py:if test="attributetest(row, 'sequence quality check')">
176
146
  <SAMPLE_ATTRIBUTE>
177
147
  <TAG>sequence quality check</TAG>
@@ -196,18 +166,6 @@ def mandatorytest(row, column, index):
196
166
  <VALUE>${row['relevant standard operating procedures']}</VALUE>
197
167
  </SAMPLE_ATTRIBUTE>
198
168
  </py:if>
199
- <py:if test="attributetest(row, 'negative control type')">
200
- <SAMPLE_ATTRIBUTE>
201
- <TAG>negative control type</TAG>
202
- <VALUE>${row['negative control type']}</VALUE>
203
- </SAMPLE_ATTRIBUTE>
204
- </py:if>
205
- <py:if test="attributetest(row, 'positive control type')">
206
- <SAMPLE_ATTRIBUTE>
207
- <TAG>positive control type</TAG>
208
- <VALUE>${row['positive control type']}</VALUE>
209
- </SAMPLE_ATTRIBUTE>
210
- </py:if>
211
169
  <py:if test="mandatorytest(row, 'collection date', index)">
212
170
  <SAMPLE_ATTRIBUTE>
213
171
  <TAG>collection date</TAG>
@@ -285,30 +243,6 @@ def mandatorytest(row, column, index):
285
243
  <VALUE>${row['ventilation type']}</VALUE>
286
244
  </SAMPLE_ATTRIBUTE>
287
245
  </py:if>
288
- <py:if test="attributetest(row, 'source material identifiers')">
289
- <SAMPLE_ATTRIBUTE>
290
- <TAG>source material identifiers</TAG>
291
- <VALUE>${row['source material identifiers']}</VALUE>
292
- </SAMPLE_ATTRIBUTE>
293
- </py:if>
294
- <py:if test="attributetest(row, 'sample material processing')">
295
- <SAMPLE_ATTRIBUTE>
296
- <TAG>sample material processing</TAG>
297
- <VALUE>${row['sample material processing']}</VALUE>
298
- </SAMPLE_ATTRIBUTE>
299
- </py:if>
300
- <py:if test="attributetest(row, 'isolation and growth condition')">
301
- <SAMPLE_ATTRIBUTE>
302
- <TAG>isolation and growth condition</TAG>
303
- <VALUE>${row['isolation and growth condition']}</VALUE>
304
- </SAMPLE_ATTRIBUTE>
305
- </py:if>
306
- <py:if test="attributetest(row, 'propagation')">
307
- <SAMPLE_ATTRIBUTE>
308
- <TAG>propagation</TAG>
309
- <VALUE>${row['propagation']}</VALUE>
310
- </SAMPLE_ATTRIBUTE>
311
- </py:if>
312
246
  <py:if test="attributetest(row, 'amount or size of sample collected')">
313
247
  <SAMPLE_ATTRIBUTE>
314
248
  <TAG>amount or size of sample collected</TAG>
@@ -316,12 +250,6 @@ def mandatorytest(row, column, index):
316
250
  <UNITS>m3</UNITS>
317
251
  </SAMPLE_ATTRIBUTE>
318
252
  </py:if>
319
- <py:if test="attributetest(row, 'oxygenation status of sample')">
320
- <SAMPLE_ATTRIBUTE>
321
- <TAG>oxygenation status of sample</TAG>
322
- <VALUE>${row['oxygenation status of sample']}</VALUE>
323
- </SAMPLE_ATTRIBUTE>
324
- </py:if>
325
253
  <py:if test="attributetest(row, 'organism count')">
326
254
  <SAMPLE_ATTRIBUTE>
327
255
  <TAG>organism count</TAG>
@@ -332,32 +260,6 @@ def mandatorytest(row, column, index):
332
260
  <SAMPLE_ATTRIBUTE>
333
261
  <TAG>sample storage duration</TAG>
334
262
  <VALUE>${row['sample storage duration']}</VALUE>
335
- <UNITS>years</UNITS>
336
- </SAMPLE_ATTRIBUTE>
337
- </py:if>
338
- <py:if test="attributetest(row, 'sample storage temperature')">
339
- <SAMPLE_ATTRIBUTE>
340
- <TAG>sample storage temperature</TAG>
341
- <VALUE>${row['sample storage temperature']}</VALUE>
342
- <UNITS>°C</UNITS>
343
- </SAMPLE_ATTRIBUTE>
344
- </py:if>
345
- <py:if test="attributetest(row, 'sample storage location')">
346
- <SAMPLE_ATTRIBUTE>
347
- <TAG>sample storage location</TAG>
348
- <VALUE>${row['sample storage location']}</VALUE>
349
- </SAMPLE_ATTRIBUTE>
350
- </py:if>
351
- <py:if test="attributetest(row, 'sample collection device')">
352
- <SAMPLE_ATTRIBUTE>
353
- <TAG>sample collection device</TAG>
354
- <VALUE>${row['sample collection device']}</VALUE>
355
- </SAMPLE_ATTRIBUTE>
356
- </py:if>
357
- <py:if test="attributetest(row, 'sample collection method')">
358
- <SAMPLE_ATTRIBUTE>
359
- <TAG>sample collection method</TAG>
360
- <VALUE>${row['sample collection method']}</VALUE>
361
263
  </SAMPLE_ATTRIBUTE>
362
264
  </py:if>
363
265
  <py:if test="attributetest(row, 'host disease status')">
@@ -469,28 +371,34 @@ def mandatorytest(row, column, index):
469
371
  <UNITS>psu</UNITS>
470
372
  </SAMPLE_ATTRIBUTE>
471
373
  </py:if>
472
- <py:if test="attributetest(row, 'subspecific genetic lineage')">
374
+ <py:if test="attributetest(row, 'source material identifiers')">
473
375
  <SAMPLE_ATTRIBUTE>
474
- <TAG>subspecific genetic lineage</TAG>
475
- <VALUE>${row['subspecific genetic lineage']}</VALUE>
376
+ <TAG>source material identifiers</TAG>
377
+ <VALUE>${row['source material identifiers']}</VALUE>
476
378
  </SAMPLE_ATTRIBUTE>
477
379
  </py:if>
478
- <py:if test="attributetest(row, 'trophic level')">
380
+ <py:if test="attributetest(row, 'perturbation')">
479
381
  <SAMPLE_ATTRIBUTE>
480
- <TAG>trophic level</TAG>
481
- <VALUE>${row['trophic level']}</VALUE>
382
+ <TAG>perturbation</TAG>
383
+ <VALUE>${row['perturbation']}</VALUE>
482
384
  </SAMPLE_ATTRIBUTE>
483
385
  </py:if>
484
- <py:if test="attributetest(row, 'relationship to oxygen')">
386
+ <py:if test="attributetest(row, 'negative control type')">
485
387
  <SAMPLE_ATTRIBUTE>
486
- <TAG>relationship to oxygen</TAG>
487
- <VALUE>${row['relationship to oxygen']}</VALUE>
388
+ <TAG>negative control type</TAG>
389
+ <VALUE>${row['negative control type']}</VALUE>
488
390
  </SAMPLE_ATTRIBUTE>
489
391
  </py:if>
490
- <py:if test="attributetest(row, 'known pathogenicity')">
392
+ <py:if test="attributetest(row, 'positive control type')">
491
393
  <SAMPLE_ATTRIBUTE>
492
- <TAG>known pathogenicity</TAG>
493
- <VALUE>${row['known pathogenicity']}</VALUE>
394
+ <TAG>positive control type</TAG>
395
+ <VALUE>${row['positive control type']}</VALUE>
396
+ </SAMPLE_ATTRIBUTE>
397
+ </py:if>
398
+ <py:if test="attributetest(row, 'experimental factor')">
399
+ <SAMPLE_ATTRIBUTE>
400
+ <TAG>experimental factor</TAG>
401
+ <VALUE>${row['experimental factor']}</VALUE>
494
402
  </SAMPLE_ATTRIBUTE>
495
403
  </py:if>
496
404
  <py:if test="attributetest(row, 'encoded traits')">
@@ -499,22 +407,113 @@ def mandatorytest(row, column, index):
499
407
  <VALUE>${row['encoded traits']}</VALUE>
500
408
  </SAMPLE_ATTRIBUTE>
501
409
  </py:if>
502
- <py:if test="attributetest(row, 'observed biotic relationship')">
410
+ <py:if test="attributetest(row, 'subspecific genetic lineage')">
503
411
  <SAMPLE_ATTRIBUTE>
504
- <TAG>observed biotic relationship</TAG>
505
- <VALUE>${row['observed biotic relationship']}</VALUE>
412
+ <TAG>subspecific genetic lineage</TAG>
413
+ <VALUE>${row['subspecific genetic lineage']}</VALUE>
506
414
  </SAMPLE_ATTRIBUTE>
507
415
  </py:if>
508
- <py:if test="attributetest(row, 'chemical administration')">
416
+ <py:if test="attributetest(row, 'taxonomic classification')">
509
417
  <SAMPLE_ATTRIBUTE>
510
- <TAG>chemical administration</TAG>
511
- <VALUE>${row['chemical administration']}</VALUE>
418
+ <TAG>taxonomic classification</TAG>
419
+ <VALUE>${row['taxonomic classification']}</VALUE>
512
420
  </SAMPLE_ATTRIBUTE>
513
421
  </py:if>
514
- <py:if test="attributetest(row, 'perturbation')">
422
+ <py:if test="attributetest(row, 'isolation and growth condition')">
515
423
  <SAMPLE_ATTRIBUTE>
516
- <TAG>perturbation</TAG>
517
- <VALUE>${row['perturbation']}</VALUE>
424
+ <TAG>isolation and growth condition</TAG>
425
+ <VALUE>${row['isolation and growth condition']}</VALUE>
426
+ </SAMPLE_ATTRIBUTE>
427
+ </py:if>
428
+ <py:if test="attributetest(row, 'annotation source')">
429
+ <SAMPLE_ATTRIBUTE>
430
+ <TAG>annotation source</TAG>
431
+ <VALUE>${row['annotation source']}</VALUE>
432
+ </SAMPLE_ATTRIBUTE>
433
+ </py:if>
434
+ <py:if test="attributetest(row, 'reference for biomaterial')">
435
+ <SAMPLE_ATTRIBUTE>
436
+ <TAG>reference for biomaterial</TAG>
437
+ <VALUE>${row['reference for biomaterial']}</VALUE>
438
+ </SAMPLE_ATTRIBUTE>
439
+ </py:if>
440
+ <py:if test="attributetest(row, 'sample material processing')">
441
+ <SAMPLE_ATTRIBUTE>
442
+ <TAG>sample material processing</TAG>
443
+ <VALUE>${row['sample material processing']}</VALUE>
444
+ </SAMPLE_ATTRIBUTE>
445
+ </py:if>
446
+ <py:if test="attributetest(row, 'sample volume or weight for DNA extraction')">
447
+ <SAMPLE_ATTRIBUTE>
448
+ <TAG>sample volume or weight for DNA extraction</TAG>
449
+ <VALUE>${row['sample volume or weight for DNA extraction']}</VALUE>
450
+ <UNITS>ng</UNITS>
451
+ </SAMPLE_ATTRIBUTE>
452
+ </py:if>
453
+ <py:if test="attributetest(row, 'nucleic acid extraction')">
454
+ <SAMPLE_ATTRIBUTE>
455
+ <TAG>nucleic acid extraction</TAG>
456
+ <VALUE>${row['nucleic acid extraction']}</VALUE>
457
+ </SAMPLE_ATTRIBUTE>
458
+ </py:if>
459
+ <py:if test="attributetest(row, 'nucleic acid amplification')">
460
+ <SAMPLE_ATTRIBUTE>
461
+ <TAG>nucleic acid amplification</TAG>
462
+ <VALUE>${row['nucleic acid amplification']}</VALUE>
463
+ </SAMPLE_ATTRIBUTE>
464
+ </py:if>
465
+ <py:if test="attributetest(row, 'library size')">
466
+ <SAMPLE_ATTRIBUTE>
467
+ <TAG>library size</TAG>
468
+ <VALUE>${row['library size']}</VALUE>
469
+ </SAMPLE_ATTRIBUTE>
470
+ </py:if>
471
+ <py:if test="attributetest(row, 'library reads sequenced')">
472
+ <SAMPLE_ATTRIBUTE>
473
+ <TAG>library reads sequenced</TAG>
474
+ <VALUE>${row['library reads sequenced']}</VALUE>
475
+ </SAMPLE_ATTRIBUTE>
476
+ </py:if>
477
+ <py:if test="attributetest(row, 'library construction method')">
478
+ <SAMPLE_ATTRIBUTE>
479
+ <TAG>library construction method</TAG>
480
+ <VALUE>${row['library construction method']}</VALUE>
481
+ </SAMPLE_ATTRIBUTE>
482
+ </py:if>
483
+ <py:if test="attributetest(row, 'library vector')">
484
+ <SAMPLE_ATTRIBUTE>
485
+ <TAG>library vector</TAG>
486
+ <VALUE>${row['library vector']}</VALUE>
487
+ </SAMPLE_ATTRIBUTE>
488
+ </py:if>
489
+ <py:if test="attributetest(row, 'library screening strategy')">
490
+ <SAMPLE_ATTRIBUTE>
491
+ <TAG>library screening strategy</TAG>
492
+ <VALUE>${row['library screening strategy']}</VALUE>
493
+ </SAMPLE_ATTRIBUTE>
494
+ </py:if>
495
+ <py:if test="attributetest(row, 'pcr conditions')">
496
+ <SAMPLE_ATTRIBUTE>
497
+ <TAG>pcr conditions</TAG>
498
+ <VALUE>${row['pcr conditions']}</VALUE>
499
+ </SAMPLE_ATTRIBUTE>
500
+ </py:if>
501
+ <py:if test="attributetest(row, 'pcr primers')">
502
+ <SAMPLE_ATTRIBUTE>
503
+ <TAG>pcr primers</TAG>
504
+ <VALUE>${row['pcr primers']}</VALUE>
505
+ </SAMPLE_ATTRIBUTE>
506
+ </py:if>
507
+ <py:if test="attributetest(row, 'adapters')">
508
+ <SAMPLE_ATTRIBUTE>
509
+ <TAG>adapters</TAG>
510
+ <VALUE>${row['adapters']}</VALUE>
511
+ </SAMPLE_ATTRIBUTE>
512
+ </py:if>
513
+ <py:if test="attributetest(row, 'chemical administration')">
514
+ <SAMPLE_ATTRIBUTE>
515
+ <TAG>chemical administration</TAG>
516
+ <VALUE>${row['chemical administration']}</VALUE>
518
517
  </SAMPLE_ATTRIBUTE>
519
518
  </py:if>
520
519
  <SAMPLE_ATTRIBUTE>