pav3 3.0.0.dev23__tar.gz → 3.0.0.dev26__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.
Files changed (128) hide show
  1. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/CONTRIBUTING.md +2 -2
  2. {pav3-3.0.0.dev23/src/pav3.egg-info → pav3-3.0.0.dev26}/PKG-INFO +100 -54
  3. pav3-3.0.0.dev23/PKG-INFO → pav3-3.0.0.dev26/README.md +82 -75
  4. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/pyproject.toml +13 -16
  5. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/__init__.py +11 -3
  6. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lift.py +4 -0
  7. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/op.py +6 -6
  8. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/records.py +2 -0
  9. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/tables.py +66 -6
  10. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/cli/__init__.py +11 -1
  11. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/cli/_cli.py +49 -8
  12. pav3-3.0.0.dev26/src/pav3/cli/_common_opt.py +161 -0
  13. pav3-3.0.0.dev26/src/pav3/cli/_lift_cli.py +139 -0
  14. pav3-3.0.0.dev26/src/pav3/cli/_returncode.py +82 -0
  15. pav3-3.0.0.dev26/src/pav3/cli/_subcommand_lift.py +100 -0
  16. pav3-3.0.0.dev26/src/pav3/cli/_subcommand_maketable.py +106 -0
  17. pav3-3.0.0.dev26/src/pav3/cli/_subcommand_subseq.py +117 -0
  18. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/tracks/alignment_track_fields.tsv +27 -23
  19. pav3-3.0.0.dev26/src/pav3/data/tracks/variant_track_fields.tsv +41 -0
  20. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/rules/call.smk +4 -0
  21. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/rules/tracks.smk +4 -14
  22. pav3-3.0.0.dev26/src/pav3/errors.py +33 -0
  23. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/fig/tracks.py +207 -34
  24. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/fig/util.py +5 -3
  25. pav3-3.0.0.dev26/src/pav3/format.py +122 -0
  26. pav3-3.0.0.dev26/src/pav3/lift/__init__.py +75 -0
  27. pav3-3.0.0.dev26/src/pav3/lift/errors.py +35 -0
  28. pav3-3.0.0.dev26/src/pav3/lift/output.py +516 -0
  29. pav3-3.0.0.dev26/src/pav3/lift/run.py +336 -0
  30. pav3-3.0.0.dev26/src/pav3/lift/source.py +422 -0
  31. pav3-3.0.0.dev26/src/pav3/lift/source_table.py +278 -0
  32. pav3-3.0.0.dev26/src/pav3/maketable.py +450 -0
  33. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/pipeline.py +56 -6
  34. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/schema.py +75 -12
  35. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/vcf.py +5 -1
  36. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/workflow/call.py +29 -1
  37. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/workflow/resource.py +2 -2
  38. pav3-3.0.0.dev26/src/pav3.egg-info/PKG-INFO +241 -0
  39. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3.egg-info/SOURCES.txt +19 -1
  40. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3.egg-info/requires.txt +3 -4
  41. pav3-3.0.0.dev26/tests/cli/test_maketable.py +502 -0
  42. pav3-3.0.0.dev26/tests/lift/conftest.py +53 -0
  43. pav3-3.0.0.dev26/tests/lift/test_lift.py +197 -0
  44. pav3-3.0.0.dev26/tests/lift/test_subseq.py +201 -0
  45. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tox.toml +1 -3
  46. pav3-3.0.0.dev23/README.md +0 -170
  47. pav3-3.0.0.dev23/src/pav3/cli/_common_opt.py +0 -41
  48. pav3-3.0.0.dev23/src/pav3/data/tracks/variant_track_fields.tsv +0 -37
  49. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/CHANGELOG.md +0 -0
  50. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/CODE_OF_CONDUCT.md +0 -0
  51. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/LICENSE +0 -0
  52. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/MANIFEST.in +0 -0
  53. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/setup.cfg +0 -0
  54. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/__main__.py +0 -0
  55. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/__init__.py +0 -0
  56. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/features.py +0 -0
  57. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lcmodel/__init__.py +0 -0
  58. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lcmodel/_lcmodel.py +0 -0
  59. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lcmodel/_lcmodel_logistic.py +0 -0
  60. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lcmodel/_lcmodel_null.py +0 -0
  61. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/lcmodel/_util.py +0 -0
  62. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/score.py +0 -0
  63. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/align/trim.py +0 -0
  64. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/anno.py +0 -0
  65. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/call/__init__.py +0 -0
  66. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/call/expr.py +0 -0
  67. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/call/integrate.py +0 -0
  68. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/call/intra.py +0 -0
  69. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/call/util.py +0 -0
  70. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/cli/_subcommand_batch.py +0 -0
  71. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/cli/_subcommand_call.py +0 -0
  72. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/cli/_subcommand_license.py +0 -0
  73. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/const.py +0 -0
  74. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/default/model.json +0 -0
  75. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_95_80/model.json +0 -0
  76. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_95_80/model_info.tar.gz +0 -0
  77. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_95_80/weights.npz +0 -0
  78. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_98_80/model.json +0 -0
  79. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_98_80/model_info.tar.gz +0 -0
  80. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/human_98_80/weights.npz +0 -0
  81. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/prim_90_50/model.json +0 -0
  82. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/prim_90_50/model_info.tar.gz +0 -0
  83. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/prim_90_50/weights.npz +0 -0
  84. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/primdiv_85_50/model.json +0 -0
  85. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/primdiv_85_50/model_info.tar.gz +0 -0
  86. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/lcmodel/primdiv_85_50/weights.npz +0 -0
  87. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/Snakefile +0 -0
  88. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/profiles/pav_default/config.yaml +0 -0
  89. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/rules/align.smk +0 -0
  90. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/rules/data.smk +0 -0
  91. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/data/workflow/rules/pipeline.smk +0 -0
  92. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/__init__.py +0 -0
  93. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/imports.py +0 -0
  94. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/inter.py +0 -0
  95. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/path.py +0 -0
  96. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/sm.py +0 -0
  97. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/dev/tables.py +0 -0
  98. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/fig/__init__.py +0 -0
  99. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/fig/const.py +0 -0
  100. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/fig/density.py +0 -0
  101. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/inv.py +0 -0
  102. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/io.py +0 -0
  103. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/kde.py +0 -0
  104. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/__init__.py +0 -0
  105. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/call.py +0 -0
  106. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/chain.py +0 -0
  107. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/interval.py +0 -0
  108. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/io.py +0 -0
  109. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/region_kde.py +0 -0
  110. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/resources.py +0 -0
  111. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/struct.py +0 -0
  112. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/lgsv/variant.py +0 -0
  113. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/params.py +0 -0
  114. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/region.py +0 -0
  115. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/seq.py +0 -0
  116. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/util.py +0 -0
  117. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3/workflow/__init__.py +0 -0
  118. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3.egg-info/dependency_links.txt +0 -0
  119. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3.egg-info/entry_points.txt +0 -0
  120. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/src/pav3.egg-info/top_level.txt +0 -0
  121. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/TESTING_TODO.md +0 -0
  122. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/align/.gitkeep +0 -0
  123. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/align/test_score.py +0 -0
  124. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/align/test_tables.py +0 -0
  125. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/call/.gitkeep +0 -0
  126. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/cli/.gitkeep +0 -0
  127. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/conftest.py +0 -0
  128. {pav3-3.0.0.dev23 → pav3-3.0.0.dev26}/tests/lgsv/.gitkeep +0 -0
@@ -5,7 +5,7 @@ features.
5
5
 
6
6
  ## Bugs, questions, and feature requests
7
7
 
8
- The project's [GitHub issues page](https://github.com/BeckLaboratory/pav/issues) may be used to ask questions,
8
+ The project's [GitHub issues page](https://github.com/BeckLaboratory/pav3/issues) may be used to ask questions,
9
9
  report bugs, and request features.
10
10
 
11
11
  Please search for related issues before opening a new one. If you find a relevant open issue, you may monitor it for
@@ -49,7 +49,7 @@ Please make sure you understand the [Code of Conduct](CODE_OF_CONDUCT.md) before
49
49
 
50
50
  Pull the codebase from GitHub:
51
51
  ```bash
52
- git clone https://github.com/BeckLaboratory/pav.git
52
+ git clone https://github.com/BeckLaboratory/pav3.git
53
53
  cd pav
54
54
  ```
55
55
 
@@ -1,17 +1,32 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pav3
3
- Version: 3.0.0.dev23
3
+ Version: 3.0.0.dev26
4
4
  Summary: Assembly-based variant discovery
5
+ Author-email: Peter Audano <peter.audano@jax.org>
6
+ Maintainer-email: Peter Audano <peter.audano@jax.org>
5
7
  License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/BeckLaboratory/pav3
9
+ Project-URL: Documentation, https://pav3.readthedocs.io
10
+ Project-URL: Repository, https://github.com/BeckLaboratory/pav3
11
+ Project-URL: Issues, https://github.com/BeckLaboratory/pav3/issues
12
+ Project-URL: Changelog, https://github.com/BeckLaboratory/pav3/blob/main/CHANGELOG.md
13
+ Keywords: variant calling,variant discovery,assembly-based,long-read,bioinformatics,genomics
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
6
20
  Requires-Python: >=3.12
7
21
  Description-Content-Type: text/markdown
8
22
  License-File: LICENSE
9
- Requires-Dist: agglovar==0.0.1.dev14
23
+ Requires-Dist: agglovar>=0.0.1.dev18
10
24
  Requires-Dist: biopython>=1.85
11
25
  Requires-Dist: fastexcel>=0.14.0
12
26
  Requires-Dist: frozendict>=2.4.6
13
27
  Requires-Dist: hmmlearn>=0.3.3
14
28
  Requires-Dist: intervaltree>=3.1.0
29
+ Requires-Dist: matplotlib>=3.11.0
15
30
  Requires-Dist: numpy>=2.3.2
16
31
  Requires-Dist: polars[numpy,pandas,pyarrow]>=1.41.0
17
32
  Requires-Dist: pyarrow>=21.0.0
@@ -19,8 +34,7 @@ Requires-Dist: pysam>=0.23.3
19
34
  Requires-Dist: scipy>=1.16.1
20
35
  Requires-Dist: scipy-stubs==1.16.1.1
21
36
  Requires-Dist: snakemake>=9.9.0
22
- Provides-Extra: fig
23
- Requires-Dist: matplotlib>=3.10.8; extra == "fig"
37
+ Requires-Dist: xlsxwriter>=3.2.9
24
38
  Dynamic: license-file
25
39
 
26
40
  <h1 align="center"><img width="300px" src="img/logo/PAVLogo_Full.png"/></h1>
@@ -31,40 +45,23 @@ Dynamic: license-file
31
45
 
32
46
  Variant caller for assembled genomes.
33
47
 
34
- Please discuss with authors prior to publishing results using PAV 3. A paper describing PAV 3 is in
35
- preparation and is expected mid-2026.
36
-
37
- ## Development release (Please read)
38
-
39
- PAV 3 is currently a development release and may contain bugs. Please report problems you encounter.
40
-
41
- PAV now uses Polars for fast data manipulation. If your job fails with strange Polars errors, such as "capacity
42
- overflow" or "PanicException", this is likely from Polars running out of memory.
43
-
44
-
45
- ### Notes for early adopters
46
-
47
- If you have been using development versions, please read about these changes.
48
-
49
- **Call subcommand is deprecated.** If you have been running pav3 with the "call" subcommand, switch it to "batch"
50
- (i.e. ("pav3 batch ...")). A future version will use "call" for single assemblies (with multiple haplotypes) defined on
51
- the command-line and "batch" to run all assemblies from an assembly table.
52
-
53
- **Moving configuration to pav.json.** The configuration file "config.json" is being moved to "pav.json". A future
54
- version will ignore "config.json".
48
+ Please discuss with authors prior to publishing results using PAV 3; contact
49
+ [contact information](https://www.jax.org/people/peter-audano). A paper describing PAV 3 is in
50
+ preparation.
55
51
 
56
52
 
57
53
  ## Install and run
58
54
 
59
55
 
60
56
  ### Install
57
+ PAV requires Python 3.12 or newer.
61
58
  ```
62
59
  pip install pav3
63
60
  ```
64
61
 
65
62
  ### Run
66
- To run PAV, use the `pav3 batch` command after setting up configuration files (see below). A future version will add
67
- `pav call` for single-assemblies without requiring configuration files.
63
+ To run PAV, use the `pav3 batch` command after setting up configuration files (see below). A future version may add
64
+ a command for single-assemblies without requiring configuration files.
68
65
 
69
66
  Some Python environments may require you to run `pav3` through the `python` command:
70
67
  ```
@@ -72,13 +69,45 @@ python -m pav3 batch
72
69
  ```
73
70
 
74
71
 
72
+ ### Containers
73
+
74
+ Public container images include PAV and all dependencies.
75
+
76
+ > [!IMPORTANT]
77
+ > Pulling containers will generate 401 errors pending permissions changes by our organization. This should be
78
+ > corrected within a few days, please check back.
79
+
80
+ Docker:
81
+ ```
82
+ docker pull ghcr.io/becklaboratory/pav3:latest
83
+
84
+ docker run --rm -v "$PWD:$PWD" -w "$PWD" --user "$(id -u):$(id -g)" \
85
+ ghcr.io/becklaboratory/pav3:latest batch
86
+ ```
87
+
88
+ Apptainer (or Singularity):
89
+ ```
90
+ apptainer pull pav3.sif oras://ghcr.io/becklaboratory/pav3-sif:latest
91
+
92
+ apptainer run pav3.sif batch
93
+ ```
94
+
95
+ The container runs `pav3` itself, so arguments follow the image exactly as they would on the command line (`batch`,
96
+ `--help`, and so on).
97
+
98
+ Both examples give PAV access to the current directory only. If the reference genome or the assemblies are somewhere
99
+ else, make those locations visible as well: add `-v /path:/path` for Docker or `--bind /path` for Apptainer.
100
+
101
+ Replace `latest` with a version (e.g. `3.0.0.dev24`) to pin a specific release.
102
+
103
+
75
104
  ### Dependencies
76
- Currently, PAV needs `minimap2` in the environment where it is run. This may change in future releases. All other
77
- dependencies are handled by the installer.
105
+ Currently, PAV needs `minimap2` in the environment where it is run (the containers above already include it). This may
106
+ change in future releases. All other dependencies are handled by the installer.
78
107
 
79
108
 
80
109
  ### Output
81
- PAV will output a VCF file for each sample called `NAME.vcf.gz`.
110
+ PAV will output a VCF file `NAME.vcf.gz` to the run directory for each sample.
82
111
 
83
112
  * `results/NAME/call_hap`: Unmerged variant calls.
84
113
  * Includes tables of callable regions in reference ("callable_ref") and query ("callable_qry") coordinates.
@@ -113,61 +142,67 @@ The assembly table points PAV to input assemblies. It may be in TSV, CSV, Excel,
113
142
  optionally be gzipped). Each assembly has one row in the table.
114
143
 
115
144
  Columns:
116
- * NAME: Assembly or sample name.
117
- * HAP_\*: One column for each assembled haplotype.
145
+ * name: Assembly or sample name.
146
+ * hap_\*: One column for each assembled haplotype.
118
147
 
119
148
 
120
149
  #### Name column
121
150
 
122
- The `NAME` column contains the assembly name (or sample name). This column must be present and each row must have a
151
+ The `name` column contains the assembly name (or sample name). This column must be present and each row must have a
123
152
  unique value.
124
153
 
125
154
 
126
155
  #### Haplotype columns
127
156
 
128
- PAV accepts one or more assembled haplotypes per assembly, each with a column in the table starting with "HAP_". Each
157
+ PAV accepts one or more assembled haplotypes per assembly, each with a column in the table starting with "hap_". Each
129
158
  is a path to an input file for one assembly haplotype.
130
159
 
131
- Common column names are "HAP_h1" for haplotype "h1" and "HAP_h2" for haplotype "h2". For some assemblies with known
132
- parental origins, "HAP_mat" and "HAP_pat" are commonly used.
160
+ Common column names are "hap_h1" for haplotype "h1" and "hap_h2" for haplotype "h2". For some assemblies with known
161
+ parental origins, "hap_pat" and "hap_mat" are commonly used.
133
162
 
134
163
  There must be at least one haplotype per assembly, and PAV has no limits on the number of haplotypes (i.e. 3 or more
135
164
  are acceptable).
136
165
 
137
- Not all assemblies need to have the same haplotypes. PAV will ignore empty the "HAP_" values for each assembly. For
138
- example, if some assemblies have an "unphased" haplotype and other do not, include "HAP_unphased" and leave it blank
139
- for assemblies that do not have it.
166
+ Not all assemblies need to have the same haplotypes. PAV will ignore empty "hap_" values for each assembly where the
167
+ path is empty. For example, if some assemblies have an "unphased" haplotype and others do not, include the
168
+ "hap_unphased" column and leave it blank for assemblies that do not have it.
140
169
 
141
170
  Note that genotypes in the VCF file will have one allele for each haplotype defined for the assembly. For an assembly
142
171
  with haplotypes "h1", "h2", and "unphased", three genotype alleles will be possible (e.g. "1|0|." for a heterozygous
143
172
  variant present in "h1", not present in "h2", and uncallable in "unphased"). The order of genotypes is determined by
144
173
  the order of haplotype columns in the assembly table.
145
174
 
146
- Each "HAP_" column contains paths to input files in FASTA, FASTQ, GFA, or FOFN format. FOFN may contain paths to these
175
+ Each "hap_" column contains paths to input files in FASTA, FASTQ, GFA, or FOFN format. FOFN may contain paths to these
147
176
  same file types including other FOFNs (recursive FOFNs are not recommended, but PAV will detect cycles). Multiple files
148
177
  can be input by separating them by semi-colons (i.e. "path/to/file1.fasta.gz;path/to/file2.fasta.gz") and a mix of
149
- types is possible. PAV will be fastest if the input is a single bgzipped and indexed FASTA file, it will build its
150
- own FASTA file for all other cases.
178
+ types is possible.
179
+
180
+ PAV will be fastest if the input is a single indexed FASTA file, which may be plain text or bgzipped (Samtools bgzip).
181
+ For all other input including multiple FASTA files or any GFA files for one haplotype, PAV will build a single FASTA
182
+ file from the input, index it, and use it for variant calling.
151
183
 
152
184
 
153
185
  #### Configuration column for global overrides
154
186
 
155
- An optional "CONFIG" column can override global configuration parameters per assembly. Global configuration parameters
187
+ An optional "config" column can override global configuration parameters per assembly. Global configuration parameters
156
188
  are defined in `pav.json` or are PAV default values if not defined. Values in this column are semicolon-separated lists
157
- of key-value pairs (i.e. "key1=val1;key2=val2"). The "reference" parameter cannot be overridden per assembly.
189
+ of key-value pairs (i.e. "key1=val1;key2=val2"). The "reference" parameter cannot be set in the assembly table.
158
190
 
159
191
 
160
- ### A note on references
192
+ ### Suitable genome references
161
193
 
162
- Do not use references with ALT, PATCH, or DECOY scaffolds for PAV, or generally, any assembly-based or long-read
163
- variant calling tool. Reference redundancy may increase callset errors.
194
+ Align against primary assemblies composed of chromosome scaffolds including unplaced contigs and unlocalized contigs
195
+ if they exist (GRCh/hg references). Do not use references with ALT, PATCH, or DECOY scaffolds. Reference redundancy
196
+ from these non-primary contigs may increase callset errors.
164
197
 
165
- The GRCh38 HGSVC no-ALT reference for long reads can be found here:
166
- ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC2/technical/reference/20200513_hg38_NoALT/
198
+ The GRCh38 HGSVC no-ALT reference for long reads was shared by the HGSVC consortium:
199
+ https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC2/technical/reference/20200513_hg38_NoALT/
167
200
 
168
- The T2T-CHM13v2.0 (hs1 on UCSC) is suitable without alteration. Custom per-sample assemblies containing a
169
- single-haplotype or an unphased ("squashed") assembly typically also make a suitable reference as long as they are
170
- free of large structural misassemblies and especially large false duplications.
201
+ The T2T-CHM13v2.0 (hs1 on UCSC) is suitable without alteration.
202
+
203
+ Custom per-sample assemblies containing a single-haplotype or an unphased ("squashed") assembly typically also make a
204
+ suitable reference as long as they are free of large structural misassemblies and large false duplications. For phased
205
+ assemblies, choose only one haplotype as a reference.
171
206
 
172
207
 
173
208
  ## PAV versions
@@ -176,8 +211,8 @@ PAV uses Python package versioning with three fields:
176
211
 
177
212
  * Major: Major changes or new features.
178
213
  * Minor: Small changes, but may affect PAV's API or command-line interfaces.
179
- * Patch: Small changes and minor new features. Patch versions do break API or command-line compatibility, but may
180
- add minor features or options to the API that were not previously supported.
214
+ * Patch: Small changes and minor new features. Patch versions do not break API or command-line compatibility, but may
215
+ add new features.
181
216
 
182
217
  PAV follows Python's packaging versioning scheme (https://packaging.python.org/en/latest/discussions/versioning/).
183
218
 
@@ -187,9 +222,20 @@ and "3.0.0a1" is an early alpha version, and "3.0.0rc1" is a release candidate,
187
222
  release and should not be considered production-ready.
188
223
 
189
224
 
225
+ ## Reporting bugs
226
+
227
+ Please report problems you encounter on the
228
+ [issues page](https://github.com/BeckLaboratory/pav3/issues).
229
+
230
+
190
231
  ## Cite PAV
191
232
 
192
233
  PAV 3 does not yet have a citation. For now, use the citation for previous PAV versions, but check back for updates.
193
234
 
194
235
  Ebert et al., “Haplotype-Resolved Diverse Human Genomes and Integrated Analysis of Structural Variation,”
195
236
  Science, February 25, 2021, eabf7117, https://doi.org/10.1126/science.abf7117 (PMID: 33632895).
237
+
238
+
239
+ ## License
240
+
241
+ PAV is released under the MIT License. See [LICENSE](LICENSE).
@@ -1,28 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: pav3
3
- Version: 3.0.0.dev23
4
- Summary: Assembly-based variant discovery
5
- License-Expression: MIT
6
- Requires-Python: >=3.12
7
- Description-Content-Type: text/markdown
8
- License-File: LICENSE
9
- Requires-Dist: agglovar==0.0.1.dev14
10
- Requires-Dist: biopython>=1.85
11
- Requires-Dist: fastexcel>=0.14.0
12
- Requires-Dist: frozendict>=2.4.6
13
- Requires-Dist: hmmlearn>=0.3.3
14
- Requires-Dist: intervaltree>=3.1.0
15
- Requires-Dist: numpy>=2.3.2
16
- Requires-Dist: polars[numpy,pandas,pyarrow]>=1.41.0
17
- Requires-Dist: pyarrow>=21.0.0
18
- Requires-Dist: pysam>=0.23.3
19
- Requires-Dist: scipy>=1.16.1
20
- Requires-Dist: scipy-stubs==1.16.1.1
21
- Requires-Dist: snakemake>=9.9.0
22
- Provides-Extra: fig
23
- Requires-Dist: matplotlib>=3.10.8; extra == "fig"
24
- Dynamic: license-file
25
-
26
1
  <h1 align="center"><img width="300px" src="img/logo/PAVLogo_Full.png"/></h1>
27
2
  <p align="center">Phased Assembly Variant Caller</p>
28
3
 
@@ -31,40 +6,23 @@ Dynamic: license-file
31
6
 
32
7
  Variant caller for assembled genomes.
33
8
 
34
- Please discuss with authors prior to publishing results using PAV 3. A paper describing PAV 3 is in
35
- preparation and is expected mid-2026.
36
-
37
- ## Development release (Please read)
38
-
39
- PAV 3 is currently a development release and may contain bugs. Please report problems you encounter.
40
-
41
- PAV now uses Polars for fast data manipulation. If your job fails with strange Polars errors, such as "capacity
42
- overflow" or "PanicException", this is likely from Polars running out of memory.
43
-
44
-
45
- ### Notes for early adopters
46
-
47
- If you have been using development versions, please read about these changes.
48
-
49
- **Call subcommand is deprecated.** If you have been running pav3 with the "call" subcommand, switch it to "batch"
50
- (i.e. ("pav3 batch ...")). A future version will use "call" for single assemblies (with multiple haplotypes) defined on
51
- the command-line and "batch" to run all assemblies from an assembly table.
52
-
53
- **Moving configuration to pav.json.** The configuration file "config.json" is being moved to "pav.json". A future
54
- version will ignore "config.json".
9
+ Please discuss with authors prior to publishing results using PAV 3; contact
10
+ [contact information](https://www.jax.org/people/peter-audano). A paper describing PAV 3 is in
11
+ preparation.
55
12
 
56
13
 
57
14
  ## Install and run
58
15
 
59
16
 
60
17
  ### Install
18
+ PAV requires Python 3.12 or newer.
61
19
  ```
62
20
  pip install pav3
63
21
  ```
64
22
 
65
23
  ### Run
66
- To run PAV, use the `pav3 batch` command after setting up configuration files (see below). A future version will add
67
- `pav call` for single-assemblies without requiring configuration files.
24
+ To run PAV, use the `pav3 batch` command after setting up configuration files (see below). A future version may add
25
+ a command for single-assemblies without requiring configuration files.
68
26
 
69
27
  Some Python environments may require you to run `pav3` through the `python` command:
70
28
  ```
@@ -72,13 +30,45 @@ python -m pav3 batch
72
30
  ```
73
31
 
74
32
 
33
+ ### Containers
34
+
35
+ Public container images include PAV and all dependencies.
36
+
37
+ > [!IMPORTANT]
38
+ > Pulling containers will generate 401 errors pending permissions changes by our organization. This should be
39
+ > corrected within a few days, please check back.
40
+
41
+ Docker:
42
+ ```
43
+ docker pull ghcr.io/becklaboratory/pav3:latest
44
+
45
+ docker run --rm -v "$PWD:$PWD" -w "$PWD" --user "$(id -u):$(id -g)" \
46
+ ghcr.io/becklaboratory/pav3:latest batch
47
+ ```
48
+
49
+ Apptainer (or Singularity):
50
+ ```
51
+ apptainer pull pav3.sif oras://ghcr.io/becklaboratory/pav3-sif:latest
52
+
53
+ apptainer run pav3.sif batch
54
+ ```
55
+
56
+ The container runs `pav3` itself, so arguments follow the image exactly as they would on the command line (`batch`,
57
+ `--help`, and so on).
58
+
59
+ Both examples give PAV access to the current directory only. If the reference genome or the assemblies are somewhere
60
+ else, make those locations visible as well: add `-v /path:/path` for Docker or `--bind /path` for Apptainer.
61
+
62
+ Replace `latest` with a version (e.g. `3.0.0.dev24`) to pin a specific release.
63
+
64
+
75
65
  ### Dependencies
76
- Currently, PAV needs `minimap2` in the environment where it is run. This may change in future releases. All other
77
- dependencies are handled by the installer.
66
+ Currently, PAV needs `minimap2` in the environment where it is run (the containers above already include it). This may
67
+ change in future releases. All other dependencies are handled by the installer.
78
68
 
79
69
 
80
70
  ### Output
81
- PAV will output a VCF file for each sample called `NAME.vcf.gz`.
71
+ PAV will output a VCF file `NAME.vcf.gz` to the run directory for each sample.
82
72
 
83
73
  * `results/NAME/call_hap`: Unmerged variant calls.
84
74
  * Includes tables of callable regions in reference ("callable_ref") and query ("callable_qry") coordinates.
@@ -113,61 +103,67 @@ The assembly table points PAV to input assemblies. It may be in TSV, CSV, Excel,
113
103
  optionally be gzipped). Each assembly has one row in the table.
114
104
 
115
105
  Columns:
116
- * NAME: Assembly or sample name.
117
- * HAP_\*: One column for each assembled haplotype.
106
+ * name: Assembly or sample name.
107
+ * hap_\*: One column for each assembled haplotype.
118
108
 
119
109
 
120
110
  #### Name column
121
111
 
122
- The `NAME` column contains the assembly name (or sample name). This column must be present and each row must have a
112
+ The `name` column contains the assembly name (or sample name). This column must be present and each row must have a
123
113
  unique value.
124
114
 
125
115
 
126
116
  #### Haplotype columns
127
117
 
128
- PAV accepts one or more assembled haplotypes per assembly, each with a column in the table starting with "HAP_". Each
118
+ PAV accepts one or more assembled haplotypes per assembly, each with a column in the table starting with "hap_". Each
129
119
  is a path to an input file for one assembly haplotype.
130
120
 
131
- Common column names are "HAP_h1" for haplotype "h1" and "HAP_h2" for haplotype "h2". For some assemblies with known
132
- parental origins, "HAP_mat" and "HAP_pat" are commonly used.
121
+ Common column names are "hap_h1" for haplotype "h1" and "hap_h2" for haplotype "h2". For some assemblies with known
122
+ parental origins, "hap_pat" and "hap_mat" are commonly used.
133
123
 
134
124
  There must be at least one haplotype per assembly, and PAV has no limits on the number of haplotypes (i.e. 3 or more
135
125
  are acceptable).
136
126
 
137
- Not all assemblies need to have the same haplotypes. PAV will ignore empty the "HAP_" values for each assembly. For
138
- example, if some assemblies have an "unphased" haplotype and other do not, include "HAP_unphased" and leave it blank
139
- for assemblies that do not have it.
127
+ Not all assemblies need to have the same haplotypes. PAV will ignore empty "hap_" values for each assembly where the
128
+ path is empty. For example, if some assemblies have an "unphased" haplotype and others do not, include the
129
+ "hap_unphased" column and leave it blank for assemblies that do not have it.
140
130
 
141
131
  Note that genotypes in the VCF file will have one allele for each haplotype defined for the assembly. For an assembly
142
132
  with haplotypes "h1", "h2", and "unphased", three genotype alleles will be possible (e.g. "1|0|." for a heterozygous
143
133
  variant present in "h1", not present in "h2", and uncallable in "unphased"). The order of genotypes is determined by
144
134
  the order of haplotype columns in the assembly table.
145
135
 
146
- Each "HAP_" column contains paths to input files in FASTA, FASTQ, GFA, or FOFN format. FOFN may contain paths to these
136
+ Each "hap_" column contains paths to input files in FASTA, FASTQ, GFA, or FOFN format. FOFN may contain paths to these
147
137
  same file types including other FOFNs (recursive FOFNs are not recommended, but PAV will detect cycles). Multiple files
148
138
  can be input by separating them by semi-colons (i.e. "path/to/file1.fasta.gz;path/to/file2.fasta.gz") and a mix of
149
- types is possible. PAV will be fastest if the input is a single bgzipped and indexed FASTA file, it will build its
150
- own FASTA file for all other cases.
139
+ types is possible.
140
+
141
+ PAV will be fastest if the input is a single indexed FASTA file, which may be plain text or bgzipped (Samtools bgzip).
142
+ For all other input including multiple FASTA files or any GFA files for one haplotype, PAV will build a single FASTA
143
+ file from the input, index it, and use it for variant calling.
151
144
 
152
145
 
153
146
  #### Configuration column for global overrides
154
147
 
155
- An optional "CONFIG" column can override global configuration parameters per assembly. Global configuration parameters
148
+ An optional "config" column can override global configuration parameters per assembly. Global configuration parameters
156
149
  are defined in `pav.json` or are PAV default values if not defined. Values in this column are semicolon-separated lists
157
- of key-value pairs (i.e. "key1=val1;key2=val2"). The "reference" parameter cannot be overridden per assembly.
150
+ of key-value pairs (i.e. "key1=val1;key2=val2"). The "reference" parameter cannot be set in the assembly table.
151
+
158
152
 
153
+ ### Suitable genome references
159
154
 
160
- ### A note on references
155
+ Align against primary assemblies composed of chromosome scaffolds including unplaced contigs and unlocalized contigs
156
+ if they exist (GRCh/hg references). Do not use references with ALT, PATCH, or DECOY scaffolds. Reference redundancy
157
+ from these non-primary contigs may increase callset errors.
161
158
 
162
- Do not use references with ALT, PATCH, or DECOY scaffolds for PAV, or generally, any assembly-based or long-read
163
- variant calling tool. Reference redundancy may increase callset errors.
159
+ The GRCh38 HGSVC no-ALT reference for long reads was shared by the HGSVC consortium:
160
+ https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC2/technical/reference/20200513_hg38_NoALT/
164
161
 
165
- The GRCh38 HGSVC no-ALT reference for long reads can be found here:
166
- ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC2/technical/reference/20200513_hg38_NoALT/
162
+ The T2T-CHM13v2.0 (hs1 on UCSC) is suitable without alteration.
167
163
 
168
- The T2T-CHM13v2.0 (hs1 on UCSC) is suitable without alteration. Custom per-sample assemblies containing a
169
- single-haplotype or an unphased ("squashed") assembly typically also make a suitable reference as long as they are
170
- free of large structural misassemblies and especially large false duplications.
164
+ Custom per-sample assemblies containing a single-haplotype or an unphased ("squashed") assembly typically also make a
165
+ suitable reference as long as they are free of large structural misassemblies and large false duplications. For phased
166
+ assemblies, choose only one haplotype as a reference.
171
167
 
172
168
 
173
169
  ## PAV versions
@@ -176,8 +172,8 @@ PAV uses Python package versioning with three fields:
176
172
 
177
173
  * Major: Major changes or new features.
178
174
  * Minor: Small changes, but may affect PAV's API or command-line interfaces.
179
- * Patch: Small changes and minor new features. Patch versions do break API or command-line compatibility, but may
180
- add minor features or options to the API that were not previously supported.
175
+ * Patch: Small changes and minor new features. Patch versions do not break API or command-line compatibility, but may
176
+ add new features.
181
177
 
182
178
  PAV follows Python's packaging versioning scheme (https://packaging.python.org/en/latest/discussions/versioning/).
183
179
 
@@ -187,9 +183,20 @@ and "3.0.0a1" is an early alpha version, and "3.0.0rc1" is a release candidate,
187
183
  release and should not be considered production-ready.
188
184
 
189
185
 
186
+ ## Reporting bugs
187
+
188
+ Please report problems you encounter on the
189
+ [issues page](https://github.com/BeckLaboratory/pav3/issues).
190
+
191
+
190
192
  ## Cite PAV
191
193
 
192
194
  PAV 3 does not yet have a citation. For now, use the citation for previous PAV versions, but check back for updates.
193
195
 
194
196
  Ebert et al., “Haplotype-Resolved Diverse Human Genomes and Integrated Analysis of Structural Variation,”
195
197
  Science, February 25, 2021, eabf7117, https://doi.org/10.1126/science.abf7117 (PMID: 33632895).
198
+
199
+
200
+ ## License
201
+
202
+ PAV is released under the MIT License. See [LICENSE](LICENSE).
@@ -11,12 +11,13 @@ readme = "README.md"
11
11
 
12
12
  requires-python = ">=3.12"
13
13
  dependencies = [
14
- "agglovar==0.0.1.dev14",
14
+ "agglovar>=0.0.1.dev18",
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
+ "matplotlib>=3.11.0",
20
21
  "numpy>=2.3.2",
21
22
  "polars[numpy,pandas,pyarrow]>=1.41.0",
22
23
  "pyarrow>=21.0.0",
@@ -24,23 +25,9 @@ dependencies = [
24
25
  "scipy>=1.16.1",
25
26
  "scipy-stubs==1.16.1.1",
26
27
  "snakemake>=9.9.0",
28
+ "xlsxwriter>=3.2.9",
27
29
  ]
28
30
 
29
- [project.scripts]
30
- pav3 = "pav3.cli:main"
31
-
32
- [project.optional-dependencies]
33
- fig = [
34
- "matplotlib>=3.10.8",
35
- ]
36
-
37
- [pav.urls]
38
- Homepage = "https://github.com/BeckLaboratory/pav"
39
- Documentation = "https://pav3.readthedocs.io"
40
- Repository = "https://github.com/BeckLaboratory/pav"
41
- Issues = "https://github.com/BeckLaboratory/pav/issues"
42
- Changelog = "https://github.com/BeckLaboratory/pav/blob/master/CHANGELOG.md"
43
-
44
31
  keywords = [
45
32
  "variant calling",
46
33
  "variant discovery",
@@ -67,6 +54,16 @@ maintainers = [
67
54
  {name = "Peter Audano", email = "peter.audano@jax.org"}
68
55
  ]
69
56
 
57
+ [project.scripts]
58
+ pav3 = "pav3.cli:main"
59
+
60
+ [project.urls]
61
+ Homepage = "https://github.com/BeckLaboratory/pav3"
62
+ Documentation = "https://pav3.readthedocs.io"
63
+ Repository = "https://github.com/BeckLaboratory/pav3"
64
+ Issues = "https://github.com/BeckLaboratory/pav3/issues"
65
+ Changelog = "https://github.com/BeckLaboratory/pav3/blob/main/CHANGELOG.md"
66
+
70
67
  [dependency-groups]
71
68
  dev = [
72
69
  "adbc-driver-manager>=1.7.0",
@@ -1,6 +1,9 @@
1
1
  """PAV Python library routines."""
2
2
 
3
- __version__ = '3.0.0.dev23'
3
+ import importlib
4
+ import logging
5
+
6
+ __version__ = '3.0.0.dev26'
4
7
 
5
8
  __all__ = [
6
9
  'align',
@@ -8,11 +11,14 @@ __all__ = [
8
11
  'call',
9
12
  'cli',
10
13
  'const',
14
+ 'errors',
11
15
  'fig',
16
+ 'format',
12
17
  'io',
13
18
  'inv',
14
19
  'kde',
15
20
  'lgsv',
21
+ 'maketable',
16
22
  'params',
17
23
  'pipeline',
18
24
  'region',
@@ -56,7 +62,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
62
  SOFTWARE.
57
63
  """
58
64
 
59
- import importlib
60
-
61
65
  for name in __all__:
62
66
  globals()[name] = importlib.import_module(f'.{name}', package=__name__)
67
+
68
+
69
+ # Configure logging
70
+ logging.getLogger(__name__).addHandler(logging.NullHandler())
@@ -58,6 +58,7 @@ poor alignment record is not prioritized over one where both coordinates land on
58
58
  alignment record.
59
59
 
60
60
  Values:
61
+
61
62
  * score: Prioritize by the alignment record scores. First by the lowest score, then by the highest.
62
63
  * filter: Prioritize by the lesser number of values in the alignment record "filter", first on
63
64
  the record with more filters, then on the record with fewer filters.
@@ -69,6 +70,7 @@ Values:
69
70
  if a lift switches alignment records.
70
71
 
71
72
  Keys:
73
+
72
74
  * best: Prioritize on the best alignment records (score, filter, len, single_align, same_align).
73
75
  * align: Same align, then best (same_align, score, filter, len, single_align).
74
76
  * len: Same region length, then best (len, score, filter, single_align, same_align).
@@ -391,6 +393,7 @@ class AlignLift:
391
393
  """Lift coordinates from query to reference.
392
394
 
393
395
  Each dict has the following keys:
396
+
394
397
  - chrom: Reference chromosome
395
398
  - pos: Reference position in 0-based coordinates.
396
399
  - is_rev: Whether the query is reverse-complemented in this alignment
@@ -456,6 +459,7 @@ class AlignLift:
456
459
  """Lift coordinates from reference to query.
457
460
 
458
461
  Each dict has the following keys:
462
+
459
463
  - chrom: Query ID
460
464
  - pos: Query position in 0-based coordinates
461
465
  - is_rev: Whether the query is reverse-complemented