Generate consensus FASTA sequences by applying VCF variants to a reference using bcftools consensus. Use when creating sample-specific reference sequences or reconstructing haplotypes.
npx skills add https://github.com/BioTender-max/awesome-bio-agent-skills --skill bio-consensus-sequences
Reference examples tested with: BioPython 1.83+, bcftools 1.19+, bedtools 2.31+, minimap2 2.26+, samtools 1.19+
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signatures<tool> --version then <tool> --help to confirm flagsIf code throws ImportError, AttributeError, or TypeError, introspect the installed
package and adapt the example to match the actual API rather than retrying.
"Generate a consensus sequence from my VCF" → Apply called variants to a reference FASTA, producing a sample-specific genome with optional haplotype selection and low-coverage masking.
bcftools consensus -f reference.fa input.vcf.gzcyvcf2 + Bio.SeqIO for simple SNP-only casesbcftools consensus -f reference.fa input.vcf.gz > consensus.fa
bcftools consensus -f reference.fa -s sample1 input.vcf.gz > sample1.fa
bcftools consensus -f reference.fa -o consensus.fa input.vcf.gz
bcftools consensus -f reference.fa -H 1 input.vcf.gz > haplotype1.fa
bcftools consensus -f reference.fa -H 2 input.vcf.gz > haplotype2.fa
| Option | Description |
|--------|-------------|
| -H 1 | First haplotype |
| -H 2 | Second haplotype |
| -H A | Apply all ALT alleles |
| -H R | Apply REF alleles where heterozygous |
| -I | Apply IUPAC ambiguity codes (separate flag) |
The -H 1 and -H 2 flags select haplotypes based on the phased genotype separator (|). With unphased genotypes (using /, e.g. 0/1), the assignment of alleles to haplotype 1 vs 2 is arbitrary and does not reflect true chromosomal phase. Verify phasing status before haplotype extraction:
bcftools query -f '%CHROM\t%POS[\t%GT]\n' input.vcf.gz | head
Phased genotypes appear as 0|1 or 1|0; unphased as 0/1. Sources of phased genotypes:
bcftools consensus -f reference.fa -I input.vcf.gz > consensus_iupac.fa
Heterozygous sites encoded with IUPAC ambiguity codes:
bcftools consensus -f reference.fa -M N input.vcf.gz > consensus.fa
Using a mask BED file:
# Create mask from depth
samtools depth input.bam | awk '$3<10 {print $1"\t"$2-1"\t"$2}' > low_coverage.bed
# Apply mask
bcftools consensus -f reference.fa -m low_coverage.bed input.vcf.gz > consensus.fa
| Option | Description |
|--------|-------------|
| -m FILE | Mask regions in BED file with N |
| -M CHAR | Character for masked regions (default N) |
bcftools consensus -f reference.fa -r chr1:1000-2000 input.vcf.gz > region.fa
Use with BED file to extract multiple regions.
bcftools consensus -f reference.fa -c chain.txt input.vcf.gz > consensus.fa
Chain files map coordinates between reference and consensus:
chain score ref_name ref_size ref_strand ref_start ref_end query_name query_size query_strand query_start query_end id
for sample in $(bcftools query -l input.vcf.gz); do
bcftools consensus -f reference.fa -s "$sample" input.vcf.gz > "${sample}.fa"
done
sample="sample1"
bcftools consensus -f reference.fa -s "$sample" -H 1 input.vcf.gz > "${sample}_hap1.fa"
bcftools consensus -f reference.fa -s "$sample" -H 2 input.vcf.gz > "${sample}_hap2.fa"
Normalize the VCF before applying variants to the reference. Non-normalized indel representations (left-aligned vs right-aligned, or decomposed vs multi-allelic) can produce incorrect consensus sequences:
bcftools norm -f reference.fa input.vcf.gz | bcftools consensus -f reference.fa > consensus.fa
Normalization left-aligns indels and splits multi-allelic records, ensuring variant positions match the reference context exactly. Without normalization, overlapping or adjacent indels are more likely to conflict, and bcftools consensus may silently produce unexpected sequence at those sites despite logging warnings to stderr.
For diploid organisms, a single consensus sequence is inherently a simplification -- the organism carries two distinct haplotype sequences. The choice of representation depends on downstream use:
| Strategy | Flag | Best for |
|----------|------|----------|
| Both haplotypes separately | -H 1, -H 2 | Phasing-aware analyses, allele-specific expression |
| IUPAC ambiguity codes | -I | Retaining heterozygosity information |
| All ALT alleles | -H A | Maximum divergence from reference |
| Majority/reference allele | -H R | Conservative consensus |
For phylogenetic applications, IUPAC codes can cause issues with some alignment and tree-building tools that do not handle ambiguity codes (or treat them as missing data). Using a single haplotype or applying only homozygous ALT alleles (bcftools view -i 'GT="1/1" || GT="1|1"') produces cleaner input for tree inference.
bcftools view -f PASS input.vcf.gz | \
bcftools consensus -f reference.fa > consensus.fa
bcftools filter -i 'QUAL>=30 && INFO/DP>=10' input.vcf.gz | \
bcftools consensus -f reference.fa > consensus.fa
bcftools view -v snps input.vcf.gz | \
bcftools consensus -f reference.fa > consensus_snps.fa
Output uses reference sequence names.
bcftools consensus -f reference.fa -p "sample1_" input.vcf.gz > consensus.fa
Sequences named: sample1_chr1, sample1_chr2, etc.
Goal: Generate consensus sequences for downstream analyses like phylogenetics, viral surveillance, or gene-level comparison.
Approach: Filter variants to high-quality calls, apply per-sample consensus generation, mask low-coverage regions with N, then combine for multi-sample workflows.
# For each sample, generate consensus
mkdir -p consensus
for sample in $(bcftools query -l cohort.vcf.gz); do
bcftools view -s "$sample" cohort.vcf.gz | \
bcftools view -c 1 | \
bcftools consensus -f reference.fa > "consensus/${sample}.fa"
done
# Combine for alignment
cat consensus/*.fa > all_samples.fa
# Apply high-quality variants only
bcftools filter -i 'QUAL>=30 && INFO/DP>=20' variants.vcf.gz | \
bcftools view -f PASS | \
bcftools consensus -f reference.fa -M N > consensus.fa
# Extract gene region
bcftools consensus -f reference.fa -r chr1:1000000-1010000 \
-s sample1 variants.vcf.gz > gene.fa
# Create mask from coverage
samtools depth -a input.bam | \
awk '$3<5 {print $1"\t"$2-1"\t"$2}' | \
bedtools merge > low_coverage.bed
# Generate consensus with mask
bcftools consensus -f reference.fa -m low_coverage.bed \
variants.vcf.gz > consensus.fa
# Align consensus to reference
minimap2 -a reference.fa consensus.fa | samtools view -bS > alignment.bam
# Or simple comparison
diff <(grep -v "^>" reference.fa) <(grep -v "^>" consensus.fa) | head
# Number of differences
bcftools view -H input.vcf.gz | wc -l
bcftools consensus processes variants in coordinate order. When variants overlap (particularly indels whose reference alleles span the same positions), later variants may conflict with already-applied changes. bcftools consensus logs warnings to stderr but still produces output -- the result at conflicting sites may not reflect the intended genotype. Normalizing the VCF beforehand (see above) reduces but does not eliminate this issue.
Check for warnings:
bcftools consensus -f reference.fa input.vcf.gz 2>&1 | grep -i warn
If overlapping variant warnings appear, inspect the affected regions and consider filtering one of the conflicting records or resolving manually.
from cyvcf2 import VCF
from Bio import SeqIO
# Load reference
ref_dict = {rec.id: str(rec.seq) for rec in SeqIO.parse('reference.fa', 'fasta')}
# Apply variants (SNPs only, simplified)
vcf = VCF('input.vcf.gz')
changes = {}
for variant in vcf:
if variant.is_snp and len(variant.ALT) == 1:
chrom = variant.CHROM
pos = variant.POS - 1 # 0-based
if chrom not in changes:
changes[chrom] = {}
changes[chrom][pos] = variant.ALT[0]
# Apply changes
for chrom, positions in changes.items():
seq = list(ref_dict[chrom])
for pos, alt in positions.items():
seq[pos] = alt
ref_dict[chrom] = ''.join(seq)
# Write output
with open('consensus.fa', 'w') as f:
for chrom, seq in ref_dict.items():
f.write(f'>{chrom}\n{seq}\n')
Note: Use bcftools consensus for production - handles indels and edge cases properly.
| Task | Command |
|------|---------|
| Basic consensus | bcftools consensus -f ref.fa in.vcf.gz |
| Specific sample | bcftools consensus -f ref.fa -s sample in.vcf.gz |
| Haplotype 1 | bcftools consensus -f ref.fa -H 1 in.vcf.gz |
| IUPAC codes | bcftools consensus -f ref.fa -I in.vcf.gz |
| With mask | bcftools consensus -f ref.fa -m mask.bed in.vcf.gz |
| Generate chain | bcftools consensus -f ref.fa -c chain.txt in.vcf.gz |
| Specific region | bcftools consensus -f ref.fa -r chr1:1-1000 in.vcf.gz |
| Error | Cause | Solution |
|-------|-------|----------|
| not indexed | VCF not indexed | Run bcftools index |
| sequence not found | Chromosome mismatch | Check chromosome names |
| overlapping records | Variants overlap | Usually OK, check warnings |
| REF does not match | Wrong reference | Use same reference as caller |
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Use when you have a written implementation plan to execute in a separate session with review checkpoints
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take biotender-max/bio-consensus-sequences from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.