Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Find homologous sequences using iterative BLAST (PSI-BLAST), profile HMMs (HMMER), and reciprocal best hit analysis. Use when identifying orthologs, distant homologs, or protein family members where standard BLAST is not sensitive enough.
.claude/skills/bio-sequence-similarity/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 236% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 113% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 76% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 357% | 0% |
<!--
#
#
-->
Advanced methods for finding homologous sequences beyond standard BLAST.
Builds a position-specific scoring matrix (PSSM) through iterations to find distant homologs.
bashpsiblast -query protein.fasta -db nr -out results.txt -num_iterations 3
bashpsiblast -query protein.fasta -db nr \ -out results.txt \ -out_pssm pssm.asn \ -out_ascii_pssm pssm.txt \ -num_iterations 5
bashpsiblast -in_pssm pssm.asn -db nr -out results.txt
bashpsiblast -query protein.fasta -db nr \ -out results.txt \ -outfmt 6 \ -num_iterations 3 \ -inclusion_ethresh 0.001
bashpsiblast -query protein.fasta -db nr \ -num_iterations 5 \ -inclusion_ethresh 0.001 \ -evalue 0.01 \ -num_threads 8 \ -out results.txt
| Parameter | Default | Description | |-----------|---------|-------------| | -num_iterations | 1 | Number of iterations | | -inclusion_ethresh | 0.002 | E-value for PSSM inclusion | | -evalue | 10 | E-value threshold for reporting | | -num_threads | 1 | CPU threads |
HMMER uses profile hidden Markov models for sensitive sequence searches.
bashjackhmmer -o results.txt -A aligned.sto --cpu 8 query.fasta database.fasta
bashhmmbuild profile.hmm alignment.sto
bashhmmsearch -o results.txt --tblout hits.tbl profile.hmm database.fasta hmmsearch -o results.txt --domtblout domains.tbl profile.hmm database.fasta
bashwget https://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz gunzip Pfam-A.hmm.gz hmmpress Pfam-A.hmm
bashhmmscan --tblout pfam_hits.tbl --domtblout domains.tbl Pfam-A.hmm query.fasta
bashgrep -v "^#" hits.tbl | head awk '$5 < 1e-10' hits.tbl
| Column | Description | |--------|-------------| | 1 | Target name | | 2 | Accession | | 3 | Query name | | 4 | Query accession | | 5 | E-value (full sequence) | | 6 | Score (full sequence) | | 7 | Bias | | 8 | E-value (best domain) | | 9 | Score (best domain) |
Find orthologs using bidirectional best hits.
bashmakeblastdb -in species_A.fasta -dbtype prot -out species_A_db makeblastdb -in species_B.fasta -dbtype prot -out species_B_db
bashblastp -query species_A.fasta -db species_B_db -outfmt 6 -evalue 1e-5 -max_target_seqs 1 > A_vs_B.txt blastp -query species_B.fasta -db species_A_db -outfmt 6 -evalue 1e-5 -max_target_seqs 1 > B_vs_A.txt
bashawk 'FNR==NR {a[$1]=$2; next} $2 in a && a[$2]==$1 {print $1"\t"$2}' \ A_vs_B.txt B_vs_A.txt > reciprocal_best_hits.txt
pythondef find_rbh(forward_blast, reverse_blast): '''Find reciprocal best hits from BLAST results''' forward = {} with open(forward_blast) as f: for line in f: parts = line.strip().split('\t') query, subject = parts[0], parts[1] if query not in forward: forward[query] = subject reverse = {} with open(reverse_blast) as f: for line in f: parts = line.strip().split('\t') query, subject = parts[0], parts[1] if query not in reverse: reverse[query] = subject rbh = [] for a, b in forward.items(): if b in reverse and reverse[b] == a: rbh.append((a, b)) return rbh rbh_pairs = find_rbh('A_vs_B.txt', 'B_vs_A.txt') for a, b in rbh_pairs: print(f'{a}\t{b}')
Uses conserved domain database for more sensitive initial search.
bashdeltablast -query protein.fasta -db nr -rpsdb cdd_delta -out results.txt
Search with a pattern plus sequence.
bashphi_pattern="G-x(2)-[ST]-x-[RK]" phiblast -query protein.fasta -db nr -pattern "$phi_pattern" -out results.txt
pythonfrom Bio.Blast import NCBIWWW, NCBIXML with open('query.fasta') as f: query = f.read() result_handle = NCBIWWW.qblast('psiblast', 'nr', query, expect=0.001, word_size=3) with open('psiblast_result.xml', 'w') as out: out.write(result_handle.read()) result_handle.close() with open('psiblast_result.xml') as f: records = NCBIXML.parse(f) for record in records: for alignment in record.alignments: for hsp in alignment.hsps: if hsp.expect < 1e-10: print(f'{alignment.hit_def[:50]}: E={hsp.expect}')
pythonfrom Bio import SearchIO results = SearchIO.parse('hmmsearch_output.txt', 'hmmer3-text') for query_result in results: print(f'Query: {query_result.id}') for hit in query_result: print(f' Hit: {hit.id}, E-value: {hit.evalue}') for hsp in hit: print(f' Domain: {hsp.bitscore} bits')
Similar to PSI-BLAST but uses HMM profiles.
bashjackhmmer -N 5 -o results.txt --tblout hits.tbl query.fasta database.fasta jackhmmer -N 5 -A iterations.sto --chkhmm checkpoint query.fasta database.fasta
bashorthofinder -f proteomes/ -t 8 orthofinder -f proteomes/ -t 8 -M msa
bashmkdir proteomes cp species_*.fasta proteomes/
| File | Content | |------|---------| | Orthogroups.tsv | All orthogroups | | Orthogroups_SingleCopyOrthologues.txt | 1:1 orthologs | | Species_Tree/ | Inferred species tree | | Gene_Trees/ | Individual gene trees |
| E-value | Interpretation | |---------|----------------| | < 1e-50 | Highly significant, likely homolog | | 1e-50 to 1e-10 | Significant, probable homolog | | 1e-10 to 1e-3 | Marginal, possible remote homolog | | > 0.01 | Not significant |
bash#!/bin/bash SPECIES_A=$1 SPECIES_B=$2 EVALUE=1e-10 THREADS=8 echo "Building databases..." makeblastdb -in $SPECIES_A -dbtype prot -out db_A makeblastdb -in $SPECIES_B -dbtype prot -out db_B echo "Running forward BLAST..." blastp -query $SPECIES_A -db db_B -outfmt 6 -evalue $EVALUE \ -max_target_seqs 1 -num_threads $THREADS > forward.txt echo "Running reverse BLAST..." blastp -query $SPECIES_B -db db_A -outfmt 6 -evalue $EVALUE \ -max_target_seqs 1 -num_threads $THREADS > reverse.txt echo "Finding reciprocal best hits..." awk 'FNR==NR {best[$1]=$2; next} $2 in best && best[$2]==$1 {print $1"\t"$2}' \ forward.txt reverse.txt > orthologs.txt echo "Found $(wc -l < orthologs.txt) ortholog pairs" rm -f db_A.* db_B.*
<!-- AUTHOR_SIGNATURE: 9a7f3c2e-MD-BABU-MIA-2026-MSSM-SECURE -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 20,873 | 15,993 | -23% | 1 | 1 | 0% | 4,461 | 5,982 | +34% | 0 | 0 | — |
case-02 | pass→pass | 17,820 | 5,482 | -69% | 1 | 1 | 0% | 1,715 | 3,650 | +113% | 0 | 0 | — |
case-09 | pass→pass | 13,769 | 11,575 | -16% | 1 | 1 | 0% | 2,752 | 4,855 | +76% | 0 | 0 | — |
case-07 | pass→pass | 3,513 | 3,275 | -7% | 1 | 1 | 0% | 686 | 3,132 | +357% | 0 | 0 | — |
case-08 | pass→pass | 9,371 | 5,319 | -43% | 1 | 1 | 0% | 1,950 | 3,640 | +87% | 0 | 0 | — |
case-03 | pass→pass | 6,128 | 3,444 | -44% | 1 | 1 | 0% | 1,216 | 3,215 | +164% | 0 | 0 | — |
case-04 | pass→pass | 6,250 | 3,806 | -39% | 1 | 1 | 0% | 1,158 | 3,255 | +181% | 0 | 0 | — |
case-05 | pass→pass | 4,707 | 2,540 | -46% | 1 | 1 | 0% | 783 | 2,939 | +275% | 0 | 0 | — |
case-06 | pass→pass | 9,039 | 5,063 | -44% | 1 | 1 | 0% | 1,762 | 3,530 | +100% | 0 | 0 | — |
case-10 | pass→pass | 5,562 | 3,726 | -33% | 1 | 1 | 0% | 1,011 | 3,107 | +207% | 0 | 0 | — |
case-11 | fail→pass | 5,026 | 3,742 | -26% | 1 | 1 | 0% | 982 | 3,297 | +236% | 0 | 0 | — |
case-12 | fail→fail | 12,476 | 7,238 | -42% | 1 | 1 | 0% | 2,233 | 3,884 | +74% | 0 | 0 | — |
case-13 | pass→pass | 4,385 | 3,846 | -12% | 1 | 1 | 0% | 793 | 3,080 | +288% | 0 | 0 | — |
case-14 | pass→pass | 6,882 | 3,543 | -49% | 1 | 1 | 0% | 1,241 | 3,241 | +161% | 0 | 0 | — |
case-15 | pass→pass | 4,645 | 2,531 | -46% | 1 | 1 | 0% | 777 | 2,956 | +280% | 0 | 0 | — |
case-16 | fail→pass | 9,023 | 5,696 | -37% | 1 | 1 | 0% | 1,700 | 3,575 | +110% | 0 | 0 | — |
case-17 | pass→pass | 6,115 | 1,791 | -71% | 1 | 1 | 0% | 1,234 | 2,835 | +130% | 0 | 0 | — |
case-18 | pass→pass | 3,351 | 3,116 | -7% | 1 | 1 | 0% | 690 | 3,169 | +359% | 0 | 0 | — |
case-19 | pass→pass | 8,240 | 3,756 | -54% | 1 | 1 | 0% | 1,033 | 3,242 | +214% | 0 | 0 | — |
case-20 | pass→pass | 8,382 | 4,775 | -43% | 1 | 1 | 0% | 1,770 | 3,468 | +96% | 0 | 0 | — |
case-21 | pass→pass | 4,389 | 3,617 | -18% | 1 | 1 | 0% | 909 | 3,221 | +254% | 0 | 0 | — |
case-22 | pass→pass | 4,337 | 2,793 | -36% | 1 | 1 | 0% | 840 | 3,067 | +265% | 0 | 0 | — |
case-23 | pass→pass | 5,655 | 3,148 | -44% | 1 | 1 | 0% | 573 | 3,050 | +432% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/26/2026 | +9% |
Other measured skills in the registry, with their headline benchmark lift.