a b/notebooks/SingleCellMultiOmics examples.ipynb
1
{
2
 "cells": [
3
  {
4
   "cell_type": "code",
5
   "execution_count": 63,
6
   "metadata": {},
7
   "outputs": [],
8
   "source": [
9
    "%matplotlib inline\n",
10
    "import matplotlib as mpl\n",
11
    "mpl.rcParams['figure.dpi'] = 250\n",
12
    "\n",
13
    "import matplotlib.pyplot as plt\n",
14
    "\n",
15
    "import pysam\n",
16
    "import singlecellmultiomics.molecule\n",
17
    "import singlecellmultiomics.fragment\n",
18
    "import pysamiterators\n",
19
    "import pandas as pd\n",
20
    "\n",
21
    "nla_test_bam_path = '../data/mini_nla_test.bam'"
22
   ]
23
  },
24
  {
25
   "cell_type": "code",
26
   "execution_count": 64,
27
   "metadata": {},
28
   "outputs": [
29
    {
30
     "name": "stdout",
31
     "output_type": "stream",
32
     "text": [
33
      "ST-E00285:221:HKM7VCCXY:6:2211:11485:25534\t1171\t0\t164834715\t60\t151M\t0\t164834656\t151\tGAGTTATGAAATCCCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGAGTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAGAC\tarray('B', [12, 41, 41, 32, 41, 37, 37, 37, 41, 41, 41, 37, 37, 41, 37, 32, 27, 37, 41, 41, 41, 32, 37, 32, 41, 41, 41, 41, 41, 37, 37, 37, 41, 41, 41, 37, 32, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 37, 27, 41, 41, 27, 41, 32, 41, 41, 41, 37, 41, 41, 41, 41, 37, 37, 37, 41, 41, 41, 41, 37, 27, 41, 41, 41, 41, 41, 41, 32, 37, 22, 32, 41, 32, 27, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 37, 37, 41, 41, 41, 41, 37, 41, 41, 41, 41, 37, 41, 41, 41, 41, 27, 37, 41, 41, 41, 41, 37, 41, 41, 41, 37, 41, 37, 37, 41, 37, 37, 41, 41, 37, 41, 41, 41, 37, 41, 37, 37, 37, 32, 32])\t[('NM', 0), ('MD', '151'), ('MC', '140M'), ('AS', 151), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '6'), ('Ti', '2211'), ('CX', '11485'), ('CY', '25534'), ('Fi', 'N'), ('CN', '0'), ('aA', 'TATAATAT'), ('LY', 'APKS1P25-NLAP1L4'), ('RX', 'TTA'), ('RQ', 'AAF'), ('BI', '90'), ('bc', 'AGCAAGCA'), ('BC', 'AGCAAGCA'), ('QT', 'FFFJJJJJ'), ('MX', 'NLAIII96C8U3'), ('MI', 'AGCAAGCATTATATAATAT'), ('QM', 'FFFJJJJJAAF////////'), ('SM', 'APKS1P25-NLAP1L4_90'), ('rS', 'GTCTTT'), ('rP', 164834866), ('RC', 2), ('DS', 164834656), ('DT', 'NLA'), ('RS', '-'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.6.APKS1P25-NLAP1L4_90')]\n",
34
      "ST-E00285:221:HKM7VCCXY:5:1211:30523:24796\t147\t0\t164834716\t60\t151M\t0\t164834656\t151\tAGTTATGAAATCCCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGAGTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAAACA\tarray('B', [32, 41, 32, 27, 41, 41, 37, 37, 22, 37, 27, 32, 37, 37, 32, 41, 41, 41, 41, 41, 41, 41, 41, 27, 37, 41, 41, 37, 32, 32, 37, 27, 27, 41, 41, 41, 41, 41, 37, 37, 27, 37, 32, 37, 37, 37, 32, 37, 37, 27, 32, 37, 12, 32, 37, 22, 41, 41, 41, 32, 22, 22, 37, 22, 32, 37, 41, 32, 27, 32, 22, 32, 12, 41, 41, 37, 37, 41, 41, 41, 41, 41, 41, 37, 22, 12, 22, 12, 32, 41, 41, 32, 37, 32, 27, 12, 12, 37, 37, 22, 32, 12, 37, 37, 12, 32, 27, 12, 22, 32, 27, 41, 37, 37, 37, 32, 41, 41, 41, 41, 27, 37, 41, 32, 37, 27, 12, 41, 12, 37, 22, 37, 32, 22, 32, 12, 37, 32, 12, 41, 41, 32, 12, 32, 27, 37, 12, 32, 32, 12, 27])\t[('NM', 1), ('MD', '147G3'), ('MC', '140M'), ('AS', 147), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '5'), ('Ti', '1211'), ('CX', '30523'), ('CY', '24796'), ('Fi', 'N'), ('CN', '0'), ('aA', 'TTAGGCAT'), ('LY', 'APKS1-P10-1-3'), ('RX', 'ACG'), ('RQ', 'AAF'), ('BI', '29'), ('bc', 'CGTTGATC'), ('BC', 'CGTTGATC'), ('QT', 'FFJJJJFA'), ('MX', 'NLAIII96C8U3'), ('MI', 'CGTTGATCACGTTAGGCAT'), ('QM', 'FFJJJJFAAAF////////'), ('SM', 'APKS1-P10-1-3_29'), ('rS', 'TGTTTT'), ('rP', 164834867), ('RC', 1), ('DS', 164834656), ('DT', 'NLA'), ('RS', '-'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.5.APKS1-P10-1-3_29')]\n"
35
     ]
36
    }
37
   ],
38
   "source": [
39
    "# iterate over the reads in  nla_test_bam_path using pysam ...\n",
40
    "with pysam.AlignmentFile(nla_test_bam_path) as alignments:\n",
41
    "    for i,read in enumerate( alignments ):\n",
42
    "        print(str(read))\n",
43
    "        if i>=1:\n",
44
    "            break"
45
   ]
46
  },
47
  {
48
   "cell_type": "code",
49
   "execution_count": 65,
50
   "metadata": {},
51
   "outputs": [
52
    {
53
     "name": "stdout",
54
     "output_type": "stream",
55
     "text": [
56
      "ST-E00285:221:HKM7VCCXY:5:2221:19918:29490\t83\t0\t164834729\t60\t140M\t0\t164834726\t140\tCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGAGTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAGACATG\tarray('B', [37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 37, 32, 32, 37, 37, 37, 41, 41, 37, 41, 41, 41, 41, 37, 41, 32, 32, 32, 22, 37, 12, 41, 37, 41, 41, 27, 41, 37, 37, 27, 37, 37, 37, 27, 37, 41, 37, 37, 37, 41, 41, 37, 37, 32, 41, 32, 32, 37, 32])\t[('NM', 0), ('MD', '140'), ('MC', '143M8S'), ('AS', 140), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '5'), ('Ti', '2221'), ('CX', '19918'), ('CY', '29490'), ('Fi', 'N'), ('CN', '0'), ('aA', 'TTAGGCAT'), ('LY', 'APKS1-P10-1-3'), ('RX', 'GAC'), ('RQ', 'AA<'), ('BI', '75'), ('bc', 'CAAGTTCC'), ('BC', 'CAAGTTCC'), ('QT', 'AAFAAFFJ'), ('MX', 'NLAIII96C8U3'), ('MI', 'CAAGTTCCGACTTAGGCAT'), ('QM', 'AAFAAFFJAA<////////'), ('SM', 'APKS1-P10-1-3_75'), ('rS', 'TCCCTT'), ('rP', 164834726), ('RC', 1), ('DS', 164834865), ('DT', 'NLA'), ('RS', '+'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.5.APKS1-P10-1-3_75')] ST-E00285:221:HKM7VCCXY:5:2221:19918:29490\t163\t0\t164834726\t60\t143M8S\t0\t164834729\t143\tTCCCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGACTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAGACATGGGAACTTG\tarray('B', [32, 32, 27, 27, 12, 27, 32, 37, 41, 27, 12, 22, 12, 22, 27, 37, 37, 12, 22, 37, 12, 12, 37, 32, 37, 12, 22, 12, 12, 32, 41, 12, 37, 12, 37, 41, 27, 22, 37, 27, 12, 27, 12, 27, 27, 32, 22, 32, 37, 22, 32, 37, 41, 12, 37, 37, 41, 37, 32, 27, 37, 41, 41, 37, 41, 41, 41, 41, 37, 37, 41, 41, 37, 37, 41, 37, 41, 27, 37, 22, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 32, 41, 41, 41, 32, 41, 41, 41, 41, 41, 41, 41, 41, 32, 32, 41, 41, 37, 41, 37, 37, 37, 22, 27, 37, 41, 41, 37, 37, 37, 41, 41, 27, 37, 37, 41, 41, 41, 41, 27, 37, 37, 37, 37])\t[('NM', 1), ('MD', '40G102'), ('MC', '140M'), ('AS', 138), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '5'), ('Ti', '2221'), ('CX', '19918'), ('CY', '29490'), ('Fi', 'N'), ('CN', '0'), ('aA', 'TTAGGCAT'), ('LY', 'APKS1-P10-1-3'), ('RX', 'GAC'), ('RQ', 'AA<'), ('BI', '75'), ('bc', 'CAAGTTCC'), ('BC', 'CAAGTTCC'), ('QT', 'AAFAAFFJ'), ('MX', 'NLAIII96C8U3'), ('MI', 'CAAGTTCCGACTTAGGCAT'), ('QM', 'AAFAAFFJAA<////////'), ('SM', 'APKS1-P10-1-3_75'), ('rS', 'TCCCTT'), ('rP', 164834726), ('RC', 1), ('DS', 164834865), ('DT', 'NLA'), ('RS', '+'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.5.APKS1-P10-1-3_75')]\n",
57
      "ST-E00285:221:HKM7VCCXY:6:1214:26920:26607\t83\t0\t164834729\t60\t140M\t0\t164834729\t140\tCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGAGTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAGACATG\tarray('B', [37, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 27, 41, 41, 27, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 32, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 32, 37, 37, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 37, 41, 41, 41, 37, 37, 41, 37, 22, 32, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41])\t[('NM', 0), ('MD', '140'), ('MC', '140M11S'), ('AS', 140), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '6'), ('Ti', '1214'), ('CX', '26920'), ('CY', '26607'), ('Fi', 'N'), ('CN', '0'), ('aA', 'CTCAGAAT'), ('LY', 'APKS1P25-NLAP1L1'), ('RX', 'ACC'), ('RQ', 'AAA'), ('BI', '61'), ('bc', 'CCTTCACA'), ('BC', 'CCTTCACA'), ('QT', 'FFJFJJJJ'), ('MX', 'NLAIII96C8U3'), ('MI', 'CCTTCACAACCCTCAGAAT'), ('QM', 'FFJFJJJJAAA////////'), ('SM', 'APKS1P25-NLAP1L1_61'), ('rS', 'CTTGCT'), ('rP', 164834729), ('RC', 1), ('DS', 164834865), ('DT', 'NLA'), ('RS', '+'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.6.APKS1P25-NLAP1L1_61')] ST-E00285:221:HKM7VCCXY:6:1214:26920:26607\t163\t0\t164834729\t60\t140M11S\t0\t164834729\t140\tCTTGCTAACTTTCTCTTCTCTGGGGAAAAGAGTCTGAGTTCCCTCAGCCTTTCTTCCTAAGACCTGTGGTTGGCTATAAATTGCATTGGTTGCTCTTCTCTAATGACCTCTGGAGATTGGCAACACCAAACAAAGACATGTGTGAAGGGGT\tarray('B', [32, 32, 37, 37, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 37, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 27, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 22, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 37, 41, 37, 41, 41, 37, 37, 41, 41, 41, 12])\t[('NM', 0), ('MD', '140'), ('MC', '140M'), ('AS', 140), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '6'), ('Ti', '1214'), ('CX', '26920'), ('CY', '26607'), ('Fi', 'N'), ('CN', '0'), ('aA', 'CTCAGAAT'), ('LY', 'APKS1P25-NLAP1L1'), ('RX', 'ACC'), ('RQ', 'AAA'), ('BI', '61'), ('bc', 'CCTTCACA'), ('BC', 'CCTTCACA'), ('QT', 'FFJFJJJJ'), ('MX', 'NLAIII96C8U3'), ('MI', 'CCTTCACAACCCTCAGAAT'), ('QM', 'FFJFJJJJAAA////////'), ('SM', 'APKS1P25-NLAP1L1_61'), ('rS', 'CTTGCT'), ('rP', 164834729), ('RC', 1), ('DS', 164834865), ('DT', 'NLA'), ('RS', '+'), ('RZ', 'CATG'), ('RG', 'HKM7VCCXY.6.APKS1P25-NLAP1L1_61')]\n"
58
     ]
59
    }
60
   ],
61
   "source": [
62
    "# Iterate over the mate pairs, keeping R1 and R2 together\n",
63
    "with pysam.AlignmentFile(nla_test_bam_path) as alignments:\n",
64
    "    for i,(R1,R2) in enumerate( pysamiterators.MatePairIterator(alignments) ):\n",
65
    "        print(R1, R2)\n",
66
    "        if i>=1:\n",
67
    "            break"
68
   ]
69
  },
70
  {
71
   "cell_type": "code",
72
   "execution_count": 66,
73
   "metadata": {},
74
   "outputs": [
75
    {
76
     "name": "stdout",
77
     "output_type": "stream",
78
     "text": [
79
      "Molecule\n",
80
      "        with 4 assinged fragments\n",
81
      "        Allele :No allele assigned\n",
82
      "            Fragment:\n",
83
      "            sample:APKS1P25-NLAP2L1_30\n",
84
      "            umi:CCG\n",
85
      "            span:chr1 164834731-164834869\n",
86
      "            strand:-\n",
87
      "            has R1: no\n",
88
      "            has R2: yes\n",
89
      "        \n",
90
      "\t    Fragment:\n",
91
      "            sample:APKS1P25-NLAP2L1_30\n",
92
      "            umi:CCG\n",
93
      "            span:chr1 164834731-164834869\n",
94
      "            strand:-\n",
95
      "            has R1: no\n",
96
      "            has R2: yes\n",
97
      "        \n",
98
      "\t    Fragment:\n",
99
      "            sample:APKS1P25-NLAP2L1_30\n",
100
      "            umi:CCG\n",
101
      "            span:chr1 164834731-164834869\n",
102
      "            strand:-\n",
103
      "            has R1: no\n",
104
      "            has R2: yes\n",
105
      "        \n",
106
      "\t    Fragment:\n",
107
      "            sample:APKS1P25-NLAP2L1_30\n",
108
      "            umi:CCG\n",
109
      "            span:chr1 164834741-164834869\n",
110
      "            strand:-\n",
111
      "            has R1: no\n",
112
      "            has R2: yes\n",
113
      "        \n"
114
     ]
115
    }
116
   ],
117
   "source": [
118
    "# Iterate over molecules\n",
119
    "with pysam.AlignmentFile(nla_test_bam_path) as alignments:\n",
120
    "    for i,molecule in enumerate( singlecellmultiomics.molecule.MoleculeIterator(alignments) ):\n",
121
    "        print(molecule)\n",
122
    "        break"
123
   ]
124
  },
125
  {
126
   "cell_type": "code",
127
   "execution_count": 67,
128
   "metadata": {},
129
   "outputs": [
130
    {
131
     "data": {
132
      "text/plain": [
133
       "Fragment:\n",
134
       "        sample:APKS1P25-NLAP2L1_30\n",
135
       "        umi:CCG\n",
136
       "        span:chr1 164834731-164834869\n",
137
       "        strand:-\n",
138
       "        has R1: no\n",
139
       "        has R2: yes\n",
140
       "        "
141
      ]
142
     },
143
     "execution_count": 67,
144
     "metadata": {},
145
     "output_type": "execute_result"
146
    }
147
   ],
148
   "source": [
149
    "# Obtain the first fragment assigned to the molecule\n",
150
    "molecule[0]"
151
   ]
152
  },
153
  {
154
   "cell_type": "code",
155
   "execution_count": 68,
156
   "metadata": {},
157
   "outputs": [],
158
   "source": [
159
    "# obtain read 1 from the first fragment\n",
160
    "molecule[0][0] "
161
   ]
162
  },
163
  {
164
   "cell_type": "code",
165
   "execution_count": 69,
166
   "metadata": {},
167
   "outputs": [],
168
   "source": [
169
    "molecule[0].get_R1()"
170
   ]
171
  },
172
  {
173
   "cell_type": "code",
174
   "execution_count": 70,
175
   "metadata": {},
176
   "outputs": [
177
    {
178
     "data": {
179
      "text/plain": [
180
       "'-'"
181
      ]
182
     },
183
     "execution_count": 70,
184
     "metadata": {},
185
     "output_type": "execute_result"
186
    }
187
   ],
188
   "source": [
189
    "# Obtain the strand as string (-: reverse, +:forward)\n",
190
    "molecule.get_strand_repr()"
191
   ]
192
  },
193
  {
194
   "cell_type": "code",
195
   "execution_count": 71,
196
   "metadata": {},
197
   "outputs": [
198
    {
199
     "data": {
200
      "text/plain": [
201
       "4"
202
      ]
203
     },
204
     "execution_count": 71,
205
     "metadata": {},
206
     "output_type": "execute_result"
207
    }
208
   ],
209
   "source": [
210
    "# Obtain the amount of fragments associated to the molecule\n",
211
    "len(molecule)"
212
   ]
213
  },
214
  {
215
   "cell_type": "code",
216
   "execution_count": 72,
217
   "metadata": {},
218
   "outputs": [
219
    {
220
     "data": {
221
      "text/plain": [
222
       "'APKS1P25-NLAP2L1_30'"
223
      ]
224
     },
225
     "execution_count": 72,
226
     "metadata": {},
227
     "output_type": "execute_result"
228
    }
229
   ],
230
   "source": [
231
    "# Obtain the sample name\n",
232
    "molecule.sample"
233
   ]
234
  },
235
  {
236
   "cell_type": "code",
237
   "execution_count": 73,
238
   "metadata": {},
239
   "outputs": [
240
    {
241
     "data": {
242
      "text/plain": [
243
       "NlaIIIMolecule\n",
244
       "        with 4 assinged fragments\n",
245
       "        Allele :No allele assigned\n",
246
       "            Fragment:\n",
247
       "            sample:APKS3-P19-1-1_115\n",
248
       "            umi:GAC\n",
249
       "            span:chr1 164834869-164835153\n",
250
       "            strand:-\n",
251
       "            has R1: yes\n",
252
       "            has R2: yes\n",
253
       "            DS:164834865\n",
254
       "    \tRS:1\n",
255
       "    \tRZ:CATG\n",
256
       "    \tRestriction site:('chr1', 164834865)\n",
257
       "\t    Fragment:\n",
258
       "            sample:APKS3-P19-1-1_115\n",
259
       "            umi:GCC\n",
260
       "            span:chr1 164834869-164835270\n",
261
       "            strand:-\n",
262
       "            has R1: yes\n",
263
       "            has R2: yes\n",
264
       "            DS:164834865\n",
265
       "    \tRS:1\n",
266
       "    \tRZ:CATG\n",
267
       "    \tRestriction site:('chr1', 164834865)\n",
268
       "\t    Fragment:\n",
269
       "            sample:APKS3-P19-1-1_115\n",
270
       "            umi:GAC\n",
271
       "            span:chr1 164834869-164835270\n",
272
       "            strand:-\n",
273
       "            has R1: yes\n",
274
       "            has R2: yes\n",
275
       "            DS:164834865\n",
276
       "    \tRS:1\n",
277
       "    \tRZ:CATG\n",
278
       "    \tRestriction site:('chr1', 164834865)\n",
279
       "\t    Fragment:\n",
280
       "            sample:APKS3-P19-1-1_115\n",
281
       "            umi:GAC\n",
282
       "            span:chr1 164834869-164835270\n",
283
       "            strand:-\n",
284
       "            has R1: yes\n",
285
       "            has R2: yes\n",
286
       "            DS:164834865\n",
287
       "    \tRS:1\n",
288
       "    \tRZ:CATG\n",
289
       "    \tRestriction site:('chr1', 164834865)"
290
      ]
291
     },
292
     "execution_count": 73,
293
     "metadata": {},
294
     "output_type": "execute_result"
295
    }
296
   ],
297
   "source": [
298
    "# Find a molecule with 4 fragments\n",
299
    "molecules_seen = [] # store all molecules, used in next examples\n",
300
    "with pysam.AlignmentFile(nla_test_bam_path) as alignments:\n",
301
    "    for i,molecule in enumerate(\n",
302
    "            singlecellmultiomics.molecule.MoleculeIterator(alignments,\n",
303
    "                                                            fragment_class_args={\n",
304
    "                                                                'umi_hamming_distance':1\n",
305
    "                                                            },\n",
306
    "                                                           moleculeClass=singlecellmultiomics.molecule.NlaIIIMolecule,\n",
307
    "                                                           fragmentClass=singlecellmultiomics.fragment.NLAIIIFragment\n",
308
    "\n",
309
    "                                                          )):\n",
310
    "        molecules_seen.append(molecule)\n",
311
    "        if len(molecule)==4 and i>0:\n",
312
    "            break\n",
313
    "molecule"
314
   ]
315
  },
316
  {
317
   "cell_type": "code",
318
   "execution_count": 74,
319
   "metadata": {},
320
   "outputs": [
321
    {
322
     "data": {
323
      "text/plain": [
324
       "Counter({'GAC': 3, 'GCC': 1})"
325
      ]
326
     },
327
     "execution_count": 74,
328
     "metadata": {},
329
     "output_type": "execute_result"
330
    }
331
   ],
332
   "source": [
333
    "# Obtain associated unique molecular identifiers\n",
334
    "molecule.umi_counter"
335
   ]
336
  },
337
  {
338
   "cell_type": "code",
339
   "execution_count": 75,
340
   "metadata": {},
341
   "outputs": [
342
    {
343
     "name": "stdout",
344
     "output_type": "stream",
345
     "text": [
346
      "ST-E00285:221:HKM7VCCXY:6:1224:9120:30439\n",
347
      "NS500413:404:HJ3KHBGX5:2:22312:23759:6537\n",
348
      "NS500413:404:HJ3KHBGX5:4:13507:22698:18344\n",
349
      "NS500413:404:HJ3KHBGX5:3:23502:18585:5263\n"
350
     ]
351
    }
352
   ],
353
   "source": [
354
    "# Iterate over all fragments in the molecule, obtain their R1 and print the read name:\n",
355
    "for fragment in molecule:\n",
356
    "    print(fragment.get_R1().query_name )"
357
   ]
358
  },
359
  {
360
   "cell_type": "code",
361
   "execution_count": 76,
362
   "metadata": {},
363
   "outputs": [
364
    {
365
     "name": "stdout",
366
     "output_type": "stream",
367
     "text": [
368
      "164835159 TGCAGT [Fragment:\n",
369
      "        sample:APKS3-P19-1-1_115\n",
370
      "        umi:GAC\n",
371
      "        span:chr1 164834869-164835153\n",
372
      "        strand:-\n",
373
      "        has R1: yes\n",
374
      "        has R2: yes\n",
375
      "        DS:164834865\n",
376
      "\tRS:1\n",
377
      "\tRZ:CATG\n",
378
      "\tRestriction site:('chr1', 164834865)]\n",
379
      "164835276 CAGTGT [Fragment:\n",
380
      "        sample:APKS3-P19-1-1_115\n",
381
      "        umi:GCC\n",
382
      "        span:chr1 164834869-164835270\n",
383
      "        strand:-\n",
384
      "        has R1: yes\n",
385
      "        has R2: yes\n",
386
      "        DS:164834865\n",
387
      "\tRS:1\n",
388
      "\tRZ:CATG\n",
389
      "\tRestriction site:('chr1', 164834865)]\n",
390
      "164835276 CCGTGT [Fragment:\n",
391
      "        sample:APKS3-P19-1-1_115\n",
392
      "        umi:GAC\n",
393
      "        span:chr1 164834869-164835270\n",
394
      "        strand:-\n",
395
      "        has R1: yes\n",
396
      "        has R2: yes\n",
397
      "        DS:164834865\n",
398
      "\tRS:1\n",
399
      "\tRZ:CATG\n",
400
      "\tRestriction site:('chr1', 164834865), Fragment:\n",
401
      "        sample:APKS3-P19-1-1_115\n",
402
      "        umi:GAC\n",
403
      "        span:chr1 164834869-164835270\n",
404
      "        strand:-\n",
405
      "        has R1: yes\n",
406
      "        has R2: yes\n",
407
      "        DS:164834865\n",
408
      "\tRS:1\n",
409
      "\tRZ:CATG\n",
410
      "\tRestriction site:('chr1', 164834865)]\n"
411
     ]
412
    }
413
   ],
414
   "source": [
415
    "# Iterate over all reverse transcription reactions:\n",
416
    "for (reverse_primer_start, reverse_primer_sequence), associated_fragments in molecule.get_rt_reactions().items():\n",
417
    "    print(reverse_primer_start,reverse_primer_sequence,associated_fragments)"
418
   ]
419
  },
420
  {
421
   "cell_type": "markdown",
422
   "metadata": {},
423
   "source": [
424
    "## Equivalence testing"
425
   ]
426
  },
427
  {
428
   "cell_type": "markdown",
429
   "metadata": {},
430
   "source": [
431
    "### Comparing fragments"
432
   ]
433
  },
434
  {
435
   "cell_type": "code",
436
   "execution_count": 77,
437
   "metadata": {},
438
   "outputs": [
439
    {
440
     "data": {
441
      "text/plain": [
442
       "True"
443
      ]
444
     },
445
     "execution_count": 77,
446
     "metadata": {},
447
     "output_type": "execute_result"
448
    }
449
   ],
450
   "source": [
451
    "# compare two fragments: (check if they should belong to the same molecule)\n",
452
    "fragment_A = molecule[0]\n",
453
    "fragment_B = molecule[1]\n",
454
    "fragment_A == fragment_B"
455
   ]
456
  },
457
  {
458
   "cell_type": "code",
459
   "execution_count": 78,
460
   "metadata": {},
461
   "outputs": [
462
    {
463
     "data": {
464
      "text/plain": [
465
       "Fragment:\n",
466
       "        sample:APKS1P25-NLAP2L2_57\n",
467
       "        umi:CCG\n",
468
       "        span:chr1 164834728-164834868\n",
469
       "        strand:+\n",
470
       "        has R1: yes\n",
471
       "        has R2: no\n",
472
       "        DS:164834865\n",
473
       "\tRS:0\n",
474
       "\tRZ:CAT\n",
475
       "\tRestriction site:('chr1', 164834865)"
476
      ]
477
     },
478
     "execution_count": 78,
479
     "metadata": {},
480
     "output_type": "execute_result"
481
    }
482
   ],
483
   "source": [
484
    "# Obtain a fragment not belonging to the molecule \n",
485
    "fragment_C = molecules_seen[0][0]\n",
486
    "fragment_C"
487
   ]
488
  },
489
  {
490
   "cell_type": "code",
491
   "execution_count": 79,
492
   "metadata": {},
493
   "outputs": [
494
    {
495
     "data": {
496
      "text/plain": [
497
       "False"
498
      ]
499
     },
500
     "execution_count": 79,
501
     "metadata": {},
502
     "output_type": "execute_result"
503
    }
504
   ],
505
   "source": [
506
    "fragment_C == fragment_A"
507
   ]
508
  },
509
  {
510
   "cell_type": "markdown",
511
   "metadata": {},
512
   "source": [
513
    "### Comparing fragment to molecule"
514
   ]
515
  },
516
  {
517
   "cell_type": "code",
518
   "execution_count": 80,
519
   "metadata": {},
520
   "outputs": [
521
    {
522
     "data": {
523
      "text/plain": [
524
       "True"
525
      ]
526
     },
527
     "execution_count": 80,
528
     "metadata": {},
529
     "output_type": "execute_result"
530
    }
531
   ],
532
   "source": [
533
    "# Fragment A belongs to molecule, this comparison results in True\n",
534
    "fragment_A == molecule"
535
   ]
536
  },
537
  {
538
   "cell_type": "code",
539
   "execution_count": 81,
540
   "metadata": {},
541
   "outputs": [
542
    {
543
     "data": {
544
      "text/plain": [
545
       "False"
546
      ]
547
     },
548
     "execution_count": 81,
549
     "metadata": {},
550
     "output_type": "execute_result"
551
    }
552
   ],
553
   "source": [
554
    "# Fragment C does not belong to molecule\n",
555
    "fragment_C == molecule "
556
   ]
557
  },
558
  {
559
   "cell_type": "markdown",
560
   "metadata": {},
561
   "source": [
562
    "# Consensus sequence"
563
   ]
564
  },
565
  {
566
   "cell_type": "code",
567
   "execution_count": 82,
568
   "metadata": {},
569
   "outputs": [
570
    {
571
     "data": {
572
      "text/html": [
573
       "<div>\n",
574
       "<style scoped>\n",
575
       "    .dataframe tbody tr th:only-of-type {\n",
576
       "        vertical-align: middle;\n",
577
       "    }\n",
578
       "\n",
579
       "    .dataframe tbody tr th {\n",
580
       "        vertical-align: top;\n",
581
       "    }\n",
582
       "\n",
583
       "    .dataframe thead tr th {\n",
584
       "        text-align: left;\n",
585
       "    }\n",
586
       "</style>\n",
587
       "<table border=\"1\" class=\"dataframe\">\n",
588
       "  <thead>\n",
589
       "    <tr>\n",
590
       "      <th></th>\n",
591
       "      <th colspan=\"21\" halign=\"left\">chr1</th>\n",
592
       "    </tr>\n",
593
       "    <tr>\n",
594
       "      <th></th>\n",
595
       "      <th>164834869</th>\n",
596
       "      <th>164834870</th>\n",
597
       "      <th>164834871</th>\n",
598
       "      <th>164834872</th>\n",
599
       "      <th>164834873</th>\n",
600
       "      <th>164834874</th>\n",
601
       "      <th>164834875</th>\n",
602
       "      <th>164834876</th>\n",
603
       "      <th>164834877</th>\n",
604
       "      <th>164834878</th>\n",
605
       "      <th>...</th>\n",
606
       "      <th>164835262</th>\n",
607
       "      <th>164835263</th>\n",
608
       "      <th>164835264</th>\n",
609
       "      <th>164835265</th>\n",
610
       "      <th>164835266</th>\n",
611
       "      <th>164835267</th>\n",
612
       "      <th>164835268</th>\n",
613
       "      <th>164835269</th>\n",
614
       "      <th>164835270</th>\n",
615
       "      <th>164835238</th>\n",
616
       "    </tr>\n",
617
       "  </thead>\n",
618
       "  <tbody>\n",
619
       "    <tr>\n",
620
       "      <td>A</td>\n",
621
       "      <td>4.0</td>\n",
622
       "      <td>NaN</td>\n",
623
       "      <td>NaN</td>\n",
624
       "      <td>NaN</td>\n",
625
       "      <td>4.0</td>\n",
626
       "      <td>NaN</td>\n",
627
       "      <td>4.0</td>\n",
628
       "      <td>NaN</td>\n",
629
       "      <td>4.0</td>\n",
630
       "      <td>NaN</td>\n",
631
       "      <td>...</td>\n",
632
       "      <td>NaN</td>\n",
633
       "      <td>3.0</td>\n",
634
       "      <td>NaN</td>\n",
635
       "      <td>NaN</td>\n",
636
       "      <td>3.0</td>\n",
637
       "      <td>3.0</td>\n",
638
       "      <td>NaN</td>\n",
639
       "      <td>3.0</td>\n",
640
       "      <td>3.0</td>\n",
641
       "      <td>NaN</td>\n",
642
       "    </tr>\n",
643
       "    <tr>\n",
644
       "      <td>G</td>\n",
645
       "      <td>NaN</td>\n",
646
       "      <td>4.0</td>\n",
647
       "      <td>NaN</td>\n",
648
       "      <td>NaN</td>\n",
649
       "      <td>NaN</td>\n",
650
       "      <td>4.0</td>\n",
651
       "      <td>NaN</td>\n",
652
       "      <td>NaN</td>\n",
653
       "      <td>NaN</td>\n",
654
       "      <td>NaN</td>\n",
655
       "      <td>...</td>\n",
656
       "      <td>NaN</td>\n",
657
       "      <td>NaN</td>\n",
658
       "      <td>NaN</td>\n",
659
       "      <td>NaN</td>\n",
660
       "      <td>NaN</td>\n",
661
       "      <td>NaN</td>\n",
662
       "      <td>NaN</td>\n",
663
       "      <td>NaN</td>\n",
664
       "      <td>NaN</td>\n",
665
       "      <td>1.0</td>\n",
666
       "    </tr>\n",
667
       "    <tr>\n",
668
       "      <td>T</td>\n",
669
       "      <td>NaN</td>\n",
670
       "      <td>NaN</td>\n",
671
       "      <td>4.0</td>\n",
672
       "      <td>4.0</td>\n",
673
       "      <td>NaN</td>\n",
674
       "      <td>NaN</td>\n",
675
       "      <td>NaN</td>\n",
676
       "      <td>4.0</td>\n",
677
       "      <td>NaN</td>\n",
678
       "      <td>4.0</td>\n",
679
       "      <td>...</td>\n",
680
       "      <td>3.0</td>\n",
681
       "      <td>NaN</td>\n",
682
       "      <td>3.0</td>\n",
683
       "      <td>3.0</td>\n",
684
       "      <td>NaN</td>\n",
685
       "      <td>NaN</td>\n",
686
       "      <td>3.0</td>\n",
687
       "      <td>NaN</td>\n",
688
       "      <td>NaN</td>\n",
689
       "      <td>NaN</td>\n",
690
       "    </tr>\n",
691
       "    <tr>\n",
692
       "      <td>C</td>\n",
693
       "      <td>NaN</td>\n",
694
       "      <td>NaN</td>\n",
695
       "      <td>NaN</td>\n",
696
       "      <td>NaN</td>\n",
697
       "      <td>NaN</td>\n",
698
       "      <td>NaN</td>\n",
699
       "      <td>NaN</td>\n",
700
       "      <td>NaN</td>\n",
701
       "      <td>NaN</td>\n",
702
       "      <td>NaN</td>\n",
703
       "      <td>...</td>\n",
704
       "      <td>NaN</td>\n",
705
       "      <td>NaN</td>\n",
706
       "      <td>NaN</td>\n",
707
       "      <td>NaN</td>\n",
708
       "      <td>NaN</td>\n",
709
       "      <td>NaN</td>\n",
710
       "      <td>NaN</td>\n",
711
       "      <td>NaN</td>\n",
712
       "      <td>NaN</td>\n",
713
       "      <td>NaN</td>\n",
714
       "    </tr>\n",
715
       "  </tbody>\n",
716
       "</table>\n",
717
       "<p>4 rows × 353 columns</p>\n",
718
       "</div>"
719
      ],
720
      "text/plain": [
721
       "       chr1                                                              \\\n",
722
       "  164834869 164834870 164834871 164834872 164834873 164834874 164834875   \n",
723
       "A       4.0       NaN       NaN       NaN       4.0       NaN       4.0   \n",
724
       "G       NaN       4.0       NaN       NaN       NaN       4.0       NaN   \n",
725
       "T       NaN       NaN       4.0       4.0       NaN       NaN       NaN   \n",
726
       "C       NaN       NaN       NaN       NaN       NaN       NaN       NaN   \n",
727
       "\n",
728
       "                                 ...                                          \\\n",
729
       "  164834876 164834877 164834878  ... 164835262 164835263 164835264 164835265   \n",
730
       "A       NaN       4.0       NaN  ...       NaN       3.0       NaN       NaN   \n",
731
       "G       NaN       NaN       NaN  ...       NaN       NaN       NaN       NaN   \n",
732
       "T       4.0       NaN       4.0  ...       3.0       NaN       3.0       3.0   \n",
733
       "C       NaN       NaN       NaN  ...       NaN       NaN       NaN       NaN   \n",
734
       "\n",
735
       "                                                               \n",
736
       "  164835266 164835267 164835268 164835269 164835270 164835238  \n",
737
       "A       3.0       3.0       NaN       3.0       3.0       NaN  \n",
738
       "G       NaN       NaN       NaN       NaN       NaN       1.0  \n",
739
       "T       NaN       NaN       3.0       NaN       NaN       NaN  \n",
740
       "C       NaN       NaN       NaN       NaN       NaN       NaN  \n",
741
       "\n",
742
       "[4 rows x 353 columns]"
743
      ]
744
     },
745
     "execution_count": 82,
746
     "metadata": {},
747
     "output_type": "execute_result"
748
    }
749
   ],
750
   "source": [
751
    "# Obtain the aligned base frequencies in a pandas dataframe\n",
752
    "pd.DataFrame( molecule.get_base_observation_dict() )"
753
   ]
754
  },
755
  {
756
   "cell_type": "code",
757
   "execution_count": 83,
758
   "metadata": {},
759
   "outputs": [
760
    {
761
     "data": {
762
      "text/html": [
763
       "<div>\n",
764
       "<style scoped>\n",
765
       "    .dataframe tbody tr th:only-of-type {\n",
766
       "        vertical-align: middle;\n",
767
       "    }\n",
768
       "\n",
769
       "    .dataframe tbody tr th {\n",
770
       "        vertical-align: top;\n",
771
       "    }\n",
772
       "\n",
773
       "    .dataframe thead tr th {\n",
774
       "        text-align: left;\n",
775
       "    }\n",
776
       "</style>\n",
777
       "<table border=\"1\" class=\"dataframe\">\n",
778
       "  <thead>\n",
779
       "    <tr>\n",
780
       "      <th></th>\n",
781
       "      <th colspan=\"21\" halign=\"left\">chr1</th>\n",
782
       "    </tr>\n",
783
       "    <tr>\n",
784
       "      <th></th>\n",
785
       "      <th>164834869</th>\n",
786
       "      <th>164834870</th>\n",
787
       "      <th>164834871</th>\n",
788
       "      <th>164834872</th>\n",
789
       "      <th>164834873</th>\n",
790
       "      <th>164834874</th>\n",
791
       "      <th>164834875</th>\n",
792
       "      <th>164834876</th>\n",
793
       "      <th>164834877</th>\n",
794
       "      <th>164834878</th>\n",
795
       "      <th>...</th>\n",
796
       "      <th>164835261</th>\n",
797
       "      <th>164835262</th>\n",
798
       "      <th>164835263</th>\n",
799
       "      <th>164835264</th>\n",
800
       "      <th>164835265</th>\n",
801
       "      <th>164835266</th>\n",
802
       "      <th>164835267</th>\n",
803
       "      <th>164835268</th>\n",
804
       "      <th>164835269</th>\n",
805
       "      <th>164835270</th>\n",
806
       "    </tr>\n",
807
       "  </thead>\n",
808
       "  <tbody>\n",
809
       "    <tr>\n",
810
       "      <td>base</td>\n",
811
       "      <td>A</td>\n",
812
       "      <td>G</td>\n",
813
       "      <td>T</td>\n",
814
       "      <td>T</td>\n",
815
       "      <td>A</td>\n",
816
       "      <td>G</td>\n",
817
       "      <td>A</td>\n",
818
       "      <td>T</td>\n",
819
       "      <td>A</td>\n",
820
       "      <td>T</td>\n",
821
       "      <td>...</td>\n",
822
       "      <td>T</td>\n",
823
       "      <td>T</td>\n",
824
       "      <td>A</td>\n",
825
       "      <td>T</td>\n",
826
       "      <td>T</td>\n",
827
       "      <td>A</td>\n",
828
       "      <td>A</td>\n",
829
       "      <td>T</td>\n",
830
       "      <td>A</td>\n",
831
       "      <td>A</td>\n",
832
       "    </tr>\n",
833
       "  </tbody>\n",
834
       "</table>\n",
835
       "<p>1 rows × 353 columns</p>\n",
836
       "</div>"
837
      ],
838
      "text/plain": [
839
       "          chr1                                                              \\\n",
840
       "     164834869 164834870 164834871 164834872 164834873 164834874 164834875   \n",
841
       "base         A         G         T         T         A         G         A   \n",
842
       "\n",
843
       "                                    ...                                \\\n",
844
       "     164834876 164834877 164834878  ... 164835261 164835262 164835263   \n",
845
       "base         T         A         T  ...         T         T         A   \n",
846
       "\n",
847
       "                                                                            \n",
848
       "     164835264 164835265 164835266 164835267 164835268 164835269 164835270  \n",
849
       "base         T         T         A         A         T         A         A  \n",
850
       "\n",
851
       "[1 rows x 353 columns]"
852
      ]
853
     },
854
     "execution_count": 83,
855
     "metadata": {},
856
     "output_type": "execute_result"
857
    }
858
   ],
859
   "source": [
860
    "# Obtain the molecule consensus sequence as pandas df:\n",
861
    "pd.DataFrame({'base':molecule.get_consensus()}).T"
862
   ]
863
  },
864
  {
865
   "cell_type": "markdown",
866
   "metadata": {},
867
   "source": [
868
    "# Visualisation"
869
   ]
870
  },
871
  {
872
   "cell_type": "code",
873
   "execution_count": 84,
874
   "metadata": {},
875
   "outputs": [
876
    {
877
     "data": {
878
      "text/html": [
879
       "<h3>chr1:164834869-164835270\n",
880
       "            sample:APKS3-P19-1-1_115  valid molecule</h3>\n",
881
       "            <h5>UMI:GAC Mapping qual:60.0 Cut loc: chr1:164834865 </h5>\n",
882
       "            <div style=\"white-space:nowrap; font-family:monospace; color:#888\"><h5>ST-E00285:221:HKM7VCCXY:6:1224:9120:30439</h5>AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGCAAATTAGTATTTAATGTAGAAAATTTGGAGAATTCAGGAAAACCACAAAGAAGAAAATTTACTGTTAACTTTGTGC.........................................................................................................................................................................................................................................................................<br />...........................................................................................................................................TAGCCTTCTAGCACTTTATGTATAAGTGTGTTTTTTATGTGGGTGTAAGAAAGTTACATTTCCTTTTACCTACCTATATTACTAAAAATGTGTTATGAATATTTTCCATATCATTAAACATTCTTCTCAAGCATAACTTTAAATAACTGCA...............................................................................................................<br /><h5>NS500413:404:HJ3KHBGX5:2:22312:23759:6537</h5>AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGC.....................................................................................................................................................................................................................................................................................................................................................<br />..........................................................................................................................................................................................................................................................................................................................................AATTTATA<text style=\"color:red; font-weight:500\" >T</text>TATAGAA<text style=\"color:red; font-weight:500\" >A</text>ATTT<text style=\"color:red; font-weight:500\" >T</text>A<text style=\"color:red; font-weight:500\" >T</text><text style=\"color:red; font-weight:500\" >T</text>TACTTTTG<text style=\"color:red; font-weight:500\" >T</text>TTTT..TTTTTTTTTTTTTTTTTTACTATTATTAATA<br /><h5>NS500413:404:HJ3KHBGX5:4:13507:22698:18344</h5>AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGC.....................................................................................................................................................................................................................................................................................................................................................<br />.................................................................................................................................................................................................................................................................................................................................................................................GTTTTTTTTTTTTTTTTTTACTATTATTAATA<br /><h5>NS500413:404:HJ3KHBGX5:3:23502:18585:5263</h5>AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGC.....................................................................................................................................................................................................................................................................................................................................................<br />...................................................................................................................................................................................................................................................................................................................................................................................TTTTTTTTTTTTTTTTTACTATTATTAATA<br />AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGCAAATTAGTATTTAATGTAGAAAATTTGGAGAATTCAGGAAAACCACAAAGAAGAAAATTTACTGTTAACTTTGTGC...TAGCCTTCTAGCACTTTATGTATAAGTGTGTTTTTTATGTGGGTGTAAGAAAGTTACATTTCCTTTTACCTACCTATATTACTAAAAATGTGTTATGAATATTTTCCATATCATTAAACATTCTTCTCAAGCATAACTTTAAATAA.............................................AATTTATA<text style=\"color:red; font-weight:800\" >T</text>TATAGAA<text style=\"color:red; font-weight:800\" >A</text>ATTT<text style=\"color:red; font-weight:800\" >T</text>A<text style=\"color:red; font-weight:800\" >T</text><text style=\"color:red; font-weight:800\" >T</text>TACTTTTG<text style=\"color:red; font-weight:800\" >T</text>TTTT.GTTTTTTTTTTTTTTTTTTACTATTATTAATA<br />AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGCAAATTAGTATTTAATGTAGAAAATTTGGAGAATTCAGGAAAACCACAAAGAAGAAAATTTACTGTTAACTTTGTGC???TAGCCTTCTAGCACTTTATGTATAAGTGTGTTTTTTATGTGGGTGTAAGAAAGTTACATTTCCTTTTACCTACCTATATTACTAAAAATGTGTTATGAATATTTTCCATATCATTAAACATTCTTCTCAAGCATAACTTTAAATAA?????????????????????????????????????????????AATTTATA<text style=\"color:black; font-weight:800\" >C</text>TATAGAA<text style=\"color:black; font-weight:800\" >C</text>ATTT<text style=\"color:black; font-weight:800\" >A</text>A<text style=\"color:black; font-weight:800\" >G</text><text style=\"color:black; font-weight:800\" >C</text>TACTTTTG<text style=\"color:black; font-weight:800\" >A</text>TTTT?GTTTTTTTTTTTTTTTTTTACTATTATTAATA<br /></div>"
883
      ],
884
      "text/plain": [
885
       "<IPython.core.display.HTML object>"
886
      ]
887
     },
888
     "metadata": {},
889
     "output_type": "display_data"
890
    }
891
   ],
892
   "source": [
893
    "# Display the molecule here in the notebook:\n",
894
    "from IPython.core.display import display, HTML\n",
895
    "display(HTML( molecule.get_html() ))"
896
   ]
897
  },
898
  {
899
   "cell_type": "code",
900
   "execution_count": 85,
901
   "metadata": {},
902
   "outputs": [
903
    {
904
     "data": {
905
      "text/html": [
906
       "AGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGCAAATTAGTATTTAATGTAGAAAATTTGGAGAATTCAGGAAAACCACAAAGAAGAAAATTTACTGTTAACTTTGTGC........................................................................................................................................................................................................................................................................."
907
      ],
908
      "text/plain": [
909
       "<IPython.core.display.HTML object>"
910
      ]
911
     },
912
     "metadata": {},
913
     "output_type": "display_data"
914
    }
915
   ],
916
   "source": [
917
    "# Display a single read:\n",
918
    "fragment = molecule[0]\n",
919
    "display(HTML(fragment.get_html(span_start=molecule.spanStart, span_end=molecule.spanEnd,show_read1=1,show_read2=0) ))"
920
   ]
921
  },
922
  {
923
   "cell_type": "code",
924
   "execution_count": 86,
925
   "metadata": {},
926
   "outputs": [
927
    {
928
     "data": {
929
      "text/plain": [
930
       "\"ST-E00285:221:HKM7VCCXY:6:1224:9120:30439\\t99\\t0\\t164834865\\t60\\t140M\\t0\\t164835008\\t140\\tCATGAGTTAGATATGGACTCTTCTTCAGACACTTTGTTTAAATTTTAAATTTTTTTCTGATTGCAAATTAGTATTTAATGTAGAAAATTTGGAGAATTCAGGAAAACCACAAAGAAGAAAATTTACTGTTAACTTTGTGC\\tarray('B', [32, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 41, 41, 41, 41, 37, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 37, 32])\\t[('NM', 0), ('MD', '140'), ('MC', '151M'), ('AS', 140), ('XS', 20), ('Is', 'ST-E00285'), ('RN', '221'), ('Fc', 'HKM7VCCXY'), ('La', '6'), ('Ti', '1224'), ('CX', '9120'), ('CY', '30439'), ('Fi', 'N'), ('CN', '0'), ('aA', 'TGACCAAT'), ('LY', 'APKS3-P19-1-1'), ('RX', 'GAC'), ('RQ', 'AAF'), ('BI', '115'), ('bc', 'GCACACGC'), ('BC', 'GCACACGC'), ('QT', 'FFJJJJJJ'), ('MX', 'NLAIII384C8U3'), ('MI', 'GCACACGCGACTGACCAAT'), ('QM', 'FFJJJJJJAAF////////'), ('SM', 'APKS3-P19-1-1_115'), ('rS', 'TGCAGT'), ('rP', 164835159), ('RC', 1), ('DT', 'NLA'), ('RG', 'HKM7VCCXY.6.APKS3-P19-1-1_115'), ('DS', 164834865), ('RS', 1), ('RZ', 'CATG')]\""
931
      ]
932
     },
933
     "execution_count": 86,
934
     "metadata": {},
935
     "output_type": "execute_result"
936
    }
937
   ],
938
   "source": [
939
    "str(fragment[0])"
940
   ]
941
  },
942
  {
943
   "cell_type": "code",
944
   "execution_count": 88,
945
   "metadata": {},
946
   "outputs": [
947
    {
948
     "name": "stdout",
949
     "output_type": "stream",
950
     "text": [
951
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
952
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
953
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
954
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
955
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
956
      "[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
957
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
958
      "[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
959
     ]
960
    },
961
    {
962
     "data": {
963
      "text/plain": [
964
       "<matplotlib.image.AxesImage at 0x7f0c29101c50>"
965
      ]
966
     },
967
     "execution_count": 88,
968
     "metadata": {},
969
     "output_type": "execute_result"
970
    },
971
    {
972
     "data": {
973
      "image/png": "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\n",
974
      "text/plain": [
975
       "<Figure size 1500x1000 with 1 Axes>"
976
      ]
977
     },
978
     "metadata": {
979
      "needs_background": "light"
980
     },
981
     "output_type": "display_data"
982
    }
983
   ],
984
   "source": [
985
    "tensor = molecule.get_alignment_tensor(\n",
986
    "    max_reads=8,\n",
987
    "    centroid=molecule.spanStart,\n",
988
    "    window_radius=10)\n",
989
    "plt.imshow(tensor)"
990
   ]
991
  },
992
  {
993
   "cell_type": "code",
994
   "execution_count": null,
995
   "metadata": {},
996
   "outputs": [],
997
   "source": []
998
  }
999
 ],
1000
 "metadata": {
1001
  "kernelspec": {
1002
   "display_name": "Python 3",
1003
   "language": "python",
1004
   "name": "python3"
1005
  },
1006
  "language_info": {
1007
   "codemirror_mode": {
1008
    "name": "ipython",
1009
    "version": 3
1010
   },
1011
   "file_extension": ".py",
1012
   "mimetype": "text/x-python",
1013
   "name": "python",
1014
   "nbconvert_exporter": "python",
1015
   "pygments_lexer": "ipython3",
1016
   "version": "3.6.8"
1017
  }
1018
 },
1019
 "nbformat": 4,
1020
 "nbformat_minor": 2
1021
}