{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ISA Create Mode example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Abstract:\n", " \n", "In this notebook, we'll show how to generate an ISA-Tab and an ISA JSON representation of a metabolomics study.\n", "The study uses GC-MS and 13C NMR on 3 distinct sample types (liver, blood and heart) collected from study subjects assigned to 3 distinct study arms.\n", "\n", "GC-MS acquisition were carried out in duplicate, extracts were derivatized using BSA and acquired on an Agilent QTOF in both positive and negative modes.\n", "13C NMR free induction decays were acquired on a Bruker Avance, using CPMG and PSEQ pulse sequences in duplicates.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Loading ISA-API model and relevant library" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# If executing the notebooks on `Google Colab`,uncomment the following command \n", "# and run it to install the required python libraries. Also, make the test datasets available.\n", "\n", "# !pip install -r requirements.txt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from isatools import isatab\n", "from isatools.isajson import ISAJSONEncoder\n", "from collections import OrderedDict\n", "from isatools.model import (\n", " Investigation,\n", " OntologyAnnotation,\n", " FactorValue,\n", " Characteristic\n", ")\n", "from isatools.create.model import (\n", " Treatment,\n", " NonTreatment,\n", " StudyCell,\n", " StudyArm,\n", " ProductNode,\n", " SampleAndAssayPlan,\n", " StudyDesign,\n", " QualityControl\n", ")\n", "from isatools.create.constants import (\n", " BASE_FACTORS,\n", " SCREEN,\n", " RUN_IN,\n", " WASHOUT,\n", " FOLLOW_UP,\n", " SAMPLE,\n", " EXTRACT,\n", " LABELED_EXTRACT,\n", " DATA_FILE\n", ")\n", "from isatools.isatab import dump_tables_to_dataframes as dumpdf\n", "import os\n", "import json" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Setting variables:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "NAME = 'name'\n", "FACTORS_0_VALUE = OntologyAnnotation(term='nitroglycerin')\n", "FACTORS_0_VALUE_ALT = OntologyAnnotation(term='alcohol')\n", "FACTORS_0_VALUE_THIRD = OntologyAnnotation(term='water')\n", "\n", "FACTORS_1_VALUE = 5\n", "FACTORS_1_UNIT = OntologyAnnotation(term='kg/m^3')\n", "\n", "FACTORS_2_VALUE = 100.0\n", "FACTORS_2_VALUE_ALT = 50.0\n", "FACTORS_2_UNIT = OntologyAnnotation(term='s')\n", "\n", "TEST_EPOCH_0_NAME = 'test epoch 0'\n", "TEST_EPOCH_1_NAME = 'test epoch 1'\n", "TEST_EPOCH_2_NAME = 'test epoch 2'\n", "\n", "TEST_STUDY_ARM_NAME_00 = 'test arm'\n", "TEST_STUDY_ARM_NAME_01 = 'another arm'\n", "TEST_STUDY_ARM_NAME_02 = 'yet another arm'\n", "\n", "TEST_STUDY_DESIGN_NAME = 'test study design'\n", "\n", "TEST_EPOCH_0_RANK = 0\n", "\n", "SCREEN_DURATION_VALUE = 100\n", "FOLLOW_UP_DURATION_VALUE = 5*366\n", "WASHOUT_DURATION_VALUE = 30\n", "DURATION_UNIT = OntologyAnnotation(term='day')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Declaration of ISA Sample / Biomaterial templates for liver, blood and heart" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sample_list = [\n", " {\n", " 'node_type': SAMPLE,\n", " 'characteristics_category': OntologyAnnotation(term='organism part'),\n", " 'characteristics_value': OntologyAnnotation(term='liver'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': SAMPLE,\n", " 'characteristics_category': OntologyAnnotation(term='organism part'),\n", " 'characteristics_value': OntologyAnnotation(term='blood'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': SAMPLE,\n", " 'characteristics_category': OntologyAnnotation(term='organism part'),\n", " 'characteristics_value': OntologyAnnotation(term='heart'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " }\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Declaration of ISA Assay templates as Python `OrderedDict`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# A Mass Spectrometry based metabolite profiling assay\n", "\n", "ms_assay_dict = OrderedDict([\n", " ('measurement_type', OntologyAnnotation(term='metabolite profiling')),\n", " ('technology_type', OntologyAnnotation(term='mass spectrometry')),\n", " ('extraction', {}),\n", " ('extract', [\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='polar fraction'),\n", " 'size': 1,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='lipids'),\n", " 'size': 1,\n", " 'is_input_to_next_protocols': True\n", " }\n", " ]),\n", " ('derivatization', {\n", " '#replicates': 1,\n", " OntologyAnnotation(term='derivatization'): ['sylalation'],\n", " OntologyAnnotation(term='derivatization'): ['bis(trimethylsilyl)acetamide'],\n", " }),\n", " ('labeled extract', [\n", " {\n", " 'node_type': LABELED_EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='labeled extract type'),\n", " 'characteristics_value': '',\n", " 'size': 1,\n", " 'is_input_to_next_protocols': True\n", " }\n", " ]),\n", " ('mass spectrometry', {\n", " '#replicates': 2,\n", " OntologyAnnotation(term='instrument'): ['Agilent QTOF'],\n", " OntologyAnnotation(term='injection_mode'): ['GC'],\n", " OntologyAnnotation(term='acquisition_mode'): ['positive mode','negative mode']\n", " }),\n", " ('raw spectral data file', [\n", " {\n", " 'node_type': DATA_FILE,\n", " 'size': 1,\n", " 'is_input_to_next_protocols': False\n", " }\n", " ])\n", "])\n", "\n", "\n", "# A high-throughput phenotyping imaging based phenotyping assay\n", "\n", "phti_assay_dict = OrderedDict([\n", " ('measurement_type', OntologyAnnotation(term='phenotyping')),\n", " ('technology_type', OntologyAnnotation(term='high-throughput imaging')),\n", " ('extraction', {}),\n", " ('extract', [\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='supernatant'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='pellet'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " }\n", " ]),\n", " ('phenotyping by high throughput imaging', {\n", " 'OntologyAnnotation(term=instrument)': ['lemnatech gigant'],\n", " 'OntologyAnnotation(term=acquisition_mode)': ['UV light','near-IR light','far-IR light','visible light'],\n", " 'OntologyAnnotation(term=camera position)': ['top','120 degree','240 degree','360 degree'],\n", " 'OntologyAnnotation(term=imaging daily schedule)': ['06.00','19.00']\n", " }),\n", " ('raw_spectral_data_file', [\n", " {\n", " 'node_type': DATA_FILE,\n", " 'size': 1,\n", " 'technical_replicates': 2,\n", " 'is_input_to_next_protocols': False\n", " }\n", " ])\n", " ])\n", "\n", "# A liquid chromatography diode-array based metabolite profiling assay\n", "\n", "lcdad_assay_dict = OrderedDict([\n", " ('measurement_type', OntologyAnnotation(term='metabolite identification')),\n", " ('technology_type', OntologyAnnotation(term='liquid chromatography diode-array detector')),\n", " ('extraction', {}),\n", " ('extract', [\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='supernatant'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='pellet'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " }\n", " ]),\n", " ('lcdad_spectroscopy', {\n", " 'OntologyAnnotation(term=instrument)': ['Shimadzu DAD 400'],\n", " }),\n", " ('raw_spectral_data_file', [\n", " {\n", " 'node_type': DATA_FILE,\n", " 'size': 1,\n", " 'technical_replicates': 2,\n", " 'is_input_to_next_protocols': False\n", " }\n", " ])\n", " ])\n", "\n", "\n", "# A NMR spectroscopy based metabolite profiling assay:\n", "nmr_assay_dict = OrderedDict([\n", " ('measurement_type', OntologyAnnotation(term='metabolite profiling')),\n", " ('technology_type', OntologyAnnotation(term='nmr spectroscopy')),\n", " ('extraction', {}),\n", " ('extract', [\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='supernatant'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " },\n", " {\n", " 'node_type': EXTRACT,\n", " 'characteristics_category': OntologyAnnotation(term='extract type'),\n", " 'characteristics_value': OntologyAnnotation(term='pellet'),\n", " 'size': 1,\n", " 'technical_replicates': None,\n", " 'is_input_to_next_protocols': True\n", " }\n", " ]),\n", " ('nmr spectroscopy', {\n", " OntologyAnnotation(term='instrument'): [OntologyAnnotation(term='Bruker AvanceII 1 GHz')],\n", " OntologyAnnotation(term='acquisition_mode'): [OntologyAnnotation(term='1D 13C NMR')],\n", " OntologyAnnotation(term='pulse_sequence'): [OntologyAnnotation(term='CPMG')]\n", " }),\n", " ('raw_spectral_data_file', [\n", " {\n", " 'node_type': DATA_FILE,\n", " 'size': 1,\n", " 'technical_replicates': 1,\n", " 'is_input_to_next_protocols': False\n", " }\n", " ])\n", " ])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Declaring Study Design key elements in terms of Treatments and Non-Treatment elements, Study Cell & Arms" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "first_treatment = Treatment(factor_values=(\n", " FactorValue(factor_name=BASE_FACTORS[0], value=FACTORS_0_VALUE),\n", " FactorValue(factor_name=BASE_FACTORS[1], value=FACTORS_1_VALUE, unit=FACTORS_1_UNIT),\n", " FactorValue(factor_name=BASE_FACTORS[2], value=FACTORS_2_VALUE, unit=FACTORS_2_UNIT)\n", "))\n", "second_treatment = Treatment(factor_values=(\n", " FactorValue(factor_name=BASE_FACTORS[0], value=FACTORS_0_VALUE_ALT),\n", " FactorValue(factor_name=BASE_FACTORS[1], value=FACTORS_1_VALUE, unit=FACTORS_1_UNIT),\n", " FactorValue(factor_name=BASE_FACTORS[2], value=FACTORS_2_VALUE, unit=FACTORS_2_UNIT)\n", "))\n", "third_treatment = Treatment(factor_values=(\n", " FactorValue(factor_name=BASE_FACTORS[0], value=FACTORS_0_VALUE_ALT),\n", " FactorValue(factor_name=BASE_FACTORS[1], value=FACTORS_1_VALUE, unit=FACTORS_1_UNIT),\n", " FactorValue(factor_name=BASE_FACTORS[2], value=FACTORS_2_VALUE_ALT, unit=FACTORS_2_UNIT)\n", "))\n", "fourth_treatment = Treatment(factor_values=(\n", " FactorValue(factor_name=BASE_FACTORS[0], value=FACTORS_0_VALUE_THIRD),\n", " FactorValue(factor_name=BASE_FACTORS[1], value=FACTORS_1_VALUE, unit=FACTORS_1_UNIT),\n", " FactorValue(factor_name=BASE_FACTORS[2], value=FACTORS_2_VALUE, unit=FACTORS_2_UNIT)\n", "))\n", "screen = NonTreatment(element_type=SCREEN, duration_value=SCREEN_DURATION_VALUE, duration_unit=DURATION_UNIT)\n", "run_in = NonTreatment(element_type=RUN_IN, duration_value=WASHOUT_DURATION_VALUE, duration_unit=DURATION_UNIT)\n", "washout = NonTreatment(element_type=WASHOUT, duration_value=WASHOUT_DURATION_VALUE, duration_unit=DURATION_UNIT)\n", "follow_up = NonTreatment(element_type=FOLLOW_UP, duration_value=FOLLOW_UP_DURATION_VALUE, duration_unit=DURATION_UNIT)\n", "potential_concomitant_washout = NonTreatment(element_type=WASHOUT, duration_value=FACTORS_2_VALUE,\n", " duration_unit=FACTORS_2_UNIT)\n", "cell_screen = StudyCell(SCREEN, elements=(screen,))\n", "cell_run_in = StudyCell(RUN_IN, elements=(run_in,))\n", "cell_other_run_in = StudyCell('OTHER RUN-IN', elements=(run_in,))\n", "cell_screen_and_run_in = StudyCell('SCREEN AND RUN-IN', elements=[screen, run_in])\n", "cell_concomitant_treatments = StudyCell('CONCOMITANT TREATMENTS',\n", " elements=([{second_treatment, fourth_treatment}]))\n", "cell_washout_00 = StudyCell(WASHOUT, elements=(washout,))\n", "cell_washout_01 = StudyCell('ANOTHER WASHOUT', elements=(washout,))\n", "cell_single_treatment_00 = StudyCell('SINGLE TREATMENT FIRST', elements=[first_treatment])\n", "cell_single_treatment_01 = StudyCell('SINGLE TREATMENT SECOND', elements=[second_treatment])\n", "cell_single_treatment_02 = StudyCell('SINGLE TREATMENT THIRD', elements=[third_treatment])\n", "cell_multi_elements = StudyCell('MULTI ELEMENTS',\n", " elements=[{first_treatment, second_treatment,\n", " fourth_treatment}, washout, second_treatment])\n", "cell_multi_elements_padded = StudyCell('MULTI ELEMENTS PADDED',\n", " elements=[first_treatment, washout, {\n", " second_treatment,\n", " fourth_treatment\n", " }, washout, third_treatment, washout])\n", "cell_follow_up = StudyCell(FOLLOW_UP, elements=(follow_up,))\n", "cell_follow_up_01 = StudyCell('ANOTHER FOLLOW_UP', elements=(follow_up,))\n", "qc = QualityControl()\n", "\n", "ms_sample_assay_plan = SampleAndAssayPlan.from_sample_and_assay_plan_dict(\"ms_sap\", sample_list, ms_assay_dict)\n", "nmr_sample_assay_plan = SampleAndAssayPlan.from_sample_and_assay_plan_dict(\"nmr_sap\", sample_list, nmr_assay_dict)\n", "\n", "first_arm = StudyArm(name=TEST_STUDY_ARM_NAME_00, group_size=3, arm_map=OrderedDict([\n", " (cell_screen, None), (cell_run_in, None),\n", " (cell_single_treatment_00, ms_sample_assay_plan),\n", " (cell_follow_up, ms_sample_assay_plan)\n", "]))\n", "second_arm = StudyArm(name=TEST_STUDY_ARM_NAME_01, group_size=5, arm_map=OrderedDict([\n", " (cell_screen, None), (cell_run_in, None),\n", " (cell_multi_elements, ms_sample_assay_plan),\n", " (cell_follow_up, ms_sample_assay_plan)\n", "]))\n", "third_arm = StudyArm(name=TEST_STUDY_ARM_NAME_02, group_size=3, arm_map=OrderedDict([\n", " (cell_screen, None), (cell_run_in, None),\n", " (cell_multi_elements_padded, ms_sample_assay_plan),\n", " (cell_follow_up, ms_sample_assay_plan)\n", "]))\n", "third_arm_no_run_in = StudyArm(name=TEST_STUDY_ARM_NAME_02, group_size=3, arm_map=OrderedDict([\n", " (cell_screen, None),\n", " (cell_multi_elements_padded, ms_sample_assay_plan),\n", " (cell_follow_up, ms_sample_assay_plan)\n", "]))\n", "arm_same_name_as_third = StudyArm(name=TEST_STUDY_ARM_NAME_02, group_size=5, arm_map=OrderedDict([\n", " (cell_screen, None), (cell_run_in, None),\n", " (cell_single_treatment_01, ms_sample_assay_plan),\n", " (cell_follow_up, ms_sample_assay_plan)\n", "]))\n", " # Sample QC (for mass spectroscopy and other)\n", "pre_run_sample_type = ProductNode(\n", " id_='pre/00', node_type=SAMPLE, name='water', size=2, characteristics=(\n", " Characteristic(category='dilution', value=10, unit='mg/L'),\n", " )\n", ")\n", "post_run_sample_type = ProductNode(\n", " id_='post/00', node_type=SAMPLE, name='ethanol', size=2, characteristics=(\n", " Characteristic(category='dilution', value=1000, unit='mg/L'),\n", " Characteristic(category='dilution', value=100, unit='mg/L'),\n", " Characteristic(category='dilution', value=10, unit='mg/L'),\n", " Characteristic(category='dilution', value=1, unit='mg/L'),\n", " Characteristic(category='dilution', value=0.1, unit='mg/L')\n", " ))\n", "dummy_sample_type = ProductNode(id_='dummy/01', node_type=SAMPLE, name='dummy')\n", "more_dummy_sample_type = ProductNode(id_='dummy/02', node_type=SAMPLE, name='more dummy')\n", "interspersed_sample_types = [(dummy_sample_type, 20)]\n", "qc = QualityControl(\n", " interspersed_sample_type=interspersed_sample_types,\n", " pre_run_sample_type=pre_run_sample_type,\n", " post_run_sample_type=post_run_sample_type\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "single_arm = StudyArm(name=TEST_STUDY_ARM_NAME_00, group_size=10, arm_map=OrderedDict([\n", " (cell_screen, ms_sample_assay_plan), (cell_run_in,ms_sample_assay_plan),\n", " (cell_single_treatment_00, nmr_sample_assay_plan),\n", " (cell_follow_up, nmr_sample_assay_plan)\n", "]))\n", "study_design = StudyDesign(study_arms=(single_arm,))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. Generated ISA Study from ISA Study Design Object" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "study = study_design.generate_isa_study()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "study" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "treatment_assay = next(iter(study.assays))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "treatment_assay.graph" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[(process.name, getattr(process.prev_process, 'name', None), getattr(process.next_process, 'name', None)) for process in treatment_assay.process_sequence]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a_graph = treatment_assay.graph" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(a_graph.nodes)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_investigation = Investigation(studies=[study])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_tables = dumpdf(isa_investigation)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[type(x) for x in study.assays[0].graph.nodes()]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[(getattr(el, 'name', None), type(el))for el in treatment_assay.graph.nodes()]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from isatools.model import _build_assay_graph" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "gph = _build_assay_graph(treatment_assay.process_sequence)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[key for key in isa_tables.keys()]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_tables['s_study_01.txt']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_tables['a_AT0_metabolite-profiling_nmr-spectroscopy.txt']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_tables['a_AT0_metabolite-profiling_mass-spectrometry.txt']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "final_dir = os.path.abspath(os.path.join('notebook-output', 'sd-test'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7. Serialization as ISA-JSON and ISA-Tab" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isa_j = json.dumps(isa_investigation, cls=ISAJSONEncoder, sort_keys=True, indent=4, separators=(',', ': '))\n", "open(os.path.join(final_dir,\"isa_as_json_from_dumps2.json\"),\"w\").write(isa_j) # this call write the string 'isa_j' to the file called 'isa_as_json_from_dumps.json'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "isatab.dump(isa_obj=isa_investigation, output_path=final_dir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8. Performing syntactic validation by invoking ISA Validator" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with open(os.path.join(final_dir,'i_investigation.txt')) as isa:\n", " validation_report=isatab.validate(isa)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "validation_report[\"errors\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion:\n", "\n", "With this notebook, we have shown how to use study design information to generate a populated instance of ISA Study object and write it to file.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## About this notebook\n", "\n", "- authors: philippe.rocca-serra@oerc.ox.ac.uk, massimiliano.izzo@oerc.ox.ac.uk\n", "- license: CC-BY 4.0\n", "- support: isatools@googlegroups.com\n", "- issue tracker: https://github.com/ISA-tools/isa-api/issues" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1" } }, "nbformat": 4, "nbformat_minor": 2 }