Install any skill in seconds. Free to start, no credit card required.
Get Started Free →End-to-end alternative splicing analysis from FASTQ to differential splicing results. Aligns with STAR 2-pass mode, performs junction QC, runs rMATS-turbo for differential analysis, and generates sashimi visualizations. Use when performing comprehensive splicing analysis from raw RNA-seq data.
.claude/skills/bio-splicing-pipeline/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-13 | ✓→✓ | = Same ✓ | 308% | 0% |
| case-19 | ✓→✓ | = Same ✓ | 584% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 40% | 0% |
<!--
#
#
-->
Complete workflow from raw RNA-seq to differential splicing results.
FASTQ → Read QC → STAR 2-pass → Junction QC → rMATS-turbo → Results → Visualization
↓
(Optional) IsoformSwitchAnalyzeRbash# fastp for adapter trimming and quality filtering fastp \ -i sample_R1.fastq.gz \ -I sample_R2.fastq.gz \ -o sample_clean_R1.fastq.gz \ -O sample_clean_R2.fastq.gz \ --detect_adapter_for_pe \ --thread 8 \ -h sample_fastp.html
bash# First pass to detect novel junctions STAR \ --runThreadN 8 \ --genomeDir star_index/ \ --readFilesIn sample_R1.fastq.gz sample_R2.fastq.gz \ --readFilesCommand zcat \ --outFileNamePrefix sample_pass1_ \ --outSAMtype BAM Unsorted \ --outSJfilterOverhangMin 8 8 8 8 \ --alignSJDBoverhangMin 1 # Generate new index with discovered junctions # (Combine SJ.out.tab files from all samples) cat *_SJ.out.tab > combined_SJ.out.tab # Second pass with combined junctions STAR \ --runThreadN 8 \ --genomeDir star_index/ \ --readFilesIn sample_R1.fastq.gz sample_R2.fastq.gz \ --readFilesCommand zcat \ --sjdbFileChrStartEnd combined_SJ.out.tab \ --outFileNamePrefix sample_ \ --outSAMtype BAM SortedByCoordinate \ --outSJfilterOverhangMin 8 8 8 8 \ --alignSJDBoverhangMin 1 \ --quantMode GeneCounts
pythonimport subprocess def check_junction_saturation(bam_file, bed_file, output_prefix): ''' QC Checkpoint: Verify junction detection saturation. Plateau indicates sufficient depth for splicing analysis. ''' subprocess.run([ 'junction_saturation.py', '-i', bam_file, '-r', bed_file, '-o', output_prefix ], check=True) # Manual check: curves should plateau print(f'Check {output_prefix}.junctionSaturation_plot.pdf') print('If curves still rising, consider deeper sequencing')
bash# Create sample list files # condition1_bams.txt: sample1.bam,sample2.bam,sample3.bam # condition2_bams.txt: sample4.bam,sample5.bam,sample6.bam rmats.py \ --b1 condition1_bams.txt \ --b2 condition2_bams.txt \ --gtf annotation.gtf \ -t paired \ --readLength 150 \ --nthread 8 \ --od rmats_output \ --tmp rmats_tmp
pythonimport pandas as pd def filter_differential_splicing(rmats_dir, event_type='SE', fdr_cutoff=0.05, dpsi_cutoff=0.1, min_reads=10): ''' Filter rMATS results for significant events. Thresholds: - |deltaPSI| > 0.1 (lenient) or > 0.2 (stringent) - FDR < 0.05 - Junction reads >= 10 ''' jc_file = f'{rmats_dir}/{event_type}.MATS.JC.txt' df = pd.read_csv(jc_file, sep='\t') significant = df[ (df['FDR'] < fdr_cutoff) & (df['IncLevelDifference'].abs() > dpsi_cutoff) ].copy() print(f'Significant {event_type} events: {len(significant)}') # Sort by significance and effect size significant['score'] = -significant['FDR'].apply(lambda x: max(x, 1e-300)).apply( lambda x: __import__('numpy').log10(x) ) * significant['IncLevelDifference'].abs() return significant.sort_values('score', ascending=False)
rlibrary(IsoformSwitchAnalyzeR) # Import Salmon quantification if available switchList <- importRdata( isoformCountMatrix = counts, isoformRepExpression = tpm, designMatrix = design, isoformExonAnnoation = 'annotation.gtf', isoformNtFasta = 'transcripts.fa' ) # Analyze switches switchList <- isoformSwitchTestDEXSeq(switchList, reduceToSwitchingGenes = TRUE)
pythonimport subprocess def visualize_top_events(rmats_dir, grouping_file, gtf_file, output_dir, n_top=20): '''Generate sashimi plots for top differential events.''' import pandas as pd from pathlib import Path Path(output_dir).mkdir(parents=True, exist_ok=True) for event_type in ['SE', 'A5SS', 'A3SS', 'MXE', 'RI']: jc_file = f'{rmats_dir}/{event_type}.MATS.JC.txt' df = pd.read_csv(jc_file, sep='\t') sig = df[(df['FDR'] < 0.05) & (df['IncLevelDifference'].abs() > 0.1)] for idx, event in sig.head(n_top).iterrows(): chrom = event['chr'] start = event.get('upstreamES', event.get('1stExonStart_0base', 0)) - 500 end = event.get('downstreamEE', event.get('2ndExonEnd', 0)) + 500 gene = event['geneSymbol'] subprocess.run([ 'ggsashimi.py', '-b', grouping_file, '-c', f'{chrom}:{start}-{end}', '-o', f'{output_dir}/{event_type}_{gene}', '-g', gtf_file, '--shrink', '--fix-y-scale', '-M', '5' ], check=True)
bash#!/bin/bash set -e # Configuration SAMPLES="sample1 sample2 sample3 sample4 sample5 sample6" CONDITIONS="control control control treatment treatment treatment" GTF="annotation.gtf" STAR_INDEX="star_index/" THREADS=8 # Step 1: QC and trimming for sample in $SAMPLES; do fastp -i ${sample}_R1.fq.gz -I ${sample}_R2.fq.gz \ -o ${sample}_clean_R1.fq.gz -O ${sample}_clean_R2.fq.gz \ --thread $THREADS done # Step 2: STAR 2-pass alignment # ... (as above) # Step 3: Junction QC for sample in $SAMPLES; do junction_saturation.py -i ${sample}.bam -r annotation.bed -o ${sample}_junc done # Step 4: rMATS differential splicing rmats.py --b1 control_bams.txt --b2 treatment_bams.txt \ --gtf $GTF -t paired --readLength 150 --nthread $THREADS \ --od rmats_output --tmp rmats_tmp echo "Pipeline complete. Check rmats_output/ for results."
<!-- 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-13 | pass→pass | 3,318 | 1,981 | -40% | 1 | 1 | 0% | 608 | 2,478 | +308% | 0 | 0 | — |
case-14 | fail→pass | 26,274 | 10,165 | -61% | 1 | 1 | 0% | 2,152 | 4,046 | +88% | 0 | 0 | — |
case-19 | pass→pass | 2,162 | 2,172 | +0% | 1 | 1 | 0% | 365 | 2,496 | +584% | 0 | 0 | — |
case-20 | pass→pass | 15,808 | 11,275 | -29% | 1 | 1 | 0% | 3,144 | 4,397 | +40% | 0 | 0 | — |
case-01 | fail→fail | 17,377 | 14,295 | -18% | 1 | 1 | 0% | 3,874 | 5,041 | +30% | 0 | 0 | — |
case-02 | fail→fail | 14,398 | 13,307 | -8% | 1 | 1 | 0% | 3,201 | 5,223 | +63% | 0 | 0 | — |
case-03 | pass→pass | 5,494 | 3,795 | -31% | 1 | 1 | 0% | 1,100 | 3,020 | +175% | 0 | 0 | — |
case-04 | pass→pass | 4,610 | 3,982 | -14% | 1 | 1 | 0% | 825 | 2,731 | +231% | 0 | 0 | — |
case-05 | pass→pass | 7,400 | 3,084 | -58% | 1 | 1 | 0% | 1,543 | 2,748 | +78% | 0 | 0 | — |
case-06 | pass→pass | 10,292 | 4,308 | -58% | 1 | 1 | 0% | 1,886 | 2,922 | +55% | 0 | 0 | — |
case-07 | pass→pass | 7,586 | 5,070 | -33% | 1 | 1 | 0% | 1,493 | 3,033 | +103% | 0 | 0 | — |
case-08 | pass→pass | 37,250 | 16,323 | -56% | 1 | 1 | 0% | 3,625 | 5,500 | +52% | 0 | 0 | — |
case-09 | fail→fail | 14,830 | 10,778 | -27% | 1 | 1 | 0% | 2,495 | 4,451 | +78% | 0 | 0 | — |
case-10 | pass→pass | 13,359 | 10,538 | -21% | 1 | 1 | 0% | 2,498 | 4,150 | +66% | 0 | 0 | — |
case-11 | fail→pass | 11,281 | 4,914 | -56% | 1 | 1 | 0% | 2,096 | 3,018 | +44% | 0 | 0 | — |
case-12 | pass→pass | 4,259 | 2,950 | -31% | 1 | 1 | 0% | 716 | 2,640 | +269% | 0 | 0 | — |
case-15 | pass→pass | 4,184 | 1,843 | -56% | 1 | 1 | 0% | 782 | 2,455 | +214% | 0 | 0 | — |
case-16 | pass→pass | 3,541 | 2,454 | -31% | 1 | 1 | 0% | 652 | 2,611 | +300% | 0 | 0 | — |
case-17 | pass→pass | 4,650 | 3,273 | -30% | 1 | 1 | 0% | 793 | 2,725 | +244% | 0 | 0 | — |
case-18 | pass→pass | 5,267 | 2,484 | -53% | 1 | 1 | 0% | 935 | 2,531 | +171% | 0 | 0 | — |
case-21 | pass→pass | 8,405 | 6,457 | -23% | 1 | 1 | 0% | 1,650 | 3,394 | +106% | 0 | 0 | — |
case-22 | pass→pass | 9,341 | 5,888 | -37% | 1 | 1 | 0% | 1,769 | 3,181 | +80% | 0 | 0 | — |
case-23 | pass→pass | 4,877 | 3,935 | -19% | 1 | 1 | 0% | 888 | 2,842 | +220% | 0 | 0 | — |
case-24 | pass→pass | 3,808 | 2,703 | -29% | 1 | 1 | 0% | 828 | 2,667 | +222% | 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. 24 cases were attempted. The headline lift of +8 percentage points is the difference between those two pass rates over the 24 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/24/2026 | +27% |
Other measured skills in the registry, with their headline benchmark lift.