diff --git a/.gitignore b/.gitignore index d08bdd88..1c30809a 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ benchmark/bin/env.sh benchmark/src/results benchmark/src/results/overlap mprofile*dat -*csv \ No newline at end of file +*csv +!docs/notebooks/example.csv \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index d84574f0..946f46a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6346,9 +6346,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "indexmap", "itoa", diff --git a/docs/notebooks/base_sequence_quality.ipynb b/docs/notebooks/base_sequence_quality.ipynb new file mode 100644 index 00000000..1e484745 --- /dev/null +++ b/docs/notebooks/base_sequence_quality.ipynb @@ -0,0 +1,514 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "76af9b7e", + "metadata": {}, + "source": [ + "# Team Z6\n", + "- Mariusz Paluch\n", + "- Bartłomiej Ściseł\n", + "- Jakub Winter" + ] + }, + { + "cell_type": "markdown", + "id": "83d7ccd7", + "metadata": {}, + "source": [ + "### Import dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "58b40aa6", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import polars_bio as pb" + ] + }, + { + "cell_type": "markdown", + "id": "2e29cd0a", + "metadata": {}, + "source": [ + "### Usage examples" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b0d81403", + "metadata": {}, + "outputs": [], + "source": [ + "pb.set_option(\"datafusion.execution.target_partitions\", \"2\")" + ] + }, + { + "cell_type": "markdown", + "id": "b238193d", + "metadata": {}, + "source": [ + "#### Usage example - .fastq file" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0420c240", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " pos avg q1 median q3 lower upper\n", + "46 0 30.135 31.0 33.0 34.0 26.5 38.5\n", + "14 1 31.210 31.0 34.0 34.0 26.5 38.5\n", + "54 2 32.015 31.0 34.0 34.0 26.5 38.5\n", + "99 3 35.690 35.0 37.0 37.0 32.0 40.0\n", + "7 4 35.680 35.0 37.0 37.0 32.0 40.0\n", + ".. ... ... ... ... ... ... ...\n", + "95 96 31.315 32.0 34.0 35.0 27.5 39.5\n", + "62 97 30.670 31.0 34.0 35.0 25.0 41.0\n", + "67 98 31.550 32.0 34.0 35.0 27.5 39.5\n", + "53 99 31.250 32.0 34.0 35.0 27.5 39.5\n", + "55 100 31.105 31.0 34.0 35.0 25.0 41.0\n", + "\n", + "[101 rows x 7 columns]\n" + ] + } + ], + "source": [ + "result = pb.base_sequence_quality(\"example.fastq\", output_type=\"pandas.DataFrame\").sort_values(by=\"pos\")\n", + "print(result)" + ] + }, + { + "cell_type": "markdown", + "id": "d8eb42e4", + "metadata": {}, + "source": [ + "##### Results visualization\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "7322aae3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABM8AAAHRCAYAAAB9856CAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAA115JREFUeJzs3XlY1OX6x/H3sA3D7gqiKC7ojDtgmmlpWWmaZVlWSmUurbbZ6jmVtpys38nylGWeMrXQdu20m5ZmmqYB7qCIoCjiCgiyw/z+GBlFQB0FGeTzui4vnO88c3/veWYYZu55FoPVarUiIiIiIiIiIiIiFbjUdgIiIiIiIiIiIiLOSsUzERERERERERGRKqh4JiIiIiIiIiIiUgUVz0RERERERERERKqg4pmIiIiIiIiIiEgVVDwTERERERERERGpgopnIiIiIiIiIiIiVVDxTEREREREREREpAoqnomIiIiIiIiIiFRBxTMRERGpNVOmTMFgMHDo0KHaTkXqMYPBwJQpU+yX586di8FgICUlpdZyEhEREeeh4pmIiIiIyBm89957zJ07t7bTEBERkVqg4pmIiIiIyEnuvPNO8vLyaNWqlf2YimciIiL1l1ttJyAiIiIi4kxcXV1xdXWt7TRERETESWjkmYiIiNS6Q4cOMWLECPz8/GjUqBGPPvoo+fn55drMmTOHq666iqZNm2I0GunYsSMzZ86sEOvvv/9m4MCBNG7cGJPJROvWrRkzZky5NqWlpUyfPp1OnTrh6elJYGAg9913HxkZGWfMNT09nXvuuYcWLVpgNBpp1qwZN954Y4X1sX766Scuv/xyvL298fX1ZciQIWzZsqVCvG+++YbOnTvj6elJ586dWbRoEaNHjyY0NNTeZvny5RgMBpYvX17utikpKRgMhgojohISErjlllto2LAhnp6e9OjRg2+//bZcm7J1vVatWsXEiRNp0qQJ3t7e3HTTTRw8eLBCnj/99BP9+vXD19cXPz8/LrnkEhYsWFCuzV9//cWgQYPw9/fHy8uLfv36sWrVqjP2KcCePXsYNmwY3t7eNG3alMcff5zFixdXuN+hoaGMHj26wu379+9P//797ZcLCwt54YUXiIyMxN/fH29vby6//HKWLVt2xlxOXfMsNDSULVu28Pvvv2MwGDAYDPTv35+dO3diMBh46623KsT4888/MRgM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8sortGvXjqZNm5Zb0+yuu+7i7bffZtmyZbz++usOxxcREREnVos7fYqIiEg9N3nyZCtg3bp1q/WWW26x+vr6Whs0aGCdMGGCNS8vr1zbb7/91tq1a1erp6enNTQ01Pr6669bP/roIytgTU5OtlqtVmtsbKz1jjvusLZs2dJqNBqtTZs2tV5//fXWv//+u8K5//vf/1ojIyOtJpPJ6uvra+3SpYv16aeftqalpVWZ76FDh6wPPfSQ1Ww2W729va3+/v7WXr16Wb/44osKbZctW2YdOHCg1d/f3+rp6Wlt27atdfTo0RVy+frrr60Wi8VqNBqtHTt2tC5cuNB69913W1u1alWu3cGDB63Dhw+3enl5WRs0aGC97777rJs3b7YC1jlz5pRrm5SUZL3rrrusQUFBVnd3d2vz5s2t119/vfWrr76yt5kzZ44VsK5bt65C3oB12bJlFfr/sssus5pMJqufn5+1Z8+e1k8//bRcm7i4OOvNN99sbdSokdVoNFpbtWplHTFihPXXX3+tsk/L7Nq1y3rDDTdYvby8rI0bN7Y++uij1p9//rnSXKZNm2Zt3ry51Wg0Wvv06WP9+++/rf369bP269fP3qa0tNT66quvWlu1amU1Go3W8PBw6/fff19p3wLWyZMnV+ibsueV1Wq1pqenW4cMGWL19fW1AuXOVaZTp05WFxcX6549e854f0VERKTuMFitDqwGKyIiIiI1bvTo0SxfvrzcbqP10fLly7nyyitZtmwZ/fv3r+10zig8PJyGDRvy66+/1nYqIiIiUo205pmIiIiIyHn6+++/Wb9+PXfddVdtpyIiIiLVTGueiYiIiIico82bNxMTE8O0adNo1qwZt912W22nJCIiItVMI89ERERERM7RV199xT333ENRURGffvopnp6etZ2SiIiIVDOteSYiIiIiIiIiIlIFjTwTERERERERERGpgopnIiIiIiIiIiIiVajVDQOmTJnCiy++WO5Yhw4dSEhIACA/P58nnniCzz77jIKCAgYOHMh7771HYGDgWZ+jtLSUtLQ0fH19MRgM1Zq/iIiIiIiIiIjUHVarlezsbIKDg3FxObsxZbW+22anTp1YunSp/bKb24mUHn/8cX744Qe+/PJL/P39mTBhAjfffDOrVq066/hpaWmEhIRUa84iIiIiIiIiIlJ3paam0qJFi7NqW+vFMzc3N4KCgiocz8rKYvbs2SxYsICrrroKgDlz5mCxWFizZg2XXnrpWcX39fUFbJ3i5+dXfYmLiIiIiIiIiEidcvToUUJCQuz1orNR68WzxMREgoOD8fT0pHfv3kydOpWWLVsSExNDUVERV199tb2t2WymZcuWrF69usriWUFBAQUFBfbL2dnZAPj5+al4JiIiIiIiIiIiDi3tVasbBvTq1Yu5c+fy888/M3PmTJKTk7n88svJzs4mPT0dDw8PAgICyt0mMDCQ9PT0KmNOnToVf39/+z9N2RQRERERERERkXNVqyPPrrvuOvv/u3btSq9evWjVqhVffPEFJpPpnGJOmjSJiRMn2i+XDccTERERERERERFxVK2OPDtVQEAA7du3Z8eOHQQFBVFYWEhmZma5Nvv37690jbQyRqPRPkVTUzVFREREREREROR81PqaZyfLyckhKSmJO++8k8jISNzd3fn1118ZPnw4ANu2bWP37t307t27ljMVERERERERqRklJSUUFRXVdhoidZa7uzuurq7VFq9Wi2dPPvkkQ4cOpVWrVqSlpTF58mRcXV2544478Pf3Z+zYsUycOJGGDRvi5+fHww8/TO/evc96p00RERERERGRuiQnJ4c9e/ZgtVprOxWROstgMNCiRQt8fHyqJV6tFs/27NnDHXfcweHDh2nSpAl9+/ZlzZo1NGnSBIC33noLFxcXhg8fTkFBAQMHDuS9996rzZRFREREREREakRJSQl79uzBy8uLJk2aOLQboIjYWK1WDh48yJ49ewgLC6uWEWgG60Vezj569Cj+/v5kZWVp/TMRERERERFxWvn5+SQnJxMaGnrOm+iJCOTl5ZGSkkLr1q3x9PQsd9251ImcasMAERERERERkfpOI85Ezk91/w6peCYiIiIiIiIiIlIFFc9ERERERERERESqoOKZiIiIiIiIiEgNmDJlCoGBgRgMBr755ptzijF37lwCAgKqNa/TGT16NMOGDbtg56sLVDwTERERERERkfO2evVqXF1dGTJkSG2n4hTi4+N58cUXmTVrFvv27eO6666r7ZTkHKl4JiIiIiIiIiLnbfbs2Tz88MOsWLGCtLS0Gj2X1WqluLi4Rs9xvpKSkgC48cYbCQoKwmg0XrBzFxYWXrBz1bSioqLaTkHFMxEREZGLXW5uLqtWrWL+/PmsWrWK3Nzc2k5JRETOgtVqJbewuFb+Wa1Wh3LNycnh888/54EHHmDIkCHMnTvXft3IkSO57bbbyrUvKiqicePGfPzxxwCUlpYydepUWrdujclkolu3bnz11Vf29suXL8dgMPDTTz8RGRmJ0Whk5cqVJCUlceONNxIYGIiPjw+XXHIJS5cuLXeuffv2MWTIEEwmE61bt2bBggWEhoYyffp0e5vMzEzGjRtHkyZN8PPz46qrrmLDhg2nvc+bNm3iqquuwmQy0ahRI+69915ycnIA23TNoUOHAuDi4lLl7o9l9+uHH36ga9eueHp6cumll7J58+YKbRcvXozFYsHHx4dBgwaxb98++3VlUy3/9a9/ERwcTIcOHQBITU1lxIgRBAQE0LBhQ2688UZSUlLstyspKWHixIkEBATQqFEjnn766TM+9rt27WLo0KE0aNAAb29vOnXqxI8//mi/fsuWLVx//fX4+fnh6+vL5Zdfbi8klpaW8tJLL9GiRQuMRiPdu3fn559/tt82JSUFg8HA559/Tr9+/fD09GT+/PkAfPjhh1gsFjw9PTGbzbz33nunzbM6uV2wM4mIiIhIrUhISKBv3772yzExMURERNRiRiIicjbyikro+MLiWjn31pcG4uVx9iWDL774ArPZTIcOHYiKiuKxxx5j0qRJGAwGRo0axa233kpOTg4+Pj6ArRCUm5vLTTfdBMDUqVOJjo7m/fffJywsjBUrVhAVFUWTJk3o16+f/TzPPvssb7zxBm3atKFBgwakpqYyePBg/vWvf2E0Gvn4448ZOnQo27Zto2XLlgDcddddHDp0iOXLl+Pu7s7EiRM5cOBAufxvvfVWTCYTP/30E/7+/syaNYsBAwawfft2GjZsWOH+Hjt2jIEDB9K7d2/WrVvHgQMHGDduHBMmTGDu3Lk8+eSThIaGcs8995QrclXlqaee4j//+Q9BQUH84x//YOjQoWzfvh13d3fA9kXYG2+8wSeffIKLiwtRUVE8+eST9sISwK+//oqfnx9LliwBbAXKshz/+OMP3NzceOWVVxg0aBAbN27Ew8ODadOmMXfuXD766CMsFgvTpk1j0aJFXHXVVVXm+tBDD1FYWMiKFSvw9vZm69at9sd17969XHHFFfTv35/ffvsNPz8/Vq1aZR8l+J///Idp06Yxa9YswsPD+eijj7jhhhvYsmULYWFh5R7nadOmER4ebi+gvfDCC8yYMYPw8HDi4uIYP3483t7e3H333Wfs3/Ol4pmIiIjIRc5sNhMdHU1UVBTR0dGYzebaTklERC4ys2fPJioqCoBBgwaRlZXF77//Tv/+/Rk4cCDe3t4sWrSIO++8E4AFCxZwww034OvrS0FBAa+++ipLly6ld+/eALRp04aVK1cya9ascsWzl156iWuuucZ+uWHDhnTr1s1++eWXX2bRokV8++23TJgwgYSEBJYuXcq6devo0aMHYBvBdHKhZuXKlaxdu5YDBw7Yp1a+8cYbfPPNN3z11Vfce++9Fe7vggULyM/P5+OPP8bb2xuAGTNmMHToUF5//XUCAwPti/wHBQWdsf8mT55sv1/z5s2jRYsWLFq0iBEjRgC2Qtj7779P27ZtAZgwYQIvvfRSuRje3t58+OGHeHh4ABAdHU1paSkffvihfeTbnDlzCAgIYPny5Vx77bVMnz6dSZMmcfPNNwPw/vvvs3jx6Qu2u3fvZvjw4XTp0gWwPVZl3n33Xfz9/fnss8/shb/27dvbr3/jjTd45plnuP322wF4/fXXWbZsGdOnT+fdd9+1t3vsscfsOZX1z7Rp0+zHWrduzdatW5k1a5aKZyIiIiJy/ry8vLBYLABYLBa8vLxqOSMRETkbJndXtr40sNbOfba2bdvG2rVrWbRoEQBubm7cdtttzJ49m/79++Pm5saIESOYP38+d955J8eOHeN///sfn332GQA7duwgNze3XFEMbOt2hYeHlztWVgArk5OTw5QpU/jhhx/Yt28fxcXF5OXlsXv3bntubm5u5UZct2vXjgYNGtgvb9iwgZycHBo1alQudl5enn264ani4+Pp1q2bvXAG0KdPH0pLS9m2bRuBgYFn1XdlyoqGYCsIdujQgfj4ePsxLy8ve+EMoFmzZhVGz3Xp0sVeOCu7Xzt27MDX17dcu/z8fJKSksjKymLfvn306tXLfp2bmxs9evQ47dTNRx55hAceeIBffvmFq6++muHDh9O1a1cA1q9fz+WXX24vnJ3s6NGjpKWl0adPn3LH+/TpU2GK7MmP87Fjx0hKSmLs2LGMHz/efry4uBh/f/8q86xOKp6JiIiIiIiIOCGDweDQ1MnaMnv2bIqLiwkODrYfs1qtGI1GZsyYgb+/P6NGjaJfv34cOHCAJUuWYDKZGDRoEIB9nbAffviB5s2bl4t96iL7JxerAJ588kmWLFnCG2+8Qbt27TCZTNxyyy0OLZifk5NDs2bNWL58eYXrykaP1bZTi1EGg6FCgevUvsnJySEyMrLc1M4yTZo0Oedcxo0bx8CBA/nhhx/45ZdfmDp1KtOmTePhhx/GZDKdc9yTnXxfyp4fH3zwQblCH4Cr69kXec+H8/8WioiIiNSQ3Nxc4uLiSElJITQ0FJPJhNlsrpWRWafmEh4eXmt5JCQkkJeX5xS5OMvjIyIilSsuLubjjz9m2rRpXHvtteWuGzZsGJ9++in3338/l112GSEhIXz++ef89NNP3HrrrfaCUMeOHTEajezevbvcFM2zsWrVKkaPHm1fOy0nJ6fcgvgdOnSguLiYuLg4IiMjAdtIt4yMDHubiIgI0tPTcXNzIzQ09KzOa7FYmDt3LseOHbMXelatWoWLi4t9sX5HrFmzxr5GW0ZGBtu3b7ePGj9XERERfP755zRt2hQ/P79K2zRr1oy//vqLK664ArA9nmezNmpISAj3338/999/P5MmTeKDDz7g4YcfpmvXrsybN4+ioqIKBT8/Pz+Cg4NZtWpVucd51apV9OzZs8pzBQYGEhwczM6dOxk1atTZ3v1qpeKZiIiI1FunLqQPtbeYvrMs6p+QkGD/cOEMuTjL4yMiIpX7/vvvycjIYOzYsRWm0A0fPpzZs2dz//33A7ZdN99//322b9/OsmXL7O18fX158sknefzxxyktLaVv375kZWWxatUq/Pz8TrumVVhYGAsXLmTo0KEYDAaef/55SktL7debzWauvvpq7r33XmbOnIm7uztPPPEEJpPJvg7Y1VdfTe/evRk2bBj/93//R/v27UlLS+OHH37gpptuqjBVFGDUqFFMnjyZu+++mylTpnDw4EEefvhh7rzzToenbIJtLbdGjRoRGBjIP//5Txo3bsywYcMcjnNqjv/+97+58cYb7Ttc7tq1i4ULF/L000/TokULHn30UV577TXCwsIwm828+eabZGZmnjbuY489xnXXXUf79u3JyMhg2bJl9kLfhAkTeOedd7j99tuZNGkS/v7+rFmzhp49e9KhQweeeuopJk+eTNu2benevTtz5sxh/fr1lY6OO9mLL77II488gr+/P4MGDaKgoIC///6bjIwMJk6ceF79dDZcavwMIiIiIk6qbCF9sC2qGxMTU2uL6Z+aS23mERMT4zS5OMvjIyIilZs9ezZXX311pWtPDR8+nL///puNGzcCtmLO1q1bad68eYV1r15++WWef/55pk6disViYdCgQfzwww+0bt36tOd/8803adCgAZdddhlDhw5l4MCBFb5k+fjjjwkMDOSKK67gpptuYvz48fj6+uLp6QnYpkD++OOPXHHFFdxzzz20b9+e22+/nV27dlVZCPPy8mLx4sUcOXKESy65hFtuuYUBAwYwY8aMs+67k7322ms8+uijREZGkp6eznfffVdu/bJz4eXlxYoVK2jZsiU333wzFouFsWPHkp+fbx+J9sQTT3DnnXdy991307t3b3x9fe2j+KpSUlLCQw89ZH+c2rdvz3vvvQdAo0aN+O2338jJyaFfv35ERkbywQcf2EehPfLII0ycOJEnnniCLl268PPPP/Ptt9+W28ChMuPGjePDDz9kzpw5dOnShX79+jF37twzPj+qi8F6ulXgLgJHjx7F39+frKysKocpioiISP0VGxtLZGSkU4xoqslcHI3tLP3iLHmIiFwI+fn5JCcn07p1a3thR6rfnj17CAkJYenSpQwYMKBWc1m+fDlXXnklGRkZTrO+2sXgdL9L51In0rRNEREREREREblolY2E6tKlC/v27ePpp58mNDTUvs6XyJmoeCYiIiIiIiIiF62ioiL+8Y9/sHPnTnx9fbnsssuYP39+hQXtRaqi4pmIiIiIiIiIXLQGDhzIwIEDazuNSvXv35+LfDWti4I2DBAREREREREREamCRp6JiIiIiFyEcnNzSUhIIC8vj5SUFEJDQwkPD8fLy6vK9nFxcfa2JpMJs9lcZXsREZH6QsUzEREREZGLUEJCApGRkeWOnW7X0oSEBPr27XvW7UVEROoLTdsUEREREbkImc1mYmJiiI6OBiA6Ohqz2Xza9ie3jYmJOW17ERGR+kIjz0RERERELkJeXl7lRo1ZLJbTTsH08vLCYrHY22rEmYiIiI2KZyIiIiIi1ciRtcPq6rpkdTVvERGRc6HimYiIiIhINXJk7bC6ui5ZXc1bROqu5cuXc+WVV5KRkUFAQABz587lscceIzMzs7ZTY9WqVdx///0kJCQwZMgQvvnmm3OKYzAYWLRoEcOGDavW/Cpzan/K6WnNMxERERGRauTI2mF1dV2yupq3iNSM0aNHYzAYuP/++ytc99BDD2EwGBg9enS1nvO2225j+/bt1RrzXE2cOJHu3buTnJzM3LlzazsdqQEqnomIiIiIVKPK1g6ranpi2bpkJ7d3dF2y2pj6WFfzFpGaExISwmeffUZeXp79WH5+PgsWLKBly5bVfj6TyUTTpk2rPe65SEpK4qqrrqJFixYXdBSX1WqluLj4gp2vJhUWFtZ2Cqel4pmIiIiIiIiInJeIiAhCQkJYuHCh/djChQtp2bIl4eHh5dqWlpYydepUWrdujclkolu3bnz11Vfl2vz444+0b98ek8nElVdeSUpKSrnr586dW65QlZSUxI033khgYCA+Pj5ccsklLF26tNxtQkNDefXVVxkzZgy+vr60bNmS//73v6e9XwUFBTzyyCM0bdoUT09P+vbty7p16wBISUnBYDBw+PBhxowZg8FgqHLkWWhoKC+//DJ33HEH3t7eNG/enHfffbdCu0OHDnHTTTfh5eVFWFgY3377rf265cuXYzAY+Omnn4iMjMRoNLJy5cpq6c9TWa1WpkyZQsuWLTEajQQHB/PII4+U65dnnnmGkJAQjEYj7dq1Y/bs2fbrf//9d3r27InRaKRZs2Y8++yz5Qp9/fv3Z8KECTz22GM0btyYgQMHArB582auu+46fHx8CAwM5M477+TQoUOnzfVCUPFMRERERERExJllp0Pa+gv3Lzv9nNIcM2YMc+bMsV/+6KOPuOeeeyq0mzp1Kh9//DHvv/8+W7Zs4fHHHycqKorff/8dgNTUVG6++WaGDh3K+vXrGTduHM8+++xpz52Tk8PgwYP59ddfiYuLY9CgQQwdOpTdu3eXazdt2jR69OhBXFwcDz74IA888ADbtm2rMu7TTz/N119/zbx584iNjaVdu3YMHDiQI0eOEBISwr59+/Dz82P69Ons27eP2267rcpY//73v+nWrRtxcXE8++yzPProoyxZsqRcmxdffJERI0awceNGBg8ezKhRozhy5Ei5Ns8++yyvvfYa8fHxdO3atUb68+uvv+att95i1qxZJCYm8s0339ClSxf79XfddReffvopb7/9NvHx8cyaNQsfHx8A9u7dy+DBg7nkkkvYsGEDM2fOZPbs2bzyyivlzjFv3jw8PDxYtWoV77//PpmZmVx11VWEh4fz999/8/PPP7N//35GjBhx2lwvBG0YICIiIiIiIuLM/p4Dv7924c7X71m4cpLDN4uKimLSpEns2rULsC2k/9lnn7F8+XJ7m4KCAl599VWWLl1K7969AWjTpg0rV65k1qxZ9OvXj5kzZ9K2bVumTZsGQIcOHdi0aROvv/56lefu1q0b3bp1s19++eWXWbRoEd9++y0TJkywHx88eDAPPvggAM888wxvvfUWy5Yto0OHDhViHjt2jJkzZzJ37lyuu+46AD744AOWLFnC7NmzeeqppwgKCsJgMODv709QUNBp+6dPnz72olX79u1ZtWoVb731Ftdcc429zejRo7njjjsAePXVV3n77bdZu3YtgwYNsrd56aWX7Lepqf7cvXs3QUFBXH311bi7u9OyZUt69uwJwPbt2/niiy9YsmQJV199tf2cZd577z1CQkKYMWMGBoMBs9lMWloazzzzDC+88AIuLrZxXGFhYfzf//2f/XavvPIK4eHhvPrqq/ZjH330ESEhIWzfvp327duftn9rkopnIiIict5yc3OJi4sjJSWF0NBQTCYTZrO5VtY0OjWX8PDwasvDkdjO1CciIlLH9bgHOlx34c7ne/oiUFWaNGnCkCFDmDt3LlarlSFDhtC4ceNybXbs2EFubm65ghHY1rwqm94ZHx9Pr169yl1fVhiqSk5ODlOmTOGHH35g3759FBcXk5eXV2HkWdeuXe3/NxgMBAUFceDAgUpjJiUlUVRURJ8+fezH3N3d6dmzJ/Hx8afNpzKn3ofevXszffr0KvPz9vbGz8+vQn49evSw/7+m+vPWW29l+vTptGnThkGDBjF48GCGDh2Km5sb69evx9XVlX79+lV62/j4eHr37o3BYLAf69OnDzk5OezZs8e+Bt6puzZv2LCBZcuW2UewnSwpKUnFMxEREanbEhIS6Nu3b7ljMTExRERE1Hou1ZmHI7GdqU9ERKSO8w0654LWhTZmzBj7SK/K1vTKyckB4IcffqB58+blrjMajed83ieffJIlS5bwxhtv0K5dO0wmE7fcckuFhejd3d3LXTYYDJSWlp7zeavb2eTn7e1t/39N9WdISAjbtm1j6dKlLFmyhAcffJB///vf/P7775hMpnOOe7KT7wfY7svQoUMrHRHXrFmzajnnudKaZyIiInLezGYz0dHRAERHRxMTE4PZbHaKXKozD0diO1OfiIiIXCiDBg2isLCQoqIi+yLwJ+vYsSNGo5Hdu3fTrl27cv9CQkIA2668a9euLXe7NWvWnPa8q1atYvTo0dx000106dKFoKCgMy6KfyZt27a1r8lVpqioiHXr1tGxY0eH4516H9asWWPfifhc1VR/gm1H06FDh/L222+zfPlyVq9ezaZNm+jSpQulpaX2NdVOZbFYWL16NVar1X5s1apV+Pr60qJFiyrPFxERwZYtWwgNDa1wX04ttF1oKp6JiIjIefPy8rK/+bNYLERERNTa9MRTc6nOPByJ7Ux9IiIicqG4uroSHx/P1q1bcXV1rXC9r68vTz75JI8//jjz5s0jKSmJ2NhY3nnnHebNmwfA/fffT2JiIk899RTbtm1jwYIFVe5iWSYsLIyFCxeyfv16NmzYwMiRI897RJm3tzcPPPAATz31FD///DNbt25l/Pjx5ObmMnbsWIfjrVq1iv/7v/9j+/btvPvuu3z55Zc8+uij55VjTfXn3LlzmT17Nps3b2bnzp1ER0djMplo1aoVoaGh3H333YwZM4ZvvvmG5ORkli9fzhdffAHAgw8+SGpqKg8//DAJCQn873//Y/LkyUycONG+3lllHnroIY4cOcIdd9zBunXrSEpKYvHixdxzzz2UlJScVz+dLxXPRERERERERKTa+Pn54efnV+X1L7/8Ms8//zxTp07FYrEwaNAgfvjhB1q3bg1Ay5Yt+frrr/nmm2/o1q0b77//frlF5Cvz5ptv0qBBAy677DKGDh3KwIEDq2WphNdee43hw4dz5513EhERwY4dO1i8eDENGjRwONYTTzzB33//TXh4OK+88gpvvvlmpaPzHFUT/RkQEMAHH3xAnz596Nq1K0uXLuW7776jUaNGAMycOZNbbrmFBx98ELPZzPjx4zl27BgAzZs358cff2Tt2rV069aN+++/n7Fjx/Lcc8+d9pzBwcGsWrWKkpISrr32Wrp06cJjjz1GQEDAaYtuF4LWPBMRERERERGRc3amUUzffPNNucsGg4FHH330tKOurr/+eq6//vpyx+655x77/0ePHs3o0aPtl0NDQ/ntt9/KtX/ooYfKXa5sGuf69etPm7unpydvv/02b7/9dpVtMjMzTxujjJ+fn310VmVOnuZYWez+/ftX2qY6+vNUw4YNY9iwYVVe7+npyZtvvsmbb75Z6fX9+vWrMFX0ZCfvwHqyshGEzkbFMxERERERqRdyc3NJSEggLy+v2nfNdTS2iIjUHSqeiYiIiIhI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bxGR2uLI66b+douInJlGnomIiIiIiIiIiFRBxTMREREREREREZEqqHgmIiIiIiIiIiJSBRXPREREREREREREqqANA0RERERERESOy83NJSEhgby8PFJSUggNDSU8PFwbKYjUYyqeiYiIiIiIiByXkJBAZGRkuWMxMTHa7VmkHtO0TREREREREZHjzGYzMTExREdHAxAdHY3ZbK7lrESkNmnkmYiIiIiIiMhxXl5e5UaZWSwWTdkUqec08kxERERERERERKQKGnkmNcrRxTZzc3OJi4uztzWZTJjN5krbO1NsERERERGpnxz5nCEidZOKZ1KjHF1sMyEhgb59+55Ve2eKLSIiIiIi9ZMjnzNEpG7StE2pUY4utmk2m8u1jYmJqbK9M8UWEREREZH6yZHPGSJSN2nkmdQoRxfb9PLywmKx2Nue7tsaZ4otIiIiIiL1kyOfM0SkbtLIMxERERERERERkSqoeCYiIiIiIiIiIlIFFc9ERERERERERESqoOKZiIiIiIiIiIhIFVQ8ExERERERERERqYKKZyIiIiIiIiIiIlVQ8UxERERERERERKQKKp6JiIiIiIiIiIhUwa22ExCp6xITE8nOziY+Ph7A/tPX15ewsLDzaq/Ylbd3hLPk7Sz3UXlXz3MwMTGxRvrEUTX5+JxLLs6SR009ls4U2xHV8ftQFx5LERERqX25ubnExcWRkpJCaGgo4eHheHl51UoeCQkJ5OXlVUsuKp6JnIfExETat29f7lhUVJT9/9u3by/3Bt+R9opdeXtHOEveznIflff5x66sfXX1iaNq8vE531ycJY8z5eJI3s4U2xHV+fvgzI+liIiIOIeEhAT69u1rvxwTE0NERESt5BEZGVnu2PnkouKZyHnIzs4GIDo6mtDQUHtFOyUlhaioKPv159JesStv7whnydtZ7qPyrp7nYNnl2bNnYzQaq61PHFWTj8+55lLX+sSRvJ0p9oXok5PbFxQUMHbsWKd+LEVERMQ5mM1moqOjiYqKIjo6GrPZXGt5xMTEEB8fXy25qHgmUg0sFgsRERH06dMHAJPJVG3tFfv8OUveznIfHW1fX/J2tH337t3t31xVZ584qiYfH0fV1T5xJG9niu2I8/l9iI2NrbY8HOVMz28RERE5My8vLywWC2D7O14bUzbL8jh5lNn55qINA0RERERERERERKqg4pmI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nF7/bEQ1DdRjV0Rr+shO+nJLut5Zs0drMsqe4L9p/wn5Ff938YWmjXwVEeKvyFB/RYS2UeTYvooIDVD2/u2687MX9OkT49WnT5zVS3mEqta+00Ut9ePcv+mGWQv1+ZfS26lFunhgE93eu+05t12eL697ZbI10XZVWfXFbCKspra1qqj05JlhGJo4caL8/P67POupU6d0zz33qFGj/85oL126tHp76ME27T+hO+at05GThWoe5KcMST2iGtd2twAAAADgnIT4++iOhHZ6adkOvbxsh67oFqEGdWTlzf3H8/TXj7ZKkjpHBOt/E2Pl+/vzqj3h9jBJenJ0V6XsPa5fD53UC98ckFR2Tv711gw995VDvx0um/xrF9ZIj46K1uVdW8jLq/br4+/TUNf2bq1re7fW++2LNX5+2cqlCQP6KjLUXy1C/OXvY361WIpXpiTVmd8zV4G+3vrr1V30+dOSYUhPf7ZNaUdz9deru5z1wgQ4fyo9eXbbbbed8bny513VR2t3H9VLH2Yqv6hEXSJD9EDvnrrstdruFQAAAABUjzsS2umtpN3afihHX2/N0BXdI2u7S+fs6MkCTXhzrY7klj2YfOborgr0/e9psSfcHiZJAb4N9drNsRr9apLW7zshSXrsg83aUVr2aKBmjXx1/8hOuqlfm7NeCKCmdQwvm2gcHh2u2PbNark3nqF8kuyOhLZ6d5f09po92nssT6/eHKsgv0pPz9QpxSWlSk3Pqu1uuFXp6sydO7cm+3HBeeazbfJp0VFDLm6u12+J1a9bN9V2lwAAAACg2oQG+uj2hLZ6eflOvbRshy7vemFffXayoFi3z1un347kOu8cCgnwqZDxhNvDynVqEaynx3TT/a/+KknacjBLIa1baNLgdrpnaAcF+/u4aQGealxclAYNiNT09zZoxfbD+sOcH/XWxL5q2djqCXd106miEt27IFlfrSybT3nms226VeEaEdNCoQGe9fvtmVPUHqq01ND8H3eX/b8h3dCntd68rU+9nSEGAAAAULfdMaidgvy85cjI0TfbDtV2d87avuN5Gv/GGm3an6UmgT56Zmy32u5SpVwf11qjukVIkkbGtNCKR4bpkcujmTirA67oHqn37o5XWJCfHBk5Gvvaam3ef36uwDpZUKx5v89tvJm0W/N/TNN32w5p28FsZeWfn+fa5xYU64556/T9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R40apRUrVujPf/6zunfv7vy66/7mlVdesd0uq7J/MsvabZeu+WnTpllul67Za6+91na7dM3fd999ltula/bRRx+13S6t3hOzWrpmp0+fbrtdmrVttV26HgtcddVVtrWsyrGDWdaulq75Dh06WNbSNXvppZfa1tKsL1a1dM12797dtpZW74lZLV2zvXr1sq2lWdtWtXQ9TuvSpYvtGFuV4zqzrN0Ya5a3GmNdsxEREbZjrFnbVmOsWdZujLV6T8xqaZa1G2PN8lZjbLnTj6UDAwNt61mV426zvF09XbNWtTTLOxwO23q6tm1VS6u8XT3N3hO741jXvF09XbN2tXQ9z8nJybGsZVXOiazyVrU0y9rV0jV/4sQJy1qatW1XS7O8VS2t3hOrWprlrWpplrWrpet56PTp0y33mVU9ZzXLW+0zXbPXXHON7fmla753796W+0yzftidX5rlrfaZVu+JVS1d89dee63lPtOsbav95emszi0jIyO1a9cu5eTk6NixY7aPlaqg0k9Hq0MefvhhY9CgQcbNN99cqQfkX3HFFUZkZKQxYMAAY+7cubbZt99+22jatKkxdOhQY+jQocbixYstsz///LMxePBgY9iwYcaoUaOMgwcPVqr/dg/1K/fFF18YsbGxxqBBg4xbb73VKCoqcvs9r776qjF48GBjyJAhxs6dO922P23atEr1t6ioyLjhhhuMIUOGGP379zdWr15tmU1PTzeGDRtmXHLJJcasWbMsc641Wbx4sREfH28MHz7c2Lt3r9v8Y489ZnTp0sXo3LmzMX36dMvs008/bTRs2NBZz8cee8y27Tlz5jizgwYNMlatWmXbj3JWC1Kcnn/22WeN2NhYY/DgwcbIkSPP+Dld2169erUxaNAgo1+/fqYPcHXNnzhxwvJ3yzX73HPPGf379zf69u1rzJkzx21+/PjxxvDhw42JEycaubm5zpzZ9mJXS7O8VS1ds/PmzbOtpVneqpZ227lZLc3yVrU0y9rV0ixvVUuzrF0tzfJWtTQbz1auXGnEx8cbAwcONDZs2FChbbP8iy++aMTGxhpt2rRxPuDVLLt//37Dx8fHGDhwoDF06NAzHiZr1vaYMWOMoUOHGvHx8cYHH3xgmy335JNPnvF+m+Xj4uKMQYMGGYMGDTI2btxom3U4HMawYcOM/v37G//617/ctl1SUmJ07dr1jDHcLPv2228bffv2NQYMGGD85S9/cZu///77jeHDhxvjxo0zDh8+fMbvi2H8d3/jbox1zduNsadn9+7d63aMPT2fn59vO8a69qOcu0V/4uLijIyMDNsx1rVtd2Osa95ujHXNuhtjXfNW26XZsYBdLc3yVrV0zbqrpWs+JyfHspZ2xzBmtXTN29XSrG27WprlrWpplrWrpVneqpaGceZxmt0Ya5a3GmPNsnZjrFneaow1y5YzG2PN8lZjrFnWbow1y1uNsWZZuzHWLO9ujHU9lrarp2vWrpau+eLiYtt6urZtV0uzfDmzerpm7Wpplrerp2vWrpZmebt6umbtaml2nmNVS7OsXS1d80lJSZa1NGvbrpZ252eutTTL2tXSLG9VS7OsXS3N8la1NMva1dLsPNRqn2mWtTv2cc3b7TNds+6OfezOn133ma5Zd8c+Zm1b7TPNsnbHPmZ5q32mWdZqf1mZeYKtW7cagwYNMuLj441vvvnGtH9mvAzDzSUjAAAAAAAAQD1V727bBAAAAAAAACqLyTMAAAAAAADAApNnAAAAAAAAgAUmzwAAAAAAAAALTJ4BAAAAAAAAFpg8AwAAAAAAACwweQYAAAAAAABYYPIMAACgilasWCEvLy+dOHHCNte2bVu9+OKLNdqXefPmqXHjxjX6GtVt2LBhmj59utvckCFDtHDhQufHXl5e+uijj87ptbdt26bWrVsrNzf3nNoBAAD1B5NnAACgTpo4caK8vLzk5eUlX19fdezYUU8//bSKi4vPue2BAwcqPT1doaGhkqwnsNatW6e77rrrnF/Pzvjx4/Xrr7/W6GvUhk8++USHDh3SjTfeWK3tdunSRQMGDND//M//VGu7AACg7mLyDAAA1FmjRo1Senq6duzYoYceekgzZ87U888/f87t+vr6KiIiQl5eXra55s2bKzAw8Jxfz05AQIDCw8Ortc2SkhKVlpZWa5tV9fLLL+v2229XgwbVf7h6++23a86cOdUykQoAAOo+Js8AAECd5efnp4iICF100UW69957NXLkSH3yySeSpOPHj2vChAlq0qSJAgMDdcUVV2jHjh3O792zZ49Gjx6tJk2aqFGjRuratau++OILSRVv21yxYoVuv/12ZWVlOa90mzlzpqQzb9vcu3evxowZo6CgIIWEhOiGG27QoUOHnF+fOXOmevXqpXfeeUdt27ZVaGiobrzxRuXk5Fj+jK5XvZ1LG5988om6dOkiPz8/7d27VwUFBXr44YfVqlUrNWrUSP3799eKFSuc33f06FHddNNNatWqlQIDA9W9e3ctWrSoQtu5ubmaMGGCgoKCFBkZqRdeeMGyH+UOHz6s5cuXa/To0Wd8LT09XVdccYUCAgLUvn17/ec//3F+LS0tTV5eXlq8eLEGDhwof39/devWTStXrqzQxqWXXqpjx46d8XkAAAAzTJ4BAIB6IyAgQIWFhZLKbuv85Zdf9Mknn2jNmjUyDENXXnmlioqKJElTpkxRQUGBVq1apc2bN+u5555TUFDQGW0OHDhQL774okJCQpSenq709HQ9/PDDZ+RKS0s1ZswY56TNt99+q99++03jx4+vkNu1a5c++ugjffbZZ/rss8+0cuVKPfvss1X6Oc+mjby8PD333HP697//ra1btyo8PFxTp07VmjVrtHjxYm3atEnXX3+9Ro0a5ZxkPHXqlOLi4vT5559ry5Ytuuuuu3Trrbdq7dq1znYfeeQRrVy5Uh9//LG++eYbrVixQikpKbZ9SUpKUmBgoGJiYs742l/+8heNGzdOGzdu1C233KIbb7xRqampFTKPPPKIHnroIa1fv17x8fEaPXq0jh496vy6r6+vevXqpR9++MHtewkAAOBd2x0AAACoaYZhaNmyZfr66681bdo07dixQ5988olWr16tgQMHSpLeffddRUVF6aOPPtL111+vvXv3aty4cerevbskqX379qZt+/r6KjQ0VF5eXoqIiLDsw7Jly7R582bt3r1bUVFRkqS3335bXbt21bp169S3b19JZZNs8+bNU3BwsCTp1ltv1bJlyzRr1qxK/7xn00ZRUZFef/119ezZU1LZVXJz587V3r171bJlS0nSww8/rK+++kpz587V3//+d7Vq1arCROG0adP09ddf6/3331e/fv108uRJvfnmm1qwYIFGjBghSZo/f75at25t2/89e/aoRYsWprdsXn/99Zo0aZIk6ZlnntG3336rV155Ra+//rozM3XqVI0bN06SNGfOHH311Vd688039ac//cmZadmypfbs2WPbDwAAAInJMwAAUId99tlnCgoKUlFRkUpLS3XzzTdr5syZWrZsmby9vdW/f39ntlmzZurcubPzKqY//vGPuvfee/XNN99o5MiRGjdunHr06HHWfUlNTVVUVJRz4kwqe3h948aNlZqa6pw8a9u2rXPSS5IiIyOVmZlZpdc6mzZ8fX0r/HybN29WSUmJLr744gq5goICNWvWTFLZs9H+/ve/6/3339eBAwdUWFiogoIC53Pedu3apcLCwgrvc9OmTdW5c2fbvuTn58vf39/0a/Hx8Wd8vGHDBsuMt7e3+vTpc8bVaQEBAcrLy7PtBwAAgMTkGQAAqMOGDx+uOXPmyNfXVy1btpS3d+UPfSZNmqTLL79cn3/+ub755hvNnj1bL7zwgqZNm1aDPZZ8fHwqfOzl5VXlh/efTRsBAQEVFkA4efKkGjZsqOTkZDVs2LBCtvz21eeff14vvfSSXnzxRXXv3l2NGjXS9OnTnbfGnq2wsDAdP378nNpw59ixY+rQoUONvgYAAKgbeOYZAACosxo1aqSOHTuqTZs2FSbOYmJiVFxcrJ9//tn5uaNHj2r79u3q0qWL83NRUVG65557tHTpUj300EP6v//7P9PX8fX1VUlJiW1fYmJitG/fPu3bt8/5uW3btunEiRMVXtNT9O7dWyUlJcrMzFTHjh0r/Cu/PXX16tUaM2aMEhMT1bNnT7Vv316//vqrs40OHTrIx8enwvt8/PjxChmr187IyDCdQPvpp5/O+Nj12WinZ4qLi5WcnHxGZsuWLerdu7ebdwEAAIDJMwAAUA916tRJY8aM0eTJk5WUlKSNGzcqMTFRrVq10pgxYyRJ06dP19dff63du3crJSVF33//vekD7KWy2yRPnjypZcuW6ciRI6a3A44cOVLdu3fXLbfcopSUFK1du1YTJkzQ0KFD1adPnxr9ec/GxRdfrFtuuUUTJkzQ0qVLtXv3bq1du1azZ8/W559/Lqnsffz222/1448/KjU1VXfffXeF1UODgoJ055136pFHHtHy5cu1ZcsWTZw40fRZZqfr3bu3wsLCtHr16jO+tmTJEr311lv69ddf9eSTT2rt2rWaOnVqhcxrr72mDz/8UA6HQ1OmTNHx48d1xx13OL+elpamAwcOaOTIkefyFgEAgHqCyTMAAFAvzZ07V3Fxcbr66qsVHx8vwzD0xRdfOG95LCkp0ZQpUxQTE6NRo0bp4osvrvBQ+tMNHDhQ99xzj8aPH6/mzZvrH//4xxkZLy8vffzxx2rSpImGDBmikSNHqn379nrvvfdq9Oc8F3PnztWECRP00EMPqXPnzho7dqzWrVunNm3aSJKeeOIJxcbG6vLLL9ewYcMUERGhsWPHVmjj+eef1+DBgzV69GiNHDlSgwYNUlxcnO3rNmzYULfffrvefffdM7721FNPafHixerRo4fefvttLVq06Iwr95599lk9++yz6tmzp5KSkvTJJ58oLCzM+fVFixbpsssu00UXXXSW7wwAAKhPvAzDMGq7EwAAAMDpMjIy1LVrV6WkpFR6kistLU3t2rXT+vXr1atXL9NMYWGhOnXqpIULFyohIaEaewwAAOoqrjwDAACAx4mIiNCbb76pvXv3Vmu7e/fu1eOPP87EGQAAqDRW2wQAAIBHcr0FtDqUL3oAAABQWdy2CQAAAAAAAFjgtk0AAAAAAADAApNnAAAAAAAAgAUmzwAAAAAAAAALTJ4BAAAAAAAAFpg8AwAAAAAAACwweQYAAAAAAABYYPIMAAAAAAAAsMDkGQAAAAAAAGDh/wNdEhNCmlP/BgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pb.visualize_base_sequence_quality(result)" + ] + }, + { + "cell_type": "markdown", + "id": "5126c39b", + "metadata": {}, + "source": [ + "##### Performance Benchmarking\n", + "| Implementation | Target Partitions | Time |\n", + "| -------------- | ----------------- | ----- |\n", + "| fastqc-rs | - | 22.9s |\n", + "| polars_bio | 1 | 9.0s |\n", + "| polars_bio | 2 | 7.8s |\n", + "| polars_bio | 4 | 14.9s |\n", + "| polars_bio | 8 | 7.4s |\n", + "\n", + "- The measured execution time is for the algorithm to run on file ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR194/ERR194147/ERR194147.fastq.gz, which contains about 8,240,000 records.\n", + "- The `fastqc-rs` execution time applies only to the base sequence quality task (pieces of code relating to other tasks have been removed for the purpose of this comparison).\n" + ] + }, + { + "cell_type": "markdown", + "id": "9886c394", + "metadata": {}, + "source": [ + "#### Usage example - .csv file" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "66c3af24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (101, 7)
posavgq1medianq3lowerupper
u64f64f64f64f64f64f64
030.13531.033.034.026.538.5
131.2131.034.034.026.538.5
232.01531.034.034.026.538.5
335.6935.037.037.032.040.0
435.6835.037.037.032.040.0
9631.31532.034.035.027.539.5
9730.6731.034.035.025.041.0
9831.5532.034.035.027.539.5
9931.2532.034.035.027.539.5
10031.10531.034.035.025.041.0
" + ], + "text/plain": [ + "shape: (101, 7)\n", + "┌─────┬────────┬──────┬────────┬──────┬───────┬───────┐\n", + "│ pos ┆ avg ┆ q1 ┆ median ┆ q3 ┆ lower ┆ upper │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ u64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "╞═════╪════════╪══════╪════════╪══════╪═══════╪═══════╡\n", + "│ 0 ┆ 30.135 ┆ 31.0 ┆ 33.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 1 ┆ 31.21 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 2 ┆ 32.015 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 3 ┆ 35.69 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ 4 ┆ 35.68 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 96 ┆ 31.315 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 97 ┆ 30.67 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "│ 98 ┆ 31.55 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 99 ┆ 31.25 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 100 ┆ 31.105 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "└─────┴────────┴──────┴────────┴──────┴───────┴───────┘" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pb.base_sequence_quality(\"example.csv\").sort(by=\"pos\")" + ] + }, + { + "cell_type": "markdown", + "id": "5ab1da41", + "metadata": {}, + "source": [ + "#### Usage example - .parquet file" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a2cb9c97", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (101, 7)
posavgq1medianq3lowerupper
u64f64f64f64f64f64f64
030.13531.033.034.026.538.5
131.2131.034.034.026.538.5
232.01531.034.034.026.538.5
335.6935.037.037.032.040.0
435.6835.037.037.032.040.0
9631.31532.034.035.027.539.5
9730.6731.034.035.025.041.0
9831.5532.034.035.027.539.5
9931.2532.034.035.027.539.5
10031.10531.034.035.025.041.0
" + ], + "text/plain": [ + "shape: (101, 7)\n", + "┌─────┬────────┬──────┬────────┬──────┬───────┬───────┐\n", + "│ pos ┆ avg ┆ q1 ┆ median ┆ q3 ┆ lower ┆ upper │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ u64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "╞═════╪════════╪══════╪════════╪══════╪═══════╪═══════╡\n", + "│ 0 ┆ 30.135 ┆ 31.0 ┆ 33.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 1 ┆ 31.21 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 2 ┆ 32.015 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 3 ┆ 35.69 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ 4 ┆ 35.68 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 96 ┆ 31.315 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 97 ┆ 30.67 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "│ 98 ┆ 31.55 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 99 ┆ 31.25 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 100 ┆ 31.105 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "└─────┴────────┴──────┴────────┴──────┴───────┴───────┘" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pb.base_sequence_quality(\"example.parquet\").sort(by=\"pos\")" + ] + }, + { + "cell_type": "markdown", + "id": "b519abbd", + "metadata": {}, + "source": [ + "#### Usage example - `polars.lazyframe.frame.LazyFrame` object" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1899ca01", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:polars_bio:Table: example registered for path: ./example.fastq\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "200rows [00:00, 212477.41rows/s]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "shape: (101, 7)
posavgq1medianq3lowerupper
u64f64f64f64f64f64f64
030.13531.033.034.026.538.5
131.2131.034.034.026.538.5
232.01531.034.034.026.538.5
335.6935.037.037.032.040.0
435.6835.037.037.032.040.0
9631.31532.034.035.027.539.5
9730.6731.034.035.025.041.0
9831.5532.034.035.027.539.5
9931.2532.034.035.027.539.5
10031.10531.034.035.025.041.0
" + ], + "text/plain": [ + "shape: (101, 7)\n", + "┌─────┬────────┬──────┬────────┬──────┬───────┬───────┐\n", + "│ pos ┆ avg ┆ q1 ┆ median ┆ q3 ┆ lower ┆ upper │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ u64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "╞═════╪════════╪══════╪════════╪══════╪═══════╪═══════╡\n", + "│ 0 ┆ 30.135 ┆ 31.0 ┆ 33.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 1 ┆ 31.21 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 2 ┆ 32.015 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 3 ┆ 35.69 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ 4 ┆ 35.68 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 96 ┆ 31.315 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 97 ┆ 30.67 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "│ 98 ┆ 31.55 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 99 ┆ 31.25 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 100 ┆ 31.105 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "└─────┴────────┴──────┴────────┴──────┴───────┴───────┘" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_lazyframe = pb.read_fastq(\"./example.fastq\")\n", + "print(type(a_lazyframe))\n", + "pb.base_sequence_quality(a_lazyframe).sort(by=\"pos\")" + ] + }, + { + "cell_type": "markdown", + "id": "cdb4aad6", + "metadata": {}, + "source": [ + "#### Usage example - `polars.dataframe.frame.DataFrame` object" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "7830b8aa", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:polars_bio:Table: example registered for path: ./example.fastq\n", + "200rows [00:00, 177236.59rows/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "shape: (101, 7)
posavgq1medianq3lowerupper
u64f64f64f64f64f64f64
030.13531.033.034.026.538.5
131.2131.034.034.026.538.5
232.01531.034.034.026.538.5
335.6935.037.037.032.040.0
435.6835.037.037.032.040.0
9631.31532.034.035.027.539.5
9730.6731.034.035.025.041.0
9831.5532.034.035.027.539.5
9931.2532.034.035.027.539.5
10031.10531.034.035.025.041.0
" + ], + "text/plain": [ + "shape: (101, 7)\n", + "┌─────┬────────┬──────┬────────┬──────┬───────┬───────┐\n", + "│ pos ┆ avg ┆ q1 ┆ median ┆ q3 ┆ lower ┆ upper │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ u64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "╞═════╪════════╪══════╪════════╪══════╪═══════╪═══════╡\n", + "│ 0 ┆ 30.135 ┆ 31.0 ┆ 33.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 1 ┆ 31.21 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 2 ┆ 32.015 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 3 ┆ 35.69 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ 4 ┆ 35.68 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 96 ┆ 31.315 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 97 ┆ 30.67 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "│ 98 ┆ 31.55 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 99 ┆ 31.25 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 100 ┆ 31.105 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "└─────┴────────┴──────┴────────┴──────┴───────┴───────┘" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_lazyframe = pb.read_fastq(\"./example.fastq\")\n", + "a_dataframe = a_lazyframe.collect()\n", + "print(type(a_dataframe))\n", + "pb.base_sequence_quality(a_dataframe).sort(by=\"pos\")" + ] + }, + { + "cell_type": "markdown", + "id": "ddf5da9d", + "metadata": {}, + "source": [ + "#### Usage example - `pandas.core.frame.DataFrame` object" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "56817174", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:polars_bio:Table: example registered for path: ./example.fastq\n", + "200rows [00:00, 74651.67rows/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "shape: (101, 7)
posavgq1medianq3lowerupper
u64f64f64f64f64f64f64
030.13531.033.034.026.538.5
131.2131.034.034.026.538.5
232.01531.034.034.026.538.5
335.6935.037.037.032.040.0
435.6835.037.037.032.040.0
9631.31532.034.035.027.539.5
9730.6731.034.035.025.041.0
9831.5532.034.035.027.539.5
9931.2532.034.035.027.539.5
10031.10531.034.035.025.041.0
" + ], + "text/plain": [ + "shape: (101, 7)\n", + "┌─────┬────────┬──────┬────────┬──────┬───────┬───────┐\n", + "│ pos ┆ avg ┆ q1 ┆ median ┆ q3 ┆ lower ┆ upper │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ u64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "╞═════╪════════╪══════╪════════╪══════╪═══════╪═══════╡\n", + "│ 0 ┆ 30.135 ┆ 31.0 ┆ 33.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 1 ┆ 31.21 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 2 ┆ 32.015 ┆ 31.0 ┆ 34.0 ┆ 34.0 ┆ 26.5 ┆ 38.5 │\n", + "│ 3 ┆ 35.69 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ 4 ┆ 35.68 ┆ 35.0 ┆ 37.0 ┆ 37.0 ┆ 32.0 ┆ 40.0 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 96 ┆ 31.315 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 97 ┆ 30.67 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "│ 98 ┆ 31.55 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 99 ┆ 31.25 ┆ 32.0 ┆ 34.0 ┆ 35.0 ┆ 27.5 ┆ 39.5 │\n", + "│ 100 ┆ 31.105 ┆ 31.0 ┆ 34.0 ┆ 35.0 ┆ 25.0 ┆ 41.0 │\n", + "└─────┴────────┴──────┴────────┴──────┴───────┴───────┘" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_lazyframe = pb.read_fastq(\"./example.fastq\")\n", + "a_pandas_dataframe = a_lazyframe.collect().to_pandas()\n", + "print(type(a_pandas_dataframe))\n", + "pb.base_sequence_quality(a_pandas_dataframe).sort(by=\"pos\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/example.csv b/docs/notebooks/example.csv new file mode 100644 index 00000000..852077c0 --- /dev/null +++ b/docs/notebooks/example.csv @@ -0,0 +1,201 @@ +name,description,sequence,quality_scores +SRR9130495.1,D00236:723:HG32CBCX2:1:1108:1330:1935/1,NCAATACAAAAGCAATATGGGAGAAGCTACCTACCATGCTTAAAAACGCCAATGAGCAGNGATTTGTCANCNNNNNNNNCNNNNNNNNTNNTANNANNCTC,"#4BDFDFFHGHGGJJJHIIIIGGIIJGJJGIIIIBHIJJJIIJIJJIJDHIGGGIJJJI#-@AEHGEFF#,########,########+##++##+##+2<" +SRR9130495.2,D00236:723:HG32CBCX2:1:1108:1472:1938/1,NGTCAAAGATAAGATCAAAAGGCACTGGCTTACCTGATTAAGAAATTGTGTAGTCCAACATCAAAATACNTNTNNNNNAGAGNCANGNCAAGCNNANNAAT,"#1=DDDDD>DHFH@EFHHGHGGFGIIIGIGGGGIIGIIDDCHIIIIIID@FEGGGIIIIICHIIIIIIG#-#-#####,,;;#,5#,#,,85@A:AB@8>@:@A@9(:((+(834" +SRR9130495.6,D00236:723:HG32CBCX2:1:1108:2392:1965/1,CGATAAAGGACTTTCAGTCAACCAACTAGATAATGACCACTGGGCACCCATTCATTATGCATGCTGGTAAATAAATTATTCTGTTCAGGAACATTGAACTC,CC@DDDBDFFHHHJJIJJIIJIJJJIIIHGIGGHCGGIGHHAACC??A<" +SRR9130495.11,D00236:723:HG32CBCX2:1:1108:4089:1977/1,CATTCCAACCAGCCGCTTAAAGTTTCTAAAAGAAGCTGGTCATGGAACCCAGAAGGAGGAGATACCTGAGGAGGAATTAGCAGAGGATGTTGAAGAGATTG,CCCFFFDFHHHHHJIJJJJIIJJJJJJJJJJJIIGJJJIGHGIJJIJJIJJIIFHGHIJJGHEHHFCEFFDEDDBDDDDDDDDDDDBACDDDDDDDDDDDD +SRR9130495.12,D00236:723:HG32CBCX2:1:1108:6197:1936/1,NCTTAAAGGCAAGGTGCTCGGCTTCCGCTATCAAGACCTCCGACAGAAAATCCGGCCTGNGGCTAAAGANCNNNNNNNNANNNNNNNNCNNGGNNCNNGGC,"#1BDFDEFGHHHHIJJJJJJIJJJJJJJJJJIJJIGIJJIJJJIJJJJHIJJHHHFFDC#,;?BBDDDD#,########+########+##++##+##++8" +SRR9130495.13,D00236:723:HG32CBCX2:1:1108:6415:1939/1,NTGTGTATGGGGATGAGGAAGGATATTAATATGTTCTATTTGAGATTTAGGGATTACATTTGTTTTTGCNCNCNNNNNTTTTNTCNTCATTTGNNGTNAAT,"#1:ADDDFHGGHFGGBHIGGIIJJEIIIJJIJIJJJFGJIIHGHGDGHJGHIHIIIIJJIIHFHIIJJJ#-#-#####,,;?#,;#,8?DDEE##,+#+2<" +SRR9130495.14,D00236:723:HG32CBCX2:1:1108:6361:1952/1,TCAGATCTTATTTTAATAGTTGACTTTACCTCTTCTTTGACTTCCTCTTCCTCGGTCTCAGTAGATATAGATGGTACCTTGGGCTTATGCCATGAGATCTG,CCCFFFFFHHHHDHIIIIJJJJJJJJJJHIIIJJJJJJJIHJHJII>GHIEGHIIIIJJJIJJIHHIJJJIJIGHIJJGJJHFHHFFDCFFEDCEDCCDEC +SRR9130495.15,D00236:723:HG32CBCX2:1:1108:6263:1960/1,CAATATCTGACTGAATGGGCCCATTTTCATAATATTCTGAAACTGTTCATACATGTCTCGCAATGTAAACTGACCTGAAATGCAATACAAAAAAATTCAGA,CCCFFFFFHHGHGGGIIIIJJIJIJJIIIIIIIIEIHGGIEGGHGIJJIJJJCECGHIIIJJJJJIFGHIIHGIIJJHHGEFHDFFFFFCCCDDBBCCDCA +SRR9130495.16,D00236:723:HG32CBCX2:1:1108:6338:1988/1,AGACACTAAAATGCCATGTATGAGACTACATAGACATACCAATTTACAACACAAACACATGAAATATACATGAGAAAACATTAACTTACTTCCAGTTGGGA,C@CFFDDDHGHHHIIIIHJJIIHIHGIJJJJJIJJJIJIIHEHIIJJJJJJIJJIIIIIJJDHIJIJGIJIJJIJJHHGGHFFFFFFFEEEDCCC@ACCBA +SRR9130495.17,D00236:723:HG32CBCX2:1:1108:6742:1944/1,NGAAACACTCTTTTTCTGGAATTTGCAAGTGGAGATTTCAGCCGCTTTGTGGTCAATGGTAGAAAAGGAAATATNTNCATATAAAAACTAGACAGAATGAT,"#1BDFDFFHGHGHJJJJJJJJHIJHHIJIIJJIJJGIJJIJIIJJGIJIHIJJJIIJJJHIEIIJJJJIHDEFH#,#,5=ADEEEDCDDDDDDDCDD5@CD" +SRR9130495.18,D00236:723:HG32CBCX2:1:1108:7076:1942/1,NGTCTAAGAATGAAGTGCTTATGGTCAACATAGGCTCCCTGTCGACAGGAGGAAGAGTTAGTGCAGTCAAGGCTNANTTGGGCAAAATTGTTTNNACCAAT,"#1:B:BDDHHFFHIEGGIGIDEHGEEGIGHIIIFACHIGIGCFGEHIGGHHGHGH@DCGGIDEIIIIFFHHAEE#,#,5=@BBC@BCCCCCCC##,+8?BC" +SRR9130495.19,D00236:723:HG32CBCX2:1:1108:7440:1957/1,CACCTGATGTCCCACAGTCCTCATAGACACTAGCACTGACTGCTGGCCATCGTCTCAGCCAGATGATGTTGACCTGCTAGCTTTTCAATTAAATTATTAAA,+=144=DD>D4CCD?E@AECFFIIIIEI?E+??;3EBDECEIBEECDIEIIADDDDEIDCDCA;=A@CECE7ACD=(;;A@DA@A@A:ADAAAD>AADBB> +SRR9130495.20,D00236:723:HG32CBCX2:1:1108:7363:1977/1,ACTCATAGAGTTGAAGATTCCCTTTCATAGAGCAGGTTTGAAACACTCTTTCTGGAGTATCTGGATGTGGACATTTGGAGCGCTTTGATGCCTACGGTGGA,CCCFFDDDFHHHHJJJIJJJJHHIIHGIJIJJJIGGHGIJIJJIIIJJJJJIJIGBFDHIIJIJGIJIGGCHGGIJHIIHHHFECDECEEDCDDCBD9?B? +SRR9130495.21,D00236:723:HG32CBCX2:1:1108:7298:1979/1,AACCGTCGCCAGGTACCATCCCAGAGAACTCTGTCTTCCTTACTTATAGCCAAGTTGCCGGCAGATCACAGCTGCATGCTTATCGGTCCATCCGTCATCGC,BCCDDDFFGGFGFJIBBHHIJJIIHHIIIGJIIHIIJJJIIEIGHJIIJJJJIIHHGIJFGHGFDDCEECDDDDDDDDDDEDDDDDDDBDEDDDCCC +SRR9130495.23,D00236:723:HG32CBCX2:1:1108:7307:1995/1,TAATTTGGTATATGTCTTTTTAAAGGCATTTTTATTAGATATTTCCTTAATTTACATTTCAAATGTTATCCCCAAAGCCCCCTATAATCTACCCCTGCCTT,;?7DD?;DBFHHFIA;A@AABBB@B?2<58+:?<<9<@: +SRR9130495.25,D00236:723:HG32CBCX2:1:1108:7870:1955/1,CTATCCCGTCGGGTGACTGTTTCCTGCTTTGCAGTTATTCAGTGGCAGAGCGTGGCGCTCTAATTTCTGCTTTCCTCTTTCCTGCAGATTGTGTGCTACAT,CCCFFFDFFHHFHBHGJIIIHGIIIJJIJIIIIJHIIIIEIJJIIJJJJIJIJIJDFEDDDCEEEEEEDDDDDDDDCDDDCDDDDDDDCDDDCDDDDDDDD +SRR9130495.26,D00236:723:HG32CBCX2:1:1108:8157:1994/1,GAAGTGCTCTTCGTTACTACTTAAATCCCCCTGGGCATGTTTCATTATTTTACAATTTGTGCAGAACCCTATCCAAACACACATGGAGTACAAATGACTTC,CCCFFDDDDHHDHHIGIIBIHHHJJJ@FGGA?@CCCCCC@CCCDD +SRR9130495.27,D00236:723:HG32CBCX2:1:1108:8703:1937/1,NATAAAAAAATAACATCCTTTCCTCCTAATAGCTTAATTATTTGAAAAAAAATATTTTCNAATCACATGNANNNNNNNNTNNNNNNNNTCTTTNNTNNCCT,"#1=DFDDDHHHHHIIJJJJJFIJJJIGIEGIIJJJHHIJJJJJIIJIIIIIJEHEHHHA#,;??AEDDC#,########,########++8??##+##(+2" +SRR9130495.28,D00236:723:HG32CBCX2:1:1108:8702:1991/1,CTCAGAGATTAAAAATGAATAACGCCTGCCGGCCAATGAGCGGACTCACAGTCCCTGTTTGTTTGTAAGCTAGGTGATTTTCAATCCACAGGGCAGGCTGA,@@@DFDFFGGDHFGIIBGEHJIIIBGIIIJJIIJIJIIFGGEGIJJJHGGHHHDCFFDDDEDEDDDDDCDDDCBDDACDEDEDDDDCCCCDGII@GIFGFE???BFBBEHIGGIEEHIHIGGHHGIHA3?CH;?@CB@DCCEDEDD3 +SRR9130495.34,D00236:723:HG32CBCX2:1:1108:10535:1962/1,AATACAGAAAAGTTAAGAGCCAGCCCCAGGCGGATTGGATGAATAGGTTGCATCTCTTTCTTGCTTATATCAAATGCCTCTTGGCAGGCTCCTTGGGAATT,???BD:A:3=?B:;?;;CA;;;A3-5>5-5:(::@8/2?8?9>>3(83(+ +SRR9130495.35,D00236:723:HG32CBCX2:1:1108:11147:1968/1,GCTGCCTTCTCCCCTCAAGGATGCAGTGGAAGTGTCAACCTGGAGAAGATGCTACACGATGCAGGAGGTGAACTCGGCCCTCAGTAAAATCCAGCTGGTGG,CCCFFFDFHHHGHJFEGIHEGHIGIIGCCGGGIIJJIJJGGGGHCGIF>DGHIIIEHHGIIJJDBGHFHFCCFFFDDCDDDDBDDDCCDEDA:CACD@CDD +SRR9130495.36,D00236:723:HG32CBCX2:1:1108:11124:1986/1,GACAGGGTTTCACCATGTTAGCCAGGACGGTCTTGATCTCCTGACCTCGTGATCCGCCTGTCTCGGCCTCCCAAAGTCCTGGGATTACAGGCGTGAGCCAC,CCCFFFFBFFFHGGHGHIHIIGIJFJJJIJHIIIFGHGGIIGEGHIH@@FGGIJIIGGIHIEEHEEFFDDCCCCBDDACCDCDBAACCDDDBDDDDBDDCC +SRR9130495.37,D00236:723:HG32CBCX2:1:1108:11773:1947/1,TACCTGCCTCTGCCTCTCGAGTGCTGGGATGAAAGATGTGCACACCCCCACCACCACCACCACCACTGCCTGGCNCNGTTTTTGATTTCTTATTCTCCAGA,"CCCFFFFFHGHHHJIJIJIIEHIJJIJJIJJIHIHJJIGFIIIIJBHHGFF>HGIJIEHHHFGDEEEEEECC?B#,#,,5?@HF1CGBGHCDDFF7=DEG.?AAC?3@EED;6@;>(-;@AC?31(,5?(4::A>AC" +SRR9130495.46,D00236:723:HG32CBCX2:1:1108:14226:1948/1,AACCTGCACCCAGAATGGCAGGAGGTCCTGGTGGCCCAGGGGGTCCTGGTGGTCCAGGAACACCAGGTCTCCCANANCCAGGTGGCCCAGGCAGGCCTGGA,??1D1BDDHFHHBBHGGGAFG)AF1:?CEGD@BGAFDGIGGB'5;CE77?=???>>CC3#+#++228>>28((2(>ACC?CCDDCCD@ +SRR9130495.48,D00236:723:HG32CBCX2:1:1108:15049:1993/1,TGACCAAGAACTCACAGAGATCCCCCCCCCCAGGGCTAAGATTAAAGGCATGTGCCACTGCCACTGGATAGATATTATCTTTTATTTTACCTGACTGGTTG,@CCFFDDDHDFHGJJJJIJGIHHHIIJJIJFE=(5;?@>@A@;@C>CAB=@<:@C@CA:>CC3:>CB<@@?344>>@@A>CDC>ACDD:>4>>>ACD?CC( +SRR9130495.49,D00236:723:HG32CBCX2:1:1108:15487:1951/1,ACGGAGGGTGGGGCTGGGTGATTGTGGTTGTCTCCTTCTTCACCCAGTTCCTCTCTTACGGATCCCCGTTAGCTNTNGGGGTCTTGTATGTAGAATGGCTG,BCCFD@DFDFHHGDGIIICGHIIJJIJGHIIJIIJJJIJIJIJEHIGHHHHHHHFFFFFFDDCDDCD@DDDDD:#+#+2<@8GHIIIEHGACFHIIGGIBHIIHHC??BDC@BBCECDCE63>@@CACCDD@ +SRR9130495.51,D00236:723:HG32CBCX2:1:1108:15923:1957/1,CCGCAACTGCCATGGAGCCACAGCCTGGTCCGTAATAGATGCAAAGCTTCTCAATAGTCAGGGGCGTGGTTTCGCGCAGCTTGGAGGCCAGCAACAGGCAG,CCCFFFFFHFHHHIIFIIIGIIFIIGJIIJJIFHGHIIIIIJIIFIJIIIJJJJJJJGGIGJFFH@?BBBDBCDDDDDDDDDDDDDDDDDDDDDDDDDDD? +SRR9130495.52,D00236:723:HG32CBCX2:1:1108:15793:1968/1,GTTTTTCCACAGACCTCTGATCTCTTACATTCGAAAGTTCTACTACTATGATCCTCAGGAAGAGGTGTACCTGTCCCTAAAGGAAGCGCAGCTCATTTCCA,BB@FFFFFFFHGDGFHJJJJIFIIGGG@FIIIGIBGGDHIIIJCHIIJJDHIIJJJIIIGIIJJFHHIJCHGDHIIHHHHHFFFFFDDDDDDCDDDDEDDE +SRR9130495.53,D00236:723:HG32CBCX2:1:1108:16082:1968/1,GAAACTTGTTTGTGACGTGTGTATTCAACTAACAGAGTTGAACCTTTCTTTTTACAGAGCAGCTTTGAAACACGCTTTTTGTAGAATCAGATCGGAAGAGC,@<@ADDDECBFFHIFEGDG;EEHHB@FHGHIIGGEHGGHGGEGEGICGCEFFDB@D>AE>ADC@CBBFGIIJJJJIHHIJJGH?DGGHCFHHIJJEEIIJAHIJJFG=FGGGIFHHIIDHGEHIHHHHGHGEB;?CDCECEEDD +SRR9130495.55,D00236:723:HG32CBCX2:1:1108:16048:2000/1,AGGACAGGAAGGACGCTTTGAGATATGATTTCACAGGCGACAGTGAGAGAAAACCAATGTCTTTAATGCATTTCTCTGCAGCATGTGACAAACTTTCAACA,CCCFFFFDFHGHHIIJJJJIFGGIJJIIIIJIJIHJIIJIHGIJJIJGGIIJIJJHHHHEDCDFFFEEEDDEDEEDDDDDDDDDDCDEDDCDDDDDDCCD@ +SRR9130495.56,D00236:723:HG32CBCX2:1:1108:16580:1970/1,GCCTGTACTCCCAGCTACTTGGGAGGCTGAGACAGGAGAATCACTTGAACCCAGGAGGTGGAGGTTGCAGTGAGCCAAGACCGGGCTATTGCACTAGATCG,@@@FFD?DBFFHHIIEHCIJIFIJHEDCH@GGEBFHHIJJIIIIIJJJJJIFHFHF@G-6@AAEDFFF>AEC@@A?;=?BCD6/<@>BAAC>:@C:CDDA? +SRR9130495.57,D00236:723:HG32CBCX2:1:1108:16594:1971/1,TCCTCTGACTTTGACACTAGTGTTGACCTTGCATGAGGAGATGTTCTCCATTTGGACTAACCTGATGTACACAGACGTTACACTTATCACAGAATACCATA,CCCFFDDFFHFHFHIJIJJIHIIIJJJJJIJJJJIIIIHIGIIJJJIGIIJJIIJEHIIJIJJJIGIJJJEIHJJIIHHEFFFFFFCCEEEEDCDDDDDDC +SRR9130495.58,D00236:723:HG32CBCX2:1:1108:16808:1998/1,ACCAATTTTCCCCTCCCCTTCCTCCCTCCCTCCCAGCCCCCTTCCTCTCTCTACCTCCTGTTATTGTTTTGTTCCTTGTTCTATGTAGGATTGAAGCATCT,@@@FFDDFHDFHGIJJJJIIGGDFHI>DGC;DHI9??FHIJIIHG>>3>;ACCCC9:@>@:>AA +SRR9130495.59,D00236:723:HG32CBCX2:1:1108:17428:1967/1,TGCATGGTGCTGAAAGCTTTGTTGCAGCTTTTCTTGGGATTGCTTAGCTGCTCCGGGTCGATCCACTTGCAGATGAGCTCTTGCTTGATGCACTGCTGCCG,?<A3>A>>AAAA?3 +SRR9130495.60,D00236:723:HG32CBCX2:1:1108:17508:1988/1,TTGTTCAGAAAAAAGTATCTTGAAACCAAAAGAACTGGGATCTTGTTAAATGCAGATTCTGTTCATTAGGTATAGGTATGCAGTCTTACAAAATGAGGTAG,CCCFFEFFHHHHHJJJJJJJJJJJJJJJJJGIJJJJJJJIIJJJJJJJJIJJIJJJJJJJJJJJIJJIIIEHHBHGHHEFFFFFEEEEDEEDDCDCDDCDC +SRR9130495.61,D00236:723:HG32CBCX2:1:1108:18425:1951/1,CCACTTAATAAATCACCTATCAAGTTGAATTATTTGTGCAAAGGCACTAGGCTGAATAGAGACCACTCAGTAGCNTNTTTTTAATCTTGCTAAGAAAGAAT,CCCFFDDFHFHHGJIIJJJJJJHGHEHHHIIJIJJIJGJIHIJHEFDHGHIFIJJGHIJJJFIGGIHIIIJIII#-#-5@DFFEEEDEEEDEDDACDCCBC +SRR9130495.62,D00236:723:HG32CBCX2:1:1108:18468:1964/1,CTATTGACTTTTATTAGAAAGGGTCTTGTTGCATAGGTAGGTCTTTAACAACCATCTCTTAAAGGGCTGGGATTGCCAGAGTAGGCCAACACGCCCAGCTA,CCCFFFFFGGHHGIGIJIJJIIIJJJJIJJIJJJJIIJDGEHGIIJJJIJJJHIJJIGFHGIJGEGIJJJIIHHHHHHFFFFFEDEEDDDDDDDBDDBBD@ +SRR9130495.63,D00236:723:HG32CBCX2:1:1108:18615:1941/1,NAGCCGAGAGGCGCCGGCTCACCTGCCTGGGTCCCGGCCTTTCTCCTGCAGTGCCAGGGATTCACCTGANGNCNNNNNNTCTNCTAGGCAAGCNNATNCTT,#1:DDFDDHHHHHIIJIIFGJJIEFHHIHHIIIJJIEHFFEEEEEEE?DFF;5:AAB9>29(#+#++8++4>>:@>AA:@1<@@A(:4? +SRR9130495.72,D00236:723:HG32CBCX2:1:1108:1440:2047/1,GCTGGTGCAGGACACCAGAATCCGCTCGATCATGCTCCCTAGAGAGGAGGGGCACAGTGAGTACACATAAGCACATGTACACACACACCCAGGACCCAAAG,CCCFFFDEHHGHHHIIIIIIIIJJIJJJGEGHIJIJJJJIIJGHIIJJJIDFEDFFFFEEEEDEDDDDDDDDDDDDDEEEEDDDDDDDDDDDDDDDDDDDA +SRR9130495.73,D00236:723:HG32CBCX2:1:1108:1468:2080/1,ACTGTCTTTTTTTTAAAACAGGTGATTGCCCGTTGATTGTTCAGTTTGCTGCTAATGATGCAAGACTTTTATCTGATGCTGCCCTGCTAGTCTGTCCCTAT,CCCFFDDEHFFDHIEIIJHGCGFHCIIHIIIHH@FGGIHIGHIJJIJGIIIJBHIGEIHGHHGGHFFFFFFEEEEDEDDDDDDDDDDDCDDDEDDDDDDDD +SRR9130495.74,D00236:723:HG32CBCX2:1:1108:1333:2084/1,ATGAGCACACAAGGGATGATCAGATTGATGGTGTAGAAGAGTGGCTTGCGCTTGATGATGAAGTCATAGGTCACGTCCACATAGCTGGGGTCCTGTGGGTT,CCCFFFFFHHHHHJIJHDIIHHHIIJIIJJJJJIJJIIJIJJJIBDGIJJJJIJJJJGIIIJIAHEEHEFFFFF>EDCDDDDDCDDCDDDDDDDDDCDDDD +SRR9130495.75,D00236:723:HG32CBCX2:1:1108:1447:2137/1,TCCACTTGTACAAAAAATTACAAAAATTAGCTGGGCATGGTGGCACACACCTGTAGTCCCAGCTACTCGGGAGGCTGAAGTGGCAGGATCACTTGAGGCAG,CCCFFEFFHFHGHJJJJIJJJJIIDIEHJIIJJJIGJJJHGJIIDHIDGIJIJJIGHIJJJJJHHHFEEBDCDBBDDDDDDDDDDDDDDDDDDDDDCDDD@ +SRR9130495.76,D00236:723:HG32CBCX2:1:1108:1499:2151/1,GAGAAAAAGCATCCCTTTAATAAGGCCGCCCCGGTTCCAAATCAATCCTGGCATTGCAGGAGGCAAGGGGGAAACACAGCCACGAAATTGGATTAGCTCTT,CCCFFFFFGGHHHJIIJHIEIJJIIIIJIIGJJIHJIJJIGIJJJIIJJHHHHHFFFFFFDCDBDDDDDDDDDDDCDDDBDBDDBBDDDDDCDDDDCDDCD +SRR9130495.77,D00236:723:HG32CBCX2:1:1108:1280:2166/1,GCCTTCTTCCCAGCAGCAATATGGCTCTTTCTTCAGCTCTTATCAGTCACATCCATCAACGAGTGGCTTTTAAAAGGGTATGTTTAAACCTTTTGACGGGA,CCCFFDEFHHHGGJIJJIJIJEIJJJJJIFGIIIIIIIJIIGIJJGIIBHIJJJJIJIEH>CG;CHCHGHICHFFFFFFDDC;@CCEEDDCDDCCDDDDDB +SRR9130495.78,D00236:723:HG32CBCX2:1:1108:1458:2216/1,TTTCTTTCCACACATCCCACCTAACACCCAAACTAAGCACTCAGTGCTTGGAATCTCCCCACCCATTCCCTCACCCCTGCTCTTCCATCATTTCCTCCAGC,CCCFFFFFHHHHHIDHIIJJJJHIIJFHIJIJIGIJHGIIIIGJEHIGIIJCGEEHJJJJJJJDHEHHGFFFFFDCDDDDDDDDDDDECCDDEEEDDDDDD +SRR9130495.79,D00236:723:HG32CBCX2:1:1108:1634:2001/1,TGTGCATTTCTCATTTTTCACGATTTTCAGTGATTTCGTCATTTTTCAAGTCGTCAAGTGGATGTTTATGATTTTCCATGATTTTCAGTTTTCTTGCCATA,CCCFFFFFHHHHGJJJJJJJJIJHGIJJJJIIIIJJIGIIJJJIJJJIIFIIJJJJJIJJJIJIIIIIIJIJGJJJJFHHGGHGFFFFCEFFDEEDEEDDD +SRR9130495.80,D00236:723:HG32CBCX2:1:1108:1566:2120/1,GGACGAAGTAAGGGAGGAGCAACTGACAACATTCATCTTGTCTGTCTCCTCCACGTCCCGAGGTACAAGGCGGATGTCATTCTTACTAATTTTTTTCTTCT,CCCFFFFFHHHHHIIJJJJIJJJIJJJJJJJIFIJJJIJIJIJIIJJIJIJJJJIJJIIJHHFFEEEEEDDDDDDDCDEDEDEEDDDEDDEECDDDDDDDD +SRR9130495.81,D00236:723:HG32CBCX2:1:1108:1863:2047/1,AAATTCGGACCCCTTGGGTGGAATATTCCTTACGAATTCAATGAGACAGATCTAAGAATCAGTGTGCAGCAACTCCACATGTTCCTGGACCAGTATGAGGT,@BCFFFFFHHFHHHIJIJGIIIJIJJJJIIJJIIIIJJJJGIJJJIJJIEGIIGIJIJJJEGHHHGEEHFFFFDEEEDDDDEEEDDDDDDDBBCDDCCCCC +SRR9130495.82,D00236:723:HG32CBCX2:1:1108:1844:2145/1,TAACTCTCTGCCTGCGATGTCCCTACCTTCCAGAATGGTGCCATGACAACGGTGTCAACTACAAGATCGGAGAGAAGTGGGATCGGCAGGGAGAAAATGGC,@CCFFFFFHHGHHJJJJJJJIJJJJJIJIIIHIIIJIIJJJJIJIIJIJJJJJJJJJIJJIIJEHHGHHFDFDDDDDCDCDDDDDDDDDDD?>BDDDDDDD +SRR9130495.83,D00236:723:HG32CBCX2:1:1108:1772:2188/1,GAGGTAGGGGTGTGTGTGAATGGGTGAGTGTGTGCCTATGCTTGTATGCCATATGAGAGAAAATGCAGCATTTAAAATCAGTGGTTAACGGCCAGCACAGT,B@BFDFDDHHDDHHGIGIJIJGIJ:CFHHIGGIJJIEHGIIIJIIIFHGIJBHIJJJJJJCHHIHHHHHGFDFFFFEEEECEEDDDDDDDDDDBDDDDDCA +SRR9130495.84,D00236:723:HG32CBCX2:1:1108:2103:2085/1,TACAAATGTGCCAGGCACTCTTCTAAGTCCTCACATGCATGAAGTTATACAACTCTACAACAAACCTAGGAATATAAACTGAGGGCAGGGACCCCCAGCAA,CCCFFFFFHHHHHJIJIJJJJJJJJJJJJIJJJJJJIJJJIJJJFHIJJJJIIJJJJJIJIIHIICHHIJJJIIIJJHHHFHHFDDDDDBDDDDDBDDDDD +SRR9130495.85,D00236:723:HG32CBCX2:1:1108:2067:2091/1,ACCAGCCCTGCTGCCACCCAGCCCACGTCCCGCGCGCCACCCATGCTGCTGCCTCGGAGCTGCAGGGAGCCGGGGAGCCAGGGCCACACGCAGGTGCAGCT,?@@D?A:BF8DDFFFFFFFFAECBF@GFECAEFIIIIIIFBE?DBBD;@CCCCBBBBBB@B::AABBBBBB7>BBB>@BB?B>B>BB?/?A?BCCCBDDDD>@ +SRR9130495.87,D00236:723:HG32CBCX2:1:1108:2387:2038/1,GGCTAACCACTGCCTTGTCAAGTTGTGTAGAGTGAGATTCAGGGGTGTTGAAGTAATGTCCTTGTTACTTGCTGTAGGGCATCTGTTTTCTGTGTATCCCA,CCCFFDDDDHGHGJEIGHHIJIHGGIIHGIIIIIEGBEHGGHIGGAFHIJJJJJJJJIDGHIIGIJJJIIHGFHEHFDFEDCEECDCDDACCCAACDFCCC +SRR9130495.88,D00236:723:HG32CBCX2:1:1108:2285:2075/1,CTGAAAGCTGAGCGTGAGCGTGGTATCACTATTGACATCTCCCTGTGGAAATTCGAGACCAGCAAATACTATGTGACCATCATTGATGCCCCAGGACACAG,?;@DDBDDDFFD>ACGED@D8@):E*::??FFC@;FEF>E;CC=CC=@DDD>?;>A>A>A;AB3;A(;@:??DFBCB4<CCD@=BB@-(4812>>> +SRR9130495.93,D00236:723:HG32CBCX2:1:1108:2748:2098/1,CATCATCTTTTTTTTTTTTTTCTCCTGAAAACTGTCTAGTAGTTTGATATATTTTGTCCGAGGTTATTTCAAGTGTTTTTTTTTTTTTTTTTAAAACGGTG,@@@DDDDDHHHHHIIFEHIIH8))7)7CEF9).)7;;>B@>9BD;;(6(55>DDDCBCC@/8-084@CC>C(((+4>?CBBBBBBBBBBB>&23:A(5?(( +SRR9130495.94,D00236:723:HG32CBCX2:1:1108:2733:2156/1,GACTGAGAAGAACAGAAAGGGAGAGAGAGGCCAATGGAAATACATGAGAAGGGAGAGAGGGAGAGAGAGGGAGGGAGGGAGGGAAGGAGGGGGAGAGGGAG,CCCFFFEFGHHHHJJGIIIJJHIIHHIIJJJJJIJIIHGJJJGIJJJJJJJJJHGGHHIHHHFDFCDCDDD>BDDBDDDDDDD>BDD?BDDDDBDBDBD@D?ABD@BD?BBDDDC +SRR9130495.96,D00236:723:HG32CBCX2:1:1108:2818:2076/1,ACACTTCATGGCAACCTGGCTTAGATTCTTCAAAATTTCTGATCCTATACCAAAGCCTCTGTAATCACTCATCACGAAGAAGTCTTCAAGATACAGTAACT,CCCFFFDDHGHHHJJJJIIJIIHIJHGCHIFEGGJJJJIJIGIIJJJIIJCEHIIIIJIBGHGGIIJIIBFGGGGHHGHFFFFDEEDECEDDDDCD>CCDE +SRR9130495.97,D00236:723:HG32CBCX2:1:1108:2848:2112/1,AACCTCTTCTCTTTGTCTTTCTCTTTATCCTTCTCCCTCTTGCCAGGACTGGACTCGCTGGTGATGGTGACGACGCTGGTGGGTAAGGTCTGCGCCCGACT,@@BFFFFEHGHHGIJDEHIJIIIIIIJIFHIIIJEIDHIIIIJJIIIGIEIIJJIIIJFEHFHIIIGIIJIFBEDDBD>=?BB@CACCCAACDDBDBB5;6@;ACBCCCC?@AA>C>?<<<9)?FHFCAG=GFFG>FGGEGHIEEBEDEFC>C@::=BB@BCACCC@CA3:(8@C<8?CC +SRR9130495.100,D00236:723:HG32CBCX2:1:1108:3014:2117/1,CCCTCCTGAAAAGGTCCAGCTCCAAAGCCTGACCCGTAGCTGCAGAGAAGAAAGCTTTTCCTCTAAAGGCTGAGGAAAAGATGAAAAATCACTGCTAGAAC,CCCFFFFFHHHHGIJIJJJJJJJJJJJJJJJIJJJIJJIJJJJIJGIDHHIIIJJIJJJJJIJJJHHHHHFFFFDEEEEDDDDDDDDDDDDDDDDDDDDDD +SRR9130495.101,D00236:723:HG32CBCX2:1:1108:3316:2011/1,GCAGAGCTGAATGGGCAAGCCCAGGACCCTTTTCAGACATTCTGCTGGCCTTTGGAAAGTGTACTCCTGTTGTATTTGATTACTTTTAGAGGACAGTACAT,CCCFFDDFHHHGHJJJJIJFGIGHJGIJIIIIIHIIGIIJIIIIJJJIIIIJIIIGIJGIJJJJIIJJJEEEE?ECFFFFFFCCEDEEEDDDDDDDDEDCD +SRR9130495.102,D00236:723:HG32CBCX2:1:1108:3264:2036/1,GGGTGCTGGAGATAGCCCACGTACACTCCTTCTTGCTGGGGTACTTGTCAGGCCAGTTGGGGCTGGTGATGGTGCCACTGGTGGATGTCACCTTGTGTTCA,"=@<=B+AD>BFDFIIDEDGEIGFIIIIIICDFGFFGIII;D?F>?*/9BF>DAF;CFFGI>/:=?>7@BAA:;@5=A5>@=,98?:>@(;:4>ABAB?ABD" +SRR9130495.103,D00236:723:HG32CBCX2:1:1108:3400:2065/1,TCTGTCTGTCACCAGGTTGGAGTGCAGTGGTAGGATCATGGCTCACTGCAGCCTCGTCCTCTTGGGTTCAAGCAATCCTCCTGCCTCAGCCTCCCAGGTAG,@@BDFFFFHHHGHIJJFHEG@GHHIIAFD@HGGGEHIJJJGIJJGGGIHFDAHHHHJFCGGGHGJI;CHFCEDDFFFCEDEEDDDDDDDD<C +SRR9130495.104,D00236:723:HG32CBCX2:1:1108:3468:2219/1,TGCACTTCGTTCTCTTAATGAAACCCTTTGACTTAACCATGACTCCGCTCTGCTCTTGAGTTTGCAAGTGTGTGCGAGTGCCCGAGAGACAGTTTTTTTTT,CCCFFEFFHHHHHJIJIIJJIIJJJIIJJIHIHJJJJJFHFHIIJIJJJJIJIJJJJJGGIIJJJGDIJJJIHHHGFFDDEEEDDDDDDDCCDCEDDDDDD +SRR9130495.105,D00236:723:HG32CBCX2:1:1108:3722:2006/1,TCCATAGTTTCGCAGAAGACTTGGAAGGATGTTGATGTATATGCAGGTCCATTATCAGTTTTTAAATTAGATGGTTTTCCCCAAGCTGCCCATGCGTCTAA,CCCFFFDDHHHHHJJIJJIIHGHIGIIDFHHIIIHHIJJIJJIJIJJJJJJIIJJIJG=DHHJJIJIIIJJJJJIGHGHHFFBFDDEEEDDDDDDBBDDDD +SRR9130495.106,D00236:723:HG32CBCX2:1:1108:3517:2148/1,CTCTGTTCTGTTCCATTGATCTATATCTCTGTTTTGGTACCAGTACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAACGTGA,CCCFFEBFHHHHFGGGIEEHIIJIJJIJJIIJIJJHIIJIIJJIIFHGIIIIJJJJJJFIJIJJJJGIIJIJCHIJIJHGJIJHHHHHHFFFFFFEEDECA +SRR9130495.107,D00236:723:HG32CBCX2:1:1108:3927:2234/1,CTGTGCTCTATGTACACGCCCATCTGTTTGCCTGACTACCACAAGCCGCTACCACCGTGCCGTTCCGTGTGCGAGCGCGCCAAGGCCGGCTGCTCGCCGCT,@C@FFFFFHHHHHJJJJGIIJIJJIJEHIIGHGJJIJJJJJJIIGHHIJIJIGHJIIJIHHGFFDEDE?BBDDBDCDDDBDDDDBDD>BDBDDDDBDDDB< +SRR9130495.108,D00236:723:HG32CBCX2:1:1108:4124:2011/1,GACTCAGAGCCAGGGCCCGGGAACAGAGATGACTCGAAGGCTAGGGCTCCAGCCAGACTTACCGGCACACGTACACCTCTAGGGGTGGCAGGGTGCTGGGT,CCCFFDDEGGGHHIJIIIJIIIIJIHHJJIJIIJIJIGGIIGIIHIGGIGHBHGHFEFFEECEDDDDDDDDBDDDDDCBACCDDDDDDBDDDDDDDDCD?9 +SRR9130495.109,D00236:723:HG32CBCX2:1:1108:4130:2090/1,TTCTATTTCTATAAACTGGCCTATTTTGGGTATTTCATATATATGGAAATATATAATTTGATTTTTTTGTTCTCTTAGCTGTATGTTTTCAGGATTCTTTC,@BBFDFFFHHGHHIJJJJJJJIIIJJJJIJJJIJJJJIJJIIIJJJIJJJJIJIIJJJJJJJJJIHJIJJHHHHHHFFFFFFEEEDECEEDDDDDCDDEDD +SRR9130495.110,D00236:723:HG32CBCX2:1:1108:4176:2091/1,AAATTGAAAGTAAATGTATACTGTAGTCCCACGCACGAGTGAATAAAGGGGTGTCTAAAAGGAGTGTGTTCTCTTCCAGGCTGCATCTCTCGGTACTCAGC,;8;ABD?+AA=ADBHIGBHE?ACCCCC +SRR9130495.111,D00236:723:HG32CBCX2:1:1108:4108:2121/1,ATGCGGAAGTAGGCAAAAATGATGTGCTAGACTACAAGAATTCCTTTTACAGAAAGTAACAAATACAGAGCCAAGAAAGTTTTTGTTAATTATCACGGTGT,@@@ADADA@AD>FIIBBBFGIBGHJDCIGEGGGHHHIJIIJJJJGHIIEHHEGHJIHGGGIFAGGGGIIG>=CHHFD?@;CCEDDDDCDD>>ACDCB@8<5 +SRR9130495.112,D00236:723:HG32CBCX2:1:1108:4384:2110/1,ACACAGGCAGCAATGATGTCTTTACTTCTTTATTTTTTTCGACTTCATCTACAGAGCTTAGCACAGCCATTGGAACAAAATTGGAGCTCAGTGCACAGTTA,@@@FDEFDDFF3CCF?FHCH@DEEGEFHIIFGBGGGDGIHAFBGDDHHIBAGGDGHE@CHAHBFFFFBDD +SRR9130495.115,D00236:723:HG32CBCX2:1:1108:4445:2247/1,TCTGTATTCTGTGTCATCTGCCATTCCTTGACTCCCTGCGCCCTTCAGCCCACAGGAAACGTGTGGATGACACACGAGGAGATGGAGTCTCTGACGGCAGC,CCCFFDDDHHHHGJJJJIJJJJBHHJJIIGIIJJJIIGIFIJJIIIIGIJJIIIJIJCHIIJJJIHHFHEFFFFDDDDDBDDCDDCDCDDDDCCCDBBDDB +SRR9130495.116,D00236:723:HG32CBCX2:1:1108:4698:2005/1,GAGGGAAGGAGGGAGGGAAAGAAGAAGGGAGAGAGGGAGGAAGGCAGGACTGTCGATGCAAGTACCTCGCTTCCTTGTTCTTAACTCATTTGATTCTTGCT,C@BFFFFFGHHGHIIIJJIBGGDHC@FEGDHIIIHGEHHEGCGIHHHFFFFDEEDDDEDDDDCDCCCDDDDDDDDDDDDDEDCCCDDDCDDDED:CCDDDD +SRR9130495.117,D00236:723:HG32CBCX2:1:1108:4588:2182/1,CTGGGGTGCAGTGGTGCAATCATAGCTCACTGCAGCCTCAATTTCCTAGGCTTAAGCATTTCTTCCACCTCAACTTCCCAAGTAGCCAGGATTACAAGCAC,CCCFFADDFFHHGGHHGIIJIJJJJJJHIIJIJJIFIJJEIIJIJIGIJIJJJJJJIJJJIIHIIJHIIFFHGHHFFFFFEDEECCCCBDBDDDDDDCDBC +SRR9130495.118,D00236:723:HG32CBCX2:1:1108:4964:2029/1,CCCCGTCTCTACTGAAACACACACACACACACACACACACACACACACACAATTAGCCAGGCGTGGCAGCGTCTGCCTGTAGTCCCAGCTACTCAGGAGGC,;8=:DDDDFFFAFIIFFBEIIEFIFIFIEFFFIIBEGEF?BF<4;A@EE/?;AB>7;7;>@?>B?''5<@;@?;0((4:@>34@@>:4<@>BAB@(948&+ +SRR9130495.119,D00236:723:HG32CBCX2:1:1108:4831:2078/1,GCGAAGAAAACTGAAAAAGGTGGAAAATTTAGAAATGTCCACTGTAGGACGTGGAATATGGCAAGAAAACTGAAAATCATGGAAAATGAGAAACATCCACT,CCCFFFFFGFHHFFHGIHDICFHIGGIDHIIJJJJIIIIIGIGHGIJJJJJJJJJJJIJJJIJJIHHHHHFFFFFEEEEEEEDDDDDDDDDDDDDDDDCDD +SRR9130495.120,D00236:723:HG32CBCX2:1:1108:4877:2117/1,GCATAATGTTGCCACTGCACTCCAGCTGGGACGACAAAGACTGTCTCTAAAAAAGTAATAAATAAATAAAAGTTTGAAATGCATTGTCCTAGGTTTTAGTC,CCCFFDEFHHHHHIIJJJJJIJIIIGIJJJJJJIIJIJJJIJJJJJJJJJJJJJIIHHGHHHHHFDFFFFFEEEEEEDDDDDCEEDEEDDDDDCDDDDDDD +SRR9130495.121,D00236:723:HG32CBCX2:1:1108:4918:2158/1,AAACATGTCAATGGCCAAAAAAAACAGACAATCAAAAAATGGACAAATATATGAACAGACATTTCTCACAAGAGGACATACAAATGGCCAGCAAATATATA,CCCFFFFDHHGHHIIJIJJJIIIJJJJJJJIJJIJJJIIJJJJIJJIJJIHGFHHHHFFFFFEFEEEEEDDDDDDDDCDDDDDDDCCBCDDDDDDDDEEEE +SRR9130495.122,D00236:723:HG32CBCX2:1:1108:4939:2211/1,CCTGGTCTCAGCATTCCTCACACGTCATAGCGAGGCCCATGGCTGTAGAAATCCCACCATTCTCTTCTCCCCAGGCCTGGCATCCGTAGAAGCCTACAGCT,@CCFFFFFHHHHDHIDIHIJIJJJJJIGGEGIJIIGIIIJJJGGIJJJJIGGHGIIIJJGHHHHHFFFFEFDEDDDDDDBDDDDDDDDD?CDDDDDDDDAC +SRR9130495.123,D00236:723:HG32CBCX2:1:1108:5169:2188/1,TCTGACCCCATGTCCTCAGGCCAGAACCCGGGAGCCTGTCAGAAAAGGTCTCTCACCTAGAGTCCATGCTCTGGAAGCTCCAGGAGGACCTGCAGAGGGTG,??@DD?DFHDFHFIIIIGFHEGGDFFHIBHGIAFIGGIIIFI@CHE@FGH@CDGGIFHEEFCCED@DEEEECCCCCCCCCCCCCCBB8ABC?ACAAABBBB +SRR9130495.124,D00236:723:HG32CBCX2:1:1108:5192:2231/1,ACTCTCCTGGCCCACGAGAGAGTCCACACAGGAGAGAAACCTTACCAGTGTCATGAGTGCGGCAAGAACTTTAGTCAGAAATCCTACCTTCAAAGCCATCA,CCCFFFFFHFHHGJJGEFGHGIIEIIFJJJIHGIJIIJIIIJIIGIEHHIGIHIJIIJIIBDFDDDDDDDDDCDDDCCDDDDDDDCDDCDDDDDCDDDDDA +SRR9130495.125,D00236:723:HG32CBCX2:1:1108:5408:2041/1,TGTGTGCATCCTCATGTGTCCTTGATAAGTGGTGTGATAAATGAAGGCTTTGCCACATTCCTTACACATGTAGGGCTTCTCTCCAGTGTGAGTCCTCTCAT,@@@DDDEBFHHHHIIIHIFHIDHIIIJHHJIHEGFIIHIJJIIJJEIJGHHIEIEGIIJIJJJGIGHGJJIIGIGIHJEHHHHHFFEFFFCC@CEEDDDDE +SRR9130495.126,D00236:723:HG32CBCX2:1:1108:5351:2057/1,CTCTATATATTTTAACAAATGCATAATGTCATGTGTTTACCATTACAGTAGGATAAAGAACAGTCTCATTGCCTTAAAAAGTTCCCTAACATTTTAATTGT,CCCFFDEDFHHHHJIJIIJJJIJJJHJJJJIJIIIHHIJIJIJJJJIIHIJJIIJJJJJIJJJJJJIJIJIJIIJJJJJJJGGIGHHFHFFFFFFFEEEEE +SRR9130495.127,D00236:723:HG32CBCX2:1:1108:5475:2108/1,AGCCCAGAAGGCTGGACACACCTCCCCCTCACCCCATCCCGCTCCCCAATCAACCCAGTCCTCAAGAAGCACACTGTGGCTGCTTGCTCTCTTGCCCCCCT,CCCFFDFFHGHGHJJIJJJIGIIIHIGIIJIIJJJIJJJHGIJIJIIIJHHGHHFFEDEEEECCDDDDDDDDDDDDDDDDDDDDDDDDDDCCDCDDDDDDB +SRR9130495.128,D00236:723:HG32CBCX2:1:1108:5542:2138/1,TGGCTAGCTACTGCTGCTGCTGCATCAAAGCCCAAATATTCACTGGCATCAGCTGTTTTGTTCTTTAGCATATTAGTAAAGTGCTCATTTAGAGACATCTT,@CCFFFFFHHHHGJIJJIJJJIJJJJJJJJJJJJJJIGGIJJJJJHJJJJJJJJJHIEIIJJJIIJJJIJIIJJJJHHHHHHHF@DFFFFEDEEEEDDCDD +SRR9130495.129,D00236:723:HG32CBCX2:1:1108:5707:2147/1,CCAGCATCACTCATGGAACCGGAGGCACTAAGGCCCCTCGGGAGACGCTGAGCAGGTGGGTAGAGGCATACTTCTGGGAGATGGCATCAAGAGCCAGTCAA,CC@FFDDFFDHG>FFFHGGIJIEIIIHIGIGHBHCEHGGGFH@FHGIHHFBFDEEDDEDDDDBDC?BBDCDDDDDC:?A?BDDDCCDC>ACDDDBDDACCC +SRR9130495.130,D00236:723:HG32CBCX2:1:1108:5614:2168/1,AAACCATGTCTCTACTAAAACTACAAAAATTAGCTGGGCAACATGGTGGGTGCCTGTATCCCAGCTACCTGGGAGGGTGAGGCACGAGAATCACTTGAACC,CCCFFFFFHHHHHIJJJJIJGJIJJJIJJJJIJJJJJIJJJJIJJHIIHJIJJJJJJJJJJJJJJJJGHFHHF@DDDDDDDDDDDDDDDBDDDDDDDDDDD +SRR9130495.131,D00236:723:HG32CBCX2:1:1108:5985:2027/1,GCGGCAGCGGCCGCGATGGAAGAACTTACGGCGTTCGTCTCCAAGTCTTTTGACCAGAAAGTGAAGGAGAAGAAGGAGGCCATCACGTACCGGGAGGTGCT,CCCFFFDDHHDGHFIJFHFFHHBFGHGEIJJJFFDDDDDDDDDDD@CCDCDDDDDAAACACDC@CCDBBBDBD@ +SRR9130495.132,D00236:723:HG32CBCX2:1:1108:5816:2071/1,TTTACATATAAGAACCTGATGACCTTTTGTTTTTGTCCAGGAGAGTCCTTCTTGTCTACGAAATGCAGCTATCACAGCAGCTGGACTTGTTTCCTGAATGC,C@CFFDDAFFFHHHHHHGFIHJIJFHHHCAAEHIGHJGCCGHIHEHJJJEHGIIIFIGBBAEHGIJIGIIHHEHHHFFFFEECCABCDCCCCACDDACDA: +SRR9130495.133,D00236:723:HG32CBCX2:1:1108:5835:2081/1,CCAGGGCTCCAAGGGGCTGGTTACGAAGTGTCTCCTGCTGCATGAGGTCCCCACGGGAGAGATTGTGGTCCGCCTTGACCTGCAGTTGTTTGATGAGCCGT,@CCDDDFFHHHGHGJGJFHIEHIGCGHIGJGIIIJJJJJJJJJIIIEIJFGIJJIJGCCDDBDDCDDDBDDDDCDDDDDDDD>BACDDDEDDCBD +SRR9130495.134,D00236:723:HG32CBCX2:1:1108:5841:2101/1,GGGCATGGTGGCATGCGCCTGTAGTCCCAGCTATTCGGGAAGCTGAGGCAGGAAAATCTCTTGAACCCAGGAGGCGGAGGTTGCAGTGAGCCAAGCTTGCA,@CCF?BDDHFHGHIIIIIIIIIGHGHHIIIFIIIIIGGFGGIIIIEFGGEGHCD>CGGFHHHGGHFFFCDDADDDDDDDBDBCDCCCCA@CCCCBDDDDDD +SRR9130495.135,D00236:723:HG32CBCX2:1:1108:6165:2044/1,TTTATACCATTTTTTTTTTTAGCATATATCCTTGTACTTTATAGGAATTATTTGCTTTATTCTCTTGTGACTTGTAAATTGATGTACTTAATTAAATCTTT,"@@CBAB;DHFFHHIGIIGGHGFF@?BGB@8=FHEGHIGD=@CGHIA;@EHFHGHBFFFCBD;>(>@A@C>>;>CA;;35>@3;>5>,;3>:;(:@:>:@@C" +SRR9130495.136,D00236:723:HG32CBCX2:1:1108:6059:2069/1,CTATGACCGCTATGTTGCCATCTGTAGCCCACTGCTTTATAACACTGTAATGTCCCACAAGGTCTGTTCCATAATGATGGCTGTGGTATACTCACTGGGCT,CCBFFDBEHHHHFEGIIGHGIIIJIIHIJIFIJJJJJJJJJJIIJJIJJJJIIHHIJIIIFIHIJFIGIIIHGGHHHHFFFFDEEEEEDEFEDDDCDDDBC +SRR9130495.137,D00236:723:HG32CBCX2:1:1108:6161:2181/1,ATGAAGCAACAACCTTATAGGCATTTTAACTCATAGGTTTTAAAACTTAAGGTTATTTTCATAGGAGTCCCTTTTAGCAGAAATGCTCACCACAGGACCAG,@@CGGDD@4???BDHCH@GH<=FHGEGGGIGCEG@E7ACH@:77?C@A@CBAA???2FFFIGIIGIIIIFDADBDDDDDDDBBBBBBCDD@CDDDD?BDDDDDDCDDBDDDBDDDCCCCCBBCCCDCCCCDDAC>ABDDDCDDDDA@C +SRR9130495.144,D00236:723:HG32CBCX2:1:1108:6837:2146/1,CCTGTTATTTTAGTTGTTAAAGGTGGCATTCTGTTCTTGTGGCTGTCTTCTTTTAGGTTTGTTGAGGGATTACCTTCTTGTTTTTTCTAGGGCATTGTTCC,BCCFDDFDHFDHFGIIIIJIGIIJJIDGHIJIIJJJJJJGFIIIHFHHIJJJIGDGIGHGHIJICHGGEHGCHGFEHFHHFDDDDDDDDDDDC?CDDDDCC +SRR9130495.145,D00236:723:HG32CBCX2:1:1108:6804:2189/1,TGAATCTCTCTTGGCCTCCTCCCCTCTCATGTCCCCTCCTCCCTCCTCTCCACTTACTCCTCCTCCTCCCCTCCCTCCTCCCAGATGGTTCTGTGTCTTTT,CCCFFEFFHHGHHJJJIJJIJJJJIJJJJJIJIFIJIGIIGGJIJJIIIIIGIIJIJIJGIIIJIJJHHHFDFFDCDCCDDDCDBCCDCDDD@ACCCDDDD +SRR9130495.146,D00236:723:HG32CBCX2:1:1108:6940:2229/1,CTTAATGCCACTATCACCACTTCCTTCAAGAGTGAGGGAGAGGAAGAGGAGGAAGAGGAGGAGGAAGAAGAGGAGGAGGAGGAAGAGGAGGGTGAAGGGGA,@@@DBDDEFHHHHGIJIEGGIGECHIFIIJGFHHACCF?D:DFF;?FHH9DFCGGHFG@CA?AB?DD>?A@BDDBB=?B5@BBFCAA@A;;5?BB9;=>;BB?1>A?ABDCC +SRR9130495.149,D00236:723:HG32CBCX2:1:1108:7167:2101/1,TTTCATGTTTTAGGTCTTGTAAGCAAGATTTTTCCTGTTGAAAAACTGGTTGAAGAAGCCATCCAATGTGCAGAAAAAATTGCCAGCAATTCTAAAATCGT,?@?DB?DDHHGDHIHHGBIECFDHHE>C7?BB7;@A(5==;88323>CDC9B +SRR9130495.152,D00236:723:HG32CBCX2:1:1108:7449:2110/1,GGCTTCAGGAGCTTCAGAAGTTAAGAGCTGCAAAAAAGAAGAAAAAGGATCGGCCAAGTAAAGACTGTTCCAAGTTGGACATGCTTGCTAGAAATTTCCAG,CCCFFDFEHGHHGJIIBEEHHIIIHHIGGJIIJIIGIIGGHIIIJIGGGGGGGIIJJHHFHHGFFFFFEEEEEEEDDDDDDDCDDEDDDDDDDDDDDDEDC +SRR9130495.153,D00236:723:HG32CBCX2:1:1108:7499:2197/1,TTCTCATAGTTCAGCTTCCACTTGCGGTAGCTTGTTCCACTTGCGGAACATGTGGTGTTTGGTTTTTTGTACCTGCACTAGTTTGCTGAGAAAGATCGGAA,@@@DDDDEHHFFHABECCAFHHHFDGIHJIIEFGHIIGIGEHEBGG0AEDHGFFFGIDG@EH=ADEBADDE@CCCBCACDDDEEDDCCCBCCC@CC>AB@@ +SRR9130495.154,D00236:723:HG32CBCX2:1:1108:7309:2205/1,GGAGGCTGAGGCAGGAGAATCGCTTGGACCCGGGAGGTGTAGGTTGCAGTGAGCCAAGATTGCGCCACTGCACTCCAGCCTGGGTGACAAAGTGAGATATT,BC@FFFDFDHHGFIGIIIJIJJJJJIJJJIIJJJIIIHHIJIJJJIJHHHHGHFFFEBAEECEDDB:@CDDDDCDDDDDDDDDBCBDCDCDDDCDBDCC?ACDD34>C@BD<>>:CB<>@BA8 +SRR9130495.156,D00236:723:HG32CBCX2:1:1108:7518:2119/1,TTATCAAAGAGGCCCAAGAGAAACCACTTGTCTGACTTCTACCATATGAGTTTAGAATAAGATGATGGCTGCCTATGAGGAAGCAGGCCCTCAACAGATAC,@@@DDBD4CFFAAHII=G9FDHG;?F@;EEBEFCF>BGBGDBECC@BBBBBBBCCABC@CC +SRR9130495.157,D00236:723:HG32CBCX2:1:1108:7577:2169/1,AGTTACTTAATATACCTTAGCCGAAACTTCTGCACTGATTTCCTCCTGTGTTTCAGCCAGCCGCTTTTTGGCAAGTTCGGTTCTCCGATCACACTCTGCAA,@@@DDDFFFFHGHIICGHFH@FGGHGHHJGIHJIJIJGIIIBDHCBGGHEHIJJIGIIIBGIEIGGHHCEBDFEDECD?@DDDDDDDDDDBCCDDDDDDC> +SRR9130495.158,D00236:723:HG32CBCX2:1:1108:7659:2196/1,TTCTGATTTTTGCTGCAGCTTCTGCTTATAATCATATGGCCAGTTGTGCTTGTCAGAGTAATGGTGAAGTCCACAAAACAAATTTCCACATCGGCAGTCAA,CCCFDDDDHDFHFGIFCHIII9FHHIGGHHIJJJJIJJEHGEGIIJJJJJJJJDHGI:DFGIIGHGJGCGHGIJJGIIHGHGFFECB@CEC@B@BDD?CCD +SRR9130495.159,D00236:723:HG32CBCX2:1:1108:7733:2213/1,GGCCAGATGTTTCTGTAAAGATTGAATTAGATCCCCAGGGAGAGGCAGCACAAAGTGCAAATGAATCAAAAACTGAGTAGAATATTGTAGAGTGCCAATTA,@<@DDA+AFFHHHIIFBHC@@F>@>CC: +SRR9130495.160,D00236:723:HG32CBCX2:1:1108:7590:2217/1,GGGGCTGGGCCCACCTGGGACAGAGGGCCACATGTAGAGGCAGCGCTCCCCCGTCTTGAGCTGATCTTTGCAGTCGAATAGCATGAGGTTGGCCCAAGCGA,CC@FFDDDGHHDHIJDGIIACBDDBBBDDD@ +SRR9130495.161,D00236:723:HG32CBCX2:1:1108:7735:2228/1,GCAGCACTGTCTGAGTATGGGAGCAAAGCCTAATCTGGCTTGCCCGGCCTCTCACCTCTGTGGCGCTCTGCATCATGGTGCTTCTTGTCATCTTTTATTGC,?@;DDDDDFCFFHIHHGBHIBH?FHIBDEHB@GEIHIEHGHAFFHGEEH<@CC@C@CCA +SRR9130495.162,D00236:723:HG32CBCX2:1:1108:7898:2065/1,GTTGGCTTCCCCCTCCCCTCTCCCGTGAGCTGAAAAGCAACAAGGGCTCCACCAGCCTGCAAAATAAGACTTGGGGGGGGGGGGGCAGGGATTGCTTTTTT,@@@FDDDDHHFHFIJIFHIIJJJDHFGIGIGJAFHIDG>@GGFHGGHJIGCHIIGEEHFGF@CFEECC>;>CCABBD<99B@BD99&)&&+9(3(4>(+:0 +SRR9130495.163,D00236:723:HG32CBCX2:1:1108:7872:2066/1,CACGCTGGATGAGTTCCTGTTCAGCGACCTGCAGGCGCTGGAAGTGCTGTTGCTCTACAATAACCACATTGTGGTGGTGGACCGGAATGCCTTTGAGGACA,CCCFFFFFGHGGHJJJJJJJJJJIJJJJJJHJJJJJIJJIJJJIGIJJIJJJJIHHHHHHFFDFFEDDEEEEDDDDBDDDDDDDDDDDDDDDDDDDDDDDD +SRR9130495.164,D00236:723:HG32CBCX2:1:1108:7826:2191/1,ATCTCTGGACCCAAACTGGAGGGTGACATTAAAGTTCCCAGGGTGGATTTGAAGGGCCCAGAAGTGGACATTTCTGCTCCCAAGGTCAATATTGATGGGAA,CCCFFEFFGHHGHIHHIIJIIIJJIJIGIIJIHIGIJJJJIJJBFGGIJJIJJJJJIJIHFHHFFF@EEDEEFEEDDDDDDDDDBACDDF@CDEDEDDBDD +SRR9130495.165,D00236:723:HG32CBCX2:1:1108:7791:2195/1,GGAGAACAGCGTGTAGAGCACTCACAGTCTGCTGCCTTCAGGTGTGGGAGGCACTGCTCACACTGATCTTCTTCCCGGTGTGTGTGGTGTTTGCCTGGATG,CCCFFDEFFGHHHJDIIJJIFJJJJJIJJJGIJJIIJIIIJIJIIGEGHHJJJJJIIFIJJJHHHHFHFFDDFFEDC>9;?BBDDD?CDDDDDDDCC?BDC +SRR9130495.166,D00236:723:HG32CBCX2:1:1108:7767:2199/1,GACTAGCCTGGCCAACATGGCAAAACCCAGTCTCTATTAAAAATACAAAAATTAGCTGGGCATGGTGGTGCACGCCTGTAGTCCCAGCTATTCAAGAGGCT,@@@DDDFFFHHFBHBHBDEHHGGGHIIJIIHIHJIEEEIGHEIHIIGHIIHHGJIEHGI?G@CDHI=CA?BDFFACDCCDFCC32??A +SRR9130495.167,D00236:723:HG32CBCX2:1:1108:7824:2210/1,GCACCACCGTGCCTGGCTAATTTTTATATATTTAGTAGAGATTGGGTTTCACTGTGTTGGCCAGGCTGATCTTGAACTCTGGACCTCAGGTGATCCTCCCG,@@@FFDDFDFAHHJJIJIIGHHHHHIIJIIDGG>GHHIGGCGHGIEHGGH>FFHJJJHDGBGHJCGGGHFEHHHHFFFFFECDECEDDDCDDDDCCDDCDD +SRR9130495.168,D00236:723:HG32CBCX2:1:1108:8205:2084/1,CTTAGCCGCTGGTGATGCTAAGGGCATGGTCAAAGTGTGGCAGCTGAGCACAGCCTTCACAGAACAAGGGCCCCGGGAGGTGGAGGACTTGGATCAGCTAG,CCCFFDEDFFHHHJEGIDHHIIIIJJJIJGIJJJGHJIJIJJJIIIJIGGIIGIJJIGHIIJGEFHGBEFDDDBDDD;>B2<@BBDBBCCCCDDDDDDDDD +SRR9130495.169,D00236:723:HG32CBCX2:1:1108:8202:2124/1,GAGACTCTTGCACACATACCGGGGAGCTGGCTCACCCTGGCCCCTCCATCCTGTCAGACTGAAGAGAACAAGTGTCTTAATTTGGGTTTTTCTTATTATTA,CCCFFEFDHFHGHGJIIIJJIJJJIIIGIJJJJFIJJHGIJGHIIJJEEEHFGFFEFECCEEEEDDDDCCAD>CCDDDDCCD?@@A=?8=?=BA93>CA??B@A????8CD(8&8?()(+224@?@>35 +SRR9130495.179,D00236:723:HG32CBCX2:1:1108:8868:2131/1,GTACATTGTATCTTTGTTCTCATTAGTTTCAGAGAAATTATTGATTTCTGCCTTTATTTCATTATTTACCCAAGAGTGATTTGGAAGCAGGTTGTTCAGTT,<;;B?D>DFC:DBF@AEDHHAHHGH:A:AC4?BFFEDA?ABD@ACCD:> +SRR9130495.183,D00236:723:HG32CBCX2:1:1108:9106:2031/1,CTAGAAATCCTGGATTTTCAGCACAATAACTTAGCCAGGCTCTGGAAACGCGCAAACCCCGGTGGTCCCGTTAATTTCCTGAAGGGGCTGTCTCACCTCCA,C@CFFDFFGGHHFJHIIJGIHCCEHHIGIFIIHIJJFIGJIGIJJIIJHIFGIJIJFFHHFDAD@BCCBDDDDBCC@CDDCCDDAEFC'8;&+)+((&28&&&+((&)&&++((++8((2(((25(&&&(++(0&&&(+((+4(+ +SRR9130495.186,D00236:723:HG32CBCX2:1:1108:9230:2213/1,ACTTAGTGCAGTACCCACTATTCCCGCTCAGGCTCCGAATAGTAGATAGAGGGTTCCGATATCTTTGTGATTGGTTGAGAATAATCAACGATTAATGAACA,CCCFFFFEHGFFHFIICIIFIJHHGBHHGIGJJIJGGHIGFHIGIIJJJIIGJCFIJI@EFDFEDFFCCEEEEDDDBDDDDDDDECCDD@BDDDCDDDCDC +SRR9130495.187,D00236:723:HG32CBCX2:1:1108:9264:2024/1,AACATAAGGTTTCTCATAAAACAAAGAAAAATGTCAATTCAGTTGTGAATTCATATTGATACCTGGAACTCTCCTGCTAGACCACCTCTAAAGGCCCAGGG,CCCFFFFFHHHGHIJJIDJIJJJDHIIJJJJIJJJJJJJIJJGCHIIJJJJJJJJJJIHJJJJJJGIJJIJIJIIIIJJHHHHGFFFFFECEEDDDDBBBB +SRR9130495.188,D00236:723:HG32CBCX2:1:1108:9293:2034/1,GTGGGGAGGTTTGGGAGTGAGCAGCACACCCCAGTTAGACTCCTGTTGGGTTTCATAGGAGCTGGCTGCTGAATGTAAGAGTGCAGGCTACCCCGGGACTT,@@@FDA;1DAFHFIIFBGIGHGADHIGIIIIIIIIHBFEHIIIIIIIIHIACEEEHHBD@CDECECCBBCCACCCCEECCCCCCCCBBBCCCB?9>>>>BC +SRR9130495.189,D00236:723:HG32CBCX2:1:1108:9484:2048/1,ATGTAGAGAGAGGGAAAAAAGGAGAGAGAGAAGGATAAAGAGAAGGATGCACAAGAAGACCAAAATACCTGATCATGTAGGGGAGAGCCTCTGGGAGAAGG,@@@DFDDDCDDFHICFHHDGIIHHCHCFFDGHHDCGIJIH@FFHFHGIIGIJIGIGF@CEBDFF@EECDCCCCCCDDEEEDDDDDDDDDDCDDCD<@BDCB +SRR9130495.190,D00236:723:HG32CBCX2:1:1108:9388:2219/1,AGCTGCTGCGAGATGGTGGCTTGCATCTCCTTGGACGGCCGCTTGTTCTCCTTGAAGATGGCAATCAGCGTGCGGCGCTGCAGGTCTGTGAACACGAGGCG,"B?>3=?>;@DF@>CACC>;>@A>',,88>>-09599(+8>C95>>>00" +SRR9130495.191,D00236:723:HG32CBCX2:1:1108:9404:2245/1,TCCGGCTGGTACCTTCATAACTACAGTAATAGAAGACATTGAGTGCCTCCACCGCAGCTGGCCCTCTCTGTTTGTAGCCAAAGATCAGATCTATCCATTCA,CCCFFFFFHHHHHJJIJIIJEIIJJJJJIJJJIJJJIJIIIIIJJJIJJIIJJJJEIJJIHIGHHHFFFFFFDEEEEEDDDDDDDDDDDDDEDCDDDCDCC +SRR9130495.192,D00236:723:HG32CBCX2:1:1108:9632:2134/1,ATAGTGGCTGCTGATGGATGTGCTCTATGCAAGGGAGGTGCTCACTATTTCTGTTCGTCAATTTGTAACCCACGGGAGGAAAGGGAACAAAGAGTGAACAA,CCCFFFFFHHHGAEFFHIICHGIJHGFIIIHIJDGIJJIIIEGIJJIIFHEGHGIICHIIFIJJJJIIJJHHHFFDBDD?BDDDDBDBDDBCDD:@CCCCD +SRR9130495.193,D00236:723:HG32CBCX2:1:1108:9647:2175/1,AATACCAGCCCAAGACTTTGGGAGAAGGGAAGAAAACAAAGTAAAATAACTTACCACTTTGGCCCAGTCCGAGAACAAGTGAAAATACCCAGGCTGCCCCA,CCCFFFDFGHHFHIIJJGIIIJDIIJIJJJJIIHIIIIJJJHCFHHFHIJJJJJJGIHJJJIJJHGHHHFFFDDDDDCD>CCDDDDDDCDDDBDDDDDDDD +SRR9130495.194,D00236:723:HG32CBCX2:1:1108:9552:2194/1,CCATGCCGACACAGGTAGATGGTACGGGGCTGCACGTGGATGTTCATCAGGTAGTATACAATTCGGCTCTGGATGTGGTCCTGCACTCTGTTCACCAAGAA,@@CFFFFFGHGHHJJJIJJJJIJJJIGHFEGGIFIJIJIIIIIJJIIJJIHHHHHHHFFFFFFFDCDDDC@@ACDDCDDDDDDDDDDDDCDDD@CCDDDDD +SRR9130495.195,D00236:723:HG32CBCX2:1:1108:9620:2235/1,CCAATGATGGCCAACTAGGCCATCTTCTACTATGTACGCAGCTAGAGGCACGAGCGCTGGGGGTACCGATTAGTTCATATTGGTGTTCCACCTATAGGGTT,"===BD?DBAABD8AC3?F?D9C6'5;:>7<<>8:(',&22>(((:>3>+:(+28(43>@B(>:>A((32" +SRR9130495.196,D00236:723:HG32CBCX2:1:1108:9908:2124/1,TCTTGTGAAGAAGATGCTGTTGGAAGCCTCTAAGAAGCCCGAACTGAATGCTCTTATAAACAATACCAGAGGAATTATTTTTTACAGTGTCCCTCACCATG,CCCFFFFFHGDFGIIJJIJJIGGJJIIJJIIJHIIIIJJJJI>HHIFIJIJIJJIIHIHIJJJJIHIHHHGFDEFFEEEEEEDDDDDFDEDCCDCDDDDDD +SRR9130495.197,D00236:723:HG32CBCX2:1:1108:9923:2206/1,TGGGGCTGTGAACCGAAGTCTGCTCCTTTGCGTGAGCCACCCCTGCAGCCCCTCCCACAGTTCCTGAGGAGCCTTTAGTCCTCGTCCTTTCTCAGCTGTAT,@BCFFDAFHHHHHIIIIHIIJIIJIIJJJIIIJJIGGIIIJJFGGGGGEIIIGFHHEFFFEECCCC@CB@BDDDCDDCCDCCDDABBBCDDCC@CCDCCCD +SRR9130495.198,D00236:723:HG32CBCX2:1:1108:10131:2036/1,ATGTGCTCAAAGGCTGGGTGGACCTTACCTCCAGTAAACCCCACGTTGTGAAGAAATCCATCAAGTACCTGGAACAAGGAACTCAAGACACCAAAGATGTG,@CCFFFDDFFBHDHIIIBFEGFGHGHGDFHFGIJJIIHDGEGHIJHFHIIIIJJJJJIIIFHHHFHFFFFFFBAEAACBBCADDDDDDDDADBABCCC>AA +SRR9130495.199,D00236:723:HG32CBCX2:1:1108:10246:2089/1,GCCCTGGGATTGTCCCTCTGGGCACAGGGAGTCCTGGGGTTGTCCCTCTGAGTAGTTCTGTTGGGAGAGGAGGCCCTGGGATTGTCCCTCTGGGTACAGGG,CCCFFBDDHHHFHJIIIJJJJIIIIIFIIEHGIGJIJDHJIJIIJJFJIJ@FFCHJJJBEGEHHHDFDCD@DBB;=?A?@BDDDCACDDDDD@?CCCCDCB +SRR9130495.200,D00236:723:HG32CBCX2:1:1108:10051:2156/1,ATGGAGGATGGCACCCTGCAGGCTGGCCCAGGAGGTGCCAGTGGGCCTCGTGCCCTGGAAATAAATAAAATGATTTCTTTTTGGAGGAATGCTCATAAACG,@@CDFFDFGFHFFIJGGIICCDDADDB diff --git a/docs/notebooks/example.fastq b/docs/notebooks/example.fastq new file mode 100644 index 00000000..4b357e52 --- /dev/null +++ b/docs/notebooks/example.fastq @@ -0,0 +1,800 @@ +@SRR9130495.1 D00236:723:HG32CBCX2:1:1108:1330:1935/1 +NCAATACAAAAGCAATATGGGAGAAGCTACCTACCATGCTTAAAAACGCCAATGAGCAGNGATTTGTCANCNNNNNNNNCNNNNNNNNTNNTANNANNCTC ++ +#4BDFDFFHGHGGJJJHIIIIGGIIJGJJGIIIIBHIJJJIIJIJJIJDHIGGGIJJJI#-@AEHGEFF#,########,########+##++##+##+2< +@SRR9130495.2 D00236:723:HG32CBCX2:1:1108:1472:1938/1 +NGTCAAAGATAAGATCAAAAGGCACTGGCTTACCTGATTAAGAAATTGTGTAGTCCAACATCAAAATACNTNTNNNNNAGAGNCANGNCAAGCNNANNAAT ++ +#1=DDDDD>DHFH@EFHHGHGGFGIIIGIGGGGIIGIIDDCHIIIIIID@FEGGGIIIIICHIIIIIIG#-#-#####,,;;#,5#,#,,85@A:AB@8>@:@A@9(:((+(834 +@SRR9130495.6 D00236:723:HG32CBCX2:1:1108:2392:1965/1 +CGATAAAGGACTTTCAGTCAACCAACTAGATAATGACCACTGGGCACCCATTCATTATGCATGCTGGTAAATAAATTATTCTGTTCAGGAACATTGAACTC ++ +CC@DDDBDFFHHHJJIJJIIJIJJJIIIHGIGGHCGGIGHHAACC??A< +@SRR9130495.11 D00236:723:HG32CBCX2:1:1108:4089:1977/1 +CATTCCAACCAGCCGCTTAAAGTTTCTAAAAGAAGCTGGTCATGGAACCCAGAAGGAGGAGATACCTGAGGAGGAATTAGCAGAGGATGTTGAAGAGATTG ++ +CCCFFFDFHHHHHJIJJJJIIJJJJJJJJJJJIIGJJJIGHGIJJIJJIJJIIFHGHIJJGHEHHFCEFFDEDDBDDDDDDDDDDDBACDDDDDDDDDDDD +@SRR9130495.12 D00236:723:HG32CBCX2:1:1108:6197:1936/1 +NCTTAAAGGCAAGGTGCTCGGCTTCCGCTATCAAGACCTCCGACAGAAAATCCGGCCTGNGGCTAAAGANCNNNNNNNNANNNNNNNNCNNGGNNCNNGGC ++ +#1BDFDEFGHHHHIJJJJJJIJJJJJJJJJJIJJIGIJJIJJJIJJJJHIJJHHHFFDC#,;?BBDDDD#,########+########+##++##+##++8 +@SRR9130495.13 D00236:723:HG32CBCX2:1:1108:6415:1939/1 +NTGTGTATGGGGATGAGGAAGGATATTAATATGTTCTATTTGAGATTTAGGGATTACATTTGTTTTTGCNCNCNNNNNTTTTNTCNTCATTTGNNGTNAAT ++ +#1:ADDDFHGGHFGGBHIGGIIJJEIIIJJIJIJJJFGJIIHGHGDGHJGHIHIIIIJJIIHFHIIJJJ#-#-#####,,;?#,;#,8?DDEE##,+#+2< +@SRR9130495.14 D00236:723:HG32CBCX2:1:1108:6361:1952/1 +TCAGATCTTATTTTAATAGTTGACTTTACCTCTTCTTTGACTTCCTCTTCCTCGGTCTCAGTAGATATAGATGGTACCTTGGGCTTATGCCATGAGATCTG ++ +CCCFFFFFHHHHDHIIIIJJJJJJJJJJHIIIJJJJJJJIHJHJII>GHIEGHIIIIJJJIJJIHHIJJJIJIGHIJJGJJHFHHFFDCFFEDCEDCCDEC +@SRR9130495.15 D00236:723:HG32CBCX2:1:1108:6263:1960/1 +CAATATCTGACTGAATGGGCCCATTTTCATAATATTCTGAAACTGTTCATACATGTCTCGCAATGTAAACTGACCTGAAATGCAATACAAAAAAATTCAGA ++ +CCCFFFFFHHGHGGGIIIIJJIJIJJIIIIIIIIEIHGGIEGGHGIJJIJJJCECGHIIIJJJJJIFGHIIHGIIJJHHGEFHDFFFFFCCCDDBBCCDCA +@SRR9130495.16 D00236:723:HG32CBCX2:1:1108:6338:1988/1 +AGACACTAAAATGCCATGTATGAGACTACATAGACATACCAATTTACAACACAAACACATGAAATATACATGAGAAAACATTAACTTACTTCCAGTTGGGA ++ +C@CFFDDDHGHHHIIIIHJJIIHIHGIJJJJJIJJJIJIIHEHIIJJJJJJIJJIIIIIJJDHIJIJGIJIJJIJJHHGGHFFFFFFFEEEDCCC@ACCBA +@SRR9130495.17 D00236:723:HG32CBCX2:1:1108:6742:1944/1 +NGAAACACTCTTTTTCTGGAATTTGCAAGTGGAGATTTCAGCCGCTTTGTGGTCAATGGTAGAAAAGGAAATATNTNCATATAAAAACTAGACAGAATGAT ++ +#1BDFDFFHGHGHJJJJJJJJHIJHHIJIIJJIJJGIJJIJIIJJGIJIHIJJJIIJJJHIEIIJJJJIHDEFH#,#,5=ADEEEDCDDDDDDDCDD5@CD +@SRR9130495.18 D00236:723:HG32CBCX2:1:1108:7076:1942/1 +NGTCTAAGAATGAAGTGCTTATGGTCAACATAGGCTCCCTGTCGACAGGAGGAAGAGTTAGTGCAGTCAAGGCTNANTTGGGCAAAATTGTTTNNACCAAT ++ +#1:B:BDDHHFFHIEGGIGIDEHGEEGIGHIIIFACHIGIGCFGEHIGGHHGHGH@DCGGIDEIIIIFFHHAEE#,#,5=@BBC@BCCCCCCC##,+8?BC +@SRR9130495.19 D00236:723:HG32CBCX2:1:1108:7440:1957/1 +CACCTGATGTCCCACAGTCCTCATAGACACTAGCACTGACTGCTGGCCATCGTCTCAGCCAGATGATGTTGACCTGCTAGCTTTTCAATTAAATTATTAAA ++ ++=144=DD>D4CCD?E@AECFFIIIIEI?E+??;3EBDECEIBEECDIEIIADDDDEIDCDCA;=A@CECE7ACD=(;;A@DA@A@A:ADAAAD>AADBB> +@SRR9130495.20 D00236:723:HG32CBCX2:1:1108:7363:1977/1 +ACTCATAGAGTTGAAGATTCCCTTTCATAGAGCAGGTTTGAAACACTCTTTCTGGAGTATCTGGATGTGGACATTTGGAGCGCTTTGATGCCTACGGTGGA ++ +CCCFFDDDFHHHHJJJIJJJJHHIIHGIJIJJJIGGHGIJIJJIIIJJJJJIJIGBFDHIIJIJGIJIGGCHGGIJHIIHHHFECDECEEDCDDCBD9?B? +@SRR9130495.21 D00236:723:HG32CBCX2:1:1108:7298:1979/1 +AACCGTCGCCAGGTACCATCCCAGAGAACTCTGTCTTCCTTACTTATAGCCAAGTTGCCGGCAGATCACAGCTGCATGCTTATCGGTCCATCCGTCATCGC ++ +BCCDDDFFGGFGFJIBBHHIJJIIHHIIIGJIIHIIJJJIIEIGHJIIJJJJIIHHGIJFGHGFDDCEECDDDDDDDDDDEDDDDDDDBDEDDDCCC +@SRR9130495.23 D00236:723:HG32CBCX2:1:1108:7307:1995/1 +TAATTTGGTATATGTCTTTTTAAAGGCATTTTTATTAGATATTTCCTTAATTTACATTTCAAATGTTATCCCCAAAGCCCCCTATAATCTACCCCTGCCTT ++ +;?7DD?;DBFHHFIA;A@AABBB@B?2<58+:?<<9<@: +@SRR9130495.25 D00236:723:HG32CBCX2:1:1108:7870:1955/1 +CTATCCCGTCGGGTGACTGTTTCCTGCTTTGCAGTTATTCAGTGGCAGAGCGTGGCGCTCTAATTTCTGCTTTCCTCTTTCCTGCAGATTGTGTGCTACAT ++ +CCCFFFDFFHHFHBHGJIIIHGIIIJJIJIIIIJHIIIIEIJJIIJJJJIJIJIJDFEDDDCEEEEEEDDDDDDDDCDDDCDDDDDDDCDDDCDDDDDDDD +@SRR9130495.26 D00236:723:HG32CBCX2:1:1108:8157:1994/1 +GAAGTGCTCTTCGTTACTACTTAAATCCCCCTGGGCATGTTTCATTATTTTACAATTTGTGCAGAACCCTATCCAAACACACATGGAGTACAAATGACTTC ++ +CCCFFDDDDHHDHHIGIIBIHHHJJJ@FGGA?@CCCCCC@CCCDD +@SRR9130495.27 D00236:723:HG32CBCX2:1:1108:8703:1937/1 +NATAAAAAAATAACATCCTTTCCTCCTAATAGCTTAATTATTTGAAAAAAAATATTTTCNAATCACATGNANNNNNNNNTNNNNNNNNTCTTTNNTNNCCT ++ +#1=DFDDDHHHHHIIJJJJJFIJJJIGIEGIIJJJHHIJJJJJIIJIIIIIJEHEHHHA#,;??AEDDC#,########,########++8??##+##(+2 +@SRR9130495.28 D00236:723:HG32CBCX2:1:1108:8702:1991/1 +CTCAGAGATTAAAAATGAATAACGCCTGCCGGCCAATGAGCGGACTCACAGTCCCTGTTTGTTTGTAAGCTAGGTGATTTTCAATCCACAGGGCAGGCTGA ++ +@@@DFDFFGGDHFGIIBGEHJIIIBGIIIJJIIJIJIIFGGEGIJJJHGGHHHDCFFDDDEDEDDDDDCDDDCBDDACDEDEDDDDCCCCDGII@GIFGFE???BFBBEHIGGIEEHIHIGGHHGIHA3?CH;?@CB@DCCEDEDD3 +@SRR9130495.34 D00236:723:HG32CBCX2:1:1108:10535:1962/1 +AATACAGAAAAGTTAAGAGCCAGCCCCAGGCGGATTGGATGAATAGGTTGCATCTCTTTCTTGCTTATATCAAATGCCTCTTGGCAGGCTCCTTGGGAATT ++ +???BD:A:3=?B:;?;;CA;;;A3-5>5-5:(::@8/2?8?9>>3(83(+ +@SRR9130495.35 D00236:723:HG32CBCX2:1:1108:11147:1968/1 +GCTGCCTTCTCCCCTCAAGGATGCAGTGGAAGTGTCAACCTGGAGAAGATGCTACACGATGCAGGAGGTGAACTCGGCCCTCAGTAAAATCCAGCTGGTGG ++ +CCCFFFDFHHHGHJFEGIHEGHIGIIGCCGGGIIJJIJJGGGGHCGIF>DGHIIIEHHGIIJJDBGHFHFCCFFFDDCDDDDBDDDCCDEDA:CACD@CDD +@SRR9130495.36 D00236:723:HG32CBCX2:1:1108:11124:1986/1 +GACAGGGTTTCACCATGTTAGCCAGGACGGTCTTGATCTCCTGACCTCGTGATCCGCCTGTCTCGGCCTCCCAAAGTCCTGGGATTACAGGCGTGAGCCAC ++ +CCCFFFFBFFFHGGHGHIHIIGIJFJJJIJHIIIFGHGGIIGEGHIH@@FGGIJIIGGIHIEEHEEFFDDCCCCBDDACCDCDBAACCDDDBDDDDBDDCC +@SRR9130495.37 D00236:723:HG32CBCX2:1:1108:11773:1947/1 +TACCTGCCTCTGCCTCTCGAGTGCTGGGATGAAAGATGTGCACACCCCCACCACCACCACCACCACTGCCTGGCNCNGTTTTTGATTTCTTATTCTCCAGA ++ +CCCFFFFFHGHHHJIJIJIIEHIJJIJJIJJIHIHJJIGFIIIIJBHHGFF>HGIJIEHHHFGDEEEEEECC?B#,#,,5?@HF1CGBGHCDDFF7=DEG.?AAC?3@EED;6@;>(-;@AC?31(,5?(4::A>AC +@SRR9130495.46 D00236:723:HG32CBCX2:1:1108:14226:1948/1 +AACCTGCACCCAGAATGGCAGGAGGTCCTGGTGGCCCAGGGGGTCCTGGTGGTCCAGGAACACCAGGTCTCCCANANCCAGGTGGCCCAGGCAGGCCTGGA ++ +??1D1BDDHFHHBBHGGGAFG)AF1:?CEGD@BGAFDGIGGB'5;CE77?=???>>CC3#+#++228>>28((2(>ACC?CCDDCCD@ +@SRR9130495.48 D00236:723:HG32CBCX2:1:1108:15049:1993/1 +TGACCAAGAACTCACAGAGATCCCCCCCCCCAGGGCTAAGATTAAAGGCATGTGCCACTGCCACTGGATAGATATTATCTTTTATTTTACCTGACTGGTTG ++ +@CCFFDDDHDFHGJJJJIJGIHHHIIJJIJFE=(5;?@>@A@;@C>CAB=@<:@C@CA:>CC3:>CB<@@?344>>@@A>CDC>ACDD:>4>>>ACD?CC( +@SRR9130495.49 D00236:723:HG32CBCX2:1:1108:15487:1951/1 +ACGGAGGGTGGGGCTGGGTGATTGTGGTTGTCTCCTTCTTCACCCAGTTCCTCTCTTACGGATCCCCGTTAGCTNTNGGGGTCTTGTATGTAGAATGGCTG ++ +BCCFD@DFDFHHGDGIIICGHIIJJIJGHIIJIIJJJIJIJIJEHIGHHHHHHHFFFFFFDDCDDCD@DDDDD:#+#+2<@8GHIIIEHGACFHIIGGIBHIIHHC??BDC@BBCECDCE63>@@CACCDD@ +@SRR9130495.51 D00236:723:HG32CBCX2:1:1108:15923:1957/1 +CCGCAACTGCCATGGAGCCACAGCCTGGTCCGTAATAGATGCAAAGCTTCTCAATAGTCAGGGGCGTGGTTTCGCGCAGCTTGGAGGCCAGCAACAGGCAG ++ +CCCFFFFFHFHHHIIFIIIGIIFIIGJIIJJIFHGHIIIIIJIIFIJIIIJJJJJJJGGIGJFFH@?BBBDBCDDDDDDDDDDDDDDDDDDDDDDDDDDD? +@SRR9130495.52 D00236:723:HG32CBCX2:1:1108:15793:1968/1 +GTTTTTCCACAGACCTCTGATCTCTTACATTCGAAAGTTCTACTACTATGATCCTCAGGAAGAGGTGTACCTGTCCCTAAAGGAAGCGCAGCTCATTTCCA ++ +BB@FFFFFFFHGDGFHJJJJIFIIGGG@FIIIGIBGGDHIIIJCHIIJJDHIIJJJIIIGIIJJFHHIJCHGDHIIHHHHHFFFFFDDDDDDCDDDDEDDE +@SRR9130495.53 D00236:723:HG32CBCX2:1:1108:16082:1968/1 +GAAACTTGTTTGTGACGTGTGTATTCAACTAACAGAGTTGAACCTTTCTTTTTACAGAGCAGCTTTGAAACACGCTTTTTGTAGAATCAGATCGGAAGAGC ++ +@<@ADDDECBFFHIFEGDG;EEHHB@FHGHIIGGEHGGHGGEGEGICGCEFFDB@D>AE>ADC@CBBFGIIJJJJIHHIJJGH?DGGHCFHHIJJEEIIJAHIJJFG=FGGGIFHHIIDHGEHIHHHHGHGEB;?CDCECEEDD +@SRR9130495.55 D00236:723:HG32CBCX2:1:1108:16048:2000/1 +AGGACAGGAAGGACGCTTTGAGATATGATTTCACAGGCGACAGTGAGAGAAAACCAATGTCTTTAATGCATTTCTCTGCAGCATGTGACAAACTTTCAACA ++ +CCCFFFFDFHGHHIIJJJJIFGGIJJIIIIJIJIHJIIJIHGIJJIJGGIIJIJJHHHHEDCDFFFEEEDDEDEEDDDDDDDDDDCDEDDCDDDDDDCCD@ +@SRR9130495.56 D00236:723:HG32CBCX2:1:1108:16580:1970/1 +GCCTGTACTCCCAGCTACTTGGGAGGCTGAGACAGGAGAATCACTTGAACCCAGGAGGTGGAGGTTGCAGTGAGCCAAGACCGGGCTATTGCACTAGATCG ++ +@@@FFD?DBFFHHIIEHCIJIFIJHEDCH@GGEBFHHIJJIIIIIJJJJJIFHFHF@G-6@AAEDFFF>AEC@@A?;=?BCD6/<@>BAAC>:@C:CDDA? +@SRR9130495.57 D00236:723:HG32CBCX2:1:1108:16594:1971/1 +TCCTCTGACTTTGACACTAGTGTTGACCTTGCATGAGGAGATGTTCTCCATTTGGACTAACCTGATGTACACAGACGTTACACTTATCACAGAATACCATA ++ +CCCFFDDFFHFHFHIJIJJIHIIIJJJJJIJJJJIIIIHIGIIJJJIGIIJJIIJEHIIJIJJJIGIJJJEIHJJIIHHEFFFFFFCCEEEEDCDDDDDDC +@SRR9130495.58 D00236:723:HG32CBCX2:1:1108:16808:1998/1 +ACCAATTTTCCCCTCCCCTTCCTCCCTCCCTCCCAGCCCCCTTCCTCTCTCTACCTCCTGTTATTGTTTTGTTCCTTGTTCTATGTAGGATTGAAGCATCT ++ +@@@FFDDFHDFHGIJJJJIIGGDFHI>DGC;DHI9??FHIJIIHG>>3>;ACCCC9:@>@:>AA +@SRR9130495.59 D00236:723:HG32CBCX2:1:1108:17428:1967/1 +TGCATGGTGCTGAAAGCTTTGTTGCAGCTTTTCTTGGGATTGCTTAGCTGCTCCGGGTCGATCCACTTGCAGATGAGCTCTTGCTTGATGCACTGCTGCCG ++ +?<A3>A>>AAAA?3 +@SRR9130495.60 D00236:723:HG32CBCX2:1:1108:17508:1988/1 +TTGTTCAGAAAAAAGTATCTTGAAACCAAAAGAACTGGGATCTTGTTAAATGCAGATTCTGTTCATTAGGTATAGGTATGCAGTCTTACAAAATGAGGTAG ++ +CCCFFEFFHHHHHJJJJJJJJJJJJJJJJJGIJJJJJJJIIJJJJJJJJIJJIJJJJJJJJJJJIJJIIIEHHBHGHHEFFFFFEEEEDEEDDCDCDDCDC +@SRR9130495.61 D00236:723:HG32CBCX2:1:1108:18425:1951/1 +CCACTTAATAAATCACCTATCAAGTTGAATTATTTGTGCAAAGGCACTAGGCTGAATAGAGACCACTCAGTAGCNTNTTTTTAATCTTGCTAAGAAAGAAT ++ +CCCFFDDFHFHHGJIIJJJJJJHGHEHHHIIJIJJIJGJIHIJHEFDHGHIFIJJGHIJJJFIGGIHIIIJIII#-#-5@DFFEEEDEEEDEDDACDCCBC +@SRR9130495.62 D00236:723:HG32CBCX2:1:1108:18468:1964/1 +CTATTGACTTTTATTAGAAAGGGTCTTGTTGCATAGGTAGGTCTTTAACAACCATCTCTTAAAGGGCTGGGATTGCCAGAGTAGGCCAACACGCCCAGCTA ++ +CCCFFFFFGGHHGIGIJIJJIIIJJJJIJJIJJJJIIJDGEHGIIJJJIJJJHIJJIGFHGIJGEGIJJJIIHHHHHHFFFFFEDEEDDDDDDDBDDBBD@ +@SRR9130495.63 D00236:723:HG32CBCX2:1:1108:18615:1941/1 +NAGCCGAGAGGCGCCGGCTCACCTGCCTGGGTCCCGGCCTTTCTCCTGCAGTGCCAGGGATTCACCTGANGNCNNNNNNTCTNCTAGGCAAGCNNATNCTT ++ +#1:DDFDDHHHHHIIJIIFGJJIEFHHIHHIIIJJIEHFFEEEEEEE?DFF;5:AAB9>29(#+#++8++4>>:@>AA:@1<@@A(:4? +@SRR9130495.72 D00236:723:HG32CBCX2:1:1108:1440:2047/1 +GCTGGTGCAGGACACCAGAATCCGCTCGATCATGCTCCCTAGAGAGGAGGGGCACAGTGAGTACACATAAGCACATGTACACACACACCCAGGACCCAAAG ++ +CCCFFFDEHHGHHHIIIIIIIIJJIJJJGEGHIJIJJJJIIJGHIIJJJIDFEDFFFFEEEEDEDDDDDDDDDDDDDEEEEDDDDDDDDDDDDDDDDDDDA +@SRR9130495.73 D00236:723:HG32CBCX2:1:1108:1468:2080/1 +ACTGTCTTTTTTTTAAAACAGGTGATTGCCCGTTGATTGTTCAGTTTGCTGCTAATGATGCAAGACTTTTATCTGATGCTGCCCTGCTAGTCTGTCCCTAT ++ +CCCFFDDEHFFDHIEIIJHGCGFHCIIHIIIHH@FGGIHIGHIJJIJGIIIJBHIGEIHGHHGGHFFFFFFEEEEDEDDDDDDDDDDDCDDDEDDDDDDDD +@SRR9130495.74 D00236:723:HG32CBCX2:1:1108:1333:2084/1 +ATGAGCACACAAGGGATGATCAGATTGATGGTGTAGAAGAGTGGCTTGCGCTTGATGATGAAGTCATAGGTCACGTCCACATAGCTGGGGTCCTGTGGGTT ++ +CCCFFFFFHHHHHJIJHDIIHHHIIJIIJJJJJIJJIIJIJJJIBDGIJJJJIJJJJGIIIJIAHEEHEFFFFF>EDCDDDDDCDDCDDDDDDDDDCDDDD +@SRR9130495.75 D00236:723:HG32CBCX2:1:1108:1447:2137/1 +TCCACTTGTACAAAAAATTACAAAAATTAGCTGGGCATGGTGGCACACACCTGTAGTCCCAGCTACTCGGGAGGCTGAAGTGGCAGGATCACTTGAGGCAG ++ +CCCFFEFFHFHGHJJJJIJJJJIIDIEHJIIJJJIGJJJHGJIIDHIDGIJIJJIGHIJJJJJHHHFEEBDCDBBDDDDDDDDDDDDDDDDDDDDDCDDD@ +@SRR9130495.76 D00236:723:HG32CBCX2:1:1108:1499:2151/1 +GAGAAAAAGCATCCCTTTAATAAGGCCGCCCCGGTTCCAAATCAATCCTGGCATTGCAGGAGGCAAGGGGGAAACACAGCCACGAAATTGGATTAGCTCTT ++ +CCCFFFFFGGHHHJIIJHIEIJJIIIIJIIGJJIHJIJJIGIJJJIIJJHHHHHFFFFFFDCDBDDDDDDDDDDDCDDDBDBDDBBDDDDDCDDDDCDDCD +@SRR9130495.77 D00236:723:HG32CBCX2:1:1108:1280:2166/1 +GCCTTCTTCCCAGCAGCAATATGGCTCTTTCTTCAGCTCTTATCAGTCACATCCATCAACGAGTGGCTTTTAAAAGGGTATGTTTAAACCTTTTGACGGGA ++ +CCCFFDEFHHHGGJIJJIJIJEIJJJJJIFGIIIIIIIJIIGIJJGIIBHIJJJJIJIEH>CG;CHCHGHICHFFFFFFDDC;@CCEEDDCDDCCDDDDDB +@SRR9130495.78 D00236:723:HG32CBCX2:1:1108:1458:2216/1 +TTTCTTTCCACACATCCCACCTAACACCCAAACTAAGCACTCAGTGCTTGGAATCTCCCCACCCATTCCCTCACCCCTGCTCTTCCATCATTTCCTCCAGC ++ +CCCFFFFFHHHHHIDHIIJJJJHIIJFHIJIJIGIJHGIIIIGJEHIGIIJCGEEHJJJJJJJDHEHHGFFFFFDCDDDDDDDDDDDECCDDEEEDDDDDD +@SRR9130495.79 D00236:723:HG32CBCX2:1:1108:1634:2001/1 +TGTGCATTTCTCATTTTTCACGATTTTCAGTGATTTCGTCATTTTTCAAGTCGTCAAGTGGATGTTTATGATTTTCCATGATTTTCAGTTTTCTTGCCATA ++ +CCCFFFFFHHHHGJJJJJJJJIJHGIJJJJIIIIJJIGIIJJJIJJJIIFIIJJJJJIJJJIJIIIIIIJIJGJJJJFHHGGHGFFFFCEFFDEEDEEDDD +@SRR9130495.80 D00236:723:HG32CBCX2:1:1108:1566:2120/1 +GGACGAAGTAAGGGAGGAGCAACTGACAACATTCATCTTGTCTGTCTCCTCCACGTCCCGAGGTACAAGGCGGATGTCATTCTTACTAATTTTTTTCTTCT ++ +CCCFFFFFHHHHHIIJJJJIJJJIJJJJJJJIFIJJJIJIJIJIIJJIJIJJJJIJJIIJHHFFEEEEEDDDDDDDCDEDEDEEDDDEDDEECDDDDDDDD +@SRR9130495.81 D00236:723:HG32CBCX2:1:1108:1863:2047/1 +AAATTCGGACCCCTTGGGTGGAATATTCCTTACGAATTCAATGAGACAGATCTAAGAATCAGTGTGCAGCAACTCCACATGTTCCTGGACCAGTATGAGGT ++ +@BCFFFFFHHFHHHIJIJGIIIJIJJJJIIJJIIIIJJJJGIJJJIJJIEGIIGIJIJJJEGHHHGEEHFFFFDEEEDDDDEEEDDDDDDDBBCDDCCCCC +@SRR9130495.82 D00236:723:HG32CBCX2:1:1108:1844:2145/1 +TAACTCTCTGCCTGCGATGTCCCTACCTTCCAGAATGGTGCCATGACAACGGTGTCAACTACAAGATCGGAGAGAAGTGGGATCGGCAGGGAGAAAATGGC ++ +@CCFFFFFHHGHHJJJJJJJIJJJJJIJIIIHIIIJIIJJJJIJIIJIJJJJJJJJJIJJIIJEHHGHHFDFDDDDDCDCDDDDDDDDDDD?>BDDDDDDD +@SRR9130495.83 D00236:723:HG32CBCX2:1:1108:1772:2188/1 +GAGGTAGGGGTGTGTGTGAATGGGTGAGTGTGTGCCTATGCTTGTATGCCATATGAGAGAAAATGCAGCATTTAAAATCAGTGGTTAACGGCCAGCACAGT ++ +B@BFDFDDHHDDHHGIGIJIJGIJ:CFHHIGGIJJIEHGIIIJIIIFHGIJBHIJJJJJJCHHIHHHHHGFDFFFFEEEECEEDDDDDDDDDDBDDDDDCA +@SRR9130495.84 D00236:723:HG32CBCX2:1:1108:2103:2085/1 +TACAAATGTGCCAGGCACTCTTCTAAGTCCTCACATGCATGAAGTTATACAACTCTACAACAAACCTAGGAATATAAACTGAGGGCAGGGACCCCCAGCAA ++ +CCCFFFFFHHHHHJIJIJJJJJJJJJJJJIJJJJJJIJJJIJJJFHIJJJJIIJJJJJIJIIHIICHHIJJJIIIJJHHHFHHFDDDDDBDDDDDBDDDDD +@SRR9130495.85 D00236:723:HG32CBCX2:1:1108:2067:2091/1 +ACCAGCCCTGCTGCCACCCAGCCCACGTCCCGCGCGCCACCCATGCTGCTGCCTCGGAGCTGCAGGGAGCCGGGGAGCCAGGGCCACACGCAGGTGCAGCT ++ +?@@D?A:BF8DDFFFFFFFFAECBF@GFECAEFIIIIIIFBE?DBBD;@CCCCBBBBBB@B::AABBBBBB7>BBB>@BB?B>B>BB?/?A?BCCCBDDDD>@ +@SRR9130495.87 D00236:723:HG32CBCX2:1:1108:2387:2038/1 +GGCTAACCACTGCCTTGTCAAGTTGTGTAGAGTGAGATTCAGGGGTGTTGAAGTAATGTCCTTGTTACTTGCTGTAGGGCATCTGTTTTCTGTGTATCCCA ++ +CCCFFDDDDHGHGJEIGHHIJIHGGIIHGIIIIIEGBEHGGHIGGAFHIJJJJJJJJIDGHIIGIJJJIIHGFHEHFDFEDCEECDCDDACCCAACDFCCC +@SRR9130495.88 D00236:723:HG32CBCX2:1:1108:2285:2075/1 +CTGAAAGCTGAGCGTGAGCGTGGTATCACTATTGACATCTCCCTGTGGAAATTCGAGACCAGCAAATACTATGTGACCATCATTGATGCCCCAGGACACAG ++ +?;@DDBDDDFFD>ACGED@D8@):E*::??FFC@;FEF>E;CC=CC=@DDD>?;>A>A>A;AB3;A(;@:??DFBCB4<CCD@=BB@-(4812>>> +@SRR9130495.93 D00236:723:HG32CBCX2:1:1108:2748:2098/1 +CATCATCTTTTTTTTTTTTTTCTCCTGAAAACTGTCTAGTAGTTTGATATATTTTGTCCGAGGTTATTTCAAGTGTTTTTTTTTTTTTTTTTAAAACGGTG ++ +@@@DDDDDHHHHHIIFEHIIH8))7)7CEF9).)7;;>B@>9BD;;(6(55>DDDCBCC@/8-084@CC>C(((+4>?CBBBBBBBBBBB>&23:A(5?(( +@SRR9130495.94 D00236:723:HG32CBCX2:1:1108:2733:2156/1 +GACTGAGAAGAACAGAAAGGGAGAGAGAGGCCAATGGAAATACATGAGAAGGGAGAGAGGGAGAGAGAGGGAGGGAGGGAGGGAAGGAGGGGGAGAGGGAG ++ +CCCFFFEFGHHHHJJGIIIJJHIIHHIIJJJJJIJIIHGJJJGIJJJJJJJJJHGGHHIHHHFDFCDCDDD>BDDBDDDDDDD>BDD?BDDDDBDBDBD@D?ABD@BD?BBDDDC +@SRR9130495.96 D00236:723:HG32CBCX2:1:1108:2818:2076/1 +ACACTTCATGGCAACCTGGCTTAGATTCTTCAAAATTTCTGATCCTATACCAAAGCCTCTGTAATCACTCATCACGAAGAAGTCTTCAAGATACAGTAACT ++ +CCCFFFDDHGHHHJJJJIIJIIHIJHGCHIFEGGJJJJIJIGIIJJJIIJCEHIIIIJIBGHGGIIJIIBFGGGGHHGHFFFFDEEDECEDDDDCD>CCDE +@SRR9130495.97 D00236:723:HG32CBCX2:1:1108:2848:2112/1 +AACCTCTTCTCTTTGTCTTTCTCTTTATCCTTCTCCCTCTTGCCAGGACTGGACTCGCTGGTGATGGTGACGACGCTGGTGGGTAAGGTCTGCGCCCGACT ++ +@@BFFFFEHGHHGIJDEHIJIIIIIIJIFHIIIJEIDHIIIIJJIIIGIEIIJJIIIJFEHFHIIIGIIJIFBEDDBD>=?BB@CACCCAACDDBDBB5;6@;ACBCCCC?@AA>C>?<<<9)?FHFCAG=GFFG>FGGEGHIEEBEDEFC>C@::=BB@BCACCC@CA3:(8@C<8?CC +@SRR9130495.100 D00236:723:HG32CBCX2:1:1108:3014:2117/1 +CCCTCCTGAAAAGGTCCAGCTCCAAAGCCTGACCCGTAGCTGCAGAGAAGAAAGCTTTTCCTCTAAAGGCTGAGGAAAAGATGAAAAATCACTGCTAGAAC ++ +CCCFFFFFHHHHGIJIJJJJJJJJJJJJJJJIJJJIJJIJJJJIJGIDHHIIIJJIJJJJJIJJJHHHHHFFFFDEEEEDDDDDDDDDDDDDDDDDDDDDD +@SRR9130495.101 D00236:723:HG32CBCX2:1:1108:3316:2011/1 +GCAGAGCTGAATGGGCAAGCCCAGGACCCTTTTCAGACATTCTGCTGGCCTTTGGAAAGTGTACTCCTGTTGTATTTGATTACTTTTAGAGGACAGTACAT ++ +CCCFFDDFHHHGHJJJJIJFGIGHJGIJIIIIIHIIGIIJIIIIJJJIIIIJIIIGIJGIJJJJIIJJJEEEE?ECFFFFFFCCEDEEEDDDDDDDDEDCD +@SRR9130495.102 D00236:723:HG32CBCX2:1:1108:3264:2036/1 +GGGTGCTGGAGATAGCCCACGTACACTCCTTCTTGCTGGGGTACTTGTCAGGCCAGTTGGGGCTGGTGATGGTGCCACTGGTGGATGTCACCTTGTGTTCA ++ +=@<=B+AD>BFDFIIDEDGEIGFIIIIIICDFGFFGIII;D?F>?*/9BF>DAF;CFFGI>/:=?>7@BAA:;@5=A5>@=,98?:>@(;:4>ABAB?ABD +@SRR9130495.103 D00236:723:HG32CBCX2:1:1108:3400:2065/1 +TCTGTCTGTCACCAGGTTGGAGTGCAGTGGTAGGATCATGGCTCACTGCAGCCTCGTCCTCTTGGGTTCAAGCAATCCTCCTGCCTCAGCCTCCCAGGTAG ++ +@@BDFFFFHHHGHIJJFHEG@GHHIIAFD@HGGGEHIJJJGIJJGGGIHFDAHHHHJFCGGGHGJI;CHFCEDDFFFCEDEEDDDDDDDD<C +@SRR9130495.104 D00236:723:HG32CBCX2:1:1108:3468:2219/1 +TGCACTTCGTTCTCTTAATGAAACCCTTTGACTTAACCATGACTCCGCTCTGCTCTTGAGTTTGCAAGTGTGTGCGAGTGCCCGAGAGACAGTTTTTTTTT ++ +CCCFFEFFHHHHHJIJIIJJIIJJJIIJJIHIHJJJJJFHFHIIJIJJJJIJIJJJJJGGIIJJJGDIJJJIHHHGFFDDEEEDDDDDDDCCDCEDDDDDD +@SRR9130495.105 D00236:723:HG32CBCX2:1:1108:3722:2006/1 +TCCATAGTTTCGCAGAAGACTTGGAAGGATGTTGATGTATATGCAGGTCCATTATCAGTTTTTAAATTAGATGGTTTTCCCCAAGCTGCCCATGCGTCTAA ++ +CCCFFFDDHHHHHJJIJJIIHGHIGIIDFHHIIIHHIJJIJJIJIJJJJJJIIJJIJG=DHHJJIJIIIJJJJJIGHGHHFFBFDDEEEDDDDDDBBDDDD +@SRR9130495.106 D00236:723:HG32CBCX2:1:1108:3517:2148/1 +CTCTGTTCTGTTCCATTGATCTATATCTCTGTTTTGGTACCAGTACCATGCTGTTTTGGTTACTGTAGCCTTGTAGTATAGTTTGAAGTCAGGTAACGTGA ++ +CCCFFEBFHHHHFGGGIEEHIIJIJJIJJIIJIJJHIIJIIJJIIFHGIIIIJJJJJJFIJIJJJJGIIJIJCHIJIJHGJIJHHHHHHFFFFFFEEDECA +@SRR9130495.107 D00236:723:HG32CBCX2:1:1108:3927:2234/1 +CTGTGCTCTATGTACACGCCCATCTGTTTGCCTGACTACCACAAGCCGCTACCACCGTGCCGTTCCGTGTGCGAGCGCGCCAAGGCCGGCTGCTCGCCGCT ++ +@C@FFFFFHHHHHJJJJGIIJIJJIJEHIIGHGJJIJJJJJJIIGHHIJIJIGHJIIJIHHGFFDEDE?BBDDBDCDDDBDDDDBDD>BDBDDDDBDDDB< +@SRR9130495.108 D00236:723:HG32CBCX2:1:1108:4124:2011/1 +GACTCAGAGCCAGGGCCCGGGAACAGAGATGACTCGAAGGCTAGGGCTCCAGCCAGACTTACCGGCACACGTACACCTCTAGGGGTGGCAGGGTGCTGGGT ++ +CCCFFDDEGGGHHIJIIIJIIIIJIHHJJIJIIJIJIGGIIGIIHIGGIGHBHGHFEFFEECEDDDDDDDDBDDDDDCBACCDDDDDDBDDDDDDDDCD?9 +@SRR9130495.109 D00236:723:HG32CBCX2:1:1108:4130:2090/1 +TTCTATTTCTATAAACTGGCCTATTTTGGGTATTTCATATATATGGAAATATATAATTTGATTTTTTTGTTCTCTTAGCTGTATGTTTTCAGGATTCTTTC ++ +@BBFDFFFHHGHHIJJJJJJJIIIJJJJIJJJIJJJJIJJIIIJJJIJJJJIJIIJJJJJJJJJIHJIJJHHHHHHFFFFFFEEEDECEEDDDDDCDDEDD +@SRR9130495.110 D00236:723:HG32CBCX2:1:1108:4176:2091/1 +AAATTGAAAGTAAATGTATACTGTAGTCCCACGCACGAGTGAATAAAGGGGTGTCTAAAAGGAGTGTGTTCTCTTCCAGGCTGCATCTCTCGGTACTCAGC ++ +;8;ABD?+AA=ADBHIGBHE?ACCCCC +@SRR9130495.111 D00236:723:HG32CBCX2:1:1108:4108:2121/1 +ATGCGGAAGTAGGCAAAAATGATGTGCTAGACTACAAGAATTCCTTTTACAGAAAGTAACAAATACAGAGCCAAGAAAGTTTTTGTTAATTATCACGGTGT ++ +@@@ADADA@AD>FIIBBBFGIBGHJDCIGEGGGHHHIJIIJJJJGHIIEHHEGHJIHGGGIFAGGGGIIG>=CHHFD?@;CCEDDDDCDD>>ACDCB@8<5 +@SRR9130495.112 D00236:723:HG32CBCX2:1:1108:4384:2110/1 +ACACAGGCAGCAATGATGTCTTTACTTCTTTATTTTTTTCGACTTCATCTACAGAGCTTAGCACAGCCATTGGAACAAAATTGGAGCTCAGTGCACAGTTA ++ +@@@FDEFDDFF3CCF?FHCH@DEEGEFHIIFGBGGGDGIHAFBGDDHHIBAGGDGHE@CHAHBFFFFBDD +@SRR9130495.115 D00236:723:HG32CBCX2:1:1108:4445:2247/1 +TCTGTATTCTGTGTCATCTGCCATTCCTTGACTCCCTGCGCCCTTCAGCCCACAGGAAACGTGTGGATGACACACGAGGAGATGGAGTCTCTGACGGCAGC ++ +CCCFFDDDHHHHGJJJJIJJJJBHHJJIIGIIJJJIIGIFIJJIIIIGIJJIIIJIJCHIIJJJIHHFHEFFFFDDDDDBDDCDDCDCDDDDCCCDBBDDB +@SRR9130495.116 D00236:723:HG32CBCX2:1:1108:4698:2005/1 +GAGGGAAGGAGGGAGGGAAAGAAGAAGGGAGAGAGGGAGGAAGGCAGGACTGTCGATGCAAGTACCTCGCTTCCTTGTTCTTAACTCATTTGATTCTTGCT ++ +C@BFFFFFGHHGHIIIJJIBGGDHC@FEGDHIIIHGEHHEGCGIHHHFFFFDEEDDDEDDDDCDCCCDDDDDDDDDDDDDEDCCCDDDCDDDED:CCDDDD +@SRR9130495.117 D00236:723:HG32CBCX2:1:1108:4588:2182/1 +CTGGGGTGCAGTGGTGCAATCATAGCTCACTGCAGCCTCAATTTCCTAGGCTTAAGCATTTCTTCCACCTCAACTTCCCAAGTAGCCAGGATTACAAGCAC ++ +CCCFFADDFFHHGGHHGIIJIJJJJJJHIIJIJJIFIJJEIIJIJIGIJIJJJJJJIJJJIIHIIJHIIFFHGHHFFFFFEDEECCCCBDBDDDDDDCDBC +@SRR9130495.118 D00236:723:HG32CBCX2:1:1108:4964:2029/1 +CCCCGTCTCTACTGAAACACACACACACACACACACACACACACACACACAATTAGCCAGGCGTGGCAGCGTCTGCCTGTAGTCCCAGCTACTCAGGAGGC ++ +;8=:DDDDFFFAFIIFFBEIIEFIFIFIEFFFIIBEGEF?BF<4;A@EE/?;AB>7;7;>@?>B?''5<@;@?;0((4:@>34@@>:4<@>BAB@(948&+ +@SRR9130495.119 D00236:723:HG32CBCX2:1:1108:4831:2078/1 +GCGAAGAAAACTGAAAAAGGTGGAAAATTTAGAAATGTCCACTGTAGGACGTGGAATATGGCAAGAAAACTGAAAATCATGGAAAATGAGAAACATCCACT ++ +CCCFFFFFGFHHFFHGIHDICFHIGGIDHIIJJJJIIIIIGIGHGIJJJJJJJJJJJIJJJIJJIHHHHHFFFFFEEEEEEEDDDDDDDDDDDDDDDDCDD +@SRR9130495.120 D00236:723:HG32CBCX2:1:1108:4877:2117/1 +GCATAATGTTGCCACTGCACTCCAGCTGGGACGACAAAGACTGTCTCTAAAAAAGTAATAAATAAATAAAAGTTTGAAATGCATTGTCCTAGGTTTTAGTC ++ +CCCFFDEFHHHHHIIJJJJJIJIIIGIJJJJJJIIJIJJJIJJJJJJJJJJJJJIIHHGHHHHHFDFFFFFEEEEEEDDDDDCEEDEEDDDDDCDDDDDDD +@SRR9130495.121 D00236:723:HG32CBCX2:1:1108:4918:2158/1 +AAACATGTCAATGGCCAAAAAAAACAGACAATCAAAAAATGGACAAATATATGAACAGACATTTCTCACAAGAGGACATACAAATGGCCAGCAAATATATA ++ +CCCFFFFDHHGHHIIJIJJJIIIJJJJJJJIJJIJJJIIJJJJIJJIJJIHGFHHHHFFFFFEFEEEEEDDDDDDDDCDDDDDDDCCBCDDDDDDDDEEEE +@SRR9130495.122 D00236:723:HG32CBCX2:1:1108:4939:2211/1 +CCTGGTCTCAGCATTCCTCACACGTCATAGCGAGGCCCATGGCTGTAGAAATCCCACCATTCTCTTCTCCCCAGGCCTGGCATCCGTAGAAGCCTACAGCT ++ +@CCFFFFFHHHHDHIDIHIJIJJJJJIGGEGIJIIGIIIJJJGGIJJJJIGGHGIIIJJGHHHHHFFFFEFDEDDDDDDBDDDDDDDDD?CDDDDDDDDAC +@SRR9130495.123 D00236:723:HG32CBCX2:1:1108:5169:2188/1 +TCTGACCCCATGTCCTCAGGCCAGAACCCGGGAGCCTGTCAGAAAAGGTCTCTCACCTAGAGTCCATGCTCTGGAAGCTCCAGGAGGACCTGCAGAGGGTG ++ +??@DD?DFHDFHFIIIIGFHEGGDFFHIBHGIAFIGGIIIFI@CHE@FGH@CDGGIFHEEFCCED@DEEEECCCCCCCCCCCCCCBB8ABC?ACAAABBBB +@SRR9130495.124 D00236:723:HG32CBCX2:1:1108:5192:2231/1 +ACTCTCCTGGCCCACGAGAGAGTCCACACAGGAGAGAAACCTTACCAGTGTCATGAGTGCGGCAAGAACTTTAGTCAGAAATCCTACCTTCAAAGCCATCA ++ +CCCFFFFFHFHHGJJGEFGHGIIEIIFJJJIHGIJIIJIIIJIIGIEHHIGIHIJIIJIIBDFDDDDDDDDDCDDDCCDDDDDDDCDDCDDDDDCDDDDDA +@SRR9130495.125 D00236:723:HG32CBCX2:1:1108:5408:2041/1 +TGTGTGCATCCTCATGTGTCCTTGATAAGTGGTGTGATAAATGAAGGCTTTGCCACATTCCTTACACATGTAGGGCTTCTCTCCAGTGTGAGTCCTCTCAT ++ +@@@DDDEBFHHHHIIIHIFHIDHIIIJHHJIHEGFIIHIJJIIJJEIJGHHIEIEGIIJIJJJGIGHGJJIIGIGIHJEHHHHHFFEFFFCC@CEEDDDDE +@SRR9130495.126 D00236:723:HG32CBCX2:1:1108:5351:2057/1 +CTCTATATATTTTAACAAATGCATAATGTCATGTGTTTACCATTACAGTAGGATAAAGAACAGTCTCATTGCCTTAAAAAGTTCCCTAACATTTTAATTGT ++ +CCCFFDEDFHHHHJIJIIJJJIJJJHJJJJIJIIIHHIJIJIJJJJIIHIJJIIJJJJJIJJJJJJIJIJIJIIJJJJJJJGGIGHHFHFFFFFFFEEEEE +@SRR9130495.127 D00236:723:HG32CBCX2:1:1108:5475:2108/1 +AGCCCAGAAGGCTGGACACACCTCCCCCTCACCCCATCCCGCTCCCCAATCAACCCAGTCCTCAAGAAGCACACTGTGGCTGCTTGCTCTCTTGCCCCCCT ++ +CCCFFDFFHGHGHJJIJJJIGIIIHIGIIJIIJJJIJJJHGIJIJIIIJHHGHHFFEDEEEECCDDDDDDDDDDDDDDDDDDDDDDDDDDCCDCDDDDDDB +@SRR9130495.128 D00236:723:HG32CBCX2:1:1108:5542:2138/1 +TGGCTAGCTACTGCTGCTGCTGCATCAAAGCCCAAATATTCACTGGCATCAGCTGTTTTGTTCTTTAGCATATTAGTAAAGTGCTCATTTAGAGACATCTT ++ +@CCFFFFFHHHHGJIJJIJJJIJJJJJJJJJJJJJJIGGIJJJJJHJJJJJJJJJHIEIIJJJIIJJJIJIIJJJJHHHHHHHF@DFFFFEDEEEEDDCDD +@SRR9130495.129 D00236:723:HG32CBCX2:1:1108:5707:2147/1 +CCAGCATCACTCATGGAACCGGAGGCACTAAGGCCCCTCGGGAGACGCTGAGCAGGTGGGTAGAGGCATACTTCTGGGAGATGGCATCAAGAGCCAGTCAA ++ +CC@FFDDFFDHG>FFFHGGIJIEIIIHIGIGHBHCEHGGGFH@FHGIHHFBFDEEDDEDDDDBDC?BBDCDDDDDC:?A?BDDDCCDC>ACDDDBDDACCC +@SRR9130495.130 D00236:723:HG32CBCX2:1:1108:5614:2168/1 +AAACCATGTCTCTACTAAAACTACAAAAATTAGCTGGGCAACATGGTGGGTGCCTGTATCCCAGCTACCTGGGAGGGTGAGGCACGAGAATCACTTGAACC ++ +CCCFFFFFHHHHHIJJJJIJGJIJJJIJJJJIJJJJJIJJJJIJJHIIHJIJJJJJJJJJJJJJJJJGHFHHF@DDDDDDDDDDDDDDDBDDDDDDDDDDD +@SRR9130495.131 D00236:723:HG32CBCX2:1:1108:5985:2027/1 +GCGGCAGCGGCCGCGATGGAAGAACTTACGGCGTTCGTCTCCAAGTCTTTTGACCAGAAAGTGAAGGAGAAGAAGGAGGCCATCACGTACCGGGAGGTGCT ++ +CCCFFFDDHHDGHFIJFHFFHHBFGHGEIJJJFFDDDDDDDDDDD@CCDCDDDDDAAACACDC@CCDBBBDBD@ +@SRR9130495.132 D00236:723:HG32CBCX2:1:1108:5816:2071/1 +TTTACATATAAGAACCTGATGACCTTTTGTTTTTGTCCAGGAGAGTCCTTCTTGTCTACGAAATGCAGCTATCACAGCAGCTGGACTTGTTTCCTGAATGC ++ +C@CFFDDAFFFHHHHHHGFIHJIJFHHHCAAEHIGHJGCCGHIHEHJJJEHGIIIFIGBBAEHGIJIGIIHHEHHHFFFFEECCABCDCCCCACDDACDA: +@SRR9130495.133 D00236:723:HG32CBCX2:1:1108:5835:2081/1 +CCAGGGCTCCAAGGGGCTGGTTACGAAGTGTCTCCTGCTGCATGAGGTCCCCACGGGAGAGATTGTGGTCCGCCTTGACCTGCAGTTGTTTGATGAGCCGT ++ +@CCDDDFFHHHGHGJGJFHIEHIGCGHIGJGIIIJJJJJJJJJIIIEIJFGIJJIJGCCDDBDDCDDDBDDDDCDDDDDDDD>BACDDDEDDCBD +@SRR9130495.134 D00236:723:HG32CBCX2:1:1108:5841:2101/1 +GGGCATGGTGGCATGCGCCTGTAGTCCCAGCTATTCGGGAAGCTGAGGCAGGAAAATCTCTTGAACCCAGGAGGCGGAGGTTGCAGTGAGCCAAGCTTGCA ++ +@CCF?BDDHFHGHIIIIIIIIIGHGHHIIIFIIIIIGGFGGIIIIEFGGEGHCD>CGGFHHHGGHFFFCDDADDDDDDDBDBCDCCCCA@CCCCBDDDDDD +@SRR9130495.135 D00236:723:HG32CBCX2:1:1108:6165:2044/1 +TTTATACCATTTTTTTTTTTAGCATATATCCTTGTACTTTATAGGAATTATTTGCTTTATTCTCTTGTGACTTGTAAATTGATGTACTTAATTAAATCTTT ++ +@@CBAB;DHFFHHIGIIGGHGFF@?BGB@8=FHEGHIGD=@CGHIA;@EHFHGHBFFFCBD;>(>@A@C>>;>CA;;35>@3;>5>,;3>:;(:@:>:@@C +@SRR9130495.136 D00236:723:HG32CBCX2:1:1108:6059:2069/1 +CTATGACCGCTATGTTGCCATCTGTAGCCCACTGCTTTATAACACTGTAATGTCCCACAAGGTCTGTTCCATAATGATGGCTGTGGTATACTCACTGGGCT ++ +CCBFFDBEHHHHFEGIIGHGIIIJIIHIJIFIJJJJJJJJJJIIJJIJJJJIIHHIJIIIFIHIJFIGIIIHGGHHHHFFFFDEEEEEDEFEDDDCDDDBC +@SRR9130495.137 D00236:723:HG32CBCX2:1:1108:6161:2181/1 +ATGAAGCAACAACCTTATAGGCATTTTAACTCATAGGTTTTAAAACTTAAGGTTATTTTCATAGGAGTCCCTTTTAGCAGAAATGCTCACCACAGGACCAG ++ +@@CGGDD@4???BDHCH@GH<=FHGEGGGIGCEG@E7ACH@:77?C@A@CBAA???2FFFIGIIGIIIIFDADBDDDDDDDBBBBBBCDD@CDDDD?BDDDDDDCDDBDDDBDDDCCCCCBBCCCDCCCCDDAC>ABDDDCDDDDA@C +@SRR9130495.144 D00236:723:HG32CBCX2:1:1108:6837:2146/1 +CCTGTTATTTTAGTTGTTAAAGGTGGCATTCTGTTCTTGTGGCTGTCTTCTTTTAGGTTTGTTGAGGGATTACCTTCTTGTTTTTTCTAGGGCATTGTTCC ++ +BCCFDDFDHFDHFGIIIIJIGIIJJIDGHIJIIJJJJJJGFIIIHFHHIJJJIGDGIGHGHIJICHGGEHGCHGFEHFHHFDDDDDDDDDDDC?CDDDDCC +@SRR9130495.145 D00236:723:HG32CBCX2:1:1108:6804:2189/1 +TGAATCTCTCTTGGCCTCCTCCCCTCTCATGTCCCCTCCTCCCTCCTCTCCACTTACTCCTCCTCCTCCCCTCCCTCCTCCCAGATGGTTCTGTGTCTTTT ++ +CCCFFEFFHHGHHJJJIJJIJJJJIJJJJJIJIFIJIGIIGGJIJJIIIIIGIIJIJIJGIIIJIJJHHHFDFFDCDCCDDDCDBCCDCDDD@ACCCDDDD +@SRR9130495.146 D00236:723:HG32CBCX2:1:1108:6940:2229/1 +CTTAATGCCACTATCACCACTTCCTTCAAGAGTGAGGGAGAGGAAGAGGAGGAAGAGGAGGAGGAAGAAGAGGAGGAGGAGGAAGAGGAGGGTGAAGGGGA ++ +@@@DBDDEFHHHHGIJIEGGIGECHIFIIJGFHHACCF?D:DFF;?FHH9DFCGGHFG@CA?AB?DD>?A@BDDBB=?B5@BBFCAA@A;;5?BB9;=>;BB?1>A?ABDCC +@SRR9130495.149 D00236:723:HG32CBCX2:1:1108:7167:2101/1 +TTTCATGTTTTAGGTCTTGTAAGCAAGATTTTTCCTGTTGAAAAACTGGTTGAAGAAGCCATCCAATGTGCAGAAAAAATTGCCAGCAATTCTAAAATCGT ++ +?@?DB?DDHHGDHIHHGBIECFDHHE>C7?BB7;@A(5==;88323>CDC9B +@SRR9130495.152 D00236:723:HG32CBCX2:1:1108:7449:2110/1 +GGCTTCAGGAGCTTCAGAAGTTAAGAGCTGCAAAAAAGAAGAAAAAGGATCGGCCAAGTAAAGACTGTTCCAAGTTGGACATGCTTGCTAGAAATTTCCAG ++ +CCCFFDFEHGHHGJIIBEEHHIIIHHIGGJIIJIIGIIGGHIIIJIGGGGGGGIIJJHHFHHGFFFFFEEEEEEEDDDDDDDCDDEDDDDDDDDDDDDEDC +@SRR9130495.153 D00236:723:HG32CBCX2:1:1108:7499:2197/1 +TTCTCATAGTTCAGCTTCCACTTGCGGTAGCTTGTTCCACTTGCGGAACATGTGGTGTTTGGTTTTTTGTACCTGCACTAGTTTGCTGAGAAAGATCGGAA ++ +@@@DDDDEHHFFHABECCAFHHHFDGIHJIIEFGHIIGIGEHEBGG0AEDHGFFFGIDG@EH=ADEBADDE@CCCBCACDDDEEDDCCCBCCC@CC>AB@@ +@SRR9130495.154 D00236:723:HG32CBCX2:1:1108:7309:2205/1 +GGAGGCTGAGGCAGGAGAATCGCTTGGACCCGGGAGGTGTAGGTTGCAGTGAGCCAAGATTGCGCCACTGCACTCCAGCCTGGGTGACAAAGTGAGATATT ++ +BC@FFFDFDHHGFIGIIIJIJJJJJIJJJIIJJJIIIHHIJIJJJIJHHHHGHFFFEBAEECEDDB:@CDDDDCDDDDDDDDDBCBDCDCDDDCDBDCC?ACDD34>C@BD<>>:CB<>@BA8 +@SRR9130495.156 D00236:723:HG32CBCX2:1:1108:7518:2119/1 +TTATCAAAGAGGCCCAAGAGAAACCACTTGTCTGACTTCTACCATATGAGTTTAGAATAAGATGATGGCTGCCTATGAGGAAGCAGGCCCTCAACAGATAC ++ +@@@DDBD4CFFAAHII=G9FDHG;?F@;EEBEFCF>BGBGDBECC@BBBBBBBCCABC@CC +@SRR9130495.157 D00236:723:HG32CBCX2:1:1108:7577:2169/1 +AGTTACTTAATATACCTTAGCCGAAACTTCTGCACTGATTTCCTCCTGTGTTTCAGCCAGCCGCTTTTTGGCAAGTTCGGTTCTCCGATCACACTCTGCAA ++ +@@@DDDFFFFHGHIICGHFH@FGGHGHHJGIHJIJIJGIIIBDHCBGGHEHIJJIGIIIBGIEIGGHHCEBDFEDECD?@DDDDDDDDDDBCCDDDDDDC> +@SRR9130495.158 D00236:723:HG32CBCX2:1:1108:7659:2196/1 +TTCTGATTTTTGCTGCAGCTTCTGCTTATAATCATATGGCCAGTTGTGCTTGTCAGAGTAATGGTGAAGTCCACAAAACAAATTTCCACATCGGCAGTCAA ++ +CCCFDDDDHDFHFGIFCHIII9FHHIGGHHIJJJJIJJEHGEGIIJJJJJJJJDHGI:DFGIIGHGJGCGHGIJJGIIHGHGFFECB@CEC@B@BDD?CCD +@SRR9130495.159 D00236:723:HG32CBCX2:1:1108:7733:2213/1 +GGCCAGATGTTTCTGTAAAGATTGAATTAGATCCCCAGGGAGAGGCAGCACAAAGTGCAAATGAATCAAAAACTGAGTAGAATATTGTAGAGTGCCAATTA ++ +@<@DDA+AFFHHHIIFBHC@@F>@>CC: +@SRR9130495.160 D00236:723:HG32CBCX2:1:1108:7590:2217/1 +GGGGCTGGGCCCACCTGGGACAGAGGGCCACATGTAGAGGCAGCGCTCCCCCGTCTTGAGCTGATCTTTGCAGTCGAATAGCATGAGGTTGGCCCAAGCGA ++ +CC@FFDDDGHHDHIJDGIIACBDDBBBDDD@ +@SRR9130495.161 D00236:723:HG32CBCX2:1:1108:7735:2228/1 +GCAGCACTGTCTGAGTATGGGAGCAAAGCCTAATCTGGCTTGCCCGGCCTCTCACCTCTGTGGCGCTCTGCATCATGGTGCTTCTTGTCATCTTTTATTGC ++ +?@;DDDDDFCFFHIHHGBHIBH?FHIBDEHB@GEIHIEHGHAFFHGEEH<@CC@C@CCA +@SRR9130495.162 D00236:723:HG32CBCX2:1:1108:7898:2065/1 +GTTGGCTTCCCCCTCCCCTCTCCCGTGAGCTGAAAAGCAACAAGGGCTCCACCAGCCTGCAAAATAAGACTTGGGGGGGGGGGGGCAGGGATTGCTTTTTT ++ +@@@FDDDDHHFHFIJIFHIIJJJDHFGIGIGJAFHIDG>@GGFHGGHJIGCHIIGEEHFGF@CFEECC>;>CCABBD<99B@BD99&)&&+9(3(4>(+:0 +@SRR9130495.163 D00236:723:HG32CBCX2:1:1108:7872:2066/1 +CACGCTGGATGAGTTCCTGTTCAGCGACCTGCAGGCGCTGGAAGTGCTGTTGCTCTACAATAACCACATTGTGGTGGTGGACCGGAATGCCTTTGAGGACA ++ +CCCFFFFFGHGGHJJJJJJJJJJIJJJJJJHJJJJJIJJIJJJIGIJJIJJJJIHHHHHHFFDFFEDDEEEEDDDDBDDDDDDDDDDDDDDDDDDDDDDDD +@SRR9130495.164 D00236:723:HG32CBCX2:1:1108:7826:2191/1 +ATCTCTGGACCCAAACTGGAGGGTGACATTAAAGTTCCCAGGGTGGATTTGAAGGGCCCAGAAGTGGACATTTCTGCTCCCAAGGTCAATATTGATGGGAA ++ +CCCFFEFFGHHGHIHHIIJIIIJJIJIGIIJIHIGIJJJJIJJBFGGIJJIJJJJJIJIHFHHFFF@EEDEEFEEDDDDDDDDDBACDDF@CDEDEDDBDD +@SRR9130495.165 D00236:723:HG32CBCX2:1:1108:7791:2195/1 +GGAGAACAGCGTGTAGAGCACTCACAGTCTGCTGCCTTCAGGTGTGGGAGGCACTGCTCACACTGATCTTCTTCCCGGTGTGTGTGGTGTTTGCCTGGATG ++ +CCCFFDEFFGHHHJDIIJJIFJJJJJIJJJGIJJIIJIIIJIJIIGEGHHJJJJJIIFIJJJHHHHFHFFDDFFEDC>9;?BBDDD?CDDDDDDDCC?BDC +@SRR9130495.166 D00236:723:HG32CBCX2:1:1108:7767:2199/1 +GACTAGCCTGGCCAACATGGCAAAACCCAGTCTCTATTAAAAATACAAAAATTAGCTGGGCATGGTGGTGCACGCCTGTAGTCCCAGCTATTCAAGAGGCT ++ +@@@DDDFFFHHFBHBHBDEHHGGGHIIJIIHIHJIEEEIGHEIHIIGHIIHHGJIEHGI?G@CDHI=CA?BDFFACDCCDFCC32??A +@SRR9130495.167 D00236:723:HG32CBCX2:1:1108:7824:2210/1 +GCACCACCGTGCCTGGCTAATTTTTATATATTTAGTAGAGATTGGGTTTCACTGTGTTGGCCAGGCTGATCTTGAACTCTGGACCTCAGGTGATCCTCCCG ++ +@@@FFDDFDFAHHJJIJIIGHHHHHIIJIIDGG>GHHIGGCGHGIEHGGH>FFHJJJHDGBGHJCGGGHFEHHHHFFFFFECDECEDDDCDDDDCCDDCDD +@SRR9130495.168 D00236:723:HG32CBCX2:1:1108:8205:2084/1 +CTTAGCCGCTGGTGATGCTAAGGGCATGGTCAAAGTGTGGCAGCTGAGCACAGCCTTCACAGAACAAGGGCCCCGGGAGGTGGAGGACTTGGATCAGCTAG ++ +CCCFFDEDFFHHHJEGIDHHIIIIJJJIJGIJJJGHJIJIJJJIIIJIGGIIGIJJIGHIIJGEFHGBEFDDDBDDD;>B2<@BBDBBCCCCDDDDDDDDD +@SRR9130495.169 D00236:723:HG32CBCX2:1:1108:8202:2124/1 +GAGACTCTTGCACACATACCGGGGAGCTGGCTCACCCTGGCCCCTCCATCCTGTCAGACTGAAGAGAACAAGTGTCTTAATTTGGGTTTTTCTTATTATTA ++ +CCCFFEFDHFHGHGJIIIJJIJJJIIIGIJJJJFIJJHGIJGHIIJJEEEHFGFFEFECCEEEEDDDDCCAD>CCDDDDCCD?@@A=?8=?=BA93>CA??B@A????8CD(8&8?()(+224@?@>35 +@SRR9130495.179 D00236:723:HG32CBCX2:1:1108:8868:2131/1 +GTACATTGTATCTTTGTTCTCATTAGTTTCAGAGAAATTATTGATTTCTGCCTTTATTTCATTATTTACCCAAGAGTGATTTGGAAGCAGGTTGTTCAGTT ++ +<;;B?D>DFC:DBF@AEDHHAHHGH:A:AC4?BFFEDA?ABD@ACCD:> +@SRR9130495.183 D00236:723:HG32CBCX2:1:1108:9106:2031/1 +CTAGAAATCCTGGATTTTCAGCACAATAACTTAGCCAGGCTCTGGAAACGCGCAAACCCCGGTGGTCCCGTTAATTTCCTGAAGGGGCTGTCTCACCTCCA ++ +C@CFFDFFGGHHFJHIIJGIHCCEHHIGIFIIHIJJFIGJIGIJJIIJHIFGIJIJFFHHFDAD@BCCBDDDDBCC@CDDCCDDAEFC'8;&+)+((&28&&&+((&)&&++((++8((2(((25(&&&(++(0&&&(+((+4(+ +@SRR9130495.186 D00236:723:HG32CBCX2:1:1108:9230:2213/1 +ACTTAGTGCAGTACCCACTATTCCCGCTCAGGCTCCGAATAGTAGATAGAGGGTTCCGATATCTTTGTGATTGGTTGAGAATAATCAACGATTAATGAACA ++ +CCCFFFFEHGFFHFIICIIFIJHHGBHHGIGJJIJGGHIGFHIGIIJJJIIGJCFIJI@EFDFEDFFCCEEEEDDDBDDDDDDDECCDD@BDDDCDDDCDC +@SRR9130495.187 D00236:723:HG32CBCX2:1:1108:9264:2024/1 +AACATAAGGTTTCTCATAAAACAAAGAAAAATGTCAATTCAGTTGTGAATTCATATTGATACCTGGAACTCTCCTGCTAGACCACCTCTAAAGGCCCAGGG ++ +CCCFFFFFHHHGHIJJIDJIJJJDHIIJJJJIJJJJJJJIJJGCHIIJJJJJJJJJJIHJJJJJJGIJJIJIJIIIIJJHHHHGFFFFFECEEDDDDBBBB +@SRR9130495.188 D00236:723:HG32CBCX2:1:1108:9293:2034/1 +GTGGGGAGGTTTGGGAGTGAGCAGCACACCCCAGTTAGACTCCTGTTGGGTTTCATAGGAGCTGGCTGCTGAATGTAAGAGTGCAGGCTACCCCGGGACTT ++ +@@@FDA;1DAFHFIIFBGIGHGADHIGIIIIIIIIHBFEHIIIIIIIIHIACEEEHHBD@CDECECCBBCCACCCCEECCCCCCCCBBBCCCB?9>>>>BC +@SRR9130495.189 D00236:723:HG32CBCX2:1:1108:9484:2048/1 +ATGTAGAGAGAGGGAAAAAAGGAGAGAGAGAAGGATAAAGAGAAGGATGCACAAGAAGACCAAAATACCTGATCATGTAGGGGAGAGCCTCTGGGAGAAGG ++ +@@@DFDDDCDDFHICFHHDGIIHHCHCFFDGHHDCGIJIH@FFHFHGIIGIJIGIGF@CEBDFF@EECDCCCCCCDDEEEDDDDDDDDDDCDDCD<@BDCB +@SRR9130495.190 D00236:723:HG32CBCX2:1:1108:9388:2219/1 +AGCTGCTGCGAGATGGTGGCTTGCATCTCCTTGGACGGCCGCTTGTTCTCCTTGAAGATGGCAATCAGCGTGCGGCGCTGCAGGTCTGTGAACACGAGGCG ++ +B?>3=?>;@DF@>CACC>;>@A>',,88>>-09599(+8>C95>>>00 +@SRR9130495.191 D00236:723:HG32CBCX2:1:1108:9404:2245/1 +TCCGGCTGGTACCTTCATAACTACAGTAATAGAAGACATTGAGTGCCTCCACCGCAGCTGGCCCTCTCTGTTTGTAGCCAAAGATCAGATCTATCCATTCA ++ +CCCFFFFFHHHHHJJIJIIJEIIJJJJJIJJJIJJJIJIIIIIJJJIJJIIJJJJEIJJIHIGHHHFFFFFFDEEEEEDDDDDDDDDDDDDEDCDDDCDCC +@SRR9130495.192 D00236:723:HG32CBCX2:1:1108:9632:2134/1 +ATAGTGGCTGCTGATGGATGTGCTCTATGCAAGGGAGGTGCTCACTATTTCTGTTCGTCAATTTGTAACCCACGGGAGGAAAGGGAACAAAGAGTGAACAA ++ +CCCFFFFFHHHGAEFFHIICHGIJHGFIIIHIJDGIJJIIIEGIJJIIFHEGHGIICHIIFIJJJJIIJJHHHFFDBDD?BDDDDBDBDDBCDD:@CCCCD +@SRR9130495.193 D00236:723:HG32CBCX2:1:1108:9647:2175/1 +AATACCAGCCCAAGACTTTGGGAGAAGGGAAGAAAACAAAGTAAAATAACTTACCACTTTGGCCCAGTCCGAGAACAAGTGAAAATACCCAGGCTGCCCCA ++ +CCCFFFDFGHHFHIIJJGIIIJDIIJIJJJJIIHIIIIJJJHCFHHFHIJJJJJJGIHJJJIJJHGHHHFFFDDDDDCD>CCDDDDDDCDDDBDDDDDDDD +@SRR9130495.194 D00236:723:HG32CBCX2:1:1108:9552:2194/1 +CCATGCCGACACAGGTAGATGGTACGGGGCTGCACGTGGATGTTCATCAGGTAGTATACAATTCGGCTCTGGATGTGGTCCTGCACTCTGTTCACCAAGAA ++ +@@CFFFFFGHGHHJJJIJJJJIJJJIGHFEGGIFIJIJIIIIIJJIIJJIHHHHHHHFFFFFFFDCDDDC@@ACDDCDDDDDDDDDDDDCDDD@CCDDDDD +@SRR9130495.195 D00236:723:HG32CBCX2:1:1108:9620:2235/1 +CCAATGATGGCCAACTAGGCCATCTTCTACTATGTACGCAGCTAGAGGCACGAGCGCTGGGGGTACCGATTAGTTCATATTGGTGTTCCACCTATAGGGTT ++ +===BD?DBAABD8AC3?F?D9C6'5;:>7<<>8:(',&22>(((:>3>+:(+28(43>@B(>:>A((32 +@SRR9130495.196 D00236:723:HG32CBCX2:1:1108:9908:2124/1 +TCTTGTGAAGAAGATGCTGTTGGAAGCCTCTAAGAAGCCCGAACTGAATGCTCTTATAAACAATACCAGAGGAATTATTTTTTACAGTGTCCCTCACCATG ++ +CCCFFFFFHGDFGIIJJIJJIGGJJIIJJIIJHIIIIJJJJI>HHIFIJIJIJJIIHIHIJJJJIHIHHHGFDEFFEEEEEEDDDDDFDEDCCDCDDDDDD +@SRR9130495.197 D00236:723:HG32CBCX2:1:1108:9923:2206/1 +TGGGGCTGTGAACCGAAGTCTGCTCCTTTGCGTGAGCCACCCCTGCAGCCCCTCCCACAGTTCCTGAGGAGCCTTTAGTCCTCGTCCTTTCTCAGCTGTAT ++ +@BCFFDAFHHHHHIIIIHIIJIIJIIJJJIIIJJIGGIIIJJFGGGGGEIIIGFHHEFFFEECCCC@CB@BDDDCDDCCDCCDDABBBCDDCC@CCDCCCD +@SRR9130495.198 D00236:723:HG32CBCX2:1:1108:10131:2036/1 +ATGTGCTCAAAGGCTGGGTGGACCTTACCTCCAGTAAACCCCACGTTGTGAAGAAATCCATCAAGTACCTGGAACAAGGAACTCAAGACACCAAAGATGTG ++ +@CCFFFDDFFBHDHIIIBFEGFGHGHGDFHFGIJJIIHDGEGHIJHFHIIIIJJJJJIIIFHHHFHFFFFFFBAEAACBBCADDDDDDDDADBABCCC>AA +@SRR9130495.199 D00236:723:HG32CBCX2:1:1108:10246:2089/1 +GCCCTGGGATTGTCCCTCTGGGCACAGGGAGTCCTGGGGTTGTCCCTCTGAGTAGTTCTGTTGGGAGAGGAGGCCCTGGGATTGTCCCTCTGGGTACAGGG ++ +CCCFFBDDHHHFHJIIIJJJJIIIIIFIIEHGIGJIJDHJIJIIJJFJIJ@FFCHJJJBEGEHHHDFDCD@DBB;=?A?@BDDDCACDDDDD@?CCCCDCB +@SRR9130495.200 D00236:723:HG32CBCX2:1:1108:10051:2156/1 +ATGGAGGATGGCACCCTGCAGGCTGGCCCAGGAGGTGCCAGTGGGCCTCGTGCCCTGGAAATAAATAAAATGATTTCTTTTTGGAGGAATGCTCATAAACG ++ +@@CDFFDFGFHFFIJGGIICCDDADDB diff --git a/docs/notebooks/example.parquet b/docs/notebooks/example.parquet new file mode 100644 index 00000000..017772b7 Binary files /dev/null and b/docs/notebooks/example.parquet differ diff --git a/docs/notebooks/report.html b/docs/notebooks/report.html new file mode 100644 index 00000000..bbdb1bf1 --- /dev/null +++ b/docs/notebooks/report.html @@ -0,0 +1,250 @@ + + + + + fastqc-rs report + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ average GC content + + 46.15999984741211 +
+ average read length + + 101 +
+ canonical + + True +
+ file name + + example.fastq +
+ k + + 5 +
+ total reads + + 200 +
+
+
+ + \ No newline at end of file diff --git a/polars_bio/__init__.py b/polars_bio/__init__.py index 01d66d58..ffe5dce6 100644 --- a/polars_bio/__init__.py +++ b/polars_bio/__init__.py @@ -1,5 +1,6 @@ from polars_bio.polars_bio import InputFormat, ReadOptions, VcfReadOptions +from .base_sequnce_quality_vis import visualize_base_sequence_quality from .context import ctx, set_option from .io import ( describe_vcf, @@ -16,6 +17,7 @@ from .polars_ext import PolarsRangesOperations as LazyFrame from .range_op import FilterOp, count_overlaps, coverage, merge, nearest, overlap from .range_viz import visualize_intervals +from .quality_stats import base_sequence_quality POLARS_BIO_MAX_THREADS = "datafusion.execution.target_partitions" @@ -29,6 +31,7 @@ "coverage", "ctx", "FilterOp", + "visualize_base_sequence_quality", "visualize_intervals", "read_bam", "read_vcf", @@ -45,4 +48,5 @@ "ReadOptions", "VcfReadOptions", "set_option", + "base_sequence_quality", ] diff --git a/polars_bio/base_sequnce_quality_vis.py b/polars_bio/base_sequnce_quality_vis.py new file mode 100644 index 00000000..fd6cd51b --- /dev/null +++ b/polars_bio/base_sequnce_quality_vis.py @@ -0,0 +1,51 @@ +from typing import Union + +import pandas as pd +import polars as pl +from matplotlib import pyplot as plt + + +def visualize_base_sequence_quality(df: Union[pd.DataFrame, pl.DataFrame]) -> None: + """ + Visualize the overlapping intervals. + + Parameters: + df: Pandas DataFrame or Polars DataFrame. The DataFrame containing the base sequence quality results + """ + assert isinstance( + df, (pd.DataFrame, pl.DataFrame) + ), "df must be a Pandas or Polars DataFrame" + df = df if isinstance(df, pd.DataFrame) else df.to_pandas() + df = df.sort_values(by="pos") + + boxes = [ + { + "label": int(row["pos"]), + "whislo": row["lower"], + "q1": row["q1"], + "med": row["median"], + "q3": row["q3"], + "whishi": row["upper"], + } + for _, row in df.iterrows() + ] + + fig, ax = plt.subplots() + fig.set_size_inches(15, 5) + + plot = ax.plot(df["pos"] + 1, df["avg"]) + box_plot = ax.bxp(boxes, showfliers=False) + + ax.set_title("base sequence quality") + ax.set_ylabel("Phred score") + ax.set_xlabel("Position in read (bp)") + + ax.legend( + [plot[0], box_plot["medians"][0]], + ["Average of phred score", "Median of phred score"], + ) + + for label in ax.get_xticklabels(): + label.set_fontsize(6) + + plt.show() diff --git a/polars_bio/quality_stats.py b/polars_bio/quality_stats.py new file mode 100644 index 00000000..cc1a1be2 --- /dev/null +++ b/polars_bio/quality_stats.py @@ -0,0 +1,59 @@ +from pathlib import Path +from typing import Union +import datafusion +import polars as pl +import pandas as pd +import pyarrow as pa +from .context import ctx +from polars_bio.polars_bio import ( + base_sequance_quality_scan, + base_sequance_quality_frame, +) + + +def base_sequence_quality( + df: Union[str, Path, pl.DataFrame, pl.LazyFrame, pd.DataFrame], + quality_scores_column: str = "quality_scores", + output_type: str = "polars.DataFrame", +) -> Union[pl.DataFrame, pd.DataFrame]: + """ + Compute base sequence quality statistics from various dataframe/file types. + + Args: + df: Input data as a file path or dataframe. + quality_scores_column: Name of the column with quality scores. + output_type: Output type, either "polars.DataFrame" or "pandas.DataFrame". + + Returns: + DataFrame with base sequence quality statistics. + """ + if isinstance(df, (str, Path)): + df = str(df) + supported_exts = {".parquet", ".csv", ".bed", ".vcf", ".fastq"} + ext = set(Path(df).suffixes) + if not (supported_exts & ext or not ext): + raise ValueError( + "Input file must be a Parquet, CSV, BED, VCF, or FASTQ file." + ) + result: datafusion.DataFrame = base_sequance_quality_scan( + ctx, df, quality_scores_column + ) + else: + if isinstance(df, pl.LazyFrame): + arrow_table = df.collect().to_arrow() + elif isinstance(df, pl.DataFrame): + arrow_table = df.to_arrow() + elif isinstance(df, pd.DataFrame): + arrow_table = pa.Table.from_pandas(df) + else: + raise TypeError("Unsupported dataframe type.") + result: datafusion.DataFrame = base_sequance_quality_frame( + ctx, arrow_table, quality_scores_column + ) + + if output_type == "polars.DataFrame": + return result.to_polars() + elif output_type == "pandas.DataFrame": + return result.to_pandas() + else: + raise ValueError("output_type must be 'polars.DataFrame' or 'pandas.DataFrame'") diff --git a/src/context.rs b/src/context.rs index 5f47f30e..1525ef05 100644 --- a/src/context.rs +++ b/src/context.rs @@ -25,7 +25,6 @@ impl PyBioSessionContext { pub fn new(seed: String, catalog_dir: String) -> PyResult { let ctx = create_context().unwrap(); let session_config: HashMap = HashMap::new(); - Ok(PyBioSessionContext { ctx, session_config, diff --git a/src/lib.rs b/src/lib.rs index c8890a8d..152b0736 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ +mod sequence_quality_histogram; mod context; mod operation; mod option; +mod quantile_stats; mod query; mod scan; mod streaming; @@ -16,6 +18,7 @@ use datafusion::datasource::MemTable; use datafusion_python::dataframe::PyDataFrame; use datafusion_vcf::storage::VcfReader; use log::{debug, error, info}; +use operation::do_base_sequence_quality; use polars_lazy::prelude::{LazyFrame, ScanArgsAnonymous}; use polars_python::error::PyPolarsErr; use polars_python::lazyframe::PyLazyFrame; @@ -33,6 +36,7 @@ use crate::utils::convert_arrow_rb_schema_to_polars_df_schema; const LEFT_TABLE: &str = "s1"; const RIGHT_TABLE: &str = "s2"; +const DEFAULT_TABLE_NAME: &str = "unnamed_table"; const DEFAULT_COLUMN_NAMES: [&str; 3] = ["contig", "start", "end"]; #[pyfunction] @@ -403,6 +407,48 @@ fn py_from_polars( }) } +#[pyfunction] +#[pyo3(signature = (py_ctx, path, column))] +fn base_sequance_quality_scan( + py: Python<'_>, + py_ctx: &PyBioSessionContext, + path: String, + column: String, +) -> PyResult { + py.allow_threads(|| { + let ctx = &py_ctx.ctx; + let rt = Runtime::new().unwrap(); + maybe_register_table(path, &DEFAULT_TABLE_NAME.to_string(), None, ctx, &rt); + let data_frame = rt.block_on(do_base_sequence_quality( + ctx, + DEFAULT_TABLE_NAME.to_string(), + column.to_string(), + )); + Ok(PyDataFrame::new(data_frame)) + }) +} + +#[pyfunction] +#[pyo3(signature = (py_ctx, df, column))] +fn base_sequance_quality_frame( + py: Python<'_>, + py_ctx: &PyBioSessionContext, + df: PyArrowType, + column: String, +) -> PyResult { + py.allow_threads(|| { + let ctx = &py_ctx.ctx; + let rt = Runtime::new().unwrap(); + register_frame(py_ctx, df, DEFAULT_TABLE_NAME.to_string()); + let data_frame = rt.block_on(do_base_sequence_quality( + ctx, + DEFAULT_TABLE_NAME.to_string(), + column.to_string(), + )); + Ok(PyDataFrame::new(data_frame)) + }) +} + #[pymodule] fn polars_bio(_py: Python, m: &Bound) -> PyResult<()> { pyo3_log::init(); @@ -417,7 +463,8 @@ fn polars_bio(_py: Python, m: &Bound) -> PyResult<()> { m.add_function(wrap_pyfunction!(py_describe_vcf, m)?)?; m.add_function(wrap_pyfunction!(py_register_view, m)?)?; m.add_function(wrap_pyfunction!(py_from_polars, m)?)?; - // m.add_function(wrap_pyfunction!(unary_operation_scan, m)?)?; + m.add_function(wrap_pyfunction!(base_sequance_quality_frame, m)?)?; + m.add_function(wrap_pyfunction!(base_sequance_quality_scan, m)?)?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/src/operation.rs b/src/operation.rs index 13ff545f..bd50e182 100644 --- a/src/operation.rs +++ b/src/operation.rs @@ -6,8 +6,10 @@ use log::{debug, info}; use sequila_core::session_context::{Algorithm, SequilaConfig}; use tokio::runtime::Runtime; +use crate::sequence_quality_histogram::SequenceQualityHistogramProvider; use crate::context::set_option_internal; use crate::option::{FilterOp, RangeOp, RangeOptions}; +use crate::quantile_stats::QuantileStatsTableProvider; use crate::query::{count_overlaps_query, nearest_query, overlap_query}; use crate::udtf::CountOverlapsProvider; use crate::utils::default_cols_to_string; @@ -191,6 +193,45 @@ async fn do_count_overlaps_coverage_naive( ctx.sql(&query).await.unwrap() } +pub(crate) async fn do_base_sequence_quality( + ctx: &ExonSession, + table: String, + column: String, +) -> datafusion::dataframe::DataFrame { + let session = Arc::new(ctx.session.clone()); + let base_provider = Arc::new(SequenceQualityHistogramProvider::new( + session.clone(), + table.clone(), + column, + )); + + let base_table_name = format!("{}_decoded", table); + session.deregister_table(base_table_name.clone()).unwrap(); + session + .register_table(&base_table_name, base_provider) + .unwrap(); + + let query = format!( + "SELECT pos, score, SUM(count) as count FROM {} GROUP BY pos, score", + base_table_name + ); + let base_df = ctx.sql(&query).await.unwrap(); + let base_plan = base_df.create_physical_plan().await.unwrap(); + + let quantile_provider = Arc::new(QuantileStatsTableProvider::new(base_plan)); + + let quantile_table_name = format!("{}_quantiles", table); + session + .deregister_table(quantile_table_name.clone()) + .unwrap(); + session + .register_table(&quantile_table_name, quantile_provider) + .unwrap(); + + let query = format!("SELECT * FROM {}", quantile_table_name); + ctx.sql(&query).await.unwrap() +} + async fn get_non_join_columns( table_name: String, join_columns: Vec, diff --git a/src/quantile_stats.rs b/src/quantile_stats.rs new file mode 100644 index 00000000..43645027 --- /dev/null +++ b/src/quantile_stats.rs @@ -0,0 +1,268 @@ +use std::any::Any; +use std::collections::HashMap; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; + +use arrow::array::{Array, Float64Builder, UInt64Array, UInt64Builder, UInt8Array}; +use arrow::compute::concat_batches; +use arrow::datatypes::{DataType, Field, Schema, SchemaRef}; +use arrow::record_batch::RecordBatch; +use async_trait::async_trait; +use datafusion::catalog::{Session, TableProvider}; +use datafusion::datasource::TableType; +use datafusion::error::Result; +use datafusion::execution::context::TaskContext; +use datafusion::physical_expr::EquivalenceProperties; +use datafusion::physical_plan::memory::MemoryStream; +use datafusion::physical_plan::{ + collect, DisplayAs, DisplayFormatType, ExecutionMode, ExecutionPlan, Partitioning, + PlanProperties, SendableRecordBatchStream, +}; + +pub struct QuantileStatsTableProvider { + input: Arc, + schema: SchemaRef, +} + +impl QuantileStatsTableProvider { + pub fn new(input: Arc) -> Self { + let schema = Arc::new(Schema::new(vec![ + Field::new("pos", DataType::UInt64, false), + Field::new("avg", DataType::Float64, true), + Field::new("q1", DataType::Float64, true), + Field::new("median", DataType::Float64, true), + Field::new("q3", DataType::Float64, true), + Field::new("lower", DataType::Float64, true), + Field::new("upper", DataType::Float64, true), + ])); + Self { + input, + schema, + } + } +} + +impl Debug for QuantileStatsTableProvider { + fn fmt(&self, _f: &mut Formatter<'_>) -> std::fmt::Result { + Ok(()) + } +} + +#[async_trait] +impl TableProvider for QuantileStatsTableProvider { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn schema(&self) -> SchemaRef { + self.schema.clone() + } + + fn table_type(&self) -> TableType { + TableType::Base + } + + async fn scan( + &self, + _state: &dyn Session, + _projection: Option<&Vec>, + _filters: &[datafusion::logical_expr::Expr], + _limit: Option, + ) -> datafusion::error::Result> { + Ok(Arc::new(QuantileStatsExec::new(self.input.clone()))) + } +} + +#[derive(Debug)] +pub struct QuantileStatsExec { + input: Arc, + schema: SchemaRef, + properties: PlanProperties, +} + +impl QuantileStatsExec { + pub fn new(input: Arc) -> Self { + let schema = Arc::new(Schema::new(vec![ + Field::new("pos", DataType::UInt64, false), + Field::new("avg", DataType::Float64, true), + Field::new("q1", DataType::Float64, true), + Field::new("median", DataType::Float64, true), + Field::new("q3", DataType::Float64, true), + Field::new("lower", DataType::Float64, true), + Field::new("upper", DataType::Float64, true), + ])); + + let schema_clone = schema.clone(); + + Self { + input, + schema, + properties: PlanProperties::new( + EquivalenceProperties::new(schema_clone), + Partitioning::UnknownPartitioning(1), + ExecutionMode::Bounded, + ), + } + } +} + +impl ExecutionPlan for QuantileStatsExec { + fn name(&self) -> &str { + "QuantileAggregateExec" + } + + fn as_any(&self) -> &dyn Any { + self + } + + fn schema(&self) -> SchemaRef { + Arc::clone(&self.schema) + } + + fn properties(&self) -> &PlanProperties { + &self.properties + } + + fn children(&self) -> Vec<&Arc> { + vec![&self.input] + } + + fn with_new_children( + self: Arc, + _children: Vec>, + ) -> Result> { + Ok(self) + } + + fn execute( + &self, + _partition: usize, + context: Arc, + ) -> Result { + let input = self.input.clone(); + let schema = self.schema.clone(); + + let batches = futures::executor::block_on(collect(input, context.clone()))?; + let combined = concat_batches(&self.input.schema(), &batches)?; + let pos_array = combined + .column_by_name("pos") + .expect("Column 'pos' not found") + .as_any() + .downcast_ref::() + .expect("Expected UInt64 for pos"); + + let score_array = combined + .column_by_name("score") + .expect("Column 'score' not found") + .as_any() + .downcast_ref::() + .expect("Expected UInt8 for score"); + + let count_array = combined + .column_by_name("count") + .expect("Column 'count' not found") + .as_any() + .downcast_ref::() + .expect("Expected UInt64 for count"); + + let mut groups: HashMap> = HashMap::new(); + for i in 0..combined.num_rows() { + if pos_array.is_valid(i) && score_array.is_valid(i) && count_array.is_valid(i) { + let pos = pos_array.value(i); + let score = score_array.value(i); + let count = count_array.value(i); + let entry = groups.entry(pos).or_insert_with(|| vec![0; 256]); + entry[score as usize] += count; + } + } + + let mut pos_builder = UInt64Builder::with_capacity(groups.len()); + let mut avg_builder = Float64Builder::with_capacity(groups.len()); + let mut q1_builder = Float64Builder::with_capacity(groups.len()); + let mut median_builder = Float64Builder::with_capacity(groups.len()); + let mut q3_builder = Float64Builder::with_capacity(groups.len()); + let mut lower_builder = Float64Builder::with_capacity(groups.len()); + let mut upper_builder = Float64Builder::with_capacity(groups.len()); + + for (pos, hist) in groups { + if let Some((average, q1, median, q3, lower, upper)) = calculate_histogram_stats(&hist) + { + pos_builder.append_value(pos); + avg_builder.append_value(average); + q1_builder.append_value(q1); + median_builder.append_value(median); + q3_builder.append_value(q3); + lower_builder.append_value(lower); + upper_builder.append_value(upper); + } + } + + let result_batch = RecordBatch::try_new( + schema.clone(), + vec![ + Arc::new(pos_builder.finish()), + Arc::new(avg_builder.finish()), + Arc::new(q1_builder.finish()), + Arc::new(median_builder.finish()), + Arc::new(q3_builder.finish()), + Arc::new(lower_builder.finish()), + Arc::new(upper_builder.finish()), + ], + )?; + let mem_stream = MemoryStream::try_new(vec![result_batch], schema, None)?; + Ok(Box::pin(mem_stream)) + } +} + +impl DisplayAs for QuantileStatsExec { + fn fmt_as(&self, _t: DisplayFormatType, _f: &mut Formatter) -> std::fmt::Result { + Ok(()) + } +} + +fn calculate_histogram_stats(hist: &[u64]) -> Option<(f64, f64, f64, f64, f64, f64)> { + let total_count: u64 = hist.iter().sum(); + if total_count == 0 { + return None; + } + + let weighted_sum: u64 = hist + .iter() + .enumerate() + .map(|(score, &count)| score as u64 * count) + .sum(); + let average = weighted_sum as f64 / total_count as f64; + + fn quantile(hist: &[u64], quantile: f64, total: u64) -> f64 { + let target = quantile * (total - 1) as f64; + let target_ = target.floor(); + let delta = target - target_; + let n = target_ as u64 + 1; + let mut lo = None; + let mut acc = 0u64; + for (hi, &count) in hist.iter().enumerate().filter(|(_, &count)| count > 0) { + if acc == n && lo.is_some() { + let lo = lo.unwrap() as f64; + return (lo + (hi as f64 - lo) * delta) as f64; + } else if acc + count > n { + return hi as f64; + } + acc += count; + lo = Some(hi); + } + + hist.iter().enumerate().fold( + 0_usize, + |acc, (value, &count)| if count > 0 { value } else { acc }, + ) as f64 + } + + let q1 = quantile(hist, 0.25, total_count); + let median = quantile(hist, 0.5, total_count); + let q3 = quantile(hist, 0.75, total_count); + let iqr = q3 - q1; + let lower = q1 - 1.5 * iqr; + let upper = q3 + 1.5 * iqr; + + Some((average, q1, median, q3, lower, upper)) +} diff --git a/src/scan.rs b/src/scan.rs index 4d5b288e..34412780 100644 --- a/src/scan.rs +++ b/src/scan.rs @@ -61,6 +61,8 @@ pub(crate) fn get_input_format(path: &str) -> InputFormat { InputFormat::Bed } else if path.ends_with(".vcf") || path.ends_with(".vcf.gz") || path.ends_with(".vcf.bgz") { InputFormat::Vcf + } else if path.ends_with(".fastq") { + InputFormat::Fastq } else { panic!("Unsupported format") } diff --git a/src/sequence_quality_histogram.rs b/src/sequence_quality_histogram.rs new file mode 100644 index 00000000..9ea963ed --- /dev/null +++ b/src/sequence_quality_histogram.rs @@ -0,0 +1,242 @@ +use std::any::Any; +use std::collections::HashMap; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; + +use arrow_array::{Array, StringArray}; +use async_trait::async_trait; +use datafusion::arrow::datatypes::{DataType, Field, Schema, SchemaRef}; +use datafusion::arrow::record_batch::RecordBatch; +use datafusion::catalog::{Session, TableProvider}; +use datafusion::datasource::TableType; +use datafusion::error::{DataFusionError, Result}; +use datafusion::execution::context::TaskContext; +use datafusion::physical_expr::EquivalenceProperties; +use datafusion::physical_plan::repartition::RepartitionExec; +use datafusion::physical_plan::stream::RecordBatchStreamAdapter; +use datafusion::physical_plan::{ + DisplayAs, DisplayFormatType, ExecutionMode, ExecutionPlan, Partitioning, PlanProperties, + SendableRecordBatchStream, +}; +use datafusion::prelude::{col, SessionContext}; +use futures::stream::BoxStream; +use futures::TryStreamExt; +pub struct SequenceQualityHistogramProvider { + session: Arc, + table_name: String, + column_name: String, + schema: SchemaRef, +} + +impl SequenceQualityHistogramProvider { + pub fn new(session: Arc, table_name: String, column_name: String) -> Self { + let schema = Arc::new(Schema::new(vec![ + Field::new("pos", DataType::UInt64, false), + Field::new("score", DataType::UInt8, false), + Field::new("count", DataType::UInt64, false), + ])); + Self { + session, + table_name, + column_name, + schema, + } + } +} + +impl Debug for SequenceQualityHistogramProvider { + fn fmt(&self, _f: &mut Formatter<'_>) -> std::fmt::Result { + Ok(()) + } +} + +#[async_trait] +impl TableProvider for SequenceQualityHistogramProvider { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn schema(&self) -> SchemaRef { + self.schema.clone() + } + + fn table_type(&self) -> TableType { + todo!() + } + + async fn scan( + &self, + _state: &dyn Session, + _projection: Option<&Vec>, + _filters: &[datafusion::prelude::Expr], + _limit: Option, + ) -> Result> { + let target_partitions = self.session.state().config().target_partitions(); + Ok(Arc::new(SequenceQualityHistogramExec { + schema: self.schema.clone(), + session: self.session.clone(), + table_name: self.table_name.clone(), + column_name: self.column_name.clone(), + properties: PlanProperties::new( + EquivalenceProperties::new(self.schema.clone()), + Partitioning::UnknownPartitioning(target_partitions), + ExecutionMode::Bounded, + ), + })) + } +} + +pub struct SequenceQualityHistogramExec { + schema: SchemaRef, + session: Arc, + table_name: String, + column_name: String, + properties: PlanProperties, +} + +impl Debug for SequenceQualityHistogramExec { + fn fmt(&self, _f: &mut Formatter<'_>) -> std::fmt::Result { + Ok(()) + } +} + +impl DisplayAs for SequenceQualityHistogramExec { + fn fmt_as(&self, _t: DisplayFormatType, _f: &mut Formatter) -> std::fmt::Result { + Ok(()) + } +} + +impl ExecutionPlan for SequenceQualityHistogramExec { + fn name(&self) -> &str { + "BaseSequenceQualityExec" + } + + fn as_any(&self) -> &dyn Any { + self + } + + fn schema(&self) -> SchemaRef { + self.schema.clone() + } + + fn properties(&self) -> &PlanProperties { + &self.properties + } + + fn children(&self) -> Vec<&Arc> { + vec![] + } + + fn with_new_children( + self: Arc, + _children: Vec>, + ) -> Result> { + Ok(self) + } + + fn execute( + &self, + partition: usize, + context: Arc, + ) -> Result { + let fut = get_stream( + self.session.clone(), + self.table_name.clone(), + self.column_name.clone(), + self.properties.partitioning.partition_count(), + partition, + context, + self.schema.clone(), + ); + let stream = futures::stream::once(fut).try_flatten(); + let schema = self.schema.clone(); + Ok(Box::pin(RecordBatchStreamAdapter::new(schema, stream))) + } +} + +fn decode_score(c: char) -> Option { + let ascii = c as u8; + if ascii >= 33 { + Some(ascii - 33) + } else { + None + } +} + +async fn get_stream( + session: Arc, + table_name: String, + column_name: String, + target_partitions: usize, + partition: usize, + context: Arc, + new_schema: SchemaRef, +) -> Result { + let df = session + .table(table_name.clone()) + .await? + .select(vec![col(&column_name)])?; + + let plan = df.create_physical_plan().await?; + + let repartition_stream = + RepartitionExec::try_new(plan, Partitioning::RoundRobinBatch(target_partitions))?; + + let partition_stream = repartition_stream.execute(partition, context)?; + + let final_pos_map = partition_stream.try_fold(HashMap::new(), |mut pos_map, batch| async move { + let col = batch.column(0); // tylko jedna kolumna + + let col = arrow::compute::cast(col, &DataType::Utf8) + .map_err(|e| DataFusionError::Internal(format!("Cast error: {e}")))?; + + let col = col + .as_any() + .downcast_ref::() + .ok_or_else(|| DataFusionError::Internal("Expected StringArray".into()))?; + + col.iter().for_each(|s_opt| { + if let Some(s) = s_opt { + s.bytes().enumerate().for_each(|(pos, byte)| { + if let Some(score) = decode_score(byte as char) { + let entry = pos_map.entry(pos).or_insert_with(|| vec![0u64; 94]); + if (score as usize) < entry.len() { + entry[score as usize] += 1; + } + } + }); + } + }); + + Ok(pos_map) + }).await?; + + let mut positions = Vec::new(); + let mut scores = Vec::new(); + let mut counts = Vec::new(); + + for (pos, counts_vec) in final_pos_map { + for (score, &count) in counts_vec.iter().enumerate() { + if count > 0 { + positions.push(pos as u64); + scores.push(score as u8); + counts.push(count as u64); + } + } + } + let pos_array = Arc::new(arrow_array::UInt64Array::from(positions)); + let score_array = Arc::new(arrow_array::UInt8Array::from(scores)); + let count_array = Arc::new(arrow_array::UInt64Array::from(counts)); + let new_batch = RecordBatch::try_new( + new_schema.clone(), + vec![pos_array, score_array, count_array], + ) + .map_err(|e| DataFusionError::Internal(format!("Error creating RecordBatch: {e}")))?; + + let iter = futures::stream::once(async move { Ok(new_batch) }); + + let adapted_stream = + RecordBatchStreamAdapter::new(new_schema.clone(), Box::pin(iter) as BoxStream<_>); + + Ok(Box::pin(adapted_stream)) +} diff --git a/tests/test_base_sequence_quality.py b/tests/test_base_sequence_quality.py new file mode 100644 index 00000000..f7b278bd --- /dev/null +++ b/tests/test_base_sequence_quality.py @@ -0,0 +1,215 @@ +from pathlib import Path +import polars as pl +import pandas as pd + +import pytest + +import polars_bio as pb + + +class TestBaseSequenceQuality: + def record_header(self, len: int): + return f"@test\n{'N'*len}\n+\n" + + def simple_test_data(self): + data = self.record_header(1) + chr(5 + 33) + "\n" + result = pl.DataFrame( + { + "pos": [0], + "avg": [5.0], + "q1": [5.0], + "median": [5.0], + "q3": [5.0], + "lower": [5.0], + "upper": [5.0], + } + ) + + return data, result + + @pytest.mark.usefixtures("tmp_path") + def test_result_from_empty_fastq_should_be_empty_df_polars(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text("", encoding="ascii") + + result = pb.base_sequence_quality(fastq_file) + assert isinstance(result, pl.DataFrame) + assert pb.base_sequence_quality(fastq_file).is_empty() + + @pytest.mark.usefixtures("tmp_path") + def test_result_from_empty_fastq_should_be_empty_df_pandas(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text("", encoding="ascii") + + result = pb.base_sequence_quality(fastq_file, output_type="pandas.DataFrame") + assert isinstance(result, pd.DataFrame) + assert pb.base_sequence_quality(fastq_file).is_empty() + + @pytest.mark.usefixtures("tmp_path") + def test_one_record_one_length(self, tmp_path: Path): + data, expected_result = self.simple_test_data() + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text(data, encoding="ascii") + + result = pb.base_sequence_quality(fastq_file) + assert result.equals(expected_result) + + @pytest.mark.usefixtures("tmp_path") + def test_one_record_one_length_lazyframe(self, tmp_path: Path): + data, expected_result = self.simple_test_data() + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text(data, encoding="ascii") + + lf = pb.read_fastq(str(fastq_file)) + result = pb.base_sequence_quality(lf) + + assert result.equals(expected_result) + + @pytest.mark.usefixtures("tmp_path") + def test_one_record_one_length_polars(self, tmp_path: Path): + data, expected_result = self.simple_test_data() + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text(data, encoding="ascii") + + lf = pb.read_fastq(str(fastq_file)) + polars_df = lf.collect() + result = pb.base_sequence_quality(polars_df) + + assert result.equals(expected_result) + + @pytest.mark.usefixtures("tmp_path") + def test_one_record_one_length_pandas(self, tmp_path: Path): + data, expected_result = self.simple_test_data() + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text(data, encoding="ascii") + + lf = pb.read_fastq(str(fastq_file)) + pandas_df = lf.collect().to_pandas() + result = pb.base_sequence_quality(pandas_df) + + assert result.equals(expected_result) + + @pytest.mark.usefixtures("tmp_path") + def test_one_record_two_length(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + fastq_file.write_text( + self.record_header(1) + chr(5 + 33) + chr(6 + 33) + "\n", + encoding="ascii", + ) + + result = pb.base_sequence_quality(fastq_file).sort(by="pos") + assert result.equals( + pl.DataFrame( + { + "pos": [0, 1], + "avg": [5.0, 6.0], + "q1": [5.0, 6.0], + "median": [5.0, 6.0], + "q3": [5.0, 6.0], + "lower": [5.0, 6.0], + "upper": [5.0, 6.0], + } + ) + ) + + @pytest.mark.usefixtures("tmp_path") + def test_two_record_one_length(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + + file_content = "" + for read in [0, 2]: + file_content += self.record_header(2) + chr(read + 33) + "\n" + + fastq_file.write_text(file_content, encoding="ascii") + + result = pb.base_sequence_quality(fastq_file) + assert result.equals( + pl.DataFrame( + { + "pos": [0], + "avg": [1.0], + "q1": [0.5], + "median": [1.0], + "q3": [1.5], + "lower": [-1.0], + "upper": [3.0], + } + ) + ) + + @pytest.mark.usefixtures("tmp_path") + def test_three_record_one_length(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + + file_content = "" + for read in [0, 2, 4]: + file_content += self.record_header(3) + chr(read + 33) + "\n" + + fastq_file.write_text(file_content, encoding="ascii") + + result = pb.base_sequence_quality(fastq_file) + assert result.equals( + pl.DataFrame( + { + "pos": [0], + "avg": [2.0], + "q1": [1.0], + "median": [2.0], + "q3": [3.0], + "lower": [-2.0], + "upper": [6.0], + } + ) + ) + + @pytest.mark.usefixtures("tmp_path") + def test_four_record_one_length(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + + file_content = "" + for read in [0, 2, 4, 9]: + file_content += self.record_header(3) + chr(read + 33) + "\n" + + fastq_file.write_text(file_content, encoding="ascii") + + result = pb.base_sequence_quality(fastq_file) + assert result.equals( + pl.DataFrame( + { + "pos": [0], + "avg": [3.75], + "q1": [1.5], + "median": [3.0], + "q3": [5.25], + "lower": [-4.125], + "upper": [10.875], + } + ) + ) + + @pytest.mark.usefixtures("tmp_path") + def test_four_record_two_length(self, tmp_path: Path): + fastq_file = tmp_path / "test.fastq" + + file_content = "" + for read1, read2 in zip([0, 2, 4, 9], [1, 3, 5, 10]): + file_content += ( + self.record_header(3) + chr(read1 + 33) + chr(read2 + 33) + "\n" + ) + + fastq_file.write_text(file_content, encoding="ascii") + + result = pb.base_sequence_quality(fastq_file).sort(by="pos") + assert result.equals( + pl.DataFrame( + { + "pos": [0, 1], + "avg": [3.75, 4.75], + "q1": [1.5, 2.5], + "median": [3.0, 4.0], + "q3": [5.25, 6.25], + "lower": [-4.125, -3.125], + "upper": [10.875, 11.875], + } + ) + )