Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze PacBio Iso-Seq data for full-length isoform discovery and quantification. Use when characterizing transcript diversity or identifying novel splice variants.
.claude/skills/bio-long-read-sequencing-isoseq-analysis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-17 | ✓→✓ | = Same ✓ | — | — |
Reference examples tested with: minimap2 2.26+, pandas 2.2+, pysam 0.22+, samtools 1.19+
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signaturespackageVersion('<pkg>') then ?function_name to verify parameters<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.
"Analyze full-length isoforms from my Iso-Seq data" → Process PacBio HiFi reads through CCS generation, primer removal, clustering, and isoform classification to discover novel transcript variants.
isoseq3 refine → isoseq3 cluster → pbmm2 align → sqanti3_qc.pybash# Full pipeline: subreads -> HQ transcripts # 1. CCS: Generate circular consensus sequences # 2. Lima: Remove primers and demultiplex # 3. Refine: Remove polyA and concatemers # 4. Cluster: Group into isoforms # 5. Polish: Generate high-quality consensus (optional with HiFi)
bash# Generate CCS from subreads (skip if using HiFi reads) ccs input.subreads.bam ccs.bam \ --min-rq 0.9 \ --min-passes 3 \ --num-threads 32 # For HiFi reads, CCS is already done # Start directly from HiFi reads
bash# Iso-Seq specific primer removal lima ccs.bam primers.fasta demux.bam \ --isoseq \ --peek-guess \ --num-threads 16 # Output: demux.primer_5p--primer_3p.bam # Lima reports also contain demux statistics # Check lima report cat demux.lima.summary
fasta>primer_5p AAGCAGTGGTATCAACGCAGAGTACATGGG >primer_3p AAGCAGTGGTATCAACGCAGAGTAC
bash# Remove polyA tails and concatemers isoseq3 refine demux.primer_5p--primer_3p.bam primers.fasta refined.bam \ --require-polya \ --min-polya-length 20 # Output: refined.bam (full-length non-chimeric reads) # Also: refined.filter_summary.json # Check refinement stats cat refined.filter_summary.json | jq
bash# Cluster similar transcripts isoseq3 cluster refined.bam clustered.bam \ --verbose \ --use-qvs \ --num-threads 32 # Output files: # - clustered.bam: Clustered transcripts # - clustered.hq_transcripts.fasta: High-quality consensus # - clustered.lq_transcripts.fasta: Low-quality consensus # - clustered.cluster_report.csv: Cluster membership
bash# Map HQ transcripts to reference genome minimap2 -ax splice:hq \ -uf \ --secondary=no \ reference.fa \ clustered.hq_transcripts.fasta \ | samtools sort -o aligned.bam samtools index aligned.bam # For downstream analysis pbmm2 align reference.fa clustered.bam aligned.bam \ --preset ISOSEQ \ --sort
bash# Collapse mapped transcripts isoseq3 collapse aligned.bam collapsed.gff # Output: # - collapsed.gff: Collapsed transcript models # - collapsed.abundance.txt: Read counts per isoform # - collapsed.group.txt: Isoform groupings # Convert to GTF gffread collapsed.gff -T -o collapsed.gtf
bash# Classify isoforms against reference annotation sqanti3_qc.py \ clustered.hq_transcripts.fasta \ reference.gtf \ reference.fa \ -o sqanti_output \ --aligner_choice minimap2 \ --cage_peak cage_peaks.bed \ --polyA_motif_list polyA_motifs.txt \ --cpus 16 # Key output files: # - sqanti_output_classification.txt: Per-isoform metrics # - sqanti_output_junctions.txt: Splice junction details # - sqanti_output.params.txt: Run parameters
| Category | Code | Description | |----------|------|-------------| | Full Splice Match | FSM | All junctions match reference | | Incomplete Splice Match | ISM | Subset of reference junctions | | Novel In Catalog | NIC | Novel combination of known junctions | | Novel Not in Catalog | NNC | Contains novel junction | | Antisense | AS | Overlaps gene on opposite strand | | Genic | G | Within gene but no junction match | | Intergenic | IR | Between genes | | Fusion | FU | Spans multiple genes |
bash# Filter artifacts using SQANTI3 rules sqanti3_filter.py \ sqanti_output_classification.txt \ --isoforms clustered.hq_transcripts.fasta \ --gtf collapsed.gtf \ --faa predicted_proteins.faa \ -o sqanti_filtered # Custom filtering python << 'EOF' import pandas as pd classification = pd.read_csv('sqanti_output_classification.txt', sep='\t') # Keep FSM, ISM, NIC with evidence keep = classification[ (classification['structural_category'].isin(['full-splice_match', 'incomplete-splice_match', 'novel_in_catalog'])) & (classification['FL'] >= 2) & (classification['bite'] == 'FALSE') ] keep['isoform'].to_csv('filtered_isoforms.txt', index=False, header=False) EOF
bash# PacBio's isoform quantification tool pigeon classify \ aligned.bam \ reference.gtf \ reference.fa \ -o pigeon_output # Produces count matrix and classification pigeon report pigeon_output_classification.txt
bash# Merge Iso-Seq with reference annotation # First, convert to TAMA format tama_format_convert.py \ -i collapsed.gtf \ -f gtf \ -o isoseq.bed # Create file list echo -e "isoseq.bed\tcapped\t1\t1" > file_list.txt echo -e "reference.bed\tcapped\t1\t2" >> file_list.txt # Merge annotations tama_merge.py \ -f file_list.txt \ -p merged \ -a 50 \ -z 50 \ -m 10
Goal: Summarize Iso-Seq clustering results including isoform counts, read support, and transcript lengths.
Approach: Parse the cluster report CSV for per-isoform read counts and extract sequence lengths from the HQ FASTA.
pythonimport pysam import pandas as pd def parse_cluster_report(report_path): df = pd.read_csv(report_path) isoform_counts = df.groupby('cluster_id').size() return isoform_counts def get_transcript_lengths(fasta_path): lengths = {} with pysam.FastxFile(fasta_path) as fh: for entry in fh: lengths[entry.name] = len(entry.sequence) return lengths def summarize_isoseq(cluster_report, hq_fasta): counts = parse_cluster_report(cluster_report) lengths = get_transcript_lengths(hq_fasta) print(f'Total isoforms: {len(counts)}') print(f'Median support: {counts.median():.0f} reads') print(f'Mean length: {sum(lengths.values())/len(lengths):.0f} bp') return counts, lengths
rlibrary(IsoformSwitchAnalyzeR) # Import SQANTI3 results switchList <- importIsoformExpression( isoformCountMatrix = 'counts.txt', isoformRepExpression = 'tpm.txt', designMatrix = design ) # Add SQANTI3 annotations switchList <- addORFfromFASTA( switchList, orfs = 'sqanti_corrected.fasta' ) # Analyze switching switchList <- isoformSwitchTestDEXSeq(switchList) # Extract significant switches sig_switches <- switchList$isoformSwitchAnalysis[ switchList$isoformSwitchAnalysis$padj < 0.05, ]
| Metric | Good | Acceptable | Poor | |--------|------|------------|------| | CCS passes | >3 | 2-3 | <2 | | Full-length % | >80% | 60-80% | <60% | | Clustering rate | >90% | 80-90% | <80% | | FSM % | >50% | 30-50% | <30% | | Novel isoforms | 10-30% | 30-50% | >50% (suspect) |
| Issue | Possible Cause | Solution | |-------|---------------|----------| | Low full-length % | Primer issues | Check primer sequences | | High concatemer % | Library prep | Increase SMRTbell cleanup | | Few FSM | Poor reference | Use comprehensive GTF | | High NNC % | Novel biology or artifacts | Validate with orthogonal data | | Low clustering | High diversity | Reduce clustering stringency |
bash# Using PacBio Docker images docker run -v /data:/data \ quay.io/biocontainers/isoseq3:4.0.0--h9ee0642_0 \ isoseq3 cluster /data/refined.bam /data/clustered.bam # SQANTI3 in Singularity singularity exec sqanti3.sif \ sqanti3_qc.py input.fa ref.gtf ref.fa -o output
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
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, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +17 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.