tsalign 2.1.1__tar.gz → 3.0.0__tar.gz
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.
- {tsalign-2.1.1 → tsalign-3.0.0}/Cargo.lock +8 -8
- tsalign-3.0.0/PKG-INFO +144 -0
- {tsalign-2.1.1/python_bindings → tsalign-3.0.0}/README.md +3 -3
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/Cargo.toml +1 -1
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/Cargo.toml +3 -3
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/alignment/stream.rs +19 -16
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/alignment/template_switch_specifics.rs +193 -175
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/alignment_type.rs +22 -20
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/context.rs +70 -69
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/display.rs +30 -28
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/identifier.rs +74 -74
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/lower_bounds/template_switch.rs +11 -11
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/lower_bounds/template_switch_alignment.rs +2 -2
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/descendant.rs +6 -6
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/template_switch_min_length.rs +71 -75
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance.rs +66 -65
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/config/io.rs +10 -10
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/config.rs +44 -44
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/Cargo.toml +2 -2
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/error.rs +2 -2
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/plain_text/parse_template_switches.rs +23 -25
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/plain_text.rs +26 -23
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg.rs +56 -54
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/complement.rs +21 -21
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/inner.rs +45 -45
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/source.rs +96 -90
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/template_switch.rs +5 -5
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement.rs +10 -12
- {tsalign-2.1.1 → tsalign-3.0.0}/pyproject.toml +1 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python/tsalign/_types.py +6 -6
- {tsalign-2.1.1 → tsalign-3.0.0}/python_bindings/Cargo.toml +3 -3
- tsalign-3.0.0/python_bindings/README.md +134 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/Cargo.toml +2 -2
- tsalign-2.1.1/PKG-INFO +0 -7
- tsalign-2.1.1/lib_tsshow/src/plain_text/alignment_stream.rs +0 -229
- {tsalign-2.1.1 → tsalign-3.0.0}/Cargo.toml +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/clippy.toml +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/closed_lists.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/comparator.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/cost.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/lib.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/open_lists/linear_heap.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/open_lists.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/generic_a_star/src/reset.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_geometry.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/a_star_sequences.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/alignment/iter.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/alignment.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/configurable_a_star_align.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/gap_affine_edit_distance.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/alignment_type/equal_cost_range.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/lower_bounds.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/chaining.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/node_ord.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/primary_match.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/primary_range.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/secondary_deletion.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/shortcut.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/template_switch_count.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies/template_switch_total_length.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/template_switch_distance/strategies.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/tests.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/alignment_configuration.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/alignment_matrix/index/iterators.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/alignment_matrix/index.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/alignment_matrix.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs/cost_function/io.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs/cost_function.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs/gap_affine/io/tests.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs/gap_affine/io.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs/gap_affine.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/costs.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/error.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/io.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/lib.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/tests.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/lib.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/plain_text/mutlipair_alignment_renderer/tests.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/plain_text/mutlipair_alignment_renderer.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/arrows.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/font/sans_serif_mono.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/font/typewriter.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/font.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/indexed_str.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/labelled_sequence.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/svg/numbers.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/character.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/index_types.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/lib_tsshow/src/ts_arrangement/row.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python/tsalign/__init__.py +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python/tsalign/py.typed +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python_bindings/.gitignore +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python_bindings/BUILD.md +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/python_bindings/src/lib.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/chain/context.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/chain/display.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/chain/node/display.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/chain/node.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/chain.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/lib.rs +0 -0
- {tsalign-2.1.1 → tsalign-3.0.0}/seed_chain/src/seed.rs +0 -0
|
@@ -417,7 +417,7 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
|
|
|
417
417
|
|
|
418
418
|
[[package]]
|
|
419
419
|
name = "generic_a_star"
|
|
420
|
-
version = "
|
|
420
|
+
version = "3.0.0"
|
|
421
421
|
dependencies = [
|
|
422
422
|
"binary-heap-plus",
|
|
423
423
|
"compare",
|
|
@@ -548,7 +548,7 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|
|
548
548
|
|
|
549
549
|
[[package]]
|
|
550
550
|
name = "lib_ts_chainalign"
|
|
551
|
-
version = "
|
|
551
|
+
version = "3.0.0"
|
|
552
552
|
dependencies = [
|
|
553
553
|
"binary-heap-plus",
|
|
554
554
|
"bincode",
|
|
@@ -568,7 +568,7 @@ dependencies = [
|
|
|
568
568
|
|
|
569
569
|
[[package]]
|
|
570
570
|
name = "lib_tsalign"
|
|
571
|
-
version = "
|
|
571
|
+
version = "3.0.0"
|
|
572
572
|
dependencies = [
|
|
573
573
|
"binary-heap-plus",
|
|
574
574
|
"compact-genome",
|
|
@@ -589,7 +589,7 @@ dependencies = [
|
|
|
589
589
|
|
|
590
590
|
[[package]]
|
|
591
591
|
name = "lib_tsshow"
|
|
592
|
-
version = "
|
|
592
|
+
version = "3.0.0"
|
|
593
593
|
dependencies = [
|
|
594
594
|
"ena",
|
|
595
595
|
"itertools",
|
|
@@ -804,7 +804,7 @@ dependencies = [
|
|
|
804
804
|
|
|
805
805
|
[[package]]
|
|
806
806
|
name = "py_lib_tsalign"
|
|
807
|
-
version = "
|
|
807
|
+
version = "3.0.0"
|
|
808
808
|
dependencies = [
|
|
809
809
|
"compact-genome",
|
|
810
810
|
"lib_tsalign",
|
|
@@ -1008,7 +1008,7 @@ dependencies = [
|
|
|
1008
1008
|
|
|
1009
1009
|
[[package]]
|
|
1010
1010
|
name = "seed_chain"
|
|
1011
|
-
version = "
|
|
1011
|
+
version = "3.0.0"
|
|
1012
1012
|
dependencies = [
|
|
1013
1013
|
"compact-genome",
|
|
1014
1014
|
"generic_a_star",
|
|
@@ -1360,7 +1360,7 @@ checksum = "2b939c825d0c4295ac520f7b479927c1e5b458c9107a9d6f5ba65bc867bb93a5"
|
|
|
1360
1360
|
|
|
1361
1361
|
[[package]]
|
|
1362
1362
|
name = "tsalign"
|
|
1363
|
-
version = "
|
|
1363
|
+
version = "3.0.0"
|
|
1364
1364
|
dependencies = [
|
|
1365
1365
|
"anyhow",
|
|
1366
1366
|
"bincode",
|
|
@@ -1381,7 +1381,7 @@ dependencies = [
|
|
|
1381
1381
|
|
|
1382
1382
|
[[package]]
|
|
1383
1383
|
name = "tsalign-tests"
|
|
1384
|
-
version = "
|
|
1384
|
+
version = "3.0.0"
|
|
1385
1385
|
dependencies = [
|
|
1386
1386
|
"anyhow",
|
|
1387
1387
|
"clap",
|
tsalign-3.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tsalign
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Classifier: Programming Language :: Rust
|
|
5
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
7
|
+
Requires-Python: >=3.8
|
|
8
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
9
|
+
|
|
10
|
+
# Python Bindings for [`lib_tsalign`](https://crates.io/crates/lib_tsalign)
|
|
11
|
+
|
|
12
|
+
[](https://pypi.org/project/tsalign/)
|
|
13
|
+
|
|
14
|
+
Python bindings for the template switch aligner. Aligns two DNA sequences
|
|
15
|
+
while detecting template switches — short-range translocations where a query
|
|
16
|
+
region is copied from (or aligns to) a different location, possibly on the
|
|
17
|
+
reverse complement strand.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install tsalign
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
import tsalign
|
|
29
|
+
|
|
30
|
+
result = tsalign.align("ACGTACGT", "ACGACGT")
|
|
31
|
+
print(result.cigar()) # compact alignment string
|
|
32
|
+
print(result.stats()) # cost, duration, node counts, …
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Aligner options
|
|
36
|
+
|
|
37
|
+
Create an `Aligner` once and reuse it for many sequences:
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
aligner = tsalign.Aligner(
|
|
41
|
+
min_length_strategy="preprocess_lookahead", # default: "lookahead"
|
|
42
|
+
chaining_strategy="lower_bound", # default: "none"
|
|
43
|
+
total_length_strategy="maximise", # default: "maximise"
|
|
44
|
+
no_ts=False, # set True for plain gap-affine
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
result = aligner.align("ACGTACGT", "ACGACGT")
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Custom cost configuration
|
|
51
|
+
|
|
52
|
+
Costs are specified in `.tsa` format. Use `sample_tsa_config/config.tsa`
|
|
53
|
+
as a starting point and consult the [main repository README](../README.md#modifying-the-cost-function) for a description
|
|
54
|
+
of each parameter.
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
aligner = tsalign.Aligner(costs_file="sample_tsa_config/config.tsa")
|
|
58
|
+
result = aligner.align("ACGTACGT", "ACGACGT")
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
You can also pass the cost string directly:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
with open("my_costs.tsa") as f:
|
|
65
|
+
cost_str = f.read()
|
|
66
|
+
aligner = tsalign.Aligner(costs=cost_str)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Restricting the alignment range
|
|
70
|
+
|
|
71
|
+
Use `AlignmentRange` to align only a window of the input sequences:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
from tsalign import Aligner, AlignmentRange
|
|
75
|
+
|
|
76
|
+
aligner = Aligner()
|
|
77
|
+
result = aligner.align(
|
|
78
|
+
"NNNACGTACGTNNN",
|
|
79
|
+
"ACGACGT",
|
|
80
|
+
range=AlignmentRange(reference_start=3, reference_end=11),
|
|
81
|
+
)
|
|
82
|
+
print(result.cigar())
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Individual start/limit keyword arguments are also accepted when `range` is
|
|
86
|
+
not provided:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
result = aligner.align(
|
|
90
|
+
"NNNACGTACGTNNN",
|
|
91
|
+
"ACGACGT",
|
|
92
|
+
reference_start=3,
|
|
93
|
+
reference_limit=11,
|
|
94
|
+
)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Working with alignment operations
|
|
98
|
+
|
|
99
|
+
`alignment.alignments()` returns a typed list of `(count, op)` pairs:
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from tsalign import align, TemplateSwitchEntranceOp, TemplateSwitchExitOp
|
|
103
|
+
|
|
104
|
+
result = align(reference, query)
|
|
105
|
+
for count, op in result.alignments():
|
|
106
|
+
if isinstance(op, TemplateSwitchEntranceOp):
|
|
107
|
+
print(f"Template switch: {op.direction}, descendant={op.descendant}, offset={op.first_offset}")
|
|
108
|
+
elif isinstance(op, TemplateSwitchExitOp):
|
|
109
|
+
print(f"Exit, anti-descendant gap: {op.anti_descendant_gap}")
|
|
110
|
+
else:
|
|
111
|
+
# SimpleAlignmentOp — a basic edit in the primary or secondary track
|
|
112
|
+
print(f"{count}x {op.kind}")
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Visualisation
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
result = tsalign.align(reference, query)
|
|
119
|
+
result.viz_template_switches() # prints ASCII art to stdout
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Limiting search resources
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
result = aligner.align(
|
|
126
|
+
reference,
|
|
127
|
+
query,
|
|
128
|
+
cost_limit=100, # return None if cost would exceed this
|
|
129
|
+
memory_limit=500_000, # return None if memory exceeds this number of bytes
|
|
130
|
+
)
|
|
131
|
+
if result is None:
|
|
132
|
+
print("No alignment found within limits")
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Accepted sequence types
|
|
136
|
+
|
|
137
|
+
Any object whose `str()` representation is a valid DNA string (ACGTN) is
|
|
138
|
+
accepted — including `Bio.Seq`:
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from Bio.Seq import Seq
|
|
142
|
+
result = tsalign.align(Seq("ACGTACGT"), Seq("ACGACGT"))
|
|
143
|
+
```
|
|
144
|
+
|
|
@@ -41,7 +41,7 @@ result = aligner.align("ACGTACGT", "ACGACGT")
|
|
|
41
41
|
## Custom cost configuration
|
|
42
42
|
|
|
43
43
|
Costs are specified in `.tsa` format. Use `sample_tsa_config/config.tsa`
|
|
44
|
-
as a starting point and consult the main repository README for a description
|
|
44
|
+
as a starting point and consult the [main repository README](../README.md#modifying-the-cost-function) for a description
|
|
45
45
|
of each parameter.
|
|
46
46
|
|
|
47
47
|
```python
|
|
@@ -95,9 +95,9 @@ from tsalign import align, TemplateSwitchEntranceOp, TemplateSwitchExitOp
|
|
|
95
95
|
result = align(reference, query)
|
|
96
96
|
for count, op in result.alignments():
|
|
97
97
|
if isinstance(op, TemplateSwitchEntranceOp):
|
|
98
|
-
print(f"Template switch: {op.direction},
|
|
98
|
+
print(f"Template switch: {op.direction}, descendant={op.descendant}, offset={op.first_offset}")
|
|
99
99
|
elif isinstance(op, TemplateSwitchExitOp):
|
|
100
|
-
print(f"Exit, anti-
|
|
100
|
+
print(f"Exit, anti-descendant gap: {op.anti_descendant_gap}")
|
|
101
101
|
else:
|
|
102
102
|
# SimpleAlignmentOp — a basic edit in the primary or secondary track
|
|
103
103
|
print(f"{count}x {op.kind}")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name = "lib_tsalign"
|
|
3
3
|
description = "A sequence-to-sequence aligner that accounts for template switches"
|
|
4
4
|
authors = ["Sebastian Schmidt <sebastian.schmidt@helsinki.fi>"]
|
|
5
|
-
version = "
|
|
5
|
+
version = "3.0.0"
|
|
6
6
|
license.workspace = true
|
|
7
7
|
edition.workspace = true
|
|
8
8
|
rust-version.workspace = true
|
|
@@ -26,9 +26,9 @@ thiserror = "2.0.3"
|
|
|
26
26
|
num-traits.workspace = true
|
|
27
27
|
serde = { workspace = true, features = ["derive"], optional = true }
|
|
28
28
|
noisy_float = { version = "0.2.0" }
|
|
29
|
-
generic_a_star = { version = "
|
|
29
|
+
generic_a_star = { version = "3.0.0", path = "../generic_a_star" }
|
|
30
30
|
log.workspace = true
|
|
31
31
|
rustc-hash = "2.1.1"
|
|
32
|
-
seed_chain = { version = "
|
|
32
|
+
seed_chain = { version = "3.0.0", path = "../seed_chain" }
|
|
33
33
|
extend_map = "0.14.3"
|
|
34
34
|
template-switch-error-free-inners = "0.1.1"
|
{tsalign-2.1.1 → tsalign-3.0.0}/lib_tsalign/src/a_star_aligner/alignment_result/alignment/stream.rs
RENAMED
|
@@ -2,7 +2,7 @@ use std::{collections::VecDeque, iter};
|
|
|
2
2
|
|
|
3
3
|
use crate::a_star_aligner::{
|
|
4
4
|
alignment_result::alignment::Alignment,
|
|
5
|
-
template_switch_distance::{AlignmentType,
|
|
5
|
+
template_switch_distance::{AlignmentType, TemplateSwitchDescendant},
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
#[derive(Debug, Clone)]
|
|
@@ -20,7 +20,7 @@ pub struct AlignmentStream {
|
|
|
20
20
|
pub struct AlignmentStreamCoordinates {
|
|
21
21
|
reference: usize,
|
|
22
22
|
query: usize,
|
|
23
|
-
|
|
23
|
+
template_switch_descendant: Option<TemplateSwitchDescendant>,
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
impl AlignmentStream {
|
|
@@ -190,7 +190,7 @@ impl AlignmentStreamCoordinates {
|
|
|
190
190
|
Self {
|
|
191
191
|
reference: reference_offset,
|
|
192
192
|
query: query_offset,
|
|
193
|
-
|
|
193
|
+
template_switch_descendant: None,
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -210,34 +210,37 @@ impl AlignmentStreamCoordinates {
|
|
|
210
210
|
| AlignmentType::PrimaryMatch
|
|
211
211
|
| AlignmentType::PrimaryFlankSubstitution
|
|
212
212
|
| AlignmentType::PrimaryFlankMatch => (1, 1),
|
|
213
|
-
AlignmentType::TemplateSwitchEntrance {
|
|
213
|
+
AlignmentType::TemplateSwitchEntrance { descendant, .. } => {
|
|
214
214
|
assert!(
|
|
215
|
-
self.
|
|
215
|
+
self.template_switch_descendant.is_none(),
|
|
216
216
|
"Encountered template switch entrance within template switch"
|
|
217
217
|
);
|
|
218
|
-
self.
|
|
218
|
+
self.template_switch_descendant = Some(descendant);
|
|
219
219
|
(0, 0)
|
|
220
220
|
}
|
|
221
221
|
AlignmentType::SecondaryInsertion
|
|
222
222
|
| AlignmentType::SecondarySubstitution
|
|
223
|
-
| AlignmentType::SecondaryMatch => match self.
|
|
224
|
-
|
|
225
|
-
|
|
223
|
+
| AlignmentType::SecondaryMatch => match self.template_switch_descendant.unwrap() {
|
|
224
|
+
TemplateSwitchDescendant::Reference => (1, 0),
|
|
225
|
+
TemplateSwitchDescendant::Query => (0, 1),
|
|
226
226
|
},
|
|
227
|
-
AlignmentType::TemplateSwitchExit {
|
|
228
|
-
|
|
227
|
+
AlignmentType::TemplateSwitchExit {
|
|
228
|
+
anti_descendant_gap,
|
|
229
|
+
} => {
|
|
230
|
+
let Some(template_switch_descendant) = self.template_switch_descendant.take()
|
|
231
|
+
else {
|
|
229
232
|
panic!(
|
|
230
233
|
"Encountered template switch exit without first encountering a template switch entrance"
|
|
231
234
|
)
|
|
232
235
|
};
|
|
233
|
-
match
|
|
234
|
-
|
|
236
|
+
match template_switch_descendant {
|
|
237
|
+
TemplateSwitchDescendant::Reference => {
|
|
235
238
|
self.query =
|
|
236
|
-
usize::try_from(self.query as isize +
|
|
239
|
+
usize::try_from(self.query as isize + anti_descendant_gap).unwrap()
|
|
237
240
|
}
|
|
238
|
-
|
|
241
|
+
TemplateSwitchDescendant::Query => {
|
|
239
242
|
self.reference =
|
|
240
|
-
usize::try_from(self.reference as isize +
|
|
243
|
+
usize::try_from(self.reference as isize + anti_descendant_gap).unwrap()
|
|
241
244
|
}
|
|
242
245
|
}
|
|
243
246
|
(0, 0)
|