pav3 3.0.0.dev21__tar.gz → 3.0.0.dev23__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.
- pav3-3.0.0.dev23/CHANGELOG.md +37 -0
- pav3-3.0.0.dev23/CODE_OF_CONDUCT.md +109 -0
- pav3-3.0.0.dev23/CONTRIBUTING.md +146 -0
- pav3-3.0.0.dev23/MANIFEST.in +26 -0
- {pav3-3.0.0.dev21/src/pav3.egg-info → pav3-3.0.0.dev23}/PKG-INFO +3 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/pyproject.toml +13 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/__init__.py +1 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lcmodel/_lcmodel.py +7 -5
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lcmodel/_util.py +37 -30
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lift.py +9 -8
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/op.py +5 -5
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/score.py +5 -4
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/tables.py +161 -11
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/call/expr.py +22 -12
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/call/integrate.py +5 -5
- pav3-3.0.0.dev23/src/pav3/call/intra.py +551 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/call/util.py +2 -49
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/__init__.py +0 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/_cli.py +8 -4
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/_common_opt.py +3 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/_subcommand_batch.py +8 -5
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/_subcommand_call.py +8 -5
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/cli/_subcommand_license.py +2 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/const.py +1 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/Snakefile +1 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/rules/align.smk +1 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/rules/call.smk +24 -28
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/rules/data.smk +1 -2
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/imports.py +5 -6
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/inter.py +1 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/path.py +12 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/fig/density.py +4 -6
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/fig/tracks.py +20 -6
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/fig/util.py +6 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/inv.py +22 -17
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/io.py +21 -9
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/call.py +2 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/interval.py +7 -8
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/region_kde.py +0 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/variant.py +8 -16
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/pipeline.py +102 -22
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/region.py +5 -1
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/schema.py +23 -15
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/util.py +2 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/vcf.py +35 -9
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/workflow/call.py +72 -10
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/workflow/resource.py +23 -14
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23/src/pav3.egg-info}/PKG-INFO +3 -3
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3.egg-info/SOURCES.txt +13 -4
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3.egg-info/requires.txt +2 -2
- pav3-3.0.0.dev23/tests/TESTING_TODO.md +1 -0
- pav3-3.0.0.dev23/tests/align/.gitkeep +0 -0
- pav3-3.0.0.dev23/tests/align/test_score.py +55 -0
- pav3-3.0.0.dev23/tests/align/test_tables.py +118 -0
- pav3-3.0.0.dev23/tests/call/.gitkeep +0 -0
- pav3-3.0.0.dev23/tests/cli/.gitkeep +0 -0
- pav3-3.0.0.dev23/tests/conftest.py +76 -0
- pav3-3.0.0.dev23/tests/lgsv/.gitkeep +0 -0
- pav3-3.0.0.dev23/tox.toml +56 -0
- pav3-3.0.0.dev21/src/pav3/call/intra.py +0 -512
- pav3-3.0.0.dev21/src/pav3/workflow/__pycache__/__init__.cpython-312.pyc +0 -0
- pav3-3.0.0.dev21/src/pav3/workflow/__pycache__/call.cpython-312.pyc +0 -0
- pav3-3.0.0.dev21/src/pav3/workflow/__pycache__/resource.cpython-312.pyc +0 -0
- pav3-3.0.0.dev21/tests/test_score_dtype.py +0 -24
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/LICENSE +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/README.md +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/setup.cfg +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/__main__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/features.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lcmodel/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lcmodel/_lcmodel_logistic.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/lcmodel/_lcmodel_null.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/records.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/align/trim.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/anno.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/call/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/default/model.json +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_95_80/model.json +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_95_80/model_info.tar.gz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_95_80/weights.npz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_98_80/model.json +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_98_80/model_info.tar.gz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/human_98_80/weights.npz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/prim_90_50/model.json +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/prim_90_50/model_info.tar.gz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/prim_90_50/weights.npz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/primdiv_85_50/model.json +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/primdiv_85_50/model_info.tar.gz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/lcmodel/primdiv_85_50/weights.npz +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/tracks/alignment_track_fields.tsv +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/tracks/variant_track_fields.tsv +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/profiles/pav_default/config.yaml +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/rules/pipeline.smk +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/data/workflow/rules/tracks.smk +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/sm.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/dev/tables.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/fig/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/fig/const.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/kde.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/chain.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/io.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/resources.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/lgsv/struct.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/params.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/seq.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3/workflow/__init__.py +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3.egg-info/dependency_links.txt +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3.egg-info/entry_points.txt +0 -0
- {pav3-3.0.0.dev21 → pav3-3.0.0.dev23}/src/pav3.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
Style guide:
|
|
5
|
+
https://common-changelog.org/
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
<!-- TEMPLATE
|
|
9
|
+
## [x.y.z] - YYYY-MM-DD
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
-
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
-
|
|
16
|
+
|
|
17
|
+
### Removed
|
|
18
|
+
-
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
-
|
|
22
|
+
|
|
23
|
+
-->
|
|
24
|
+
|
|
25
|
+
## [Unreleased] - TBD
|
|
26
|
+
First full PAV 3.0 beta release.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- Altered PAV project structure including library.
|
|
30
|
+
- Replaced Pandas with Polars.
|
|
31
|
+
- Increased performance with Polars and vectorization.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
- Variant intersects are handled by agglovar
|
|
35
|
+
|
|
36
|
+
### Removed
|
|
37
|
+
- SVPop was replaced by agglovar and some functions were moved into PAV.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
|
|
2
|
+
# Contributor Covenant 3.0 Code of Conduct
|
|
3
|
+
|
|
4
|
+
## Our Pledge
|
|
5
|
+
|
|
6
|
+
We pledge to make our community welcoming, safe, and equitable for all.
|
|
7
|
+
|
|
8
|
+
We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all
|
|
9
|
+
individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics,
|
|
10
|
+
neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or
|
|
11
|
+
religion, national or social origin, socio-economic position, level of education, or other status. The same privileges
|
|
12
|
+
of participation are extended to everyone who participates in good faith and in accordance with this Covenant.
|
|
13
|
+
|
|
14
|
+
## Encouraged Behaviors
|
|
15
|
+
|
|
16
|
+
While acknowledging differences in social norms, we all strive to meet our community's expectations for positive
|
|
17
|
+
behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture,
|
|
18
|
+
background, or native language.
|
|
19
|
+
|
|
20
|
+
With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared
|
|
21
|
+
values, including:
|
|
22
|
+
|
|
23
|
+
1. Respecting the **purpose of our community**, our activities, and our ways of gathering.
|
|
24
|
+
2. Engaging **kindly and honestly** with others.
|
|
25
|
+
3. Respecting **different viewpoints** and experiences.
|
|
26
|
+
4. **Taking responsibility** for our actions and contributions.
|
|
27
|
+
5. Gracefully giving and accepting **constructive feedback**.
|
|
28
|
+
6. Committing to **repairing harm** when it occurs.
|
|
29
|
+
7. Behaving in other ways that promote and sustain the **well-being of our community**.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## Restricted Behaviors
|
|
33
|
+
|
|
34
|
+
We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are
|
|
35
|
+
violations of this Code of Conduct.
|
|
36
|
+
|
|
37
|
+
1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any
|
|
38
|
+
clear request to stop.
|
|
39
|
+
2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of
|
|
40
|
+
people.
|
|
41
|
+
3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable
|
|
42
|
+
identities or traits.
|
|
43
|
+
4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or
|
|
44
|
+
purpose of the community.
|
|
45
|
+
5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their
|
|
46
|
+
permission.
|
|
47
|
+
6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group.
|
|
48
|
+
7. Behaving in other ways that **threaten the well-being** of our community.
|
|
49
|
+
|
|
50
|
+
### Other Restrictions
|
|
51
|
+
|
|
52
|
+
1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade
|
|
53
|
+
enforcement actions.
|
|
54
|
+
2. **Failing to credit sources.** Not properly crediting the sources of content you contribute.
|
|
55
|
+
3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the
|
|
56
|
+
community.
|
|
57
|
+
4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other
|
|
58
|
+
restricted behaviors.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Reporting an Issue
|
|
62
|
+
|
|
63
|
+
Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict
|
|
64
|
+
represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help
|
|
65
|
+
avoid conflicts and minimize harm.
|
|
66
|
+
|
|
67
|
+
When an incident does occur, it is important to report it promptly. **Please report violations to
|
|
68
|
+
Peter Audano (peter.audano@jax.org)**. Alternatively, you may consult with Christine Beck (christine.beck@jax.org) or
|
|
69
|
+
The Jackson Laboratory HR department (hrhelp@jax.org) for guidance.
|
|
70
|
+
|
|
71
|
+
Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They
|
|
72
|
+
will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing
|
|
73
|
+
witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as
|
|
74
|
+
possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried
|
|
75
|
+
out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon
|
|
76
|
+
resolution.
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Addressing Violations
|
|
80
|
+
|
|
81
|
+
****
|
|
82
|
+
|
|
83
|
+
Complaints will be reviewed confidentially and appropriate responses will be taken including suspension and
|
|
84
|
+
permanent bans from the project as necessary. We reserve the right to remove any content contributed by a violator
|
|
85
|
+
including code and discussions.
|
|
86
|
+
|
|
87
|
+
## Scope
|
|
88
|
+
|
|
89
|
+
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing
|
|
90
|
+
the community in public or other spaces. Examples of representing our community include using an official email address,
|
|
91
|
+
posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
## Attribution
|
|
95
|
+
|
|
96
|
+
This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at
|
|
97
|
+
[https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/).
|
|
98
|
+
|
|
99
|
+
Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy
|
|
100
|
+
of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/)
|
|
101
|
+
|
|
102
|
+
For answers to common questions about Contributor Covenant, see the FAQ at
|
|
103
|
+
[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at
|
|
104
|
+
[https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can
|
|
105
|
+
be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of
|
|
106
|
+
[Mozilla’s code of conduct team](https://github.com/mozilla/inclusion).
|
|
107
|
+
|
|
108
|
+
Some modifications to the original code of conduct were made using the
|
|
109
|
+
[Atom project Code of Conduct](https://github.com/atom/atom/blob/master/CODE_OF_CONDUCT.md) as a guide.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! We appreciate your help including bugs reports and implementing new
|
|
4
|
+
features.
|
|
5
|
+
|
|
6
|
+
## Bugs, questions, and feature requests
|
|
7
|
+
|
|
8
|
+
The project's [GitHub issues page](https://github.com/BeckLaboratory/pav/issues) may be used to ask questions,
|
|
9
|
+
report bugs, and request features.
|
|
10
|
+
|
|
11
|
+
Please search for related issues before opening a new one. If you find a relevant open issue, you may monitor it for
|
|
12
|
+
updates (look for the "Subscribe" button on the issue's page). Add comments to existing issues as needed. Reference
|
|
13
|
+
related issues in your new issue or comments. Comments on closed issues may be missed.
|
|
14
|
+
|
|
15
|
+
Please make sure you understand the [Code of Conduct](CODE_OF_CONDUCT.md) before opening or commenting on issues.
|
|
16
|
+
|
|
17
|
+
### Reporting bugs
|
|
18
|
+
|
|
19
|
+
When reporting a bug, please provide the following information:
|
|
20
|
+
* A clear and concise description of the bug.
|
|
21
|
+
* The version of the project you are using.
|
|
22
|
+
* The steps to reproduce the bug.
|
|
23
|
+
* Any error messages you receive.
|
|
24
|
+
* Platform information (e.g. OS, Python version, etc).
|
|
25
|
+
|
|
26
|
+
Please include as many details as possible in your report, it helps us resolve the issue faster. Please also take a
|
|
27
|
+
moment to re-read your report to ensure it is clear and concise. When in doubt, more detail is generally better.
|
|
28
|
+
|
|
29
|
+
### Feature requests
|
|
30
|
+
|
|
31
|
+
We welcome ideas for improving on the project. Please provide a clear description of the feature you would like and
|
|
32
|
+
examples about why it is useful. Please help us understand the full context of your feature request so that we can
|
|
33
|
+
make an informed decision and properly prioritize the request.
|
|
34
|
+
|
|
35
|
+
## Contributing
|
|
36
|
+
|
|
37
|
+
Bugs are often fixed by the maintainers, but please feel free to look for issues and submit pull requests. Pick any
|
|
38
|
+
issue that is accepted and not assigned to another contributor. You may comment on the issue to express your interest
|
|
39
|
+
in working on it.
|
|
40
|
+
|
|
41
|
+
If you are a first time contributor, we will do our best to mark issues as a "good first issue".
|
|
42
|
+
|
|
43
|
+
If you would like to take on an issue, please comment on the issue to let others know. You may use the issue to discuss
|
|
44
|
+
possible solutions.
|
|
45
|
+
|
|
46
|
+
Please make sure you understand the [Code of Conduct](CODE_OF_CONDUCT.md) before becoming a contributor.
|
|
47
|
+
|
|
48
|
+
### Setting up your environment
|
|
49
|
+
|
|
50
|
+
Pull the codebase from GitHub:
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/BeckLaboratory/pav.git
|
|
53
|
+
cd pav
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
A virtual environment is already setup with [uv](https://docs.astral.sh/uv/). See the
|
|
57
|
+
[uv installation guide](https://docs.astral.sh/uv/getting-started/installation/) to install uv if you do not have it.
|
|
58
|
+
|
|
59
|
+
Initialize your virtual environment:
|
|
60
|
+
```bash
|
|
61
|
+
uv sync
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This will create a virtual environment in the `.venv` directory including all project dependencies and development tools
|
|
65
|
+
used directly by this project. Your IDE can use the virtual environment to provide features such as code completion.
|
|
66
|
+
|
|
67
|
+
Commands in the virtual environment can be run by prefixing them with `uv`.
|
|
68
|
+
|
|
69
|
+
Open an interactive session:
|
|
70
|
+
```bash
|
|
71
|
+
uv run ipython
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Setting up your IDE
|
|
75
|
+
|
|
76
|
+
This project was developed with [PyCharm](https://www.jetbrains.com/pycharm/), but no specific IDE is compulsory. When
|
|
77
|
+
opening the projcet in PyCharm, it should detect the uv virtual environment and use it. If not, you may need to
|
|
78
|
+
configure the IDE to use the environment in `.venv`.
|
|
79
|
+
|
|
80
|
+
### Linting and unit tests
|
|
81
|
+
|
|
82
|
+
Linting and unit tests are setup through tox environments [tox](https://tox.wiki/) already configured for this project.
|
|
83
|
+
A list of environments can be viewed in [tox.toml]. Environments starting with "py" are for unit testing various
|
|
84
|
+
Python versions, and a "flake8" environment is for linting. By default, running a tox environment will run all unit
|
|
85
|
+
tests or perform linting for the whole project.
|
|
86
|
+
|
|
87
|
+
Important environments are:
|
|
88
|
+
* flake8: Linting.
|
|
89
|
+
* sphinx: Build documentation.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
To run a tox environment, use:
|
|
93
|
+
```bash
|
|
94
|
+
uv run tox -e <environment_name>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For example, to run the linting environment:
|
|
98
|
+
```bash
|
|
99
|
+
uv run tox -e flake8
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The same tools are also available in the virtual environment and can be run with the `uv` prefix.
|
|
103
|
+
|
|
104
|
+
For example, lint a single file:
|
|
105
|
+
```bash
|
|
106
|
+
uv run flake8 <file_path>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Please ensure your contributions pass linting and do not break unit tests before submitting a pull request. When adding
|
|
110
|
+
a new feature, please consider adding unit tests for it.
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
### Pull requests
|
|
114
|
+
|
|
115
|
+
When your contribution is ready, open a pull request.
|
|
116
|
+
|
|
117
|
+
Before submitting a pull request:
|
|
118
|
+
* Make sure your changes are rebased against the main branch.
|
|
119
|
+
* Ensure your code is free of linting errors (See [Linting and unit tests])
|
|
120
|
+
* Ensure your code does not break any existing unit tests (See [Linting and unit tests]).
|
|
121
|
+
* Ensure your code follows the conventions outlined in the [Conventions](#conventions) section.
|
|
122
|
+
|
|
123
|
+
While submitting a pull request:
|
|
124
|
+
* Use a clear and concise title.
|
|
125
|
+
* Provide a clear and concise description.
|
|
126
|
+
* Reference the issue(s) you are working on.
|
|
127
|
+
|
|
128
|
+
A maintainer will review your request and may ask for changes or leave comments. Once all issues are resolved, the
|
|
129
|
+
pull request will be merged into the main branch, and your contribution will be included in the next release!
|
|
130
|
+
|
|
131
|
+
If you are stuck or unsure about your solution, feel free to open a draft pull request and ask for help.
|
|
132
|
+
|
|
133
|
+
## Conventions
|
|
134
|
+
|
|
135
|
+
* Use [reStructuredText docstrings](https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html)
|
|
136
|
+
* Omit ":type:" and ":rtype:", allow type hints to fill it in.
|
|
137
|
+
* Use type hints.
|
|
138
|
+
* Use snake_case for variable names and function names.
|
|
139
|
+
* Use CamelCase for class names.
|
|
140
|
+
* Line length limit 120 characters
|
|
141
|
+
* Use 4 spaces for indentation.
|
|
142
|
+
* Place operators at the start of multi-line expressions rather than the end.
|
|
143
|
+
* Avoid backslashes, enclose in parethesis instead.
|
|
144
|
+
* All non-public members should be prefixed with an underscore.
|
|
145
|
+
* All public package members must appear in __all__.
|
|
146
|
+
* Use relative imports except for a few submodules with no dependencies on other submodules.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include CHANGELOG.md
|
|
4
|
+
include CODE_OF_CONDUCT.md
|
|
5
|
+
include CONTRIBUTING.md
|
|
6
|
+
include pyproject.toml
|
|
7
|
+
include tox.toml
|
|
8
|
+
|
|
9
|
+
graft tests
|
|
10
|
+
graft src/pav3/data
|
|
11
|
+
graft src/pav3/workflow
|
|
12
|
+
|
|
13
|
+
prune local
|
|
14
|
+
prune dist
|
|
15
|
+
prune docs/build
|
|
16
|
+
prune .tox
|
|
17
|
+
prune .venv
|
|
18
|
+
prune .pytest_cache
|
|
19
|
+
prune .ruff_cache
|
|
20
|
+
prune .idea
|
|
21
|
+
prune .claude
|
|
22
|
+
|
|
23
|
+
global-exclude __pycache__
|
|
24
|
+
global-exclude *.py[cod]
|
|
25
|
+
global-exclude .DS_Store
|
|
26
|
+
global-exclude *.so
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pav3
|
|
3
|
-
Version: 3.0.0.
|
|
3
|
+
Version: 3.0.0.dev23
|
|
4
4
|
Summary: Assembly-based variant discovery
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
License-File: LICENSE
|
|
9
|
-
Requires-Dist: agglovar
|
|
9
|
+
Requires-Dist: agglovar==0.0.1.dev14
|
|
10
10
|
Requires-Dist: biopython>=1.85
|
|
11
11
|
Requires-Dist: fastexcel>=0.14.0
|
|
12
12
|
Requires-Dist: frozendict>=2.4.6
|
|
13
13
|
Requires-Dist: hmmlearn>=0.3.3
|
|
14
14
|
Requires-Dist: intervaltree>=3.1.0
|
|
15
15
|
Requires-Dist: numpy>=2.3.2
|
|
16
|
-
Requires-Dist: polars[numpy,pandas,pyarrow]>=1.
|
|
16
|
+
Requires-Dist: polars[numpy,pandas,pyarrow]>=1.41.0
|
|
17
17
|
Requires-Dist: pyarrow>=21.0.0
|
|
18
18
|
Requires-Dist: pysam>=0.23.3
|
|
19
19
|
Requires-Dist: scipy>=1.16.1
|
|
@@ -11,14 +11,14 @@ readme = "README.md"
|
|
|
11
11
|
|
|
12
12
|
requires-python = ">=3.12"
|
|
13
13
|
dependencies = [
|
|
14
|
-
"agglovar
|
|
14
|
+
"agglovar==0.0.1.dev14",
|
|
15
15
|
"biopython>=1.85",
|
|
16
16
|
"fastexcel>=0.14.0",
|
|
17
17
|
"frozendict>=2.4.6",
|
|
18
18
|
"hmmlearn>=0.3.3",
|
|
19
19
|
"intervaltree>=3.1.0",
|
|
20
20
|
"numpy>=2.3.2",
|
|
21
|
-
"polars[numpy,pandas,pyarrow]>=1.
|
|
21
|
+
"polars[numpy,pandas,pyarrow]>=1.41.0",
|
|
22
22
|
"pyarrow>=21.0.0",
|
|
23
23
|
"pysam>=0.23.3",
|
|
24
24
|
"scipy>=1.16.1",
|
|
@@ -80,9 +80,11 @@ dev = [
|
|
|
80
80
|
"flake8-rst-docstrings>=0.3.1",
|
|
81
81
|
"ipython>=9.7.0",
|
|
82
82
|
"ply>=3.11",
|
|
83
|
+
"pygithub>=2.9.1",
|
|
83
84
|
"pylint>=3.3.7",
|
|
84
85
|
"pytest>=8.4.1",
|
|
85
86
|
"pytest-cov>=6.2.1",
|
|
87
|
+
"ruff>=0.15.12",
|
|
86
88
|
"sphinx>=8.2.3",
|
|
87
89
|
"sphinx-autoapi>=3.6.0",
|
|
88
90
|
"sphinx-rtd-theme>=3.0.2",
|
|
@@ -112,7 +114,15 @@ version = {attr = "pav3.__version__"}
|
|
|
112
114
|
|
|
113
115
|
[tool.pytest.ini_options]
|
|
114
116
|
testpaths = [
|
|
115
|
-
"tests"
|
|
117
|
+
"tests",
|
|
118
|
+
]
|
|
119
|
+
addopts = [
|
|
120
|
+
"--strict-markers",
|
|
121
|
+
"--strict-config",
|
|
122
|
+
]
|
|
123
|
+
markers = [
|
|
124
|
+
"requires_test_data: test depends on local/test_data/pav_short (skipped when absent)",
|
|
125
|
+
"sample(name): tag a parametrized case with the sample name it represents (filtered by --run-samples)",
|
|
116
126
|
]
|
|
117
127
|
|
|
118
128
|
[tool.pylint.'MESSAGES CONTROL']
|
|
@@ -21,7 +21,7 @@ __all__ = [
|
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
from abc import ABC, abstractmethod
|
|
24
|
-
from dataclasses import dataclass
|
|
24
|
+
from dataclasses import dataclass
|
|
25
25
|
import pathlib
|
|
26
26
|
import importlib.resources.abc
|
|
27
27
|
import inspect
|
|
@@ -44,10 +44,12 @@ class LCAlignModel(ABC):
|
|
|
44
44
|
|
|
45
45
|
Warning: Child class implementations must call `super().__post_init__()`.
|
|
46
46
|
|
|
47
|
-
:ivar lc_model_def: LC model definition dictionary from
|
|
48
|
-
|
|
49
|
-
:ivar
|
|
50
|
-
|
|
47
|
+
:ivar lc_model_def: LC model definition dictionary parsed from ``model.json``. If None, the child class must
|
|
48
|
+
create one or let this parent class raise an exception. Null models do this; most others do not.
|
|
49
|
+
:ivar resource_type: Where the model was loaded from: ``"package"`` for a model bundled inside the pav3 package,
|
|
50
|
+
``"filesystem"`` for a model directory on disk, or None for null models with no backing resource.
|
|
51
|
+
:ivar anchor: For ``"package"`` resources, the dotted resource name (e.g. ``"pav3.data.lcmodel.default"``).
|
|
52
|
+
For ``"filesystem"`` resources, the path string to the model directory. None for null models.
|
|
51
53
|
"""
|
|
52
54
|
|
|
53
55
|
lc_model_def: Optional[dict[str, Any]]
|
|
@@ -24,31 +24,31 @@ from ._lcmodel_null import LCAlignModelNull
|
|
|
24
24
|
LC_MODEL_RESOURCE = 'pav3.data.lcmodel'
|
|
25
25
|
"""Resource directory where built-in LC models are kept in the package."""
|
|
26
26
|
|
|
27
|
+
|
|
27
28
|
def get_model(
|
|
28
|
-
model_name: Optional[str] =
|
|
29
|
+
model_name: Optional[str] = 'default',
|
|
29
30
|
) -> LCAlignModel | None:
|
|
30
|
-
"""Load model
|
|
31
|
+
"""Load a model used to tag low-confidence (LC) alignments.
|
|
31
32
|
|
|
32
|
-
If
|
|
33
|
-
not tag any alignment records as LC.
|
|
33
|
+
If `model_name` is None, an empty string, or the keywords "none" or "null" (not case-sensitive), a null model is
|
|
34
|
+
returned that does not tag any alignment records as LC.
|
|
34
35
|
|
|
35
|
-
If
|
|
36
|
-
searched first. If
|
|
37
|
-
found
|
|
36
|
+
If `model_name` is a strictly alpha-numeric string, the pre-trained models bundled in the package data directory
|
|
37
|
+
are searched first. If `model_name` contains non-alpha-numeric characters (e.g. '.' or './'), or the name is not
|
|
38
|
+
found among the pre-trained models, it is treated as a filesystem path and searched from the current working
|
|
39
|
+
directory.
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
file
|
|
41
|
+
Once a model directory is located, "model.json" is read from it (an error is raised if that file is absent). This
|
|
42
|
+
file must contain at minimum a ``"type"`` attribute. The model directory may contain other files read by the
|
|
41
43
|
specific model type.
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
:param model_name: Name of a pre-trained model or path to model directory. If None or 'none' (not case-sensitive),
|
|
46
|
-
return a null model that does not tag any alignment records as low confidence.
|
|
45
|
+
:param model_name: Name of a pre-trained model or path to a model directory on the filesystem. If None or 'none'
|
|
46
|
+
(not case-sensitive), a null model that does not tag any alignment records as low confidence is returned.
|
|
47
47
|
|
|
48
|
-
:returns: LC alignment model or None if
|
|
48
|
+
:returns: LC alignment model, or None if no model could be located.
|
|
49
49
|
|
|
50
|
-
:raises ValueError: If model
|
|
51
|
-
:raises ValueError: If model definition is invalid or recursive aliases are detected.
|
|
50
|
+
:raises ValueError: If the model directory exists but does not contain a model definition file.
|
|
51
|
+
:raises ValueError: If the model definition is invalid or recursive aliases are detected.
|
|
52
52
|
"""
|
|
53
53
|
if model_name is None:
|
|
54
54
|
return null_model()
|
|
@@ -58,7 +58,7 @@ def get_model(
|
|
|
58
58
|
|
|
59
59
|
model_name = model_name.strip()
|
|
60
60
|
|
|
61
|
-
if model_name.lower()
|
|
61
|
+
if model_name.lower().strip() in {'none', 'null', ''}:
|
|
62
62
|
return null_model()
|
|
63
63
|
|
|
64
64
|
# Locate model and load config
|
|
@@ -85,18 +85,22 @@ def locate_model(
|
|
|
85
85
|
) -> tuple[str, str, dict[str, Any]] | None:
|
|
86
86
|
"""Locate a model by name or path.
|
|
87
87
|
|
|
88
|
-
Recursively follow aliases until a model definition is found or no model can be located.
|
|
88
|
+
Recursively follow aliases until a concrete model definition is found or no model can be located.
|
|
89
89
|
|
|
90
|
-
:param model_name: Name of a pre-trained model or path to model directory
|
|
91
|
-
return a null model that does not tag any alignment records as low confidence.
|
|
90
|
+
:param model_name: Name of a pre-trained model or path to a model directory on the filesystem.
|
|
92
91
|
|
|
93
|
-
:returns: A tuple
|
|
92
|
+
:returns: A 3-tuple ``(resource_type, anchor, lc_model_def)`` where:
|
|
94
93
|
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
* ``resource_type`` is ``"package"`` when the model was found inside the installed package, or
|
|
95
|
+
``"filesystem"`` when it was found on the filesystem.
|
|
96
|
+
* ``anchor`` is the dotted package resource name (e.g. ``"pav3.data.lcmodel.default"``) for
|
|
97
|
+
``"package"`` resources, or the path string to the model directory for ``"filesystem"`` resources.
|
|
98
|
+
* ``lc_model_def`` is the parsed contents of ``model.json`` as a dict.
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
Returns None if no model can be located.
|
|
101
|
+
|
|
102
|
+
:raises ValueError: If the model directory exists but does not contain a model definition file.
|
|
103
|
+
:raises ValueError: If the model definition is invalid or recursive aliases are detected.
|
|
100
104
|
"""
|
|
101
105
|
# Locate a model
|
|
102
106
|
model_name_list = []
|
|
@@ -178,10 +182,13 @@ def locate_model(
|
|
|
178
182
|
def locate_config_package(
|
|
179
183
|
model_name: str
|
|
180
184
|
) -> Optional[tuple[str, str]]:
|
|
181
|
-
"""Locate a model directory
|
|
185
|
+
"""Locate a model directory bundled inside the pav3 package.
|
|
186
|
+
|
|
187
|
+
:param model_name: Alpha-numeric model name used to construct the dotted package resource path
|
|
188
|
+
``pav3.data.lcmodel.<model_name>``.
|
|
182
189
|
|
|
183
|
-
:returns:
|
|
184
|
-
|
|
190
|
+
:returns: ``("package", anchor)`` where ``anchor`` is the dotted resource name
|
|
191
|
+
(e.g. ``"pav3.data.lcmodel.default"``), or None if the model resource was not found.
|
|
185
192
|
"""
|
|
186
193
|
|
|
187
194
|
if not re.search(r'^\w+$', model_name):
|
|
@@ -197,7 +204,7 @@ def locate_config_package(
|
|
|
197
204
|
if not model_dir.is_dir():
|
|
198
205
|
raise ValueError(f'LC align model directory resource exists but is not a directory: {model_dir}')
|
|
199
206
|
|
|
200
|
-
if not importlib.resources.
|
|
207
|
+
if not (importlib.resources.files(model_resource) / 'model.json').is_file():
|
|
201
208
|
raise ValueError(f'Missing "model.json" in LC align model resource: {model_resource}')
|
|
202
209
|
|
|
203
210
|
return 'package', model_resource
|
|
@@ -230,4 +237,4 @@ def locate_config_filesystem(
|
|
|
230
237
|
|
|
231
238
|
def null_model() -> LCAlignModelNull:
|
|
232
239
|
"""Get a null model."""
|
|
233
|
-
return LCAlignModelNull(None, None)
|
|
240
|
+
return LCAlignModelNull(None, None, None)
|
|
@@ -55,7 +55,7 @@ For example, "score" prioritizes alignment records by the lowest score first (lo
|
|
|
55
55
|
alignment record for the start position and end position). If scores are equal, it next prioritizes
|
|
56
56
|
on the higher alignment record score. This ensures that a lift where a coordinate lands on a
|
|
57
57
|
poor alignment record is not prioritized over one where both coordinates land on a better
|
|
58
|
-
alignment record.
|
|
58
|
+
alignment record.
|
|
59
59
|
|
|
60
60
|
Values:
|
|
61
61
|
* score: Prioritize by the alignment record scores. First by the lowest score, then by the highest.
|
|
@@ -184,22 +184,24 @@ class LiftSeg:
|
|
|
184
184
|
assert (
|
|
185
185
|
qry_pos_min := self.df_ops.select(pl.col('qry_pos').min()).item()
|
|
186
186
|
) == self._row['qry_pos'], (
|
|
187
|
-
f'Query start position mismatch in LiftSeg init:
|
|
187
|
+
f'Query start position mismatch in LiftSeg init: '
|
|
188
|
+
f'lift-table={qry_pos_min} != align-table={self._row["qry_pos"]}'
|
|
188
189
|
)
|
|
189
190
|
|
|
190
191
|
assert (
|
|
191
192
|
qry_end_max := self.df_ops.select(pl.col('qry_end').max()).item()
|
|
192
193
|
) == self._row['qry_end'], (
|
|
193
|
-
f'Query end position mismatch in LiftSeg init:
|
|
194
|
+
f'Query end position mismatch in LiftSeg init: '
|
|
195
|
+
f'lift-table={qry_end_max} != align-table={self._row["qry_end"]}'
|
|
194
196
|
)
|
|
195
197
|
|
|
196
198
|
assert (
|
|
197
199
|
ref_end_max := self.df_ops.select(pl.col('ref_end').max()).item()
|
|
198
200
|
) == self._row['end'], (
|
|
199
|
-
f'Reference end position mismatch in LiftSeg init:
|
|
201
|
+
f'Reference end position mismatch in LiftSeg init: '
|
|
202
|
+
f'lift-table={ref_end_max} != align-table={self._row["end"]}'
|
|
200
203
|
)
|
|
201
204
|
|
|
202
|
-
|
|
203
205
|
def __repr__(self) -> str:
|
|
204
206
|
"""Get a string representation of the object."""
|
|
205
207
|
return (
|
|
@@ -235,7 +237,6 @@ class LiftSeg:
|
|
|
235
237
|
|
|
236
238
|
return qry_pos + (pos - ref_pos), op_code
|
|
237
239
|
|
|
238
|
-
|
|
239
240
|
def to_ref(
|
|
240
241
|
self,
|
|
241
242
|
pos: int
|
|
@@ -303,7 +304,7 @@ class AlignLift:
|
|
|
303
304
|
:param cache_align: Number of alignment records to cache in memory.
|
|
304
305
|
"""
|
|
305
306
|
if df is None:
|
|
306
|
-
raise ValueError(
|
|
307
|
+
raise ValueError('Parameter "df" is missing')
|
|
307
308
|
|
|
308
309
|
df = (
|
|
309
310
|
df
|
|
@@ -315,7 +316,7 @@ class AlignLift:
|
|
|
315
316
|
df = df.lazy()
|
|
316
317
|
|
|
317
318
|
if df_qry_fai is None:
|
|
318
|
-
raise ValueError(
|
|
319
|
+
raise ValueError('Parameter "df_qry_fai" is missing')
|
|
319
320
|
|
|
320
321
|
if isinstance(df_qry_fai, pl.LazyFrame):
|
|
321
322
|
df_qry_fai = df_qry_fai.collect()
|
|
@@ -115,16 +115,16 @@ OP_CODE: dict[str, int] = {
|
|
|
115
115
|
}
|
|
116
116
|
"""Mapping from CIGAR characters to operation codes."""
|
|
117
117
|
|
|
118
|
-
CONSUMES_QRY_ARR: np.typing.NDArray[np.integer] = np.array([M, I, S, EQ, X])
|
|
119
|
-
"""Array of operation codes that consume query bases."""
|
|
120
|
-
|
|
121
118
|
CONSUMES_REF_ARR: np.typing.NDArray[np.integer] = np.array([M, D, N, EQ, X])
|
|
122
119
|
"""Array of operation codes that consume reference bases."""
|
|
123
120
|
|
|
124
|
-
|
|
121
|
+
CONSUMES_QRY_ARR: np.typing.NDArray[np.integer] = np.array([M, I, S, EQ, X])
|
|
122
|
+
"""Array of operation codes that consume query bases."""
|
|
123
|
+
|
|
124
|
+
ADV_REF_ARR: np.typing.NDArray[np.integer] = np.array([M, D, EQ, X])
|
|
125
125
|
"""Array of operation codes that advance the reference position."""
|
|
126
126
|
|
|
127
|
-
ADV_QRY_ARR: np.typing.NDArray[np.integer] = np.array([M,
|
|
127
|
+
ADV_QRY_ARR: np.typing.NDArray[np.integer] = np.array([M, I, S, H, EQ, X])
|
|
128
128
|
"""Array of operation codes that advance the query position."""
|
|
129
129
|
|
|
130
130
|
VAR_ARR: np.typing.NDArray[np.integer] = np.array([X, I, D])
|