How to Compute Reverse Complements in Python with Biopython
By Dr. Zubair Khalid, DVM, MS, PhD ·

The difference between the main ways to compute a reverse complement in Python is how much of the work you manage yourself. Biopython's Seq.reverse_complement() method handles the nucleotide alphabet, ambiguity codes, and object behavior for you, the module-level Bio.Seq.reverse_complement() function does the same job on plain strings and bytes, and a hand-built str.translate table trades features and safety for zero dependencies and raw speed.
The rule of thumb is simple. Use Seq.reverse_complement() whenever a sequence comes from a file or feeds a pipeline. Use the module-level function for quick string work inside code that already imports Biopython. Reach for str.maketrans only in dependency-free scripts where you control the input alphabet.
This guide defines the operation, walks through each option with working code, compares the options on the criteria that decide real choices, and lists the mistakes that cost the most debugging time.
What a Reverse Complement Is
DNA in a genome is double stranded, and the two strands run in opposite directions. Each strand has a direction described as 5-prime to 3-prime (written 5' to 3'), which refers to the carbon positions on the sugar ring in the backbone. The strands are held together by Watson-Crick base pairing: adenine (A) pairs with thymine (T) through two hydrogen bonds, and cytosine (C) pairs with guanine (G) through three hydrogen bonds.
The reverse complement of a sequence is what its partner strand reads when you traverse it in the 5' to 3' direction. Two separate operations combine to produce it:
- Complement swaps each base for its pairing partner (A to T, C to G) while keeping the position order.
- Reverse flips the order of the characters without changing any bases.
Applying both gives the reverse complement. For the triplet 5'-ATG-3', the complement alone is TAC, the reverse alone is GTA, and the reverse complement is CAT. Getting this order of operations right is the single most common source of confusion for people new to the task, because complementing and reversing commute mathematically (you get the same answer either way) but doing only one of them produces a biologically wrong answer.
from Bio.Seq import Seq
seq = Seq("ATG")
print(seq.complement()) # TAC (bases swapped, same order)
print(seq[::-1]) # GTA (order flipped, same bases)
print(seq.reverse_complement()) # CAT (what the partner strand reads, 5' to 3')
The operation matters constantly in practice. Genes sit on either strand of the double helix, so a region you download from a genome browser may encode its gene on the strand opposite the one you are reading. Sequence processing suites treat the reverse complement as a bread-and-butter function alongside translation and primer design, which is exactly how tools such as SPDE organize their single-sequence processing module [1]. Alignment reports describe matches on a plus or minus strand, and the minus-strand hit only makes sense once you can flip the sequence. Feature engineering methods rely on it too: the iRSpot-SF recombination hotspot predictor found that reverse complement k-mer composition (k-mers collapsed with their mirror-strand equivalents so strand orientation cannot bias the feature) outperformed other sequence feature groups [2]. Clinical variant reporting adds another layer, because the HGVS nomenclature standard describes variants relative to a transcript rather than the genome, and Python libraries such as hgvs exist to parse, validate, and map those strand-aware descriptions [3].
The full nucleotide alphabet, including ambiguity codes
Real sequence data contains more than A, C, G, and T. The IUPAC (International Union of Pure and Applied Chemistry) notation defines single-letter codes for ambiguity, and a correct reverse complement must map every one of them to its pairing partner:
| Code | Meaning | Complements with |
|---|---|---|
| A | adenine | T |
| C | cytosine | G |
| G | guanine | C |
| T | thymine | A |
| R | A or G (purine) | Y |
| Y | C or T (pyrimidine) | R |
| S | C or G (strong, three bonds) | S |
| W | A or T (weak, two bonds) | W |
| K | G or T (keto) | M |
| M | A or C (amino) | K |
| B | C, G, or T (not A) | V |
| V | A, C, or G (not T) | B |
| D | A, G, or T (not C) | H |
| H | A, C, or T (not G) | D |
| N | any base | N |
Two details trip people up. First, lowercase letters are meaningful in genomic FASTA files, where soft-masked repeats (regions flagged by repeat-finding tools) appear in lowercase. A correct implementation complements lowercase to lowercase and preserves the case distinction. Second, Biopython maps U (uracil, the RNA equivalent of T) to A, and it maps A to T even in RNA strings, so complementing an RNA sequence produces a DNA-style string rather than an RNA-style string. Plan for that if your data is RNA.
Why Python for Bioinformatics
Python earned its place in sequence analysis for reasons that go beyond convenience. The tradition of object-oriented sequence manipulation in Python goes back decades, with packages such as Sarment providing modules for building and manipulating sequence segmentations whose results are easy to handle because they are proper objects [4]. That design philosophy, where a sequence carries behavior rather than being a bare character array, is exactly what makes Seq.reverse_complement() pleasant to use.
Python also dominates small and medium workflow utilities because laboratory scientists without formal programming training can read, adapt, and chain scripts. Tools such as GAD, a Python program for extracting features from GFF3 and GTF annotation files, were built explicitly to accelerate genomic analysis for non-developers [5]. When thousands of labs write their own glue scripts, an operation as common as the reverse complement needs to be one obvious, well-named call.
Speed concerns are real but manageable. Mature libraries pair a friendly Python interface with a compiled core, as EggLib does with its C++ engine underneath a Python layer for sequence data management and population genetic analyses [6]. Biopython itself is designed as an extensible platform, and third-party modules have been built to slot directly into its distribution, such as the Python interface to the SCOP and ASTRAL structural classification resources [7]. The practical consequence for this article is that you get correctness and integration from Biopython while the heavy character work happens in optimized code.
Reverse Complement in Python with Biopython: The Options at a Glance

There are six practical ways to compute a reverse complement in Python. The table below is the core of this article, and everything after it expands one row at a time.
| Option | Input type | IUPAC codes and case | Metadata survival | Dependency | Best for |
|---|---|---|---|---|---|
Seq.reverse_complement() | Seq object | Full alphabet, case preserved | None (bare sequence) | Biopython | Everyday sequence work in scripts and pipelines |
Bio.Seq.reverse_complement() | str or bytes | Full alphabet, case preserved | None | Biopython 1.79 and later | String-level work inside Biopython code |
SeqRecord.reverse_complement() | SeqRecord | Full alphabet, case preserved | Features remapped, per-letter annotations reversed | Biopython | Files with ids, qualities, and features |
MutableSeq.reverse_complement() | MutableSeq | Full alphabet, case preserved | None | Biopython | In-place edits on a working copy |
str.translate plus slicing | str | Only what your table includes | None | None | Dependency-free scripts with controlled input |
| Character-by-character loop | Any iterable | Only what you code | None | None | Learning the algorithm, never production |
Read the table as a decision ladder. The first four rows all give you the same correct answer on the full IUPAC alphabet, and they differ in what container the sequence lives in and what metadata travels with it. The last two rows give you exactly the correctness you build into them yourself.
Option 1: Seq.reverse_complement() on Biopython Sequence Objects
The Seq object is Biopython's core sequence container. It behaves like a string for slicing and concatenation, but it carries sequence-aware methods. The reverse complement method is the one you will use most:
from Bio.Seq import Seq
coding = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
rc = coding.reverse_complement()
print(rc)
# CTATCGGGCACCCTTTCAGCGGCCATTACAAATGGCCAT
If you follow the official Biopython tutorial, this is the same 39-base sequence used in its quick start chapter, and the output above matches the tutorial's documented result. That makes it a convenient anchor for checking your own installation: if this call produces that string, your environment is sane.
Three behaviors matter for daily work:
- The method returns a new object.
Seqis immutable, socodingis unchanged after the call. Assign the result, as inrc = coding.reverse_complement(). Calling the method and discarding the result is a silent no-op that has bitten every bioinformatician at least once. - The result is a full
Seq. You can slice it, translate it, or compute its reverse complement again. The double reverse complement returns the original, which is the basis of the cheapest correct unit test in sequence scripting. - Case and ambiguity codes are handled.
Seq("atgc").reverse_complement()returnsgcatwait, let me be precise: it returnsgcatonly if the mapping is lowercase to lowercase, which Biopython does. Ambiguity codes map per the IUPAC table above, so R becomes Y and N stays N.
Complement without reversal
Sometimes you want the paired strand in the same coordinate direction, for example when checking base pairing in a designed construct. Seq.complement() does the swap without the flip:
from Bio.Seq import Seq
seq = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
print(seq.complement())
# TACCGGTAACATTACCCGGCGACTTTCCCACGGGCTATC
Note that this output is the reverse of the reverse complement, not the same string. If you catch yourself writing seq.complement() where you meant seq.reverse_complement(), the bug is hard to spot by eye on random sequence, which is why the sanity checks later in this article matter.
In-place edits with MutableSeq
Seq immutability is a feature, but occasionally you want to mutate a working copy directly, for example when building sequences up inside a loop. MutableSeq supports in-place operations, and its reverse_complement() method edits the object itself:
from Bio.Seq import MutableSeq
working = MutableSeq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
working.reverse_complement() # edits in place
print(working)
# CTATCGGGCACCCTTTCAGCGGCCATTACAAATGGCCAT
Use this sparingly. In-place mutation makes it easier to lose track of which variables alias the same underlying sequence, and the immutable style keeps pipelines predictable.
Option 2: The Module-Level Function on Plain Strings
Biopython 1.79 and later expose module-level functions in Bio.Seq that accept plain strings and bytes, so you can get Biopython's alphabet handling without wrapping every value in a Seq:
from Bio.Seq import complement, reverse_complement
print(reverse_complement("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG"))
# CTATCGGGCACCCTTTCAGCGGCCATTACAAATGGCCAT
print(reverse_complement(b"ATGGCC"))
# b'GGCCAT'
print(complement("ATG"))
# TAC
This option earns its place in codebases that store sequences as strings for interoperability with other tools, or that read raw bytes from a high-throughput source. The functions handle the full IUPAC alphabet in both cases, exactly like the Seq methods, and the bytes variant is useful when a pipeline hands you undecoded data.
The tradeoffs are narrow but real. You need Biopython 1.79 or later, so pin your dependency if you rely on these functions. There is no metadata involved, which is fine because plain strings carry none. And because the function name is identical to the method name, search results and autocomplete can mix the two, so check that your call site imports from the right place.
Option 3: A Dependency-Free str.translate Table
When you cannot or do not want to install anything, the standard library provides a clean solution. str.maketrans builds a character mapping table, str.translate applies it in one C-level pass, and slice notation [::-1] reverses the string:
_TABLE = str.maketrans("ACGTacgtNn", "TGCAtgcaNn")
def reverse_complement(seq: str) -> str:
"""Return the reverse complement of a nucleotide string."""
return seq.translate(_TABLE)[::-1]
print(reverse_complement("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG"))
# CTATCGGGCACCCTTTCAGCGGCCATTACAAATGGCCAT
This is the fastest pure-Python approach because CPython implements translate in C. For a single string it is effectively the speed floor.
The minimal table above covers uppercase, lowercase, and N. If your data carries ambiguity codes, extend the table to the full alphabet:
_COMPLEMENT = {
"A": "T", "C": "G", "G": "C", "T": "A", "U": "A",
"R": "Y", "Y": "R", "S": "S", "W": "W",
"K": "M", "M": "K", "B": "V", "V": "B",
"D": "H", "H": "D", "N": "N",
}
_TABLE = str.maketrans(
{**_COMPLEMENT,
**{b.lower(): c.lower() for b, c in _COMPLEMENT.items()}}
)
def reverse_complement(seq: str) -> str:
return seq.translate(_TABLE)[::-1]
Now the honest caveats, because this option is where silent failures live:
- Unmapped characters pass through unchanged.
str.translateleaves characters it has no entry for exactly as they were. A stray X, a hyphen from a gapped alignment, or a trailing newline survives into your output and then gets reversed into the middle of the sequence. Strip whitespace and validate the alphabet before calling. - You own the alphabet. The most common real-world bug is a table built from uppercase ACGTN only, fed with soft-masked genomic FASTA. Every lowercase repeat base passes through uncomplemented, and the result looks plausible while being wrong for exactly the regions most likely to matter.
- No metadata, no formats. This function knows nothing about FASTA headers, quality scores, or feature coordinates. It is a string tool.
Used within those boundaries, it is an excellent choice for quick scripts, teaching, and environments where you cannot install packages.
Option 4: Reverse Complementing Files with SeqIO and SeqRecord
Real work happens on files, and files carry identifiers, descriptions, quality scores, and annotation features. The pattern of loading genomic data formats into standard Python data structures is well established across the ecosystem, from metaseq loading multiple genomic formats into ordinary Python containers [8] to Biopython's own SeqIO module, which reads and writes every common sequence format through the same iterator interface.
FASTA: flip a whole file, record by record
from Bio import SeqIO
source = "contigs.fasta"
target = "contigs_rc.fasta"
with open(target, "w") as out:
for record in SeqIO.parse(source, "fasta"):
record.seq = record.seq.reverse_complement()
SeqIO.write(record, out, "fasta")
Two design choices in this snippet matter at scale. First, SeqIO.parse returns an iterator, so records are read one at a time. Second, writing each record immediately inside the loop keeps memory flat no matter how large the file is. That matters for real pipelines: PHYLUCE, a Python package for phylogenomic analysis of conserved loci, preprocesses data across hundreds of taxa and thousands of enriched loci, and file-level workflows at that scale live or die on streaming rather than loading everything into a list [9]. The naive alternative, records = list(SeqIO.parse(...)), multiplies your memory footprint by the whole file size for no benefit here.
FASTQ: reverse the qualities along with the bases

FASTQ records carry a Phred quality score (a per-base error probability encoded as a character) for every base. If you reverse complement the bases but leave the qualities in place, every downstream per-base quality filter reads the wrong score. Biopython solves this with the record-level method:
from Bio import SeqIO
with open("reads_rc.fastq", "w") as out:
for record in SeqIO.parse("reads.fastq", "fastq"):
SeqIO.write(record.reverse_complement(), out, "fastq")
SeqRecord.reverse_complement() returns a new record whose sequence is the reverse complement, whose per-letter annotations such as phred_quality are reversed along with the bases, and whose feature locations are remapped. You can verify the alignment cheaply:
record = next(SeqIO.parse("reads.fastq", "fastq"))
rc = record.reverse_complement()
assert len(rc.seq) == len(rc.letter_annotations["phred_quality"])
FASTQ has a zoo of historical variants differing in how quality characters encode scores. The Galaxy project's FASTQ manipulation suite, implemented in Python, was built specifically to handle all of the commonly known FASTQ format variants through one pipeline [10]. Biopython's SeqIO follows the same spirit with separate format names: "fastq" for the standard Phred+33 encoding used by modern files, plus "fastq-solexa" and "fastq-illumina" for legacy encodings. Confirm which variant your instrument or archive produced before converting, because reading one variant with another format name corrupts the scores silently.
GenBank: keep the annotations you need to write back out
from Bio import SeqIO
record = SeqIO.read("plasmid.gb", "genbank")
rc = record.reverse_complement(annotations=True)
SeqIO.write(rc, "plasmid_rc.gb", "genbank")
annotations=True copies the annotation dictionary, which includes molecule_type, a field Biopython requires when writing GenBank format. Without it, the write step fails. Feature locations on the new record are remapped to the reversed coordinates automatically, so a CDS that spanned positions 100 to 400 on the original record spans the mirrored positions on the flipped one. If you also maintain coordinates outside the record, in a BED file or a spreadsheet of primer positions, Biopython cannot remap those for you, and that is covered under mistakes below.
Pros and Cons: Choosing the Best Reverse Complement Method
There is no single best reverse complement method in Python with Biopython, only the best fit for the data in front of you. The criteria that decide real choices are correctness on your actual alphabet, metadata survival, performance and memory, dependency budget, and failure mode (loud errors versus silent corruption).
Seq.reverse_complement()
- Pros: correct on the full IUPAC alphabet in both cases, returns a proper
Seqthat slices and translates, integrates with everySeqIOworkflow, one obvious name. - Cons: requires Biopython, wraps values in objects, returns a new object so you must assign the result.
Bio.Seq.reverse_complement() on strings
- Pros: identical alphabet correctness on plain
strandbytes, no object wrapping, fits string-heavy code. - Cons: requires Biopython 1.79 or later, carries no metadata, name collision with the method can confuse search and autocomplete.
SeqRecord.reverse_complement()
- Pros: the only option that handles metadata correctly, reverses per-letter annotations, remaps features, works inside streaming file loops.
- Cons: more machinery than a bare string operation, format-specific gotchas such as GenBank's
molecule_typerequirement and FASTQ variant encodings.
MutableSeq.reverse_complement()
- Pros: in-place edit when you are deliberately mutating a working copy.
- Cons: aliasing surprises, rarely the right default.
str.translate plus slicing
- Pros: zero dependencies, fastest per character in CPython, two readable lines.
- Cons: you own the alphabet, unmapped characters pass through silently, no validation, easy to forget lowercase or ambiguity codes.
Character-by-character loop
- Pros: makes the algorithm explicit for teaching.
- Cons: the slow path in Python by a wide margin, and just as easy to get wrong.
On performance, keep the honest picture in mind. Controlled cross-language benchmarks consistently show Python trailing compiled languages on tight loops, with Python among the slowest of six languages tested on large and reverse-ordered inputs [11]. That is exactly why the fast paths here delegate: str.translate runs in C, and mature Python bioinformatics libraries pair a Python interface with compiled engines, as EggLib does with its C++ core [6]. For a single reverse complement call, the difference between options is negligible, and at file scale, parsing and object construction dominate rather than the complement itself. When an analysis grows into heavy computation beyond sequence plumbing, the ecosystem scales it with accelerators rather than by rewriting your loop, as pyVIPER did by moving protein activity estimation onto PyTorch GPU execution for orders-of-magnitude runtime improvements [12].
A compact decision list:
- Bare string, controlled alphabet, no dependencies allowed:
str.translatetable. - Strings inside a codebase that already imports Biopython: module-level function.
- Sequences in scripts and pipelines:
Seq.reverse_complement(). - Files with ids, qualities, or features:
SeqRecord.reverse_complement()inside aSeqIOloop.
Worked Scenarios
Reverse primer binding site
A reverse primer must match the partner strand of your target, read 5' to 3'. Given a target region on the plus strand, the binding sequence is the reverse complement of the target's 3-prime end:
from Bio.Seq import Seq
target = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
binding_site = target[-20:] # GCTGAAAGGGTGCCCGATAG
reverse_primer = binding_site.reverse_complement()
print(reverse_primer)
# CTATCGGGCACCCTTTCAGC
This is the sequence manipulation step of primer design, not the whole discipline. Real primer design adds melting temperature, GC content, secondary structure, and specificity checks on top. But the flip itself is where a strand error would doom the primer before any of those checks run.
Reading a gene on the minus strand
Suppose a genomic window comes from the strand opposite a coding sequence. To read its codons in the correct orientation, flip first, then translate:
from Bio.Seq import Seq
window = Seq("CTATCGGGCACCCTTTCAGCGGCCATTACAAATGGCCAT")
coding_strand = window.reverse_complement()
print(coding_strand.translate(to_stop=True))
# MAIVMGR
The to_stop=True argument halts translation at the first stop codon, returning the peptide MAIVMGR. The window in this example is the reverse complement of the tutorial sequence from earlier, so the round trip lands on a clean open reading frame (a stretch of codons running from a start codon to a stop codon). In real projects, this flip-then-translate pattern is how you inspect annotations on the minus strand without manually reversing anything.
Sanity checks that catch strand bugs
Three checks fit in any test file and catch nearly every reverse complement mistake:
from Bio.Seq import Seq
def test_roundtrip():
seq = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
assert seq.reverse_complement().reverse_complement() == seq
def test_palindrome():
# EcoRI site GAATTC reads the same on both strands
assert Seq("GAATTC").reverse_complement() == Seq("GAATTC")
def test_length_preserved():
seq = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
assert len(seq.reverse_complement()) == len(seq)
The round trip check fails if you complemented without reversing or reversed without complementing. The palindrome check uses the EcoRI restriction site, which is self-complementary, a property real restriction enzymes exploit. The length check catches whitespace or newline contamination from hand-parsed files.
Common Mistakes and Limitations
- Reversing without complementing, or complementing without reversing.
seq[::-1]alone is a reversal, andseq.complement()alone is a complement. Both produce plausible-looking DNA that is wrong. The round trip unit test above catches this in one line. - Hand-rolled tables that miss lowercase or ambiguity codes. Soft-masked FASTA uses lowercase for repeats, and genomic sequence carries R, Y, N, and friends. A table built from uppercase ACGTN silently passes every other character through unchanged, and
str.translatewill not warn you. Include the full alphabet or use Biopython. - FASTQ quality scores left in place. Flipping bases without reversing Phred qualities desynchronizes every per-base quality calculation downstream. Use
SeqRecord.reverse_complement(), which reverses the per-letter annotations with the sequence. - Assuming the method modifies in place.
Seqis immutable.seq.reverse_complement()with no assignment does nothing. Assign the result or useMutableSeqdeliberately. - RNA alphabet confusion. Biopython maps U to A and A to T, so complementing an RNA string yields DNA-style output. If you need an RNA string back, handle the transcription step explicitly rather than expecting the complement to guess.
- External coordinates not transformed. Biopython remaps features inside a
SeqRecord, but your BED intervals, primer position spreadsheets, and variant positions are your responsibility. For a full-length flip of a sequence of length L, a 0-based half-open interval from start to end becomes L minus end to L minus start. Get this wrong and every downstream overlap is shifted. - Hand-parsed FASTA with newlines. Reading a wrapped FASTA file as one string and translating it embeds reversed newlines mid-sequence. Use
SeqIO, or strip whitespace before translating. - Strand-aware reporting standards. Variant nomenclature such as HGVS describes changes relative to a transcript, which for minus-strand genes means working in the reverse complement orientation of the genome. For anything touching clinical reporting, use a dedicated library such as hgvs rather than hand-rolling the orientation logic [3].
- Paired-end orientation assumptions. In paired-end sequencing, the two reads of a fragment typically point toward each other. Flipping one file of a pair and not the other changes the stored orientation relationship, and some overlap-merging tools assume the standard inward orientation. Flip files only when you know why.
- Circular molecule edge cases. Features that span the origin of a circular plasmid or genome can behave in surprising ways under coordinate remapping. Check any origin-spanning feature after a flip rather than trusting the round trip blindly.
Two limitations frame the whole operation. First, the reverse complement is a nucleotide operation, and applying it to peptide sequences produces nonsense, so guard the input type in shared code. Second, memory scales with sequence length: a chromosome-scale string runs to hundreds of megabytes, and a reverse complement makes another copy, so stream files rather than loading collections of records, and keep the operation per record.
Frequently Asked Questions
Does Seq.reverse_complement() modify the original sequence?
No. Biopython Seq objects are immutable, so the method returns a new Seq and leaves the original untouched. Assign the result, and use MutableSeq only when you specifically want in-place edits.
How do I handle lowercase or soft-masked FASTA sequence?
Biopython preserves case automatically and complements lowercase letters to lowercase, so soft-masked repeats stay soft-masked. For hand-rolled str.translate tables, include both cases in the table or the lowercase bases will pass through uncomplemented.
What happens to ambiguity codes like R, Y, and N?
Biopython maps them by IUPAC rules, so R becomes Y, K becomes M, B becomes V, and N stays N. A minimal ACGT table silently leaves these codes unchanged, which corrupts the output without any error message.
How do I reverse complement a FASTQ file correctly?
Use SeqRecord.reverse_complement() inside a SeqIO loop, which reverses the Phred quality scores along with the bases so per-base qualities stay aligned with their nucleotides. Confirm the FASTQ variant encoding before converting legacy files.
Which method is fastest?
For a single string, a str.translate table plus slicing is the speed floor, and Biopython sits close behind because the per-character work runs in optimized code. At file scale, parsing dominates, and character-by-character Python loops are the slow path to avoid.
Do I need Biopython to compute a reverse complement in Python?
No. A two-line str.translate function handles simple, controlled input with no dependencies. Biopython earns its install when files, metadata, ambiguity codes, quality scores, or pipelines are involved, which in practice is most real work.
Sources
- SPDE: A Multi-functional Software for Sequence Processing and Data Extraction
- iRSpot-SF: Prediction of recombination hotspots by incorporating sequence based features into Chou's Pseudo components.
- A Python package for parsing, validating, mapping and formatting sequence variants using HGVS nomenclature.
- Sarment: Python modules for HMM analysis and partitioning of sequences.
- GAD: A Python Script for Dividing Genome Annotation Files into Feature-Based Files.
- EggLib: processing, analysis and simulation tools for population genetics and genomics.
- A high level interface to SCOP and ASTRAL implemented in python.
- metaseq: a Python package for integrative genome-wide analysis reveals relationships between chromatin insulators and associated nuclear mRNA.
- PHYLUCE is a software package for the analysis of conserved genomic loci.
- Manipulation of FASTQ data with Galaxy.
- Language Aware Sorting: Empirical and ML Driven Performance Evaluation of Insertion Sort
- pyVIPER: a fast and scalable Python package for protein activity estimation and master regulator analysis of single-cell RNA sequencing data.