[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M75K9FEZP0C2HD3ZC8ZFS0EW":3,"skill-same:01M75K9FEZP0C2HD3ZC8ZFS0EW":46},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M75K9FEZP0C2HD3ZC8ZFS0EW","pysam-genomics",null,"Programmatically read, modify, filter, and write BAM\u002FCRAM\u002FVCF files using pysam 0.22+ — the Python interface to htslib for NGS I\u002FO, variant calling, and custom pipelines.","pradyumnasagar\u002Fopen-research-skills","pradyumnasagar","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10559871?v=4","01M75K78MYCCVKRTYGT8KKC380","Pradyumna Jayaram","01M75K78NTNE41F2PE1XBVFHAS",8,"MIT","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbioinformatics-sequence\u002Fpysam-genomics\u002FSKILL.md",[],[],"2026-11-12 13:55:43",false,"---\n\nname: pysam-genomics\ndescription: \"Programmatically read, modify, filter, and write BAM\u002FCRAM\u002FVCF files using pysam 0.22+ — the Python interface to htslib for NGS I\u002FO, variant calling, and custom pipelines.\"\nlicense: MIT\n---\n\u003C!-- metadata:\n  category: bioinformatics-sequence\n  oversight: low\n  version: 1.0.0\n  author: Pradyumna Jayaram\n  tags: [bioinformatics-sequence, research]\n  difficulty: intermediate\n-->\n\n# pysam — BAM\u002FCRAM Python Interface\n\n## Hard rules\n\n1. **No fabricated citations.** Every cited work must resolve to a verifiable\n2. **No claim without provenance.** Every quantitative or factual claim\n3. **No silent failure.** Every script invocation, API call, or tool use must declare its exit status and what to do on non-zero. A skill that silently swallows errors is a violation.\n\n## When to use\n\n- Programmatically iterate BAM alignments with Python logic.\n- Extract variant or coverage data from a BAM.\n- Build a custom pipeline that needs alignment-level access.\n- Query regions from indexed BAM\u002FCRAM without loading a whole file.\n\n## When NOT to use\n\n- You need a BAM stats summary → use `samtools stats` or `mosdepth`.\n- You need variant calling → use GATK\u002FHaplotypeCaller or freebayes.\n- Visual → IGV, IGV.js, or JBrowse.\n\n## Prerequisites\n\n- `pysam` ≥ 0.22 (PyPI or conda)\n- `htslib` ≥ 1.19 (linked automatically)\n\n## Core workflow\n\n1. **Open an alignment file** with `pysam.AlignmentFile`.\n2. **Iterate and filter** with Python (no shell calls).\n3. **Query by region** with pileup \u002F fetch.\n4. **Write** optional BAM\u002FCRAM output.\n5. **Close** explicitly or use a context manager.\n\n## Code patterns\n\n### Open a BAM (read)\n\n```python\nimport pysam\n\"\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\n```\n\n### Open a SAM (auto-detect gzipped)\n\n```python\nsam = pysam.AlignmentFile(\"input.sam\", \"r\")\n```\n\n### Open a indexed region\n\nAccess a small region without loading the whole BAM:\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor read in bam.fetch(\"chr1\", 100_000, 200_000):\n    print(read.query_name, read.reference_name, read.pos, read.cigartuples)\n```\n\n### Iterate through all alignments\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor read in bam:\n    # read is a pysam AlignedSegment\n    if read.is_proper_pair:\n        print(read.query_name, read.tlen)\n```\n\n### Filter by FLAG in Python\n\n```python\ndef proper_paired(read):\n    return read.is_paired and read.is_proper_pair\n\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nproper = [r for r in bam if proper_paired(r)]\n```\n\n### Extract MAPQ, CIGAR, cigarstring\n\n```python\nfor read in bam:\n    print(read.query_name,\n          read.mapq,\n          read.cigartuples,   # [(0, 100)] = 100M\n          read.cigarstring)   # \"100M\"\n```\n\n### Extract the aligned sequence\n\n```python\nfor read in bam:\n    if not read.is_unmapped:\n        print(read.query_sequence[:50])  # First 50 bp\n```\n\n### Access mate information\n\n```python\nfor read in bam:\n    if read.is_paired and read.mate_is_unmapped:\n        print(f\"{read.query_name} mate is unmapped\")\n```\n\n### Pileup at a position\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor column in bam.pileup(\"chr1\", 100_000, 100_001):\n    for read in column.pileups:\n        print(read.alignment.query_name)\n```\n\n### Write a filtered BAM\n\n```python\nwith pysam.AlignmentFile(\"filtered.bam\", \"wb\", header=bam.header) as out:\n    for read in bam:\n        if read.mapq >= 30 and read.is_proper_pair:\n            out.write(read)\n```\n\n### Iterating over a tabix-indexed BED\u002FVCF\n\n```python\nvcf = pysam.TabixFile(\"variants.vcf.gz\")\nfor record in vcf.contigs:\n    pass  # Use region query for actual records\n```\n\n### Read from CRAM (requires reference)\n\n```python\ncram = pysam.AlignmentFile(\"input.cram\", \"rc\", reference_fasta=\"genome.fa\")\n```\n\n### Access the header as Python dict\n\n```python\nheader = bam.header.to_dict()\nprint(header[\"RG\"])  # List of read groups\n```\n\n### Convert SAM to Python objects\n\n```python\nwith pysam.AlignmentFile(\"input.sam\", \"r\") as sam:\n    for read in sam:\n        # read is an AlignedSegment\n        ...\n```\n\n### Get index statistics without loading\n\n```python\nindex = pysam.IndexedReads(pysam.AlignmentFile(\"input.bam\"))\n```\n\nThe `Index` object is for random-access.\n\n### Create custom tags\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\", fields=[\"NM\", \"MD\", \"RG\"])\n# Fields are automatically loaded if they exist\n```\n\n### Check if a position is covered\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor col in bam.pileup(\"chr1\", 100_000, 100_001):\n    coverage = col.nsegments\n    if coverage >= 10:\n        print(f\"Position covered: {coverage}\")\n```\n\n### Extract all reads overlapping a gene\n\n```python\n# Use fetch for gene coordinates\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\ngene_reads = [r for r in bam.fetch(\"chr1\", start, end)]\n```\n\n### Read group filter\n\n```python\nrg_bam = pysam.AlignmentFile(\"input.bam\", \"rb\", header=header)\nfor read in rg_bam:\n    # read.get_tag(\"RG\") - read group from optional tags\n    pass\n```\n\n## Common pitfalls\n\n- **Forgetting to close the file.** Use a context manager (`with ...`) or close explicitly.\n- **CIGAR interpretation.** `read.cigartuples` returns `(operation, length)` tuples. `0` = M, `1` = I, `2` = D.\n- **MAPQ zero** means unmapped *in this alignment*, not zero quality.\n- **Reference fasta for CRAM.** Must be the exact FASTA used to create the CRAM.\n- **Duplicate reads being filtered.** `samtools markdup -r` is the modern way.\n- **Pileup object is lazy.** If you need it, materialize it (e.g., with `list()`) otherwise it's consumed by iteration.\n\n## Validation\n\n- After filtering, `samtools flagstat filtered.bam` should show the expected read count.\n- `read_mapq` should be >= your threshold.\n- `read.is_proper_pair` checks both ends.\n\n## Open alternatives\n\n| Need | Tool |\n|------|------|\n| Shell pipeline | `samtools view`, `samtools filter` |\n| Variant calling | GATK \u002F freebayes \u002F bcftools |\n| Coverage | `mosdepth`, `samtools depth` |\n| Multi-sample | `bcftools isec` |\n| Pysam in R | `Rsamtools` (Bioconductor) |\n\n## References\n\n- pysam documentation: \u003Chttps:\u002F\u002Fpysam.readthedocs.io\u002F>\n- htslib: \u003Chttp:\u002F\u002Fwww.htslib.org\u002F>\n- SAM spec: \u003Chttps:\u002F\u002Fsamtools.github.io\u002Fhts-specs\u002FSAMv1.pdf>\n- Companion: `ors-bioinformatics-sequence-sam-bam-basics`, `ors-bioinformatics-sequence-bcftools-variant-manipulation`.\n\n## Changelog\n\n- 1.0.0 (2026-06-10): Initial adaptation by Pradyumna Jayaram from `pysam-genomic-files` (SciAgent-Skills).\n\n## Cross-references\n\nOther skills in this category:\n\n- batch-processing\n- bowtie2-alignment\n- bwa-alignment\n- bwa-mem2-alignment\n- codon-usage\n- compressed-sequence-files\n- fastq-quality-scores\n- filter-sequences\n- format-conversion\n- hisat2-alignment\n- motif-search\n- paired-end-fastq\n- read-write-sequences\n- reverse-complement\n- sam-bam-basics\n- samtools-bam-processing\n- seq-objects\n- sequence-properties\n- sequence-slicing\n- sequence-statistics\n- star-alignment\n- transcription-translation\n","\u003C!-- metadata:\n  category: bioinformatics-sequence\n  oversight: low\n  version: 1.0.0\n  author: Pradyumna Jayaram\n  tags: [bioinformatics-sequence, research]\n  difficulty: intermediate\n-->\n\n# pysam — BAM\u002FCRAM Python Interface\n\n## Hard rules\n\n1. **No fabricated citations.** Every cited work must resolve to a verifiable\n2. **No claim without provenance.** Every quantitative or factual claim\n3. **No silent failure.** Every script invocation, API call, or tool use must declare its exit status and what to do on non-zero. A skill that silently swallows errors is a violation.\n\n## When to use\n\n- Programmatically iterate BAM alignments with Python logic.\n- Extract variant or coverage data from a BAM.\n- Build a custom pipeline that needs alignment-level access.\n- Query regions from indexed BAM\u002FCRAM without loading a whole file.\n\n## When NOT to use\n\n- You need a BAM stats summary → use `samtools stats` or `mosdepth`.\n- You need variant calling → use GATK\u002FHaplotypeCaller or freebayes.\n- Visual → IGV, IGV.js, or JBrowse.\n\n## Prerequisites\n\n- `pysam` ≥ 0.22 (PyPI or conda)\n- `htslib` ≥ 1.19 (linked automatically)\n\n## Core workflow\n\n1. **Open an alignment file** with `pysam.AlignmentFile`.\n2. **Iterate and filter** with Python (no shell calls).\n3. **Query by region** with pileup \u002F fetch.\n4. **Write** optional BAM\u002FCRAM output.\n5. **Close** explicitly or use a context manager.\n\n## Code patterns\n\n### Open a BAM (read)\n\n```python\nimport pysam\n\"\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\n```\n\n### Open a SAM (auto-detect gzipped)\n\n```python\nsam = pysam.AlignmentFile(\"input.sam\", \"r\")\n```\n\n### Open a indexed region\n\nAccess a small region without loading the whole BAM:\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor read in bam.fetch(\"chr1\", 100_000, 200_000):\n    print(read.query_name, read.reference_name, read.pos, read.cigartuples)\n```\n\n### Iterate through all alignments\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor read in bam:\n    # read is a pysam AlignedSegment\n    if read.is_proper_pair:\n        print(read.query_name, read.tlen)\n```\n\n### Filter by FLAG in Python\n\n```python\ndef proper_paired(read):\n    return read.is_paired and read.is_proper_pair\n\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nproper = [r for r in bam if proper_paired(r)]\n```\n\n### Extract MAPQ, CIGAR, cigarstring\n\n```python\nfor read in bam:\n    print(read.query_name,\n          read.mapq,\n          read.cigartuples,   # [(0, 100)] = 100M\n          read.cigarstring)   # \"100M\"\n```\n\n### Extract the aligned sequence\n\n```python\nfor read in bam:\n    if not read.is_unmapped:\n        print(read.query_sequence[:50])  # First 50 bp\n```\n\n### Access mate information\n\n```python\nfor read in bam:\n    if read.is_paired and read.mate_is_unmapped:\n        print(f\"{read.query_name} mate is unmapped\")\n```\n\n### Pileup at a position\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor column in bam.pileup(\"chr1\", 100_000, 100_001):\n    for read in column.pileups:\n        print(read.alignment.query_name)\n```\n\n### Write a filtered BAM\n\n```python\nwith pysam.AlignmentFile(\"filtered.bam\", \"wb\", header=bam.header) as out:\n    for read in bam:\n        if read.mapq >= 30 and read.is_proper_pair:\n            out.write(read)\n```\n\n### Iterating over a tabix-indexed BED\u002FVCF\n\n```python\nvcf = pysam.TabixFile(\"variants.vcf.gz\")\nfor record in vcf.contigs:\n    pass  # Use region query for actual records\n```\n\n### Read from CRAM (requires reference)\n\n```python\ncram = pysam.AlignmentFile(\"input.cram\", \"rc\", reference_fasta=\"genome.fa\")\n```\n\n### Access the header as Python dict\n\n```python\nheader = bam.header.to_dict()\nprint(header[\"RG\"])  # List of read groups\n```\n\n### Convert SAM to Python objects\n\n```python\nwith pysam.AlignmentFile(\"input.sam\", \"r\") as sam:\n    for read in sam:\n        # read is an AlignedSegment\n        ...\n```\n\n### Get index statistics without loading\n\n```python\nindex = pysam.IndexedReads(pysam.AlignmentFile(\"input.bam\"))\n```\n\nThe `Index` object is for random-access.\n\n### Create custom tags\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\", fields=[\"NM\", \"MD\", \"RG\"])\n# Fields are automatically loaded if they exist\n```\n\n### Check if a position is covered\n\n```python\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\nfor col in bam.pileup(\"chr1\", 100_000, 100_001):\n    coverage = col.nsegments\n    if coverage >= 10:\n        print(f\"Position covered: {coverage}\")\n```\n\n### Extract all reads overlapping a gene\n\n```python\n# Use fetch for gene coordinates\nbam = pysam.AlignmentFile(\"input.bam\", \"rb\")\ngene_reads = [r for r in bam.fetch(\"chr1\", start, end)]\n```\n\n### Read group filter\n\n```python\nrg_bam = pysam.AlignmentFile(\"input.bam\", \"rb\", header=header)\nfor read in rg_bam:\n    # read.get_tag(\"RG\") - read group from optional tags\n    pass\n```\n\n## Common pitfalls\n\n- **Forgetting to close the file.** Use a context manager (`with ...`) or close explicitly.\n- **CIGAR interpretation.** `read.cigartuples` returns `(operation, length)` tuples. `0` = M, `1` = I, `2` = D.\n- **MAPQ zero** means unmapped *in this alignment*, not zero quality.\n- **Reference fasta for CRAM.** Must be the exact FASTA used to create the CRAM.\n- **Duplicate reads being filtered.** `samtools markdup -r` is the modern way.\n- **Pileup object is lazy.** If you need it, materialize it (e.g., with `list()`) otherwise it's consumed by iteration.\n\n## Validation\n\n- After filtering, `samtools flagstat filtered.bam` should show the expected read count.\n- `read_mapq` should be >= your threshold.\n- `read.is_proper_pair` checks both ends.\n\n## Open alternatives\n\n| Need | Tool |\n|------|------|\n| Shell pipeline | `samtools view`, `samtools filter` |\n| Variant calling | GATK \u002F freebayes \u002F bcftools |\n| Coverage | `mosdepth`, `samtools depth` |\n| Multi-sample | `bcftools isec` |\n| Pysam in R | `Rsamtools` (Bioconductor) |\n\n## References\n\n- pysam documentation: \u003Chttps:\u002F\u002Fpysam.readthedocs.io\u002F>\n- htslib: \u003Chttp:\u002F\u002Fwww.htslib.org\u002F>\n- SAM spec: \u003Chttps:\u002F\u002Fsamtools.github.io\u002Fhts-specs\u002FSAMv1.pdf>\n- Companion: `ors-bioinformatics-sequence-sam-bam-basics`, `ors-bioinformatics-sequence-bcftools-variant-manipulation`.\n\n## Changelog\n\n- 1.0.0 (2026-06-10): Initial adaptation by Pradyumna Jayaram from `pysam-genomic-files` (SciAgent-Skills).\n\n## Cross-references\n\nOther skills in this category:\n\n- batch-processing\n- bowtie2-alignment\n- bwa-alignment\n- bwa-mem2-alignment\n- codon-usage\n- compressed-sequence-files\n- fastq-quality-scores\n- filter-sequences\n- format-conversion\n- hisat2-alignment\n- motif-search\n- paired-end-fastq\n- read-write-sequences\n- reverse-complement\n- sam-bam-basics\n- samtools-bam-processing\n- seq-objects\n- sequence-properties\n- sequence-slicing\n- sequence-statistics\n- star-alignment\n- transcription-translation\n",{"name":5,"license":15,"description":7},"main","9c0b41e2036cc5588c699f06e658ea6dc3b9685d","skills\u002Fbioinformatics-sequence\u002Fpysam-genomics",2,"https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar","PhD Scholar,\r\nManipal School Of Life Sciences, Manipal\r\n #OpenSourceDeveloper #LifeSciences #ComputationalBiology","2026-10-30 01:30:52",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add pradyumnasagar\u002Fopen-research-skills --skill pysam-genomics",{"tool":38,"command":39},"bunx","bunx skills add pradyumnasagar\u002Fopen-research-skills --skill pysam-genomics",{"tool":41,"command":42},"pnpm","pnpm dlx skills add pradyumnasagar\u002Fopen-research-skills --skill pysam-genomics","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Fskills\u002Fbioinformatics-sequence\u002Fpysam-genomics\u002FSKILL.md",true,[],[47,54,60,67,74,81],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":19},"01M75KTS5K9QNX8FQBTJW2GQSH","good-skill","A well-formed test fixture for the validation script.","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fgood-skill\u002FSKILL.md",[],[],{"skillNo":55,"name":56,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M75KTR7FAT0MMMED2EGC9WZZ","BadSkill","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fbad-skill\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M75KTN949EDF77GJDS8H6VR8","my-new-skill","One sentence (max 200 chars) — what the skill does and when to use it.","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Ftemplate\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M75KTHTFS121SSF1Q5X2FXDA","thesis-structure","Use when planning or checking the architecture of a PhD \u002F MPhil thesis in the life sciences or bioinformatics — monograph vs article-based, chapter sequence, IMRaD-based chapters, abstract-to-conclusion flow, and the examiner expectations that the structure must meet.","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Fskills\u002Fthesis-writing\u002Fthesis-structure\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M75KTE3WKW46FXFHQ579H8YP","thesis-methods-reproducibility","Use when writing or checking the Methods, figures, data, and code of a bioinformatics \u002F microbiology \u002F life-science PhD thesis — the FAIR data, versioned code, report-generation, figure-and-table discipline, and the reproducibility expectations that examiners probe at viva.","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Fskills\u002Fthesis-writing\u002Fthesis-methods-reproducibility\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M75KTA033ZQCJY3DC8P5VQET","thesis-defense-viva","Use when preparing for the viva voce \u002F oral thesis defense — building the examiner's question set, rehearsing the presentation, and the pre-defense polish (slides, summary, the 'what if I'm stuck' responses) for a life-science or bioinformatics PhD.","https:\u002F\u002Fgithub.com\u002Fpradyumnasagar\u002Fopen-research-skills\u002Fblob\u002Fmain\u002Fskills\u002Fthesis-writing\u002Fthesis-defense-viva\u002FSKILL.md",[],[]]