{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "55fdf449",
   "metadata": {},
   "source": [
    "# Structural Variants Detection by using long reads \n",
    "\n",
    "#### Structural variation with `Sniffles` (LR)__ \n",
    "\n",
    "Sniffles is a structural variation caller using third generation sequencing (PacBio or Oxford Nanopore). It detects all types of SVs (10bp+) using evidence from split-read alignments, high-mismatch regions, and coverage analysis.\n",
    "\n",
    "https://github.com/fritzsedlazeck/Sniffles\n",
    "\n",
    "In the following exercices, we will :\n",
    "* map the long reads of the `5417` and `A8` samples against the reference genome `GCA_002220235.1_ASM222023v1_genomic`\n",
    "* call SV and create a ?snf file for each sample\n",
    "* merge calling using the snf files into a single .vcf \n",
    "\n",
    "------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a09d637d-b5e4-4f2d-bba3-858703d906d9",
   "metadata": {},
   "source": [
    "#### __Preparing data before mapping__\n",
    "\n",
    "* Go into the `LONG_READS` directory\n",
    "* List recursively the LONG_READS directory \n",
    "* For each sample, merge all fastq files into a single fastq file `all_LR_A8.fastq.gz` and `all_LR_5417.fastq.gz` in the `LONG_READS` directory - `zcat`\n",
    "\n",
    "#### `5417`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "de2573e3-c27a-4e00-91ae-ff194db7e8e9",
   "metadata": {},
   "outputs": [],
   "source": [
    " #\n",
    " cd /home/jovyan/SV_DATA/LONG_READS\n",
    " ls -R"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "16cf06d8-97fd-4331-87c6-48dc56f23b65",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Merging fastq\n",
    "zcat 5417/fastq_runid_d9b45d7d98e41184ec96f40f59021521f703067d_*gz > 5417.fastq "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f276b07c-e9c9-4814-ba00-0be387396020",
   "metadata": {},
   "outputs": [],
   "source": [
    "gzip 5417.fastq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "091bbfd4-d151-4bd7-bcff-e56c6ed8d20b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5417  5417.fastq.gz  A8\n"
     ]
    }
   ],
   "source": [
    "ls"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d116fd02-02d6-4430-8e20-02c531b07f0f",
   "metadata": {},
   "source": [
    "#### `A8`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a98eb800-ed10-4104-b59b-f34e65dc4b23",
   "metadata": {},
   "outputs": [],
   "source": [
    "zcat A8/*gz | gzip > A8.fastq.gz"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f705bb76-aca3-4179-85b7-2d4ec1df67db",
   "metadata": {},
   "source": [
    "#### __Mapping Long Reads against the reference genome__\n",
    "\n",
    "* Go into the`RESULTS` directory and create the directory `SV_CALLING`\n",
    "* Perform the mapping with `minimaps2` https://github.com/lh3/minimap2\n",
    "* Sort the bam file with `samtools sort` and index the bam file created\n",
    "\n",
    "```\n",
    "minimap2 -ax map-ont -t 8 --MD -R '@RG\\tID:SAMPLE_ID\\tSM:SAMPLE_ID'  REF_FILE FASTQ_FILE > SAM_FILE\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98bf89bf-e4e8-46ef-9d52-d96e5ebbcaff",
   "metadata": {},
   "source": [
    "#### Mapping for the `5417` sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "44a9e60f-c749-4145-a568-6b0703b748e2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[M::mm_idx_gen::0.435*1.01] collected minimizers\n",
      "[M::mm_idx_gen::0.502*1.86] sorted minimizers\n",
      "[M::main::0.502*1.86] loaded/built the index for 21 target sequence(s)\n",
      "[M::mm_mapopt_update::0.552*1.78] mid_occ = 26\n",
      "[M::mm_idx_stat] kmer size: 15; skip: 10; is_hpc: 0; #seq: 21\n",
      "[M::mm_idx_stat::0.580*1.75] distinct minimizers: 2545925 (93.94% are singletons); average occurrences: 1.110; average spacing: 5.336; total length: 15074320\n",
      "[M::worker_pipeline::15.513*5.43] mapped 56582 sequences\n",
      "[M::main] Version: 2.24-r1122\n",
      "[M::main] CMD: minimap2 -ax map-ont -t 8 --MD -R @RG\\tID:5417\\tSM:5417 /home/jovyan/SV_DATA/REF/GCA_002220235.1_ASM222023v1_genomic.fna 5417.fastq.gz\n",
      "[M::main] Real time: 15.543 sec; CPU: 84.314 sec; Peak RSS: 2.595 GB\n"
     ]
    }
   ],
   "source": [
    "minimap2 -ax map-ont -t 8 --MD -R '@RG\\tID:5417\\tSM:5417'  /home/jovyan/SV_DATA/REF/GCA_002220235.1_ASM222023v1_genomic.fna 5417.fastq.gz > 5417_mapping_LT.sam "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7b7d2e0e-aa2a-4624-be61-eaa213da0bc0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[bam_sort_core] merging from 0 files and 4 in-memory blocks...\n"
     ]
    }
   ],
   "source": [
    "samtools sort -@4 -o 5417_mapping_LT.bam 5417_mapping_LT.sam"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a2d55407-bb4b-45be-a05c-3cad455e48d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "samtools index 5417_mapping_LT.bam"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "779fc9ec-910d-46d8-a7b1-b36d28e2111c",
   "metadata": {},
   "source": [
    "#### Mapping for the `A8`sample\n",
    "\n",
    "You can do it with 2 commands only (mapping + bam index) !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b2f95542-faee-4c31-a8b0-db5940afebb2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[M::mm_idx_gen::0.452*1.01] collected minimizers\n",
      "[M::mm_idx_gen::0.522*1.83] sorted minimizers\n",
      "[M::main::0.523*1.83] loaded/built the index for 21 target sequence(s)\n",
      "[M::mm_mapopt_update::0.573*1.76] mid_occ = 26\n",
      "[M::mm_idx_stat] kmer size: 15; skip: 10; is_hpc: 0; #seq: 21\n",
      "[M::mm_idx_stat::0.599*1.73] distinct minimizers: 2545925 (93.94% are singletons); average occurrences: 1.110; average spacing: 5.336; total length: 15074320\n",
      "[M::worker_pipeline::30.653*5.51] mapped 44202 sequences\n",
      "[M::main] Version: 2.24-r1122\n",
      "[M::main] CMD: minimap2 -ax map-ont -t 8 --MD -R @RG\\tID:5417\\tSM:5417 /home/jovyan/SV_DATA/REF/GCA_002220235.1_ASM222023v1_genomic.fna A8.fastq.gz\n",
      "[M::main] Real time: 30.678 sec; CPU: 168.813 sec; Peak RSS: 2.893 GB\n",
      "[bam_sort_core] merging from 0 files and 4 in-memory blocks...\n"
     ]
    }
   ],
   "source": [
    "minimap2 -ax map-ont -t 8 --MD -R '@RG\\tID:5417\\tSM:5417'  /home/jovyan/SV_DATA/REF/GCA_002220235.1_ASM222023v1_genomic.fna A8.fastq.gz | samtools sort -@4 -o A8_mapping_LT.bam\n",
    "samtools index A8_mapping_LT.bam"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "89e9a844-650d-470e-b843-3bc250d549b0",
   "metadata": {},
   "source": [
    "#### __SV calling for each sample with `sniffle`__\n",
    "\n",
    "```\n",
    "sniffles --input sample1.bam --snf sample1.snf\n",
    "```\n",
    "\n",
    "#### `5417`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "8c8acd8c-ea5e-4e57-8d09-9fb4367641a3",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running Sniffles2, build 2.2\n",
      "  Run Mode: call_sample\n",
      "  Start on: 2023/10/08 19:01:02\n",
      "  Working dir: /home/jovyan/SV_DATA/LONG_READS\n",
      "  Used command: /opt/conda/bin/sniffles --input 5417_mapping_LT.bam --snf 5417.snf\n",
      "==============================\n",
      "Opening for reading: 5417_mapping_LT.bam\n",
      "Opening for writing: 5417.snf\n",
      "\n",
      "Analyzing 55391 alignments total...\n",
      "\n",
      " 4821/55391 alignments processed (8%, 32862/s); 3/21 tasks done; parallel 4/4; 170 candidates. \n",
      " 8403/55391 alignments processed (15%, 36492/s); 5/21 tasks done; parallel 4/4; 369 candidates. \n",
      "11772/55391 alignments processed (21%, 33067/s); 7/21 tasks done; parallel 4/4; 635 candidates. \n",
      "15173/55391 alignments processed (27%, 30295/s); 8/21 tasks done; parallel 4/4; 877 candidates. \n",
      "18035/55391 alignments processed (32%, 34467/s); 9/21 tasks done; parallel 4/4; 1143 candidates. \n",
      "22590/55391 alignments processed (40%, 34792/s); 11/21 tasks done; parallel 4/4; 1501 candidates. \n",
      "25109/55391 alignments processed (45%, 31636/s); 12/21 tasks done; parallel 4/4; 1686 candidates. \n",
      "27952/55391 alignments processed (50%, 32623/s); 13/21 tasks done; parallel 4/4; 1948 candidates. \n",
      "30770/55391 alignments processed (55%, 34961/s); 14/21 tasks done; parallel 4/4; 2157 candidates. \n",
      "33780/55391 alignments processed (60%, 34344/s); 15/21 tasks done; parallel 4/4; 2395 candidates. \n",
      "36834/55391 alignments processed (66%, 32642/s); 16/21 tasks done; parallel 4/4; 2617 candidates. \n",
      "40052/55391 alignments processed (72%, 33392/s); 17/21 tasks done; parallel 4/4; 2858 candidates. \n",
      "55391/55391 alignments processed (100%, 34541/s); 21/21 tasks done; parallel 0/4; 3917 candidates. \n",
      "Took 1.60s.\n",
      "\n",
      "Done.\n",
      "Wrote 3917 SV candidates to 5417.snf (for multi-sample calling).\n"
     ]
    }
   ],
   "source": [
    "sniffles --input 5417_mapping_LT.bam --snf 5417.snf "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "aa631a5f-32ec-46f4-a862-cae217a38cc0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 1635804\n",
      "drwxr-s--- 2 jovyan users      4096 Oct  1 18:52 A8\n",
      "drwxr-s--- 2 jovyan users      4096 Oct  1 18:52 5417\n",
      "-rw-r--r-- 1 jovyan users 186487043 Oct  8 18:52 5417.fastq.gz\n",
      "-rw-r--r-- 1 jovyan users 465520556 Oct  8 18:56 5417_mapping_LT.sam\n",
      "-rw-r--r-- 1 jovyan users 208810190 Oct  8 18:58 5417_mapping_LT.bam\n",
      "-rw-r--r-- 1 jovyan users     84584 Oct  8 19:01 5417_mapping_LT.bam.bai\n",
      "-rw-r--r-- 1 jovyan users    473486 Oct  8 19:01 5417.snf\n",
      "-rw-r--r-- 1 jovyan users 388565136 Oct  8 19:04 A8.fastq.gz\n",
      "-rw-r--r-- 1 jovyan users 424916224 Oct  8 19:05 A8_mapping_LT.bam\n",
      "-rw-r--r-- 1 jovyan users    171392 Oct  8 19:05 A8_mapping_LT.bam.bai\n"
     ]
    }
   ],
   "source": [
    "ls -lrt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72d8496e-8f51-4e89-beb6-f5f09e25140b",
   "metadata": {},
   "source": [
    "`A8`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a4a383dd-4e77-40ad-970e-c0dcba5adbe9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running Sniffles2, build 2.2\n",
      "  Run Mode: call_sample\n",
      "  Start on: 2023/10/08 19:06:22\n",
      "  Working dir: /home/jovyan/SV_DATA/LONG_READS\n",
      "  Used command: /opt/conda/bin/sniffles --input A8_mapping_LT.bam --snf A8.snf\n",
      "==============================\n",
      "Opening for reading: A8_mapping_LT.bam\n",
      "Opening for writing: A8.snf\n",
      "\n",
      "Analyzing 42643 alignments total...\n",
      "\n",
      " 3376/42643 alignments processed (7%, 18090/s); 1/21 tasks done; parallel 4/4; 53 candidates. \n",
      " 6159/42643 alignments processed (14%, 17107/s); 3/21 tasks done; parallel 4/4; 218 candidates. \n",
      " 9337/42643 alignments processed (21%, 16399/s); 5/21 tasks done; parallel 4/4; 426 candidates. \n",
      "12311/42643 alignments processed (28%, 17749/s); 7/21 tasks done; parallel 4/4; 684 candidates. \n",
      "14587/42643 alignments processed (34%, 17410/s); 8/21 tasks done; parallel 4/4; 807 candidates. \n",
      "18052/42643 alignments processed (42%, 17280/s); 10/21 tasks done; parallel 4/4; 1151 candidates. \n",
      "21465/42643 alignments processed (50%, 17073/s); 12/21 tasks done; parallel 4/4; 1504 candidates. \n",
      "23566/42643 alignments processed (55%, 15885/s); 13/21 tasks done; parallel 4/4; 1691 candidates. \n",
      "25683/42643 alignments processed (60%, 16189/s); 14/21 tasks done; parallel 4/4; 1864 candidates. \n",
      "27907/42643 alignments processed (65%, 15327/s); 15/21 tasks done; parallel 4/4; 2083 candidates. \n",
      "29964/42643 alignments processed (70%, 16267/s); 16/21 tasks done; parallel 4/4; 2297 candidates. \n",
      "32096/42643 alignments processed (75%, 15774/s); 17/21 tasks done; parallel 4/4; 2496 candidates. \n",
      "42643/42643 alignments processed (100%, 16077/s); 21/21 tasks done; parallel 0/4; 3344 candidates. \n",
      "Took 2.65s.\n",
      "\n",
      "Done.\n",
      "Wrote 3344 SV candidates to A8.snf (for multi-sample calling).\n"
     ]
    }
   ],
   "source": [
    "sniffles --input A8_mapping_LT.bam --snf A8.snf "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c59e4b2-03c2-4374-ac1f-f2481b13125b",
   "metadata": {},
   "source": [
    "#### __Merging SV calling  with `sniffle`__\n",
    "\n",
    "```\n",
    "sniffles --input snf_files_list.tsv --vcf multisample.vcf\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "1c370c87-0547-4d94-9ede-930a27331937",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Running Sniffles2, build 2.2\n",
      "  Run Mode: combine\n",
      "  Start on: 2023/10/08 19:06:32\n",
      "  Working dir: /home/jovyan/SV_DATA/LONG_READS\n",
      "  Used command: /opt/conda/bin/sniffles --input 5417.snf A8.snf --vcf multisample.vcf.gz\n",
      "==============================\n",
      "Opening for writing: multisample.vcf.gz (multi-sample, sorted, bgzipped, tabix-indexed)\n",
      "Verified headers for 2 .snf files.\n",
      "The following samples will be processed in multi-calling:\n",
      "    5417.snf (sample ID in output VCF='5417')\n",
      "    A8.snf (sample ID in output VCF='A8')\n",
      "\n",
      "Calling SVs across 2 samples (7261 candidates total)...\n",
      "\n",
      "(Estimating progress); 4/21 tasks done; parallel 4/4; 61 SVs. \n",
      "1319/7261 candidates processed (18%, 19345/s); 7/21 tasks done; parallel 4/4; 155 SVs. \n",
      "1975/7261 candidates processed (27%, 27456/s); 9/21 tasks done; parallel 4/4; 237 SVs. \n",
      "2910/7261 candidates processed (40%, 31723/s); 11/21 tasks done; parallel 4/4; 376 SVs. \n",
      "3656/7261 candidates processed (50%, 35646/s); 13/21 tasks done; parallel 4/4; 460 SVs. \n",
      "4021/7261 candidates processed (55%, 32376/s); 14/21 tasks done; parallel 4/4; 501 SVs. \n",
      "4918/7261 candidates processed (67%, 37865/s); 16/21 tasks done; parallel 4/4; 621 SVs. \n",
      "5354/7261 candidates processed (73%, 35268/s); 17/21 tasks done; parallel 4/4; 680 SVs. \n",
      "7261/7261 candidates processed (100%, 42145/s); 21/21 tasks done; parallel 0/4; 904 SVs. \n",
      "Took 0.17s.\n",
      "\n",
      "Generating index for multisample.vcf.gz...\n",
      "Indexing VCF output took 0.02s.\n",
      "Done.\n",
      "Wrote 904 called SVs to multisample.vcf.gz (multi-sample, sorted, bgzipped, tabix-indexed)\n"
     ]
    }
   ],
   "source": [
    "sniffles --input 5417.snf A8.snf  --vcf multisample.vcf.gz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "5f68756d-92fe-4929-8200-66fc4e540c81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5417                     5417.snf               A8.snf\n",
      "5417.fastq.gz            A8                     multisample.vcf.gz\n",
      "5417_mapping_LT.bam      A8.fastq.gz            multisample.vcf.gz.tbi\n",
      "5417_mapping_LT.bam.bai  A8_mapping_LT.bam\n",
      "5417_mapping_LT.sam      A8_mapping_LT.bam.bai\n"
     ]
    }
   ],
   "source": [
    "ls"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9a8a616",
   "metadata": {
    "tags": []
   },
   "source": [
    "#### __Have a look on the VCF file__ "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95a0b720",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "ec9e8ab7-2b9a-407e-8b0e-b477f964a096",
   "metadata": {},
   "source": [
    "#### __Count the number of SVs__ `bftools stats`\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "18de1869-8010-419e-869e-3ba3c1c00485",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# This file was produced by bcftools stats (1.13+htslib-1.13+ds) and can be plotted using plot-vcfstats.\n",
      "# The command line was:\tbcftools stats  multisample.vcf.gz\n",
      "#\n",
      "# Definition of sets:\n",
      "# ID\t[2]id\t[3]tab-separated file names\n",
      "ID\t0\tmultisample.vcf.gz\n",
      "# SN, Summary numbers:\n",
      "#   number of records   .. number of data rows in the VCF\n",
      "#   number of no-ALTs   .. reference-only sites, ALT is either \".\" or identical to REF\n",
      "#   number of SNPs      .. number of rows with a SNP\n",
      "#   number of MNPs      .. number of rows with a MNP, such as CC>TT\n",
      "#   number of indels    .. number of rows with an indel\n",
      "#   number of others    .. number of rows with other type, for example a symbolic allele or\n",
      "#                          a complex substitution, such as ACT>TCGA\n",
      "#   number of multiallelic sites     .. number of rows with multiple alternate alleles\n",
      "#   number of multiallelic SNP sites .. number of rows with multiple alternate alleles, all SNPs\n",
      "# \n",
      "#   Note that rows containing multiple types will be counted multiple times, in each\n",
      "#   counter. For example, a row with a SNP and an indel increments both the SNP and\n",
      "#   the indel counter.\n",
      "# \n",
      "# SN\t[2]id\t[3]key\t[4]value\n",
      "SN\t0\tnumber of samples:\t2\n",
      "SN\t0\tnumber of records:\t904\n",
      "SN\t0\tnumber of no-ALTs:\t0\n",
      "SN\t0\tnumber of SNPs:\t0\n",
      "SN\t0\tnumber of MNPs:\t0\n",
      "SN\t0\tnumber of indels:\t3\n",
      "SN\t0\tnumber of others:\t898\n",
      "SN\t0\tnumber of multiallelic sites:\t0\n"
     ]
    }
   ],
   "source": [
    "bcftools stats multisample.vcf.gz | head -n30"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66694f69",
   "metadata": {},
   "source": [
    "# Crossing informations between SNP (illumina data) and SV - `bedtools intersect` or `intersectBed`\n",
    "    \n",
    "    https://bedtools.readthedocs.io/en/latest/content/tools/intersect.html\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24b25459",
   "metadata": {},
   "source": [
    "* Create a directory VARIANTS_COMPARISON \n",
    "* Count how many SNPs detectd with bcftools are within each SV detected by SNIFFLE\n",
    "* Extract all SNPs within each SVs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "add13c89",
   "metadata": {},
   "source": [
    "#### count SNP number within each SV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b645e71c",
   "metadata": {},
   "outputs": [],
   "source": [
    "bedtools intersect  -a ../BREAKDANCER/break.bed -b ../VCF_CLONES/output.vcf  -c > intersect_break_vs_gatk.bed"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e738f724",
   "metadata": {},
   "source": [
    "#### extract all SNPs within each SV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8538f10f",
   "metadata": {},
   "outputs": [],
   "source": [
    "bedtools intersect  -a ../BREAKDANCER/break.bed -b ../VCF_CLONES/output.vcf  -wo > intersect_break_vs_gatk_full.bed"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Bash",
   "language": "bash",
   "name": "bash"
  },
  "language_info": {
   "codemirror_mode": "shell",
   "file_extension": ".sh",
   "mimetype": "text/x-sh",
   "name": "bash"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
