Utility functions for phred quality strings.

(ns cljam.io.sam.util.quality
  (:import [java.nio Buffer ByteBuffer CharBuffer]))

Converts fastq-char to phred-byte.

(definline fastq-char->phred-byte
  [ch]
  `(byte (- (int ~ch) 33)))

Converts phred-byte to fastq-char.

(definline phred-byte->fastq-char
  [b]
  `(unchecked-char (unchecked-add (Math/min 93 (Math/max (long ~b) 0)) 33)))

Converts fastq quality string to phred bytes.

(defn fastq->phred
  ^bytes [^String fastq]
  (let [b (.getBytes fastq)
        in-bb (ByteBuffer/wrap b)
        out-bb (ByteBuffer/allocate (alength b))]
    (while (.hasRemaining in-bb)
      (.put out-bb (fastq-char->phred-byte (.get in-bb))))
    (.array out-bb)))

Converts phred bytes or a byte to fastq quality string or char.

(defmulti phred->fastq
  class)

Converts phred bytes to fastq quality string.

(defn phred-bytes->fastq
  [^bytes b]
  (when-not (nil? b)
    (let [bb (ByteBuffer/wrap b)
          cb (CharBuffer/allocate (alength b))]
      (loop []
        (when (.hasRemaining bb)
          (.put cb (phred-byte->fastq-char (.get bb)))
          (recur)))
      (.flip ^Buffer cb)
      (.toString cb))))
(defmethod phred->fastq (class (byte-array nil))
  [^bytes b]
  (phred-bytes->fastq b))
(def ^:private ^:const max-phred-score 93)
(defmethod phred->fastq Integer
  [n]
  {:pre [(<= 0 n max-phred-score)]}
  (phred-byte->fastq-char n))