stcrpy 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- examples/__init__.py +0 -0
- examples/egnn.py +425 -0
- stcrpy/__init__.py +5 -0
- stcrpy/tcr_datasets/__init__.py +0 -0
- stcrpy/tcr_datasets/tcr_graph_dataset.py +499 -0
- stcrpy/tcr_datasets/tcr_selector.py +0 -0
- stcrpy/tcr_datasets/tcr_structure_dataset.py +0 -0
- stcrpy/tcr_datasets/utils.py +350 -0
- stcrpy/tcr_formats/__init__.py +0 -0
- stcrpy/tcr_formats/tcr_formats.py +114 -0
- stcrpy/tcr_formats/tcr_haddock.py +556 -0
- stcrpy/tcr_geometry/TCRCoM.py +350 -0
- stcrpy/tcr_geometry/TCRCoM_LICENCE +168 -0
- stcrpy/tcr_geometry/TCRDock.py +261 -0
- stcrpy/tcr_geometry/TCRGeom.py +450 -0
- stcrpy/tcr_geometry/TCRGeomFiltering.py +273 -0
- stcrpy/tcr_geometry/__init__.py +0 -0
- stcrpy/tcr_geometry/reference_data/__init__.py +0 -0
- stcrpy/tcr_geometry/reference_data/dock_reference_1_imgt_numbered.pdb +6549 -0
- stcrpy/tcr_geometry/reference_data/dock_reference_2_imgt_numbered.pdb +6495 -0
- stcrpy/tcr_geometry/reference_data/reference_A.pdb +31 -0
- stcrpy/tcr_geometry/reference_data/reference_B.pdb +31 -0
- stcrpy/tcr_geometry/reference_data/reference_D.pdb +31 -0
- stcrpy/tcr_geometry/reference_data/reference_G.pdb +31 -0
- stcrpy/tcr_geometry/reference_data/reference_data.py +104 -0
- stcrpy/tcr_interactions/PLIPParser.py +147 -0
- stcrpy/tcr_interactions/TCRInteractionProfiler.py +433 -0
- stcrpy/tcr_interactions/TCRpMHC_PLIP_Model_Parser.py +133 -0
- stcrpy/tcr_interactions/__init__.py +0 -0
- stcrpy/tcr_interactions/utils.py +170 -0
- stcrpy/tcr_methods/__init__.py +0 -0
- stcrpy/tcr_methods/tcr_batch_operations.py +223 -0
- stcrpy/tcr_methods/tcr_methods.py +150 -0
- stcrpy/tcr_methods/tcr_reformatting.py +18 -0
- stcrpy/tcr_metrics/__init__.py +2 -0
- stcrpy/tcr_metrics/constants.py +39 -0
- stcrpy/tcr_metrics/tcr_interface_rmsd.py +237 -0
- stcrpy/tcr_metrics/tcr_rmsd.py +179 -0
- stcrpy/tcr_ml/__init__.py +0 -0
- stcrpy/tcr_ml/geometry_predictor.py +3 -0
- stcrpy/tcr_processing/AGchain.py +89 -0
- stcrpy/tcr_processing/Chemical_components.py +48915 -0
- stcrpy/tcr_processing/Entity.py +301 -0
- stcrpy/tcr_processing/Fragment.py +58 -0
- stcrpy/tcr_processing/Holder.py +24 -0
- stcrpy/tcr_processing/MHC.py +449 -0
- stcrpy/tcr_processing/MHCchain.py +149 -0
- stcrpy/tcr_processing/Model.py +37 -0
- stcrpy/tcr_processing/Select.py +145 -0
- stcrpy/tcr_processing/TCR.py +532 -0
- stcrpy/tcr_processing/TCRIO.py +47 -0
- stcrpy/tcr_processing/TCRParser.py +1230 -0
- stcrpy/tcr_processing/TCRStructure.py +148 -0
- stcrpy/tcr_processing/TCRchain.py +160 -0
- stcrpy/tcr_processing/__init__.py +3 -0
- stcrpy/tcr_processing/annotate.py +480 -0
- stcrpy/tcr_processing/utils/__init__.py +0 -0
- stcrpy/tcr_processing/utils/common.py +67 -0
- stcrpy/tcr_processing/utils/constants.py +367 -0
- stcrpy/tcr_processing/utils/region_definitions.py +782 -0
- stcrpy/utils/__init__.py +0 -0
- stcrpy/utils/error_stream.py +12 -0
- stcrpy-1.0.0.dist-info/METADATA +173 -0
- stcrpy-1.0.0.dist-info/RECORD +68 -0
- stcrpy-1.0.0.dist-info/WHEEL +5 -0
- stcrpy-1.0.0.dist-info/licenses/LICENCE +28 -0
- stcrpy-1.0.0.dist-info/licenses/stcrpy/tcr_geometry/TCRCoM_LICENCE +168 -0
- stcrpy-1.0.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
CHAIN_TYPE_ONE_HOT_ENCODING = {
|
|
2
|
+
"A": 0, # alpha TCR
|
|
3
|
+
"D": 0, # delta TCR
|
|
4
|
+
"B": 1, # beta TCR
|
|
5
|
+
"G": 1, # gamma TCR
|
|
6
|
+
"MHC": 2,
|
|
7
|
+
"antigen": 3,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
MHC_CHAIN_TYPES = [
|
|
11
|
+
"GA1",
|
|
12
|
+
"GA1L",
|
|
13
|
+
"GA2",
|
|
14
|
+
"GA2L",
|
|
15
|
+
"GA",
|
|
16
|
+
"GB",
|
|
17
|
+
"CD1",
|
|
18
|
+
"CD1L",
|
|
19
|
+
"MR1",
|
|
20
|
+
"MR1",
|
|
21
|
+
"MHC",
|
|
22
|
+
"MH1",
|
|
23
|
+
"MH2",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
TCR_REGION_ONE_HOT_ENCODING = {
|
|
27
|
+
"NOT_CDR": 0,
|
|
28
|
+
"CDRA1": 1,
|
|
29
|
+
"CDRA2": 2,
|
|
30
|
+
"CDRA3": 3,
|
|
31
|
+
"CDRB1": 4,
|
|
32
|
+
"CDRB2": 5,
|
|
33
|
+
"CDRB3": 6,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
AMINO_ACID_ONEHOT_ENCODING = {
|
|
37
|
+
"ALA": 0,
|
|
38
|
+
"ARG": 1,
|
|
39
|
+
"ASN": 2,
|
|
40
|
+
"ASP": 3,
|
|
41
|
+
"CYS": 4,
|
|
42
|
+
"GLU": 5,
|
|
43
|
+
"GLN": 6,
|
|
44
|
+
"GLY": 7,
|
|
45
|
+
"HIS": 8,
|
|
46
|
+
"ILE": 9,
|
|
47
|
+
"LEU": 10,
|
|
48
|
+
"LYS": 11,
|
|
49
|
+
"MET": 12,
|
|
50
|
+
"PHE": 13,
|
|
51
|
+
"PRO": 14,
|
|
52
|
+
"SER": 15,
|
|
53
|
+
"THR": 16,
|
|
54
|
+
"TRP": 17,
|
|
55
|
+
"TYR": 18,
|
|
56
|
+
"VAL": 19,
|
|
57
|
+
"UNK": 20,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
ATOM14_ATOM_NAMES = {
|
|
62
|
+
"ALA": ["N", "CA", "C", "O", "CB", "", "", "", "", "", "", "", "", ""],
|
|
63
|
+
"ARG": [
|
|
64
|
+
"N",
|
|
65
|
+
"CA",
|
|
66
|
+
"C",
|
|
67
|
+
"O",
|
|
68
|
+
"CB",
|
|
69
|
+
"CG",
|
|
70
|
+
"CD",
|
|
71
|
+
"NE",
|
|
72
|
+
"CZ",
|
|
73
|
+
"NH1",
|
|
74
|
+
"NH2",
|
|
75
|
+
"",
|
|
76
|
+
"",
|
|
77
|
+
"",
|
|
78
|
+
],
|
|
79
|
+
"ASN": [
|
|
80
|
+
"N",
|
|
81
|
+
"CA",
|
|
82
|
+
"C",
|
|
83
|
+
"O",
|
|
84
|
+
"CB",
|
|
85
|
+
"CG",
|
|
86
|
+
"OD1",
|
|
87
|
+
"ND2",
|
|
88
|
+
"",
|
|
89
|
+
"",
|
|
90
|
+
"",
|
|
91
|
+
"",
|
|
92
|
+
"",
|
|
93
|
+
"",
|
|
94
|
+
],
|
|
95
|
+
"ASP": [
|
|
96
|
+
"N",
|
|
97
|
+
"CA",
|
|
98
|
+
"C",
|
|
99
|
+
"O",
|
|
100
|
+
"CB",
|
|
101
|
+
"CG",
|
|
102
|
+
"OD1",
|
|
103
|
+
"OD2",
|
|
104
|
+
"",
|
|
105
|
+
"",
|
|
106
|
+
"",
|
|
107
|
+
"",
|
|
108
|
+
"",
|
|
109
|
+
"",
|
|
110
|
+
],
|
|
111
|
+
"CYS": ["N", "CA", "C", "O", "CB", "SG", "", "", "", "", "", "", "", ""],
|
|
112
|
+
"GLN": [
|
|
113
|
+
"N",
|
|
114
|
+
"CA",
|
|
115
|
+
"C",
|
|
116
|
+
"O",
|
|
117
|
+
"CB",
|
|
118
|
+
"CG",
|
|
119
|
+
"CD",
|
|
120
|
+
"OE1",
|
|
121
|
+
"NE2",
|
|
122
|
+
"",
|
|
123
|
+
"",
|
|
124
|
+
"",
|
|
125
|
+
"",
|
|
126
|
+
"",
|
|
127
|
+
],
|
|
128
|
+
"GLU": [
|
|
129
|
+
"N",
|
|
130
|
+
"CA",
|
|
131
|
+
"C",
|
|
132
|
+
"O",
|
|
133
|
+
"CB",
|
|
134
|
+
"CG",
|
|
135
|
+
"CD",
|
|
136
|
+
"OE1",
|
|
137
|
+
"OE2",
|
|
138
|
+
"",
|
|
139
|
+
"",
|
|
140
|
+
"",
|
|
141
|
+
"",
|
|
142
|
+
"",
|
|
143
|
+
],
|
|
144
|
+
"GLY": ["N", "CA", "C", "O", "", "", "", "", "", "", "", "", "", ""],
|
|
145
|
+
"HIS": [
|
|
146
|
+
"N",
|
|
147
|
+
"CA",
|
|
148
|
+
"C",
|
|
149
|
+
"O",
|
|
150
|
+
"CB",
|
|
151
|
+
"CG",
|
|
152
|
+
"ND1",
|
|
153
|
+
"CD2",
|
|
154
|
+
"CE1",
|
|
155
|
+
"NE2",
|
|
156
|
+
"",
|
|
157
|
+
"",
|
|
158
|
+
"",
|
|
159
|
+
"",
|
|
160
|
+
],
|
|
161
|
+
"ILE": [
|
|
162
|
+
"N",
|
|
163
|
+
"CA",
|
|
164
|
+
"C",
|
|
165
|
+
"O",
|
|
166
|
+
"CB",
|
|
167
|
+
"CG1",
|
|
168
|
+
"CG2",
|
|
169
|
+
"CD1",
|
|
170
|
+
"",
|
|
171
|
+
"",
|
|
172
|
+
"",
|
|
173
|
+
"",
|
|
174
|
+
"",
|
|
175
|
+
"",
|
|
176
|
+
],
|
|
177
|
+
"LEU": [
|
|
178
|
+
"N",
|
|
179
|
+
"CA",
|
|
180
|
+
"C",
|
|
181
|
+
"O",
|
|
182
|
+
"CB",
|
|
183
|
+
"CG",
|
|
184
|
+
"CD1",
|
|
185
|
+
"CD2",
|
|
186
|
+
"",
|
|
187
|
+
"",
|
|
188
|
+
"",
|
|
189
|
+
"",
|
|
190
|
+
"",
|
|
191
|
+
"",
|
|
192
|
+
],
|
|
193
|
+
"LYS": [
|
|
194
|
+
"N",
|
|
195
|
+
"CA",
|
|
196
|
+
"C",
|
|
197
|
+
"O",
|
|
198
|
+
"CB",
|
|
199
|
+
"CG",
|
|
200
|
+
"CD",
|
|
201
|
+
"CE",
|
|
202
|
+
"NZ",
|
|
203
|
+
"",
|
|
204
|
+
"",
|
|
205
|
+
"",
|
|
206
|
+
"",
|
|
207
|
+
"",
|
|
208
|
+
],
|
|
209
|
+
"MET": [
|
|
210
|
+
"N",
|
|
211
|
+
"CA",
|
|
212
|
+
"C",
|
|
213
|
+
"O",
|
|
214
|
+
"CB",
|
|
215
|
+
"CG",
|
|
216
|
+
"SD",
|
|
217
|
+
"CE",
|
|
218
|
+
"",
|
|
219
|
+
"",
|
|
220
|
+
"",
|
|
221
|
+
"",
|
|
222
|
+
"",
|
|
223
|
+
"",
|
|
224
|
+
],
|
|
225
|
+
"PHE": [
|
|
226
|
+
"N",
|
|
227
|
+
"CA",
|
|
228
|
+
"C",
|
|
229
|
+
"O",
|
|
230
|
+
"CB",
|
|
231
|
+
"CG",
|
|
232
|
+
"CD1",
|
|
233
|
+
"CD2",
|
|
234
|
+
"CE1",
|
|
235
|
+
"CE2",
|
|
236
|
+
"CZ",
|
|
237
|
+
"",
|
|
238
|
+
"",
|
|
239
|
+
"",
|
|
240
|
+
],
|
|
241
|
+
"PRO": ["N", "CA", "C", "O", "CB", "CG", "CD", "", "", "", "", "", "", ""],
|
|
242
|
+
"SER": ["N", "CA", "C", "O", "CB", "OG", "", "", "", "", "", "", "", ""],
|
|
243
|
+
"THR": [
|
|
244
|
+
"N",
|
|
245
|
+
"CA",
|
|
246
|
+
"C",
|
|
247
|
+
"O",
|
|
248
|
+
"CB",
|
|
249
|
+
"OG1",
|
|
250
|
+
"CG2",
|
|
251
|
+
"",
|
|
252
|
+
"",
|
|
253
|
+
"",
|
|
254
|
+
"",
|
|
255
|
+
"",
|
|
256
|
+
"",
|
|
257
|
+
"",
|
|
258
|
+
],
|
|
259
|
+
"TRP": [
|
|
260
|
+
"N",
|
|
261
|
+
"CA",
|
|
262
|
+
"C",
|
|
263
|
+
"O",
|
|
264
|
+
"CB",
|
|
265
|
+
"CG",
|
|
266
|
+
"CD1",
|
|
267
|
+
"CD2",
|
|
268
|
+
"NE1",
|
|
269
|
+
"CE2",
|
|
270
|
+
"CE3",
|
|
271
|
+
"CZ2",
|
|
272
|
+
"CZ3",
|
|
273
|
+
"CH2",
|
|
274
|
+
],
|
|
275
|
+
"TYR": [
|
|
276
|
+
"N",
|
|
277
|
+
"CA",
|
|
278
|
+
"C",
|
|
279
|
+
"O",
|
|
280
|
+
"CB",
|
|
281
|
+
"CG",
|
|
282
|
+
"CD1",
|
|
283
|
+
"CD2",
|
|
284
|
+
"CE1",
|
|
285
|
+
"CE2",
|
|
286
|
+
"CZ",
|
|
287
|
+
"OH",
|
|
288
|
+
"",
|
|
289
|
+
"",
|
|
290
|
+
],
|
|
291
|
+
"VAL": [
|
|
292
|
+
"N",
|
|
293
|
+
"CA",
|
|
294
|
+
"C",
|
|
295
|
+
"O",
|
|
296
|
+
"CB",
|
|
297
|
+
"CG1",
|
|
298
|
+
"CG2",
|
|
299
|
+
"",
|
|
300
|
+
"",
|
|
301
|
+
"",
|
|
302
|
+
"",
|
|
303
|
+
"",
|
|
304
|
+
"",
|
|
305
|
+
"",
|
|
306
|
+
],
|
|
307
|
+
"UNK": ["", "", "", "", "", "", "", "", "", "", "", "", "", ""],
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
ATOM_TYPES = [
|
|
311
|
+
"N",
|
|
312
|
+
"CA",
|
|
313
|
+
"C",
|
|
314
|
+
"CB",
|
|
315
|
+
"O",
|
|
316
|
+
"CG",
|
|
317
|
+
"CG1",
|
|
318
|
+
"CG2",
|
|
319
|
+
"OG",
|
|
320
|
+
"OG1",
|
|
321
|
+
"SG",
|
|
322
|
+
"CD",
|
|
323
|
+
"CD1",
|
|
324
|
+
"CD2",
|
|
325
|
+
"ND1",
|
|
326
|
+
"ND2",
|
|
327
|
+
"OD1",
|
|
328
|
+
"OD2",
|
|
329
|
+
"SD",
|
|
330
|
+
"CE",
|
|
331
|
+
"CE1",
|
|
332
|
+
"CE2",
|
|
333
|
+
"CE3",
|
|
334
|
+
"NE",
|
|
335
|
+
"NE1",
|
|
336
|
+
"NE2",
|
|
337
|
+
"OE1",
|
|
338
|
+
"OE2",
|
|
339
|
+
"CH2",
|
|
340
|
+
"NH1",
|
|
341
|
+
"NH2",
|
|
342
|
+
"OH",
|
|
343
|
+
"CZ",
|
|
344
|
+
"CZ2",
|
|
345
|
+
"CZ3",
|
|
346
|
+
"NZ",
|
|
347
|
+
"OXT",
|
|
348
|
+
]
|
|
349
|
+
|
|
350
|
+
ATOM37_ATOM_ONEHOT_ENCODING = {atom_type: i for i, atom_type in enumerate(ATOM_TYPES)}
|
|
File without changes
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from Bio.SeqUtils import seq1
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def to_AF3_json(
|
|
7
|
+
tcr: "TCR",
|
|
8
|
+
tcr_only: bool = True,
|
|
9
|
+
save: bool = True,
|
|
10
|
+
save_dir: str = "",
|
|
11
|
+
name: str = None,
|
|
12
|
+
V_domain_only: bool = False,
|
|
13
|
+
) -> dict:
|
|
14
|
+
"""Converts TCR object to dict in Alphafold 3 JSON input format, ie. amino acid sequences.
|
|
15
|
+
Eg:
|
|
16
|
+
{
|
|
17
|
+
"name": Job name,
|
|
18
|
+
"modelSeeds": [],
|
|
19
|
+
"sequences": [
|
|
20
|
+
{"proteinChain": {"sequence": AAAAAAAAAAAAAA, "count": 1}},
|
|
21
|
+
{"proteinChain": {"sequence": AAAAAAAAAAAAAA, "count": 1}},
|
|
22
|
+
{"proteinChain": {"sequence": AAAAAAAAAAAAAA, "count": 1}},
|
|
23
|
+
],
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
tcr (TCR): TCR structure object
|
|
28
|
+
tcr_only (bool, optional): Whether to include TCR sequence only, excluding antigen and MHC. Defaults to True.
|
|
29
|
+
save (bool, optional): Whether to save dict as JSON file. Defaults to True.
|
|
30
|
+
save_dir (str, optional): Directory to save JSON files to. Defaults to "".
|
|
31
|
+
name (str, optional): TCR ID to use as name for AF3 job. Defaults to None.
|
|
32
|
+
V_domain_only (bool, optional): Include full TCR sequence or only the variable domain (1-128 IMGT numbering). Defaults to False.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
dict: Nested dictionary of AF3 sequence inputs.
|
|
36
|
+
"""
|
|
37
|
+
if V_domain_only:
|
|
38
|
+
residue_nrs = list(range(128))
|
|
39
|
+
else:
|
|
40
|
+
residue_nrs = None
|
|
41
|
+
tcr_sequences = get_sequences(tcr, residues_to_include=residue_nrs)
|
|
42
|
+
if not tcr_only:
|
|
43
|
+
if len(tcr.get_MHC()) > 0:
|
|
44
|
+
mhc_sequences = get_sequences(tcr.get_MHC()[0])
|
|
45
|
+
tcr_sequences.update(mhc_sequences)
|
|
46
|
+
|
|
47
|
+
if len(tcr.get_antigen()) > 0:
|
|
48
|
+
antigen_sequence = get_sequences(tcr.get_antigen()[0])
|
|
49
|
+
tcr_sequences.update(antigen_sequence)
|
|
50
|
+
name = name if name is not None else f"{tcr.parent.parent.id}_{tcr.id}"
|
|
51
|
+
tcr_json = {
|
|
52
|
+
"name": name,
|
|
53
|
+
"modelSeeds": [],
|
|
54
|
+
"sequences": [
|
|
55
|
+
{"proteinChain": {"sequence": seq, "count": 1}}
|
|
56
|
+
for _, seq in tcr_sequences.items()
|
|
57
|
+
],
|
|
58
|
+
}
|
|
59
|
+
if save:
|
|
60
|
+
path = os.path.join(save_dir, f"{name}.json")
|
|
61
|
+
with open(path, "w") as f:
|
|
62
|
+
json.dump(tcr_json, f)
|
|
63
|
+
return tcr_json
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_sequences(
|
|
67
|
+
entity: "Bio.PDB.Entity",
|
|
68
|
+
amino_acids_only: bool = True,
|
|
69
|
+
residues_to_include: list = None,
|
|
70
|
+
) -> dict:
|
|
71
|
+
"""Extract seqeunces from strcuture objects as dictionary.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
entity (Bio.PDB.Entity): Stucture object
|
|
75
|
+
amino_acids_only (bool, optional): Whether to remove non-amino acid 'X' from sequences. Defaults to True.
|
|
76
|
+
residues_to_include (list, optional): List of residue IDs to include in sequence. Defaults to None.
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
e: AttributeError if entity has no attribute .get_chains(). The assuems entity is chain level and returns single sequence
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
dict: Dictionary of amino acid sequences, keyed by chain ID in strcuctre entity.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
if residues_to_include is None:
|
|
86
|
+
|
|
87
|
+
def residue_filter(res):
|
|
88
|
+
return True
|
|
89
|
+
|
|
90
|
+
else:
|
|
91
|
+
|
|
92
|
+
def residue_filter(res):
|
|
93
|
+
return res.id[1] in residues_to_include
|
|
94
|
+
try:
|
|
95
|
+
sequences = {
|
|
96
|
+
chain.id: seq1(
|
|
97
|
+
"".join(residue.resname for residue in chain if residue_filter(residue))
|
|
98
|
+
)
|
|
99
|
+
for chain in entity.get_chains()
|
|
100
|
+
}
|
|
101
|
+
except AttributeError as e:
|
|
102
|
+
if entity.level == "C":
|
|
103
|
+
sequences = {
|
|
104
|
+
entity.id: seq1(
|
|
105
|
+
"".join(
|
|
106
|
+
residue.resname for residue in entity if residue_filter(residue)
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
else:
|
|
111
|
+
raise e
|
|
112
|
+
if amino_acids_only:
|
|
113
|
+
sequences = {k: seq.replace("X", "") for k, seq in sequences.items()}
|
|
114
|
+
return sequences
|