lib/io/quality_score.ex

defmodule Bio.QualityScore do
  @moduledoc """
  A struct representing the quality score of a FASTQ file.

  ``` elixir
  %QualityScore{
    scoring_characters: binary(),
    scores: [integer()],
    label: binary(),
    encoding: Bio.IO.FastQ.quality_encoding()
  }
  ```
  """
  defstruct scoring_characters: "",
            scores: '',
            label: "",
            encoding: :phred_33

  @doc false
  def new(bin, opts \\ []) do
    label = Keyword.get(opts, :label, "")
    encoding = Keyword.get(opts, :encoding)

    %__MODULE__{
      scoring_characters: bin,
      scores: parse_scores(bin, encoding),
      label: label,
      encoding: encoding
    }
  end

  defp parse_scores(bin, :phred_33) do
    offset = 33

    bin
    |> String.to_charlist()
    |> Enum.map(&(&1 - offset))
  end

  defp parse_scores(bin, :phred_64) do
    offset = 64

    bin
    |> String.to_charlist()
    |> Enum.map(&(&1 - offset))
  end

  defp parse_scores(bin, :decimal) do
    bin
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end
end