{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Create ISA-API Investigation from Datascriptor Study Design configuration\n", "# Crossover Study with two dietary treatments on dogs\n", "\n", "In this notebook I will show you how you can use a study design configuration is JSON format as produce by datascriptor (https://gitlab.com/datascriptor/datascriptor) to generate a single-study ISA investigation and how you can then serialise it in JSON and tabular (i.e. CSV) format.\n", "\n", "Or study design configuration consists of:\n", "- a 4-arm study design. Each arm has 10 subjects\n", "- subjects are humans. There is an observational factor, named \"status\" with two values: \"healthy\" and \"diseased\"\n", "- a crossover of two drug treatments, a proper treatment (\"hypertena\" 20 mg/day for 14 days) and a control treatment (\"placebo\" 20 mg/day for 14 days)\n", "- four non-treatment phases: screen (7 days), washout (14 days) and follow-up (180 days)\n", "- three sample types collected: blood and saliva\n", "- three assay types: \n", " - DNA methylation profiling using nucleic acid sequencing on saliva samples\n", " - clinical chemistry with marker on blood samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Setup\n", "\n", "Let's import all the required libraries" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "from time import time\n", "import os\n", "import json" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "## ISA-API related imports\n", "from isatools.model import Investigation, Study" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "## ISA-API create mode related imports\n", "from isatools.create.model import StudyDesign\n", "from isatools.create.connectors import generate_study_design\n", "\n", "# serializer from ISA Investigation to JSON\n", "from isatools.isajson import ISAJSONEncoder\n", "\n", "# ISA-Tab serialisation\n", "from isatools import isatab" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "## ISA-API create mode related imports\n", "from isatools.create import model\n", "from isatools import isajson" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Load the Study Design JSON configuration\n", "\n", "First of all we load the study design configurator with all the specs defined above" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "with open(os.path.abspath(os.path.join(\n", " \"isa-study-design-as-json\", \"datascriptor\", \"crossover-study-human.json\"\n", ")), \"r\") as config_file:\n", " study_design_config = json.load(config_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Generate the ISA Study Design from the JSON configuration\n", "To perform the conversion we just need to use the function `generate_isa_study_design()` (name possibly subject to change, should we drop the \"isa\" and \"datascriptor\" qualifiers?)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "study_design = generate_study_design(study_design_config)\n", "assert isinstance(study_design, StudyDesign)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Generate the ISA Study from the StudyDesign and embed it into an ISA Investigation\n", "\n", "The `StudyDesign.generate_isa_study()` method returns the complete ISA-API `Study` object." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The generation of the study design took 2.02 s.\n" ] } ], "source": [ "start = time()\n", "study = study_design.generate_isa_study()\n", "end = time()\n", "print('The generation of the study design took {:.2f} s.'.format(end - start))\n", "assert isinstance(study, Study)\n", "investigation = Investigation(identifier='inv01', studies=[study])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Serialize and save the JSON representation of the generated ISA Investigation" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The JSON serialisation of the ISA investigation took 0.55 s.\n" ] } ], "source": [ "start = time()\n", "inv_json = json.dumps(investigation, cls=ISAJSONEncoder, sort_keys=True, indent=4, separators=(',', ': '))\n", "end = time()\n", "print('The JSON serialisation of the ISA investigation took {:.2f} s.'.format(end - start))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "directory = os.path.abspath(os.path.join('output', 'crossover-2-treatments-mice'))\n", "os.makedirs(directory, exist_ok=True)\n", "with open(os.path.abspath(os.path.join(directory, 'isa-investigation-crossover-2-treatments-mice.json')), 'w') as out_fp:\n", " json.dump(json.loads(inv_json), out_fp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Dump the ISA Investigation to ISA-Tab" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The Tab serialisation of the ISA investigation took 21.58 s.\n" ] } ], "source": [ "start = time()\n", "isatab.dump(investigation, directory)\n", "end = time()\n", "print('The Tab serialisation of the ISA investigation took {:.2f} s.'.format(end - start))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To use them on the notebook we can also dump the tables to pandas DataFrames, using the `dump_tables_to_dataframes` function rather than dump" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "dataframes = isatab.dump_tables_to_dataframes(investigation)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dataframes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7. Check the correctness of the ISA-Tab DataFrames \n", "\n", "We have 1 study file and 2 assay files (one for MS and one for NMR). Let's check the names:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'s_study_01.txt'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "'a_AT5_DNA-methylation-profiling_nucleic-acid-sequencing.txt'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "'a_AT11_clinical-chemistry_marker-panel.txt'" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for key in dataframes.keys():\n", " display(key)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.1 Count of subjects and samples\n", "\n", "We have 10 subjects in the each of the 4 arms for a total of 40 subjects.\n", "\n", "We collect:\n", "- 5 blood samples per subject (50 samples * 4 arms = 200 total samples)\n", "- 2 blood samples per subject (20 samples * 4 arms = 80 total samples)\n", "\n", "Across the 4 study arms a total of 280 samples are collected (70 samples per arm)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 70 samples in the GRP0 arm (i.e. group)\n", "There are 70 samples in the GRP1 arm (i.e. group)\n", "There are 70 samples in the GRP2 arm (i.e. group)\n", "There are 70 samples in the GRP3 arm (i.e. group)\n" ] } ], "source": [ "study_frame = dataframes['s_study_01.txt']\n", "count_arm0_samples = len(study_frame[study_frame['Source Name'].apply(lambda el: 'GRP0' in el)])\n", "count_arm1_samples = len(study_frame[study_frame['Source Name'].apply(lambda el: 'GRP1' in el)])\n", "count_arm2_samples = len(study_frame[study_frame['Source Name'].apply(lambda el: 'GRP2' in el)])\n", "count_arm3_samples = len(study_frame[study_frame['Source Name'].apply(lambda el: 'GRP3' in el)])\n", "print(\"There are {} samples in the GRP0 arm (i.e. group)\".format(count_arm0_samples))\n", "print(\"There are {} samples in the GRP1 arm (i.e. group)\".format(count_arm1_samples))\n", "print(\"There are {} samples in the GRP2 arm (i.e. group)\".format(count_arm2_samples))\n", "print(\"There are {} samples in the GRP3 arm (i.e. group)\".format(count_arm3_samples))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.2 Study Table Overview\n", "\n", "The study table provides an overview of the subjects (sources) and samples" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | Source Name | \n", "Characteristics[Study Subject] | \n", "Term Accession Number | \n", "Characteristics[status] | \n", "Protocol REF | \n", "Parameter Value[Sampling order] | \n", "Parameter Value[Study cell] | \n", "Date | \n", "Performer | \n", "Sample Name | \n", "Characteristics[organism part] | \n", "Term Accession Number.1 | \n", "Comment[study step with treatment] | \n", "Factor Value[Sequence Order] | \n", "Factor Value[DURATION] | \n", "Unit | \n", "Factor Value[AGENT] | \n", "Factor Value[INTENSITY] | \n", "Unit.1 | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "GRP0_SBJ01 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "healthy | \n", "sample collection | \n", "031 | \n", "A0E3 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP0_SBJ01_A0E3_SMP-Blood-Sample-1 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "YES | \n", "3 | \n", "14 | \n", "days | \n", "placebo | \n", "20.0 | \n", "mg/day | \n", "
| 1 | \n", "GRP0_SBJ01 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "healthy | \n", "sample collection | \n", "001 | \n", "A0E1 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "Saliva Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C174119 | \n", "YES | \n", "1 | \n", "14 | \n", "days | \n", "hypertena | \n", "20.0 | \n", "mg/day | \n", "
| 2 | \n", "GRP0_SBJ01 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "healthy | \n", "sample collection | \n", "042 | \n", "A0E4 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP0_SBJ01_A0E4_SMP-Blood-Sample-2 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "NO | \n", "4 | \n", "180 | \n", "days | \n", "\n", " | \n", " | \n", " |
| 3 | \n", "GRP0_SBJ01 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "healthy | \n", "sample collection | \n", "011 | \n", "A0E1 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP0_SBJ01_A0E1_SMP-Blood-Sample-1 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "YES | \n", "1 | \n", "14 | \n", "days | \n", "hypertena | \n", "20.0 | \n", "mg/day | \n", "
| 4 | \n", "GRP0_SBJ01 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "healthy | \n", "sample collection | \n", "043 | \n", "A0E4 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP0_SBJ01_A0E4_SMP-Blood-Sample-3 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "NO | \n", "4 | \n", "180 | \n", "days | \n", "\n", " | \n", " | \n", " |
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 275 | \n", "GRP3_SBJ10 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "diseased | \n", "sample collection | \n", "242 | \n", "A3E3 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP3_SBJ10_A3E3_SMP-Blood-Sample-1 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "YES | \n", "3 | \n", "14 | \n", "days | \n", "hypertena | \n", "20.0 | \n", "mg/day | \n", "
| 276 | \n", "GRP3_SBJ10 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "diseased | \n", "sample collection | \n", "256 | \n", "A3E4 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP3_SBJ10_A3E4_SMP-Blood-Sample-3 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "NO | \n", "4 | \n", "180 | \n", "days | \n", "\n", " | \n", " | \n", " |
| 277 | \n", "GRP3_SBJ10 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "diseased | \n", "sample collection | \n", "254 | \n", "A3E4 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP3_SBJ10_A3E4_SMP-Blood-Sample-1 | \n", "Blood Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C17610 | \n", "NO | \n", "4 | \n", "180 | \n", "days | \n", "\n", " | \n", " | \n", " |
| 278 | \n", "GRP3_SBJ10 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "diseased | \n", "sample collection | \n", "232 | \n", "A3E3 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "Saliva Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C174119 | \n", "YES | \n", "3 | \n", "14 | \n", "days | \n", "hypertena | \n", "20.0 | \n", "mg/day | \n", "
| 279 | \n", "GRP3_SBJ10 | \n", "Homo sapiens | \n", "http://purl.obolibrary.org/obo/NCBITaxon_9606 | \n", "diseased | \n", "sample collection | \n", "212 | \n", "A3E1 | \n", "2021-06-30 | \n", "Unknown | \n", "GRP3_SBJ10_A3E1_SMP-Saliva-Sample-1 | \n", "Saliva Sample | \n", "http://purl.obolibrary.org/obo/NCIT_C174119 | \n", "YES | \n", "1 | \n", "14 | \n", "days | \n", "placebo | \n", "20.0 | \n", "mg/day | \n", "
280 rows × 19 columns
\n", "| \n", " | Sample Name | \n", "Comment[study step with treatment] | \n", "Protocol REF | \n", "Parameter Value[cross linking] | \n", "Parameter Value[DNA fragmentation] | \n", "Parameter Value[DNA fragment size] | \n", "Parameter Value[immunoprecipitation antibody] | \n", "Performer | \n", "Extract Name | \n", "Characteristics[extract type] | \n", "Protocol REF.1 | \n", "Parameter Value[instrument] | \n", "Parameter Value[library_orientation] | \n", "Parameter Value[library_strategy] | \n", "Parameter Value[library_selection] | \n", "Parameter Value[multiplex identifier] | \n", "Performer.1 | \n", "Raw Data File | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S81-Extract-R1 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "single | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S81-raw_data_file-R2.raw | \n", "
| 1 | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "uv-light | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S1-Extract-R1 | \n", "DNA | \n", "library_preparation | \n", "GridION | \n", "paired | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S1-raw_data_file-R1.raw | \n", "
| 2 | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S81-Extract-R1 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "paired | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S81-raw_data_file-R3.raw | \n", "
| 3 | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "uv-light | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S1-Extract-R1 | \n", "DNA | \n", "library_preparation | \n", "GridION | \n", "paired | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S1-raw_data_file-R2.raw | \n", "
| 4 | \n", "GRP0_SBJ01_A0E1_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S81-Extract-R1 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "paired | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S81-raw_data_file-R4.raw | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 1275 | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S152-Extract-R1 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "single | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S152-raw_data_file-R1.raw | \n", "
| 1276 | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S152-Extract-R2 | \n", "DNA | \n", "library_preparation | \n", "GridION | \n", "single | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S152-raw_data_file-R5.raw | \n", "
| 1277 | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S152-Extract-R2 | \n", "DNA | \n", "library_preparation | \n", "GridION | \n", "single | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S152-raw_data_file-R6.raw | \n", "
| 1278 | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "di-tert-butyl peroxide | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S152-Extract-R1 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "paired | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S152-raw_data_file-R3.raw | \n", "
| 1279 | \n", "GRP3_SBJ10_A3E3_SMP-Saliva-Sample-1 | \n", "YES | \n", "extraction | \n", "uv-light | \n", "nebulization | \n", "a | \n", "d | \n", "Unknown | \n", "AT5-S72-Extract-R2 | \n", "gDNA | \n", "library_preparation | \n", "GridION | \n", "single | \n", "MBD-Seq | \n", "MF | \n", "f | \n", "Unknown | \n", "AT5-S72-raw_data_file-R6.raw | \n", "
1280 rows × 18 columns
\n", "| \n", " | Sample Name | \n", "Comment[study step with treatment] | \n", "Protocol REF | \n", "Performer | \n", "Raw Data File | \n", "
|---|---|---|---|---|---|
| 0 | \n", "GRP0_SBJ01_A0E1_SMP-Blood-Sample-1 | \n", "YES | \n", "sample preparation | \n", "Unknown | \n", "AT11-S1-raw_data_file-R1 | \n", "
| 1 | \n", "GRP0_SBJ01_A0E3_SMP-Blood-Sample-1 | \n", "YES | \n", "sample preparation | \n", "Unknown | \n", "AT11-S11-raw_data_file-R1 | \n", "
| 2 | \n", "GRP0_SBJ01_A0E4_SMP-Blood-Sample-1 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S21-raw_data_file-R1 | \n", "
| 3 | \n", "GRP0_SBJ01_A0E4_SMP-Blood-Sample-2 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S22-raw_data_file-R1 | \n", "
| 4 | \n", "GRP0_SBJ01_A0E4_SMP-Blood-Sample-3 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S23-raw_data_file-R1 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 195 | \n", "GRP3_SBJ10_A3E1_SMP-Blood-Sample-1 | \n", "YES | \n", "sample preparation | \n", "Unknown | \n", "AT11-S152-raw_data_file-R1 | \n", "
| 196 | \n", "GRP3_SBJ10_A3E3_SMP-Blood-Sample-1 | \n", "YES | \n", "sample preparation | \n", "Unknown | \n", "AT11-S162-raw_data_file-R1 | \n", "
| 197 | \n", "GRP3_SBJ10_A3E4_SMP-Blood-Sample-1 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S174-raw_data_file-R1 | \n", "
| 198 | \n", "GRP3_SBJ10_A3E4_SMP-Blood-Sample-2 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S175-raw_data_file-R1 | \n", "
| 199 | \n", "GRP3_SBJ10_A3E4_SMP-Blood-Sample-3 | \n", "NO | \n", "sample preparation | \n", "Unknown | \n", "AT11-S176-raw_data_file-R1 | \n", "
200 rows × 5 columns
\n", "