97e37a4c1138 default tip

More
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Tue, 13 Oct 2026 10:31:54 -0400
parents c76aecc93001
children (none)
branches/tags default tip
files bin/convert-to-mp3 bin/vimmv bin/xx fish/functions/vimhist.fish htoprc lisp/sav.lisp refs/aluya-ont.fasta refs/aluyb-ont.fasta refs/l1-ont.fasta refs/ont-barcodes-1.fasta refs/ont-barcodes-2.fasta remote/bin/vimmv stumpwm/bioinf.lisp stumpwm/key-mapping.lisp stumpwm/stumpconfig.asd vim/custom-dictionary.utf-8.add vim/vimrc

Changes

--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/convert-to-mp3	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+input_file="$1"
+output_file="$(echo "$1" | sed -Ee 's/[.][^.]+$/.mp3/')"
+
+ffmpeg -i "$input_file" -q:a 2 "$output_file"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/vimmv	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -eu
+
+# Lists the current directory's files in Vim, so you can edit it and save to rename them
+# USAGE: vimv [file1 file2]
+# https://github.com/thameera/vimv
+
+declare -r FILENAMES_FILE=$(mktemp "${TMPDIR:-/tmp}/vimv.XXXXXX")
+
+trap '{ rm -f "${FILENAMES_FILE}" ; }' EXIT
+
+safeMove() {
+    local src="$1"
+    local dest="$2"
+    mkdir -p "$(dirname "$dest")"
+    if [ -e "$dest" ]; then
+        echo "WARN: Can't rename '$src' -> '$dest', destination exists!" >&2
+        return 1
+    fi
+    if git ls-files --error-unmatch "$src" > /dev/null 2>&1; then
+        git mv -- "$src" "$dest"
+    else
+        mv -n -- "$src" "$dest"
+    fi
+}
+
+if [ $# -ne 0 ]; then
+    src=( "$@" )
+else
+    IFS=$'\r\n' GLOBIGNORE='*' command eval 'src=($(ls -1A))'
+fi
+
+for ((i=0;i<${#src[@]};++i)); do
+    echo "${src[i]}" >> "${FILENAMES_FILE}"
+done
+
+${EDITOR:-vi} "${FILENAMES_FILE}"
+
+IFS=$'\r\n' GLOBIGNORE='*' command eval 'dest=($(cat "${FILENAMES_FILE}"))'
+IFS=$'\r\n' GLOBIGNORE='*' command eval 'dest_unique=($(cat "${FILENAMES_FILE}" | sort -u))'
+
+if (( ${#src[@]} != ${#dest[@]} )); then
+    echo "WARN: Number of files changed. Did you delete a line by accident? Aborting.." >&2
+    exit 1
+fi
+
+if (( ${#dest[@]} != ${#dest_unique[@]} )); then
+    echo "WARN: Destination filenames are not unique! Aborting.." >&2
+    exit 1
+fi
+
+declare -i count=0
+EXT="vimv-tmp-$(date +%s)-${RANDOM}"
+for ((i=0;i<${#src[@]};++i)); do
+    if [ "${src[i]}" != "${dest[i]}" ]; then
+        safeMove "${src[i]}" "${dest[i]}.${EXT}" && ((++count))
+    fi
+done
+
+for ((i=0;i<${#src[@]};++i)); do
+    if [ "${src[i]}" != "${dest[i]}" ]; then
+        safeMove "${dest[i]}.${EXT}" "${dest[i]}" || : resume on error
+    fi
+done
+
+echo "$count" files renamed.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/xx	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+x txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fish/functions/vimhist.fish	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,9 @@
+function vimhist -d "Edit history with Vim, copy the result."
+    set tmpfile (mktemp vimhist.XXXXXX)
+    history -n 20 --reverse > "$tmpfile"
+    vim -c 'set ft=fish' "$tmpfile"
+    cat "$tmpfile" | pbcopy
+    rm "$tmpfile"
+end
+
+
--- a/htoprc	Thu Jul 16 11:24:25 2026 -0400
+++ b/htoprc	Tue Oct 13 10:31:54 2026 -0400
@@ -3,7 +3,7 @@
 htop_version=3.2.2
 config_reader_min_version=3
 fields=0 48 17 18 39 2 46 47 49 1
-hide_kernel_threads=0
+hide_kernel_threads=1
 hide_userland_threads=1
 hide_running_in_container=0
 shadow_other_users=0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/sav.lisp	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,426 @@
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (ql:quickload '(:adopt :str :alexandria :losh :iterate :boots) :silent t))
+
+(defpackage :sav
+  (:use :cl :iterate :losh)
+  (:export :toplevel :*ui*))
+
+(in-package :sav)
+
+
+;;;; Configuration ------------------------------------------------------------
+
+(defparameter *score-match* 1)
+(defparameter *score-mismatch* -1.5)
+(defparameter *score-gap* -2)
+
+
+;;;; Utilities ----------------------------------------------------------------
+(defclass* seq ()
+  (label bases (annotations :initform nil)))
+
+
+(defun make-buffer (&key initial-contents
+                         (element-type t)
+                         (initial-capacity (max 64 (length initial-contents))))
+  (let ((buffer (make-array initial-capacity
+                  :element-type element-type
+                  :adjustable t
+                  :fill-pointer (length initial-contents))))
+    (when initial-contents
+      (replace buffer initial-contents))
+    buffer))
+
+(defun buffer-push (buffer element)
+  (vector-push-extend element buffer)
+  element)
+
+(defun buffer-append (buffer sequence)
+  (let* ((l1 (length buffer))
+         (l2 (length sequence))
+         (needed (+ l1 l2)))
+    (when (< (array-total-size buffer) needed)
+      (adjust-array buffer (max needed (* l1 2))))
+    (setf (fill-pointer buffer) needed)
+    (replace buffer sequence :start1 l1)
+    sequence))
+
+(defmacro-clause (BUFFERING expr &optional
+                  APPEND (append nil)
+                  INTO (var iterate::*result-var*)
+                  INITIAL-CONTENTS (initial-contents '())
+                  ELEMENT-TYPE (element-type t))
+  `(progn
+     (with ,var = (make-buffer :initial-contents ,initial-contents
+                               :element-type ,element-type))
+     (,(if append 'buffer-append 'buffer-push) ,var ,expr)))
+
+
+(defun read-fasta (stream)
+  (iterate
+    (with label = nil)
+    (case (peek-char nil stream nil :eof)
+      (:eof (finish))
+      (#\Newline (read-char stream))
+      ((#\> #\@) (if label
+             (finish)
+             (setf label (subseq (read-line stream) 1))))
+      (t (buffering (read-line stream) :into data
+                    :append t
+                    :element-type 'character)))
+    (finally (return (make-instance 'seq :label label :bases data)))))
+
+(defun read-fastq (stream)
+  (let ((header-line (read-line stream))
+        (sequence-line (read-line stream))
+        (sep-line (read-line stream))
+        (quality-line (read-line stream)))
+    (declare (ignore sep-line quality-line))
+    (make-instance 'seq
+      :label (subseq header-line 1)
+      :bases sequence-line)))
+
+(defun read-bare (stream)
+  (make-instance 'seq :label "Query" :bases (read-line stream)))
+
+(defun read-fast* (stream)
+  (ecase (peek-char nil stream nil :eof)
+    (:eof nil)
+    ((#\A #\C #\T #\G #\n #\a #\c #\t #\g #\n) (read-bare stream))
+    (#\> (read-fasta stream))
+    (#\@ (read-fastq stream))))
+
+(defun parse-file (path)
+  (with-open-file (s path)
+    (iterate
+      (for seq = (read-fast* s))
+      (while seq)
+      (collect seq))))
+
+(defun read-data (path &key default-name)
+  ;; todo handle -
+  (declare (ignore default-name))
+  (parse-file path))
+
+(defun dna-reverse (seq)
+  (reverse seq))
+
+(defun dna-complement (seq)
+  (map (type-of seq) (lambda (ch)
+                       (ecase ch
+                         (#\A #\T)
+                         (#\T #\A)
+                         (#\C #\G)
+                         (#\G #\C)
+                         (#\N #\N)))
+       seq))
+
+(defun dna-reverse-complement (seq)
+  (dna-reverse (dna-complement seq)))
+
+
+;;;; Alignment ----------------------------------------------------------------
+(defun make-smith-waterman-grid (rows cols)
+  (make-array (list rows cols) :initial-element 0))
+
+(defun extract-smith-waterman-path (grid prev best-row best-col)
+  (iterate (for coord
+                :first (cons best-row best-col)
+                :then (aref prev (car coord) (cdr coord)))
+           (until (< (aref grid (car coord) (cdr coord)) 0.1f0))
+           (collect (cons (1- (car coord)) (1- (cdr coord))) :at start)))
+
+(defun print-grid (seq1 seq2 grid &key (pad 4))
+  (flet ((print-padded (seq)
+           (map nil (lambda (el) (format t "~V@A" pad el)) seq))
+         (row-of (array row) ; ugly hack, but just for debugging…
+           (iterate
+             (for col :below (array-dimension array 1))
+             (collect (aref array row col)))))
+    (print-padded "  ")
+    (print-padded seq1)
+    (terpri)
+    (iterate
+      (for row :below (array-dimension grid 0))
+      (print-padded (list (if (plusp row)
+                            (aref seq2 (1- row))
+                            #\Space)))
+      (print-padded (row-of grid row))
+      (terpri))))
+
+(defun render-annotations (seq pad gaps anns)
+  (if (null anns)
+    (list (list) "")
+    (let ((chars "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
+          (n 0)
+          (legend (list)))
+      (flet ((annotate (text)
+               (let ((ch (aref chars n)))
+                 (incf n)
+                 (push (format nil "~A - ~A" ch text) legend)
+                 ch)))
+        (iterate
+          (for i :from 0 :below (length seq))
+          (collect (if-found (text (gethash i anns))
+                     (annotate text)
+                     #\space)
+                   :into line :result-type 'string)
+          (loop :while (eql i (car gaps))
+                :do (progn (collect #\space :into line :result-type 'string)
+                           (pop gaps)))
+          (returning (list (nreverse legend)
+                           (str:concat (str:repeat pad " ") line))))))))
+
+(defclass* alignment ()
+  (lab1 seq1 pad1 leg1 ann1
+   m padm
+   lab2 seq2 pad2 leg2 ann2))
+
+(defun render-alignment (rseq qseq path)
+  (iterate
+    (with seq1 = (bases rseq))
+    (with seq2 = (bases qseq))
+    (with (lo2 . lo1) = (first path))
+    (with (hi2 . hi1) = (car (last path)))
+    (with gaps1 = (list))
+    (with gaps2 = (list))
+    (with pad1 = (if (>= lo1 lo2) 0 (- lo2 lo1)))
+    (with pad2 = (if (>= lo2 lo1) 0 (- lo1 lo2)))
+    (with padM = (max lo1 lo2))
+    (with p1 = -1)
+    (with p2 = -1)
+    (for (i2 . i1) :in path)
+    (for ch1 = (aref seq1 i1))
+    (for ch2 = (aref seq2 i2))
+    (collect (cond ((or (= i1 p1) (= i2 p2)) #\g)
+                   ((char= ch1 ch2) #\|)
+                   (t #\x))
+             :into m :result-type 'string)
+    (collect (if (> i1 p1)
+               (progn (setf p1 i1)
+                      ch1)
+               (progn (push i1 gaps1)
+                      #\-))
+             :into l1 :result-type 'string)
+    (collect (if (> i2 p2)
+               (progn (setf p2 i2)
+                      ch2)
+               (progn (push i2 gaps2)
+                      #\-))
+             :into l2 :result-type 'string)
+    (returning
+      (destructuring-bind (leg1 ann1) (render-annotations seq1 pad1 gaps1 (annotations rseq))
+        (destructuring-bind (leg2 ann2) (render-annotations seq2 pad2 gaps2 (annotations qseq))
+          (make-instance 'alignment
+            :lab1 (label rseq)
+            :seq1 (str:concat (str:repeat pad1 " ")
+                              (subseq seq1 0 lo1)
+                              l1
+                              (subseq seq1 (1+ hi1) nil))
+            :pad1 pad1 :leg1 leg1 :ann1 ann1
+            :m (str:concat (str:repeat padM " ")
+                           m)
+            :padm padm
+            :lab2 (label qseq)
+            :seq2 (str:concat (str:repeat pad2 " ")
+                              (subseq seq2 0 lo2)
+                              l2
+                              (subseq seq2 (1+ hi2) nil))
+            :pad2 pad2 :leg2 leg2 :ann2 ann2))))))
+
+
+;; (defun print-alignment (seq1 seq2 path &optional ann1 ann2)
+;;   (let ((a (render-alignment seq1 seq2 path ann1 ann2)))
+;;     (map nil #'write-line (leg1 a))
+;;     (when (leg1 a) (write-line ""))
+;;     (write-line (ann1 a))
+;;     (write-line (seq1 a))
+;;     (write-line (m a))
+;;     (write-line (seq2 a))
+;;     (write-line (ann2 a))
+;;     (when (leg2 a) (write-line ""))
+;;     (map nil #'write-line (leg2 a))))
+
+(defun smith-waterman (rseq qseq)
+  (iterate
+    (with seq1 = (coerce (bases rseq) 'simple-base-string))
+    (with seq2 = (coerce (bases qseq) 'simple-base-string))
+    (with best-row = 0)
+    (with best-col = 0)
+    (with best-score = 0)
+    (with rows = (1+ (length seq2)))
+    (with cols = (1+ (length seq1)))
+    (with grid = (make-smith-waterman-grid rows cols))
+    (with prev = (make-array (list rows cols) :initial-element nil))
+    (for row :from 1 :below rows)
+    (for ch2 :in-string seq2)
+    (iterate
+      (for col :from 1 :below cols)
+      (for ch1 :in-string seq1)
+      (for row-1 = (1- row))
+      (for col-1 = (1- col))
+      (for match = (+ (aref grid row-1 col-1)
+                      (if (char= ch1 ch2) *score-match* *score-mismatch*)))
+      (for gap-1 = (+ (aref grid row col-1) *score-gap*))
+      (for gap-2 = (+ (aref grid row-1 col) *score-gap*))
+      (for best = (max match gap-1 gap-2 0))
+      (setf (aref grid row col) best
+            (aref prev row col) (cond ((= best 0) nil)
+                                      ((= best match) (cons row-1 col-1))
+                                      ((= best gap-1) (cons row col-1))
+                                      ((= best gap-2) (cons row-1 col))))
+      (if (> best best-score)
+        (setf best-score best
+              best-row row
+              best-col col)))
+    (returning
+      (let ((path (extract-smith-waterman-path grid prev best-row best-col)))
+        (render-alignment rseq qseq path)))))
+
+
+;;;; UI -----------------------------------------------------------------------
+(defparameter *selected-index* 0)
+(defparameter *r-seqs* nil)
+(defparameter *q-seq* nil)
+(defparameter *x-offset* 5)
+
+(defparameter *alignments* nil)
+
+(defconstant +attr/match+    (boots:attr :bold t :fg (boots:rgb 50 255 50)))
+(defconstant +attr/mismatch+ (boots:attr :bold t :fg (boots:rgb 255 50 50)))
+(defconstant +attr/not-selected+ (boots:attr :bold t))
+(defconstant +attr/selected+ (boots:attr :bold t :fg (boots:rgb 0 0 0) :bg (boots:rgb 255 255 255)))
+
+(defun draw/status (pad)
+  (boots:draw pad 0 0 "SAV v1"))
+
+(defun draw/alignment (index pad &aux (alignment (nth index *alignments*)))
+  (boots:draw pad 0 0 (format nil "~A vs ~A" (lab1 alignment) (lab2 alignment))
+              (if (= index *selected-index*) +attr/selected+ +attr/not-selected+))
+  (boots:draw pad *x-offset* 2 (seq1 alignment))
+  (boots:draw pad *x-offset* 4 (seq2 alignment))
+  (loop :for i :from 0
+        :for ch :across (m alignment)
+        :do (multiple-value-bind (c a) (case ch
+                                         (#\| (values #\| +attr/match+))
+                                         (#\g (values #\space +attr/mismatch+))
+                                         (#\x (values #\x +attr/mismatch+))
+                                         (#\space (values nil nil)))
+              (when c
+                (boots:draw pad (+ *x-offset* i) 2 (aref (seq1 alignment) i) a)
+                (boots:draw pad (+ *x-offset* i) 3 c a)
+                (boots:draw pad (+ *x-offset* i) 4 (aref (seq2 alignment) i) a)))))
+
+(defun press-any-key ()
+  (boots:read-event)
+  nil)
+
+(defun recompute-alignments ()
+  (setf *alignments* (loop :for r-seq :in *r-seqs*
+                           :collect (smith-waterman r-seq *q-seq*))))
+
+(defun incf-selected (delta)
+  (zapf *selected-index* (mod (+ % delta) (length *alignments*))))
+
+(defun swap-alignments (a b)
+  (let ((ai (mod a (length *alignments*)))
+        (bi (mod b (length *alignments*))))
+    (rotatef (nth ai *alignments*)
+             (nth bi *alignments*))
+    (setf *selected-index* bi)))
+
+(defun ui/main ()
+  (setf (boots:root boots:*screen*)
+        (boots:make-stack
+          :children (list*
+                      (boots:make-canvas :height 1 :draw #'draw/status)
+                      (loop :for a :in *alignments*
+                            :for i :from 0
+                            :collect (boots:make-canvas
+                                       :border-top t :fill-char #\space
+                                       :draw (curry #'draw/alignment i))))))
+  (loop
+    (boots:redraw)
+    (boots:event-case (boots:read-event)
+      ((#\k :up)   (incf-selected -1))
+      ((#\j :down) (incf-selected  1))
+      (#\K (swap-alignments *selected-index* (1- *selected-index*)))
+      (#\J (swap-alignments *selected-index* (1+ *selected-index*)))
+      ((#\h :left)  (incf *x-offset* 10))
+      ((#\l :right) (decf *x-offset* 10))
+      ((#\escape #\q) (return)))))
+
+
+
+;;;; Entry Point --------------------------------------------------------------
+(defun run% (r-seqs q-seq)
+  (boots/terminals/ansi:with-ansi-terminal (terminal :truecolor t)
+    (boots:with-screen (boots:*screen* terminal)
+      (boots:with-light-borders
+        (let* ((*r-seqs* r-seqs)
+               (*q-seq* q-seq))
+          (recompute-alignments)
+          (ui/main))))))
+
+(defun run (reference-path query-path)
+  (let ((r-seqs (read-data reference-path :default-name "Reference"))
+        (q-seqs (read-data query-path :default-name "Query")))
+    (run% r-seqs (first q-seqs))))
+
+
+(defun r ()
+  (run "/home/sjl/scratch/sav-foo.fasta" "/home/sjl/scratch/sav-bar.fasta"))
+
+
+;;;; User Interface -----------------------------------------------------------
+(defparameter *option/help*
+  (adopt:make-option 'help
+    :help "Display help and exit."
+    :long "help"
+    :short #\h
+    :reduce (constantly t)))
+
+(defparameter *option/version*
+  (adopt:make-option 'version
+    :help "Display version information and exit."
+    :long "version"
+    :reduce (constantly t)))
+
+(adopt:define-string *help-text*
+  "sav is a Sequence Alignment Visualizer")
+
+(defparameter *examples*
+  '(("Align the clipboard to the L1HS consensus sequence:"
+     . "sav path/to/l1.fa <(pbpaste)")))
+
+(defparameter *ui*
+  (adopt:make-interface
+    :name "sav"
+    :usage "[OPTIONS] REF QUERY"
+    :summary "sequence alignment visualizer"
+    :help *help-text*
+    :examples *examples*
+    :contents (list
+                *option/help*
+                *option/version*)))
+
+
+(defun toplevel ()
+  (adopt::quit-on-ctrl-c ()
+    (multiple-value-bind (arguments options) (adopt:parse-options-or-exit *ui*)
+      (when (gethash 'help options)
+        (adopt:print-help-and-exit *ui*))
+      (let () ; todo options
+        (handler-case
+            (progn
+              (assert (= (length arguments) 2) () "REF and QUERY arguments are both required.")
+              (run (first arguments) (second arguments)))
+          (error (e) (adopt:print-error-and-exit e)))))))
+
+
+
+#; Scratch --------------------------------------------------------------------
+
+;; (run "~/scratch/sav-foo.fasta" "~/scratch/sav-bar.fasta"
+;;      (alexandria:alist-hash-table '())
+;;      (alexandria:alist-hash-table '()))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/refs/aluya-ont.fasta	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,16 @@
+>AluYa5 Normal Short-Way
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>AluYa5 Normal Long-Way
+TGGCGGGATCTCGGCTCACTGCAAGCTCCGCCTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCCCAAGTAGCTGGGACTACAGGCGCCCGCCACTACGCCCGGCTAATTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCGTTTTAG
+>AluYa5 Inverted Short-Way
+GACGTGAGGTCGGACCCGCTGTCTCGCTCTGAGGCAGAGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>AluYa5 Inverted Long-Way
+ACCGCCCTAGAGCCGAGTGACGTTCGAGGCGGAGGGCCCAAGTGCGGTAAGAGGACGGAGTCGGAGGGTTCATCGACCCTGATGTCCGCGGGCGGTGATGCGGGCCGATTAAAAAACATAAAAATCATCTCTGCCCCAAAGTGGCAAAATC
+>Nanopore Adapter Top Strand
+CCTGTACTTCGTTCAGTTACGTATTGCT
+>Nanopore Adapter Bottom Strand
+GCAATACGTAACTGAACGAAGTACAGG
+>Full AluYa5
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACGAGGTCAGGAGATCGAGACCATCCCGGCTAAAACGGTGAAACCCCGTCTCTACTAAAAATACAAAAAATTAGCCGGGCGTAGTGGCGGGCGCCTGTAGTCCCAGCTACTTGGGAGGCTGAGGCAGGAGAATGGCGTGAACCCGGGAGGCGGAGCTTGCAGTGAGCCGAGATCCCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>Full AluYa5 (Revcomp)
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGAGACGGAGTCTCGCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGGGATCTCGGCTCACTGCAAGCTCCGCCTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCCCAAGTAGCTGGGACTACAGGCGCCCGCCACTACGCCCGGCTAATTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCGTTTTAGCCGGGATGGTCTCGATCTCCTGACCTCGTGATCCGCCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCACCGCGCCCGGCC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/refs/aluyb-ont.fasta	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,16 @@
+>AluYb8 Normal Short-Way
+GTCCGGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>AluYb8 Normal Long-Way
+TGCGGACTGCAGTGGCGCAATCTCGGCTCACTGCAAGCTCCGCTTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGACTACAGGCGCCCGCCACCGCGCCCGGCTAATTTTTTGTATTTTTAGTAGAGACGGGGTT
+>AluYb8 Inverted Short-Way
+CAGGCCGGACCCGCTGTCTCGCTCTGAGGCAGAGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>AluYb8 Inverted Long-Way
+ACGCCTGACGTCACCGCGTTAGAGCCGAGTGACGTTCGAGGCGAAGGGCCCAAGTGCGGTAAGAGGACGGAGTCGGAGGGCTCATCGACCCTGATGTCCGCGGGCGGTGGCGCGGGCCGATTAAAAAACATAAAAATCATCTCTGCCCCAA
+>Nanopore Adapter Top Strand
+CCTGTACTTCGTTCAGTTACGTATTGCT
+>Nanopore Adapter Bottom Strand
+GCAATACGTAACTGAACGAAGTACAGG
+>Full AluYb8
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGTGGATCATGAGGTCAGGAGATCGAGACCATCCTGGCTAACAAGGTGAAACCCCGTCTCTACTAAAAATACAAAAAATTAGCCGGGCGCGGTGGCGGGCGCCTGTAGTCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATGGCGTGAACCCGGGAAGCGGAGCTTGCAGTGAGCCGAGATTGCGCCACTGCAGTCCGCAGTCCGGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>Full AluYb8 (Revcomp)
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGAGACGGAGTCTCGCTCTGTCGCCCAGGCCGGACTGCGGACTGCAGTGGCGCAATCTCGGCTCACTGCAAGCTCCGCTTCCCGGGTTCACGCCATTCTCCTGCCTCAGCCTCCCGAGTAGCTGGGACTACAGGCGCCCGCCACCGCGCCCGGCTAATTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCTTGTTAGCCAGGATGGTCTCGATCTCCTGACCTCATGATCCACCCGCCTCGGCCTCCCAAAGTGCTGGGATTACAGGCGTGAGCCACCGCGCCCGGCC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/refs/l1-ont.fasta	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,16 @@
+>L1.3 Normal Short-Way
+GCTAGATGACACATTAGTGGGTGCAGCGCACCAGCATGGCACATGTATACATATGTAACTAACCTGCACAATGTGCACATGTACCCTAAAACTTAGAGTATAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>L1.3 Normal Long-Way
+ATTAGGTATATCTCCCAATGCTATCCCTCCCCCCTCCCCCGACCCCACCACAGTCCCCAGAGTGTGATATTCCCCTTCCTGTGTCCATGTGATCTCATTGTTCAATTCCCACCTATGAGTGAGAATATGCGGTGTTTGGTTTTTTGTTCT
+>L1.3 Inverted Short-Way
+CGATCTACTGTGTAATCACCCACGTCGCGTGGTCGTACCGTGTACATATGTATACATTGATTGGACGTGTTACACGTGTACATGGGATTTTGAATCTCATATTATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+>L1.3 Inverted Long-Way
+TAATCCATATAGAGGGTTACGATAGGGAGGGGGGAGGGGGCTGGGGTGGTGTCAGGGGTCTCACACTATAAGGGGAAGGACACAGGTACACTAGAGTAACAAGTTAAGGGTGGATACTCACTCTTATACGCCACAAACCAAAAAACAAGA
+>Nanopore Adapter Top Strand
+CCTGTACTTCGTTCAGTTACGTATTGCT
+>Nanopore Adapter Bottom Strand
+GCAATACGTAACTGAACGAAGTACAGG
+>Full L1.3
+GGGGGAGGAGCCAAGATGGCCGAATAGGAACAGCTCCGGTCTACAGCTCCCAGCGTGAGCGACGCAGAAGACGGTGATTTCTGCATTTCCATCTGAGGTACCGGGTTCATCTCACTAGGGAGTGCCAGACAGTGGGCGCAGGCCAGTGTGTGTGCGCACCGTGCGCGAGCCGAAGCAGGGCGAGGCATTGCCTCACCTGGGAAGCGCAAGGGGTCAGGGAGTTCCCTTTCTGAGTCAAAGAAAGGGGTGACGGTCGCACCTGGAAAATCGGGTCACTCCCACCCGAATATTGCGCTTTTCAGACCGGCTTAAGAAACGGCGCACCACGAGACTATATCCCACACCTGGCTCGGAGGGTCCTACGCCCACGGAATCTCGCTGATTGCTAGCACAGCAGTCTGAGATCAAACTGCAAGGCGGCAACGAGGCTGGGGGAGGGGCGCCCGCCATTGCCCAGGCTTGCTTAGGTAAACAAAGCAGCCGGGAAGCTCGAACTGGGTGGAGCCCACCACAGCTCAAGGAGGCCTGCCTGCCTCTGTAGGCTCCACCTCTGGGGGCAGGGCACAGACAAACAAAAAGACAGCAGTAACCTCTGCAGACTTAAGTGTCCCTGTCTGACAGCTTTGAAGAGAGCAGTGGTTCTCCCAGCACGCAGCTGGAGATCTGAGAACGGGCAGACAGACTGCCTCCTCAAGTGGGTCCCTGACTCCTGACCCCCGAGCAGCCTAACTGGGAGGCACCCCCCAGCAGGGGCACACTGACACCTCACACGGCAGGGTATTCCAACAGACCTGCAGCTGAGGGTCCTGTCTGTTAGAAGGAAAACTAACAACCAGAAAGGACATCTACACCGAAAACCCATCTGTACATCACCATCATCAAAGACCAAAAGTAGATAAAACCACAAAGATGGGGAAAAAACAGAACAGAAAAACTGGAAACTCTAAAACGCAGAGCGCCTCTCCTCCTCCAAAGGAACGCAGTTCCTCACCAGCAACGGAACAAAGCTGGATGGAGAATGATTTTGACGAGCTGAGAGAAGAAGGCTTCAGACGATCAAATTACTCTGAGCTACGGGAGGACATTCAAACCAAAGGCAAAGAAGTTGAAAACTTTGAAAAAAATTTAGAAGAATGTATAACTAGAATAACCAATACAGAGAAGTGCTTAAAGGAGCTGATGGAGCTGAAAACCAAGGCTCGAGAACTACGTGAAGAATGCAGAAGCCTCAGGAGCCGATGCGATCAACTGGAAGAAAGGGTATCAGCAATGGAAGATGAAATGAATGAAATGAAGCGAGAAGGGAAGTTTAGAGAAAAAAGAATAAAAAGAAATGAGCAAAGCCTCCAAGAAATATGGGACTATGTGAAAAGACCAAATCTACGTCTGATTGGTGTACCTGAAAGTGATGTGGAGAATGGAACCAAGTTGGAAAACACTCTGCAGGATATTATCCAGGAGAACTTCCCCAATCTAGCAAGGCAGGCCAACGTTCAGATTCAGGAAATACAGAGAACGCCACAAAGATACTCCTCGAGAAGAGCAACTCCAAGACACATAATTGTCAGATTCACCAAAGTTGAAATGAAGGAAAAAATGTTAAGGGCAGCCAGAGAGAAAGGTCGGGTTACCCTCAAAGGAAAGCCCATCAGACTAACAGTGGATCTCTCGGCAGAAACCCTACAAGCCAGAAGAGAGTGGGGGCCAATATTCAACATTCTTAAAGAAAAGAATTTTCAACCCAGAATTTCATATCCAGCCAAACTAAGCTTCATAAGTGAAGGAGAAATAAAATACTTTATAGACAAGCAAATGTTGAGAGATTTTGTCACCACCAGGCCTGCCCTAAAAGAGCTCCTGAAGGAAGCGCTAAACATGGAAAGGAACAACCGGTACCAGCCGCTGCAAAATCATGCCAAAATGTAAAGACCATCGAGACTAGGAAGAAACTGCATCAACTAATGAGCAAAATCACCAGCTAACATCATAATGACAGGATCAAATTCACACATAACAATATTAACTTTAAATATAAATGGACTAAATTCTGCAATTAAAAGACACAGACTGGCAAGTTGGATAAAGAGTCAAGACCCATCAGTGTGCTGTATTCAGGAAACCCATCTCACGTGCAGAGACACACATAGGCTCAAAATAAAAGGATGGAGGAAGATCTACCAAGCCAATGGAAAACAAAAAAAGGCAGGGGTTGCAATCCTAGTCTCTGATAAAACAGACTTTAAACCAACAAAGATCAAAAGAGACAAAGAAGGCCATTACATAATGGTAAAGGGATCAATTCAACAAGAGGAGCTAACTATCCTAAATATTTATGCACCCAATACAGGAGCACCCAGATTCATAAAGCAAGTCCTCAGTGACCTACAAAGAGACTTAGACTCCCACACATTAATAATGGGAGACTTTAACACCCCACTGTCAACATTAGACAGATCAACGAGACAGAAAGTCAACAAGGATACCCAGGAATTGAACTCAGCTCTGCACCAAGCAGACCTAATAGACATCTACAGAACTCTCCACCCCAAATCAACAGAATATACCTTTTTTTCAGCACCACACCACACCTATTCCAAAATTGACCACATAGTTGGAAGTAAAGCTCTCCTCAGCAAATGTAAAAGAACAGAAATTATAACAAACTATCTCTCAGACCACAGTGCAATCAAACTAGAACTCAGGATTAAGAATCTCACTCAAAGCCGCTCAACTACATGGAAACTGAACAACCTGCTCCTGAATGACTACTGGGTACATAACGAAATGAAGGCAGAAATAAAGATGTTCTTTGAAACCAACGAGAACAAAGACACCACATACCAGAATCTCTGGGACGCATTCAAAGCAGTGTGTAGAGGGAAATTTATAGCACTAAATGCCTACAAGAGAAAGCAGGAAAGATCCAAAATTGACACCCTAACATCACAATTAAAAGAACTAGAAAAGCAAGAGCAAACACATTCAAAAGCTAGCAGAAGGCAAGAAATAACTAAAATCAGAGCAGAACTGAAGGAAATAGAGACACAAAAAACCCTTCAAAAAATCAATGAATCCAGGAGCTGGTTTTTTGAAAGGATCAACAAAATTGATAGACCGCTAGCAAGACTAATAAAGAAAAAAAGAGAGAAGAATCAAATAGACACAATAAAAAATGATAAAGGGGATATCACCACCGATCCCACAGAAATACAAACTACCATCAGAGAATACTACAAACACCTCTACGCAAATAAACTAGAAAATCTAGAAGAAATGGATACATTCCTCGACACATACACTCTCCCAAGACTAAACCAGGAAGAAGTTGAATCTCTGAATAGACCAATAACAGGCTCTGAAATTGTGGCAATAATCAATAGTTTACCAACCAAAAAGAGTCCAGGACCAGATGGATTCACAGCCGAATTCTACCAGAGGTACATGGAGGAACTGGTACCATTCCTTCTGAAACTATTCCAATCAATAGAAAAAGAGGGAATCCTCCCTAACTCATTTTATGAGGCCAGCATCATTCTGATACCAAAGCCGGGCAGAGACACAACCAAAAAAGAGAATTTTAGACCAATATCCTTGATGAACATTGATGCAAAAATCCTCAATAAAATACTGGCAAACCGAATCCAGCAGCACATCAAAAAGCTTATCCACCATGATCAAGTGGGCTTCATCCCTGGGATGCAAGGCTGGTTCAATATACGCAAATCAATAAATGTAATCCAGCATATAAACAGAGCCAAAGACAAAAACCACATGATTATCTCAATAGATGCAGAAAAAGCCTTTGACAAAATTCAACAACCCTTCATGCTAAAAACTCTCAATAAATTAGGTATTGATGGGACGTATTTCAAAATAATAAGAGCTATCTATGACAAACCCACAGCCAATATCATACTGAATGGGCAAAAACTGGAAGCATTCCCTTTGAAAACCGGCACAAGACAGGGATGCCCTCTCTCACCGCTCCTATTCAACATAGTGTTGGAAGTTCTGGCCAGGGCAATCAGGCAGGAGAAGGAAATAAAGGGTATTCAATTAGGAAAAGAGGAAGTCAAATTGTCCCTGTTTGCAGACGACATGATTGTATATCTAGAAAACCCCATCGTCTCAGCCCAAAATCTCCTTAAGCTGATAAGCAACTTCAGCAAAGTCTCAGGATACAAAATCAATGTACAAAAATCACAAGCATTCTTATACACCAACAACAGACAAACAGAGAGCCAAATCATGGGTGAACTCCCATTCGTAATTGCTTCAAAGAGAATAAAATACCTAGGAATCCAACTTACAAGGGATGTGAAGGACCTCTTCAAGGAGAACTACAAACCACTGCTCAAGGAAATAAAAGAGGACACAAACAAATGGAAGAACATTCCATGCTCATGGGTAGGAAGAATCAATATCGTGAAAATGGCCATACTGCCCAAGGTAATTTACAGATTCAATGCCATCCCCATCAAGCTACCAATGACTTTCTTCACAGAATTGGAAAAAACTACTTTAAAGTTCATATGGAACCAAAAAAGAGCCCGCATTGCCAAGTCAATCCTAAGCCAAAAGAACAAAGCTGGAGGCATCACACTACCTGACTTCAAACTATACTACAAGGCTACAGTAACCAAAACAGCATGGTACTGGTACCAAAACAGAGATATAGATCAATGGAACAGAACAGAGCCCTCAGAAATAATGCCGCATATCTACAACTATCTGATCTTTGACAAACCTGAGAAAAACAAGCAATGGGGAAAGGATTCCCTATTTAATAAATGGTGCTGGGAAAACTGGCTAGCCATATGTAGAAAGCTGAAACTGGATCCCTTCCTTACACCTTATACAAAAATCAATTCAAGATGGATTAAAGATTTAAACGTTAAACCTAAAACCATAAAAACCCTAGAAGAAAACCTAGGCATTACCATTCAGGACATAGGCGTGGGCAAGGACTTCATGTCCAAAACACCAAAAGCAATGGCAACAAAAGACAAAATTGACAAATGGGATCTAATTAAACTAAAGAGCTTCTGCACAGCAAAAGAAACTACCATCAGAGTGAACAGGCAACCTACAACATGGGAGAAAATTTTCGCAACCTACTCATCTGACAAAGGGCTAATATCCAGAATCTACAATGAACTTAAACAAATTTACAAGAAAAAAACAAACAACCCCATCAAAAAGTGGGCGAAGGACATGAACAGACACTTCTCAAAAGAAGACATTTATGCAGCCAAAAAACACATGAAGAAATGCTCATCATCACTGGCCATCAGAGAAATGCAAATCAAAACCACTATGAGATATCATCTCACACCAGTTAGAATGGCAATCATTAAAAAGTCAGGAAACAACAGGTGCTGGAGAGGATGCGGAGAAATAGGAACACTTTTACACTGTTGGTGGGACTGTAAACTAGTTCAACCATTGTGGAAGTCAGTGTGGCGATTCCTCAGGGATCTAGAACTAGAAATACCATTTGACCCAGCCATCCCATTACTGGGTATATACCCAAATGAGTATAAATCATGCTGCTATAAAGACACATGCACACGTATGTTTATTGCGGCACTATTCACAATAGCAAAGACTTGGAACCAACCCAAATGTCCAACAATGATAGACTGGATTAAGAAAATGTGGCACATATACACCATGGAATACTATGCAGCCATAAAAAATGATGAGTTCATATCCTTTGTAGGGACATGGATGAAATTGGAAACCATCATTCTCAGTAAACTATCGCAAGAACAAAAAACCAAACACCGCATATTCTCACTCATAGGTGGGAATTGAACAATGAGATCACATGGACACAGGAAGGGGAATATCACACTCTGGGGACTGTGGTGGGGTCGGGGGAGGGGGGAGGGATAGCATTGGGAGATATACCTAATGCTAGATGACACATTAGTGGGTGCAGCGCACCAGCATGGCACATGTATACATATGTAACTAACCTGCACAATGTGCACATGTACCCTAAAACTTAGAGTATAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+>Full L1.3 (Revcomp)
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTATTATACTCTAAGTTTTAGGGTACATGTGCACATTGTGCAGGTTAGTTACATATGTATACATGTGCCATGCTGGTGCGCTGCACCCACTAATGTGTCATCTAGCATTAGGTATATCTCCCAATGCTATCCCTCCCCCCTCCCCCGACCCCACCACAGTCCCCAGAGTGTGATATTCCCCTTCCTGTGTCCATGTGATCTCATTGTTCAATTCCCACCTATGAGTGAGAATATGCGGTGTTTGGTTTTTTGTTCTTGCGATAGTTTACTGAGAATGATGGTTTCCAATTTCATCCATGTCCCTACAAAGGATATGAACTCATCATTTTTTATGGCTGCATAGTATTCCATGGTGTATATGTGCCACATTTTCTTAATCCAGTCTATCATTGTTGGACATTTGGGTTGGTTCCAAGTCTTTGCTATTGTGAATAGTGCCGCAATAAACATACGTGTGCATGTGTCTTTATAGCAGCATGATTTATACTCATTTGGGTATATACCCAGTAATGGGATGGCTGGGTCAAATGGTATTTCTAGTTCTAGATCCCTGAGGAATCGCCACACTGACTTCCACAATGGTTGAACTAGTTTACAGTCCCACCAACAGTGTAAAAGTGTTCCTATTTCTCCGCATCCTCTCCAGCACCTGTTGTTTCCTGACTTTTTAATGATTGCCATTCTAACTGGTGTGAGATGATATCTCATAGTGGTTTTGATTTGCATTTCTCTGATGGCCAGTGATGATGAGCATTTCTTCATGTGTTTTTTGGCTGCATAAATGTCTTCTTTTGAGAAGTGTCTGTTCATGTCCTTCGCCCACTTTTTGATGGGGTTGTTTGTTTTTTTCTTGTAAATTTGTTTAAGTTCATTGTAGATTCTGGATATTAGCCCTTTGTCAGATGAGTAGGTTGCGAAAATTTTCTCCCATGTTGTAGGTTGCCTGTTCACTCTGATGGTAGTTTCTTTTGCTGTGCAGAAGCTCTTTAGTTTAATTAGATCCCATTTGTCAATTTTGTCTTTTGTTGCCATTGCTTTTGGTGTTTTGGACATGAAGTCCTTGCCCACGCCTATGTCCTGAATGGTAATGCCTAGGTTTTCTTCTAGGGTTTTTATGGTTTTAGGTTTAACGTTTAAATCTTTAATCCATCTTGAATTGATTTTTGTATAAGGTGTAAGGAAGGGATCCAGTTTCAGCTTTCTACATATGGCTAGCCAGTTTTCCCAGCACCATTTATTAAATAGGGAATCCTTTCCCCATTGCTTGTTTTTCTCAGGTTTGTCAAAGATCAGATAGTTGTAGATATGCGGCATTATTTCTGAGGGCTCTGTTCTGTTCCATTGATCTATATCTCTGTTTTGGTACCAGTACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAGTGTGATGCCTCCAGCTTTGTTCTTTTGGCTTAGGATTGACTTGGCAATGCGGGCTCTTTTTTGGTTCCATATGAACTTTAAAGTAGTTTTTTCCAATTCTGTGAAGAAAGTCATTGGTAGCTTGATGGGGATGGCATTGAATCTGTAAATTACCTTGGGCAGTATGGCCATTTTCACGATATTGATTCTTCCTACCCATGAGCATGGAATGTTCTTCCATTTGTTTGTGTCCTCTTTTATTTCCTTGAGCAGTGGTTTGTAGTTCTCCTTGAAGAGGTCCTTCACATCCCTTGTAAGTTGGATTCCTAGGTATTTTATTCTCTTTGAAGCAATTACGAATGGGAGTTCACCCATGATTTGGCTCTCTGTTTGTCTGTTGTTGGTGTATAAGAATGCTTGTGATTTTTGTACATTGATTTTGTATCCTGAGACTTTGCTGAAGTTGCTTATCAGCTTAAGGAGATTTTGGGCTGAGACGATGGGGTTTTCTAGATATACAATCATGTCGTCTGCAAACAGGGACAATTTGACTTCCTCTTTTCCTAATTGAATACCCTTTATTTCCTTCTCCTGCCTGATTGCCCTGGCCAGAACTTCCAACACTATGTTGAATAGGAGCGGTGAGAGAGGGCATCCCTGTCTTGTGCCGGTTTTCAAAGGGAATGCTTCCAGTTTTTGCCCATTCAGTATGATATTGGCTGTGGGTTTGTCATAGATAGCTCTTATTATTTTGAAATACGTCCCATCAATACCTAATTTATTGAGAGTTTTTAGCATGAAGGGTTGTTGAATTTTGTCAAAGGCTTTTTCTGCATCTATTGAGATAATCATGTGGTTTTTGTCTTTGGCTCTGTTTATATGCTGGATTACATTTATTGATTTGCGTATATTGAACCAGCCTTGCATCCCAGGGATGAAGCCCACTTGATCATGGTGGATAAGCTTTTTGATGTGCTGCTGGATTCGGTTTGCCAGTATTTTATTGAGGATTTTTGCATCAATGTTCATCAAGGATATTGGTCTAAAATTCTCTTTTTTGGTTGTGTCTCTGCCCGGCTTTGGTATCAGAATGATGCTGGCCTCATAAAATGAGTTAGGGAGGATTCCCTCTTTTTCTATTGATTGGAATAGTTTCAGAAGGAATGGTACCAGTTCCTCCATGTACCTCTGGTAGAATTCGGCTGTGAATCCATCTGGTCCTGGACTCTTTTTGGTTGGTAAACTATTGATTATTGCCACAATTTCAGAGCCTGTTATTGGTCTATTCAGAGATTCAACTTCTTCCTGGTTTAGTCTTGGGAGAGTGTATGTGTCGAGGAATGTATCCATTTCTTCTAGATTTTCTAGTTTATTTGCGTAGAGGTGTTTGTAGTATTCTCTGATGGTAGTTTGTATTTCTGTGGGATCGGTGGTGATATCCCCTTTATCATTTTTTATTGTGTCTATTTGATTCTTCTCTCTTTTTTTCTTTATTAGTCTTGCTAGCGGTCTATCAATTTTGTTGATCCTTTCAAAAAACCAGCTCCTGGATTCATTGATTTTTTGAAGGGTTTTTTGTGTCTCTATTTCCTTCAGTTCTGCTCTGATTTTAGTTATTTCTTGCCTTCTGCTAGCTTTTGAATGTGTTTGCTCTTGCTTTTCTAGTTCTTTTAATTGTGATGTTAGGGTGTCAATTTTGGATCTTTCCTGCTTTCTCTTGTAGGCATTTAGTGCTATAAATTTCCCTCTACACACTGCTTTGAATGCGTCCCAGAGATTCTGGTATGTGGTGTCTTTGTTCTCGTTGGTTTCAAAGAACATCTTTATTTCTGCCTTCATTTCGTTATGTACCCAGTAGTCATTCAGGAGCAGGTTGTTCAGTTTCCATGTAGTTGAGCGGCTTTGAGTGAGATTCTTAATCCTGAGTTCTAGTTTGATTGCACTGTGGTCTGAGAGATAGTTTGTTATAATTTCTGTTCTTTTACATTTGCTGAGGAGAGCTTTACTTCCAACTATGTGGTCAATTTTGGAATAGGTGTGGTGTGGTGCTGAAAAAAAGGTATATTCTGTTGATTTGGGGTGGAGAGTTCTGTAGATGTCTATTAGGTCTGCTTGGTGCAGAGCTGAGTTCAATTCCTGGGTATCCTTGTTGACTTTCTGTCTCGTTGATCTGTCTAATGTTGACAGTGGGGTGTTAAAGTCTCCCATTATTAATGTGTGGGAGTCTAAGTCTCTTTGTAGGTCACTGAGGACTTGCTTTATGAATCTGGGTGCTCCTGTATTGGGTGCATAAATATTTAGGATAGTTAGCTCCTCTTGTTGAATTGATCCCTTTACCATTATGTAATGGCCTTCTTTGTCTCTTTTGATCTTTGTTGGTTTAAAGTCTGTTTTATCAGAGACTAGGATTGCAACCCCTGCCTTTTTTTGTTTTCCATTGGCTTGGTAGATCTTCCTCCATCCTTTTATTTTGAGCCTATGTGTGTCTCTGCACGTGAGATGGGTTTCCTGAATACAGCACACTGATGGGTCTTGACTCTTTATCCAACTTGCCAGTCTGTGTCTTTTAATTGCAGAATTTAGTCCATTTATATTTAAAGTTAATATTGTTATGTGTGAATTTGATCCTGTCATTATGATGTTAGCTGGTGATTTTGCTCATTAGTTGATGCAGTTTCTTCCTAGTCTCGATGGTCTTTACATTTTGGCATGATTTTGCAGCGGCTGGTACCGGTTGTTCCTTTCCATGTTTAGCGCTTCCTTCAGGAGCTCTTTTAGGGCAGGCCTGGTGGTGACAAAATCTCTCAACATTTGCTTGTCTATAAAGTATTTTATTTCTCCTTCACTTATGAAGCTTAGTTTGGCTGGATATGAAATTCTGGGTTGAAAATTCTTTTCTTTAAGAATGTTGAATATTGGCCCCCACTCTCTTCTGGCTTGTAGGGTTTCTGCCGAGAGATCCACTGTTAGTCTGATGGGCTTTCCTTTGAGGGTAACCCGACCTTTCTCTCTGGCTGCCCTTAACATTTTTTCCTTCATTTCAACTTTGGTGAATCTGACAATTATGTGTCTTGGAGTTGCTCTTCTCGAGGAGTATCTTTGTGGCGTTCTCTGTATTTCCTGAATCTGAACGTTGGCCTGCCTTGCTAGATTGGGGAAGTTCTCCTGGATAATATCCTGCAGAGTGTTTTCCAACTTGGTTCCATTCTCCACATCACTTTCAGGTACACCAATCAGACGTAGATTTGGTCTTTTCACATAGTCCCATATTTCTTGGAGGCTTTGCTCATTTCTTTTTATTCTTTTTTCTCTAAACTTCCCTTCTCGCTTCATTTCATTCATTTCATCTTCCATTGCTGATACCCTTTCTTCCAGTTGATCGCATCGGCTCCTGAGGCTTCTGCATTCTTCACGTAGTTCTCGAGCCTTGGTTTTCAGCTCCATCAGCTCCTTTAAGCACTTCTCTGTATTGGTTATTCTAGTTATACATTCTTCTAAATTTTTTTCAAAGTTTTCAACTTCTTTGCCTTTGGTTTGAATGTCCTCCCGTAGCTCAGAGTAATTTGATCGTCTGAAGCCTTCTTCTCTCAGCTCGTCAAAATCATTCTCCATCCAGCTTTGTTCCGTTGCTGGTGAGGAACTGCGTTCCTTTGGAGGAGGAGAGGCGCTCTGCGTTTTAGAGTTTCCAGTTTTTCTGTTCTGTTTTTTCCCCATCTTTGTGGTTTTATCTACTTTTGGTCTTTGATGATGGTGATGTACAGATGGGTTTTCGGTGTAGATGTCCTTTCTGGTTGTTAGTTTTCCTTCTAACAGACAGGACCCTCAGCTGCAGGTCTGTTGGAATACCCTGCCGTGTGAGGTGTCAGTGTGCCCCTGCTGGGGGGTGCCTCCCAGTTAGGCTGCTCGGGGGTCAGGAGTCAGGGACCCACTTGAGGAGGCAGTCTGTCTGCCCGTTCTCAGATCTCCAGCTGCGTGCTGGGAGAACCACTGCTCTCTTCAAAGCTGTCAGACAGGGACACTTAAGTCTGCAGAGGTTACTGCTGTCTTTTTGTTTGTCTGTGCCCTGCCCCCAGAGGTGGAGCCTACAGAGGCAGGCAGGCCTCCTTGAGCTGTGGTGGGCTCCACCCAGTTCGAGCTTCCCGGCTGCTTTGTTTACCTAAGCAAGCCTGGGCAATGGCGGGCGCCCCTCCCCCAGCCTCGTTGCCGCCTTGCAGTTTGATCTCAGACTGCTGTGCTAGCAATCAGCGAGATTCCGTGGGCGTAGGACCCTCCGAGCCAGGTGTGGGATATAGTCTCGTGGTGCGCCGTTTCTTAAGCCGGTCTGAAAAGCGCAATATTCGGGTGGGAGTGACCCGATTTTCCAGGTGCGACCGTCACCCCTTTCTTTGACTCAGAAAGGGAACTCCCTGACCCCTTGCGCTTCCCAGGTGAGGCAATGCCTCGCCCTGCTTCGGCTCGCGCACGGTGCGCACACACACTGGCCTGCGCCCACTGTCTGGCACTCCCTAGTGAGATGAACCCGGTACCTCAGATGGAAATGCAGAAATCACCGTCTTCTGCGTCGCTCACGCTGGGAGCTGTAGACCGGAGCTGTTCCTATTCGGCCATCTTGGCTCCTCCCCC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/refs/ont-barcodes-1.fasta	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,28 @@
+>Nanopore Adapter Top Strand
+CCTGTACTTCGTTCAGTTACGTATTGCT
+>Nanopore Adapter Bottom Strand
+GCAATACGTAACTGAACGAAGTACAGG
+>NB01
+AAGGTTAACACAAAGACACCGACAACTTTCTTCAGCACCT
+>NB02
+AAGGTTAAACAGACGACTACAAACGGAATCGACAGCACCT
+>NB03
+AAGGTTAACCTGGTAACTGGGACACAAGACTCCAGCACCT
+>NB04
+AAGGTTAATAGGGAAACACGATAGAATCCGAACAGCACCT
+>NB05
+AAGGTTAAAAGGTTACACAAACCCTGGACAAGCAGCACCT
+>NB06
+AAGGTTAAGACTACTTTCTGCCTTTGCGAGAACAGCACCT
+>NB07
+AAGGTTAAAAGGATTCATTCCCACGGTAACACCAGCACCT
+>NB08
+AAGGTTAAACGTAACTTGGTTTGTTCCCTGAACAGCACCT
+>NB09
+AAGGTTAAAACCAAGACTCGCTGTGCCTAGTTCAGCACCT
+>NB10
+AAGGTTAAGAGAGGACAAAGGTTTCAACGCTTCAGCACCT
+>NB11
+AAGGTTAATCCATTCCCTCCGATAGATGAAACCAGCACCT
+>NB12
+AAGGTTAATCCGATTCTGCTTCTTTCTACCTGCAGCACCT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/refs/ont-barcodes-2.fasta	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,28 @@
+>Nanopore Adapter Top Strand
+CCTGTACTTCGTTCAGTTACGTATTGCT
+>Nanopore Adapter Bottom Strand
+GCAATACGTAACTGAACGAAGTACAGG
+>NB13
+AAGGTTAAAGAACGACTTCCATACTCGTGTGACAGCACCT
+>NB14
+AAGGTTAAAACGAGTCTCTTGGGACCCATAGACAGCACCT
+>NB15
+AAGGTTAAAGGTCTACCTCGCTAACACCACTGCAGCACCT
+>NB16
+AAGGTTAACGTCAACTGACAGTGGTTCGTACTCAGCACCT
+>NB17
+AAGGTTAAACCCTCCAGGAAAGTACCTCTGATCAGCACCT
+>NB18
+AAGGTTAACCAAACCCAACAACCTAGATAGGCCAGCACCT
+>NB19
+AAGGTTAAGTTCCTCGTGCAGTGTCAAGAGATCAGCACCT
+>NB20
+AAGGTTAATTGCGTCCTGTTACGAGAACTCATCAGCACCT
+>NB21
+AAGGTTAAGAGCCTCTCATTGTCCGTTCTCTACAGCACCT
+>NB22
+AAGGTTAAACCACTGCCATGTATCAAAGTACGCAGCACCT
+>NB23
+AAGGTTAACTTACTACCCAGTGAACCTCCTCGCAGCACCT
+>NB24
+AAGGTTAAGCATAGTTCTGCATGATGGGTTAGCAGCACCT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remote/bin/vimmv	Tue Oct 13 10:31:54 2026 -0400
@@ -0,0 +1,1 @@
+../../bin/vimmv
\ No newline at end of file
--- a/stumpwm/bioinf.lisp	Thu Jul 16 11:24:25 2026 -0400
+++ b/stumpwm/bioinf.lisp	Tue Oct 13 10:31:54 2026 -0400
@@ -83,29 +83,78 @@
 (defcommand kmerize (k) ((:integer "k: "))
   (pbcopy (kmerized-string k (pbpaste))))
 
+(defun dna-complement (seq)
+  (map 'string (lambda (base)
+                 (case base
+                   (#\A #\T)
+                   (#\C #\G)
+                   (#\G #\C)
+                   (#\T #\A)
+                   (#\N #\N)
+                   (#\a #\t)
+                   (#\c #\g)
+                   (#\g #\c)
+                   (#\t #\a)
+                   (#\n #\n)
+                   (t #\?)))
+       seq))
+
+(defun rna-complement (seq)
+  (map 'string (lambda (base)
+                 (case base
+                   (#\A #\U)
+                   (#\C #\G)
+                   (#\G #\C)
+                   (#\U #\A)
+                   (#\N #\N)
+                   (#\a #\u)
+                   (#\c #\g)
+                   (#\g #\c)
+                   (#\t #\u)
+                   (#\n #\n)
+                   (t #\?)))
+       seq))
+
+(defun bio-complement (seq)
+  (if (or (position #\U seq) (position #\u seq))
+      (rna-complement seq)
+      (dna-complement seq)))
+
+
 (defun reverse-complement (seq)
-  (nreverse (map 'string (lambda (base)
-                           (case base
-                             (#\A #\T)
-                             (#\C #\G)
-                             (#\G #\C)
-                             (#\T #\A)
-                             (#\N #\N)
-                             (#\a #\t)
-                             (#\c #\g)
-                             (#\g #\c)
-                             (#\t #\a)
-                             (#\n #\n)
-                             (t #\?)))
-                 seq)))
+  (nreverse (bio-complement seq)))
 
 (defcommand revcomp () ()
   (pbcopy (reverse-complement (pbpaste))))
 
+(defcommand comp () ()
+  (pbcopy (bio-complement (pbpaste))))
+
 (defcommand rev () ()
   (pbcopy (reverse (pbpaste))))
 
 
+(defun align/ref% (ref)
+  (alexandria:write-string-into-file (pbpaste) "~/scratch/query.fastx"
+                                     :if-exists :supersede)
+  (run-shell-command (format nil "st -- sav ~A ~~/scratch/query.fastx" ref)))
+
+(defcommand align/l1 () ()
+  (align/ref% "~/src/dotfiles/refs/l1-ont.fasta"))
+
+(defcommand align/aluya () ()
+  (align/ref% "~/src/dotfiles/refs/aluya-ont.fasta"))
+
+(defcommand align/aluyb () ()
+  (align/ref% "~/src/dotfiles/refs/aluyb-ont.fasta"))
+
+(defcommand align/barcodes1 () ()
+  (align/ref% "~/src/dotfiles/refs/ont-barcodes-1.fasta"))
+
+(defcommand align/barcodes2 () ()
+  (align/ref% "~/src/dotfiles/refs/ont-barcodes-2.fasta"))
+
+
 #; Scratch --------------------------------------------------------------------
 
 (random-fasta-string 10 100)
--- a/stumpwm/key-mapping.lisp	Thu Jul 16 11:24:25 2026 -0400
+++ b/stumpwm/key-mapping.lisp	Tue Oct 13 10:31:54 2026 -0400
@@ -191,6 +191,7 @@
   ("KP_Page_Up"   "igv/select-reads") ; 9
   )
 
+
 (defvar *keymap/igv* (make-sparse-keymap))
 
 (define-key *keymap/igv* (kbd "s") "igv/supplementary-on")
@@ -206,8 +207,17 @@
 (define-key *keymap/igv* (kbd "m") "igv/minimera")
 (define-key *keymap/igv* (kbd "H-i") "igv")
 
+(defvar *keymap/alignment* (make-sparse-keymap))
+
+(define-key *keymap/alignment* (kbd "a") "align/aluya")
+(define-key *keymap/alignment* (kbd "b") "align/aluyb")
+(define-key *keymap/alignment* (kbd "l") "align/l1")
+(define-key *keymap/alignment* (kbd "1") "align/barcodes1")
+(define-key *keymap/alignment* (kbd "2") "align/barcodes2")
+
 (define-top-keys ;; alternate maps
-  ("H-i" *keymap/igv*))
+  ("H-i" *keymap/igv*)
+  ("H-a" *keymap/alignment*))
 
 
 ;;; The G A M E R M O U S E:
--- a/stumpwm/stumpconfig.asd	Thu Jul 16 11:24:25 2026 -0400
+++ b/stumpwm/stumpconfig.asd	Tue Oct 13 10:31:54 2026 -0400
@@ -39,4 +39,5 @@
                (:file "miscellaneous")
                (:file "igv")
                (:file "bioinf")
+               (:file "tasks")
                (:file "key-mapping")))
--- a/vim/custom-dictionary.utf-8.add	Thu Jul 16 11:24:25 2026 -0400
+++ b/vim/custom-dictionary.utf-8.add	Tue Oct 13 10:31:54 2026 -0400
@@ -582,3 +582,5 @@
 bcftools
 hg37
 LLQR
+nalbinding
+nalbind
--- a/vim/vimrc	Thu Jul 16 11:24:25 2026 -0400
+++ b/vim/vimrc	Tue Oct 13 10:31:54 2026 -0400
@@ -2182,6 +2182,9 @@
     " Fix s
     au FileType vlime_sldb      nnoremap <buffer> <nowait> s :call vlime#ui#sldb#StepCurOrLastFrame("step")<cr>
 
+    " Fix S
+    au FileType vlime_sldb      nnoremap <buffer> <nowait> S :call vlime#ui#sldb#OpenFrameSource()<cr>
+
     " Fix p
     au FileType vlime_inspector nnoremap <buffer> p :call vlime#ui#inspector#InspectorPop()<cr>
 augroup end