repare 0.0.2__tar.gz → 0.1.1__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.

Potentially problematic release.


This version of repare might be problematic. Click here for more details.

Files changed (125) hide show
  1. repare-0.1.1/.gitattributes +2 -0
  2. {repare-0.0.2 → repare-0.1.1}/.gitignore +9 -4
  3. {repare-0.0.2 → repare-0.1.1}/.pre-commit-config.yaml +1 -1
  4. repare-0.1.1/PKG-INFO +121 -0
  5. repare-0.1.1/README.md +100 -0
  6. repare-0.1.1/benchmarks/published/compare_gurgy_pedigrees.py +81 -0
  7. repare-0.1.1/benchmarks/published/compare_nepluyevsky_pedigrees.py +52 -0
  8. repare-0.1.1/benchmarks/published/data/gurgy/citation.md +3 -0
  9. repare-0.1.1/benchmarks/published/data/gurgy/published_exact_relations.csv +266 -0
  10. repare-0.1.1/benchmarks/published/data/hazleton_north/citation.md +1 -0
  11. repare-0.1.1/benchmarks/published/data/hazleton_north/published_exact_relations.csv +71 -0
  12. repare-0.1.1/benchmarks/published/data/nepluyevsky/citation.md +1 -0
  13. repare-0.1.1/benchmarks/published/data/nepluyevsky/published_exact_relations.csv +83 -0
  14. repare-0.1.1/benchmarks/published/evaluator/comparison_utils.py +66 -0
  15. repare-0.0.2/benchmarks/published/comparator/relation_comparison.py → repare-0.1.1/benchmarks/published/evaluator/pedigree_evaluator.py +105 -54
  16. repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree.svg +7076 -0
  17. repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree_repositioned_cropped.pdf +0 -0
  18. repare-0.1.1/benchmarks/published/results/gurgy_comparison/inferred_pedigree_repositioned_cropped.svg +15522 -0
  19. repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree.svg +6957 -0
  20. repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree_cropped.pdf +0 -0
  21. repare-0.1.1/benchmarks/published/results/gurgy_comparison/published_pedigree_cropped.svg +35690 -0
  22. repare-0.1.1/benchmarks/published/results/gurgy_comparison/relation_differences.csv +49 -0
  23. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree.svg +2482 -0
  24. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree_cropped.pdf +0 -0
  25. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/inferred_pedigree_cropped.svg +5120 -0
  26. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree.svg +2568 -0
  27. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree_cropped.pdf +0 -0
  28. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/published_pedigree_cropped.svg +10782 -0
  29. repare-0.1.1/benchmarks/published/results/nepluyevsky_comparison/relation_differences.csv +9 -0
  30. repare-0.1.1/benchmarks/published/results/results.csv +6 -0
  31. repare-0.1.1/benchmarks/published/run_evaluations.py +47 -0
  32. repare-0.1.1/benchmarks/simulations/plot_parameter_data.py +133 -0
  33. repare-0.1.1/benchmarks/simulations/plot_sampling_data.py +84 -0
  34. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.0_error_rate_scale=0.0.csv +22 -22
  35. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.0_error_rate_scale=0.5.csv +30 -30
  36. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.0_error_rate_scale=1.0.csv +101 -0
  37. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.0_error_rate_scale=2.0.csv +101 -0
  38. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.2_error_rate_scale=0.0.csv +21 -21
  39. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.2_error_rate_scale=0.5.csv +38 -38
  40. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.2_error_rate_scale=1.0.csv +101 -0
  41. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.2_error_rate_scale=2.0.csv +101 -0
  42. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.4_error_rate_scale=0.0.csv +45 -45
  43. {repare-0.0.2/benchmarks/simulations/results → repare-0.1.1/benchmarks/simulations/results/parameter_experiment}/data/p_mask_node=0.4_error_rate_scale=0.5.csv +47 -47
  44. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.4_error_rate_scale=1.0.csv +101 -0
  45. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.4_error_rate_scale=2.0.csv +101 -0
  46. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=0.0.csv +101 -0
  47. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=0.5.csv +101 -0
  48. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=1.0.csv +101 -0
  49. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/data/p_mask_node=0.6_error_rate_scale=2.0.csv +101 -0
  50. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/degree_f1_heatmap.pdf +0 -0
  51. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/pedigree_summary_statistics.pdf +0 -0
  52. repare-0.1.1/benchmarks/simulations/results/parameter_experiment/plots/relation_f1_heatmap.pdf +0 -0
  53. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.0.csv +101 -0
  54. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.2.csv +101 -0
  55. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10000_epsilon=0.4.csv +101 -0
  56. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.0.csv +101 -0
  57. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.2.csv +101 -0
  58. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=1000_epsilon=0.4.csv +101 -0
  59. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.0.csv +101 -0
  60. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.4_error_rate_scale=1.0.csv → repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.2.csv +101 -101
  61. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=100_epsilon=0.4.csv +101 -0
  62. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.0.csv +101 -0
  63. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.2.csv +101 -0
  64. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/data/max_candidate_pedigrees=10_epsilon=0.4.csv +101 -0
  65. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/plots/degree_f1_heatmap.pdf +0 -0
  66. repare-0.1.1/benchmarks/simulations/results/sampling_experiment/plots/relation_f1_heatmap.pdf +0 -0
  67. repare-0.0.2/benchmarks/simulations/run_simulations.py → repare-0.1.1/benchmarks/simulations/run_parameter_experiment.py +24 -12
  68. repare-0.1.1/benchmarks/simulations/run_sampling_experiment.py +88 -0
  69. {repare-0.0.2 → repare-0.1.1}/benchmarks/simulations/simulator/simulated_pedigree.py +64 -42
  70. repare-0.1.1/examples/algorithm_diagram.svg +2181 -0
  71. repare-0.1.1/examples/nodes.csv +7 -0
  72. repare-0.1.1/examples/outputs/corrected_input_relations.csv +21 -0
  73. repare-0.1.1/examples/outputs/reconstructed_exact_relations.csv +12 -0
  74. repare-0.1.1/examples/outputs/reconstructed_pedigree.pdf +0 -0
  75. repare-0.1.1/examples/relations.csv +12 -0
  76. repare-0.1.1/examples/repare.sh +3 -0
  77. repare-0.1.1/pixi.lock +7321 -0
  78. repare-0.1.1/pyproject.toml +76 -0
  79. {repare-0.0.2 → repare-0.1.1}/src/repare/main.py +9 -3
  80. {repare-0.0.2 → repare-0.1.1}/src/repare/pedigree.py +491 -242
  81. {repare-0.0.2 → repare-0.1.1}/src/repare/pedigree_reconstructor.py +213 -43
  82. repare-0.1.1/src/repare.egg-info/PKG-INFO +121 -0
  83. repare-0.1.1/src/repare.egg-info/SOURCES.txt +98 -0
  84. repare-0.0.2/PKG-INFO +0 -35
  85. repare-0.0.2/README.md +0 -15
  86. repare-0.0.2/benchmarks/published/data/blocher/citation.bib +0 -16
  87. repare-0.0.2/benchmarks/published/data/blocher/published_exact_relations.csv +0 -83
  88. repare-0.0.2/benchmarks/published/data/fowler/citation.bib +0 -15
  89. repare-0.0.2/benchmarks/published/data/fowler/published_exact_relations.csv +0 -71
  90. repare-0.0.2/benchmarks/published/data/rivollat/citation.bib +0 -34
  91. repare-0.0.2/benchmarks/published/data/rivollat/published_exact_relations.csv +0 -266
  92. repare-0.0.2/benchmarks/published/run_comparisons.py +0 -26
  93. repare-0.0.2/benchmarks/simulations/plot_data.py +0 -99
  94. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.0_error_rate_scale=1.0.csv +0 -101
  95. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.0_error_rate_scale=2.csv +0 -101
  96. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.2_error_rate_scale=1.0.csv +0 -101
  97. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.2_error_rate_scale=2.csv +0 -101
  98. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.4_error_rate_scale=2.csv +0 -101
  99. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=0.0.csv +0 -101
  100. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=0.5.csv +0 -101
  101. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=1.0.csv +0 -101
  102. repare-0.0.2/benchmarks/simulations/results/data/p_mask_node=0.6_error_rate_scale=2.csv +0 -101
  103. repare-0.0.2/benchmarks/simulations/results/plots/degree_f1_heatmap.png +0 -0
  104. repare-0.0.2/benchmarks/simulations/results/plots/pedigree_summary_statistics.png +0 -0
  105. repare-0.0.2/benchmarks/simulations/results/plots/relation_f1_heatmap.png +0 -0
  106. repare-0.0.2/pyproject.toml +0 -50
  107. repare-0.0.2/src/repare.egg-info/PKG-INFO +0 -35
  108. repare-0.0.2/src/repare.egg-info/SOURCES.txt +0 -55
  109. {repare-0.0.2 → repare-0.1.1}/LICENSE +0 -0
  110. {repare-0.0.2/benchmarks/published/data/rivollat → repare-0.1.1/benchmarks/published/data/gurgy}/inferred_relations_READv2.csv +0 -0
  111. {repare-0.0.2/benchmarks/published/data/rivollat → repare-0.1.1/benchmarks/published/data/gurgy}/nodes.csv +0 -0
  112. {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/inferred_relations_coeffs.csv +0 -0
  113. {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/inferred_relations_custom.csv +0 -0
  114. {repare-0.0.2/benchmarks/published/data/fowler → repare-0.1.1/benchmarks/published/data/hazleton_north}/nodes.csv +0 -0
  115. {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/inferred_relations_KIN.csv +0 -0
  116. {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/inferred_relations_custom.csv +0 -0
  117. {repare-0.0.2/benchmarks/published/data/blocher → repare-0.1.1/benchmarks/published/data/nepluyevsky}/nodes.csv +0 -0
  118. {repare-0.0.2/benchmarks/published/comparator → repare-0.1.1/benchmarks/published/evaluator}/__init__.py +0 -0
  119. {repare-0.0.2 → repare-0.1.1}/benchmarks/simulations/simulator/__init__.py +0 -0
  120. {repare-0.0.2 → repare-0.1.1}/setup.cfg +0 -0
  121. {repare-0.0.2 → repare-0.1.1}/src/repare/__init__.py +0 -0
  122. {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/dependency_links.txt +0 -0
  123. {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/entry_points.txt +0 -0
  124. {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/requires.txt +0 -0
  125. {repare-0.0.2 → repare-0.1.1}/src/repare.egg-info/top_level.txt +0 -0
@@ -0,0 +1,2 @@
1
+ # SCM syntax highlighting & preventing 3-way merges
2
+ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
@@ -1,6 +1,7 @@
1
- # Data directories
2
- *raw_data
3
- *sandbox_data
1
+ # Data / sandbox directories
2
+ *raw_data/
3
+ *sandbox_data/
4
+ *sandbox/
4
5
 
5
6
  # .DS_Store files
6
7
  .DS_Store
@@ -178,4 +179,8 @@ cython_debug/
178
179
  #.idea/
179
180
 
180
181
  # PyPI configuration file
181
- .pypirc
182
+ .pypirc
183
+
184
+ # pixi environments
185
+ .pixi/*
186
+ !.pixi/config.toml
@@ -1,7 +1,7 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
3
  # Ruff version.
4
- rev: v0.11.5
4
+ rev: v0.12.8
5
5
  hooks:
6
6
  # Run the linter.
7
7
  - id: ruff
repare-0.1.1/PKG-INFO ADDED
@@ -0,0 +1,121 @@
1
+ Metadata-Version: 2.4
2
+ Name: repare
3
+ Version: 0.1.1
4
+ Summary: Reconstruct (ancient) pedigrees from pairwise kinship relations.
5
+ Author-email: Edward Huang <edwardhuangc@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Source, https://github.com/ehuangc/repare
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: matplotlib
12
+ Requires-Dist: networkx
13
+ Requires-Dist: pandas
14
+ Requires-Dist: tqdm
15
+ Provides-Extra: benchmark
16
+ Requires-Dist: scikit-learn; extra == "benchmark"
17
+ Requires-Dist: seaborn; extra == "benchmark"
18
+ Provides-Extra: plot
19
+ Requires-Dist: pygraphviz; extra == "plot"
20
+ Dynamic: license-file
21
+
22
+ 🌲 **repare** is a Python package for (ancient) pedigree reconstruction.
23
+
24
+ ## Installation
25
+
26
+ ### Recommended
27
+ ```
28
+ conda create -n "repare" -c conda-forge python=3.13 pygraphviz matplotlib networkx pandas tqdm
29
+ conda activate repare
30
+ pip install repare
31
+ ```
32
+ repare uses PyGraphviz to plot reconstructed pedigrees. Since PyGraphviz relies on Graphviz which cannot be installed using `pip`, we recommend installing repare and its dependencies in a fresh conda environment, as shown above.
33
+
34
+ If you don't need to plot reconstructed pedigrees, you can install repare directly with `pip install repare`. If you need to plot reconstructed pedigrees and have your own Graphviz installation, you can install repare and Pygraphviz with `pip install repare[plot]`.
35
+
36
+ To install conda, see [this page](https://www.anaconda.com/docs/getting-started/miniconda/install). To install PyGraphviz and Graphviz (yourself), see [this page](https://pygraphviz.github.io/documentation/stable/install.html).
37
+
38
+
39
+ ## Usage
40
+
41
+ We recommend running repare through its command-line interface.
42
+ ```
43
+ repare -n NODES -r RELATIONS [-o OUTPUT] [-m MAX_CANDIDATE_PEDIGREES] [-e EPSILON] [-s SEED] [-d] [-w] [-v]
44
+ ```
45
+
46
+ > [!NOTE]
47
+ > Minimal command:
48
+ > ```
49
+ > repare -n nodes.csv -r relations.csv
50
+ > ```
51
+ > For example data inputs, see [examples/nodes.csv](examples/nodes.csv) and [examples/relations.csv](examples/relations.csv).
52
+
53
+ ### Inputs
54
+ **Nodes** (-n) (*required*): Path to a CSV file that contains information about the individuals to be analyzed by repare.
55
+
56
+ <dl>
57
+ <dd>
58
+ <details open>
59
+ <summary><ins>Nodes CSV file columns</ins></summary>
60
+
61
+ - **id** *(required)*: ID of individual. Cannot be fully numeric, as numeric IDs are reserved for placeholder nodes.
62
+ - **sex** *(required)*: Genetic sex of individual. Value must be "M" or "F".
63
+ - **y_haplogroup** *(required)*: Y chromosome haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
64
+ - **mt_haplogroup** *(required)*: Mitochondrial haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
65
+ - **can_have_children** *(optional)*: Whether the individual *can* have offspring (e.g., as indicated by age of death). If provided, value must be "True" or "False". Defaults to "True".
66
+ - **can_be_inbred** *(optional)*: Whether the individual *can* have parents related at the 3rd-degree or closer (e.g., as indicated by ROH). If provided, value must be "True" or "False". Defaults to "True".
67
+ - **years_before_present** *(optional)*: (Approximate) date of birth of individual, in years before present. If provided, will be used to prune temporally invalid pedigrees. *This column should only be used when backed by strong dating evidence.*
68
+ </details>
69
+ </dd>
70
+ </dl>
71
+
72
+ **Relations** (-r) (*required*): Path to a CSV file that contains information about inferred pairwise kinship relations. Methods to infer these kinship relations include [KIN](https://doi.org/10.1186/s13059-023-02847-7) and [READv2](https://doi.org/10.1186/s13059-024-03350-3). All individuals included in this file must be specified in the nodes CSV.
73
+
74
+ <dl>
75
+ <dd>
76
+ <details open>
77
+ <summary><ins>Relations CSV file columns</ins></summary>
78
+
79
+ - **id1** *(required)*: ID of individual 1.
80
+ - **id2** *(required)*: ID of individual 2.
81
+ - **degree** *(required)*: Degree of (inferred) kinship relation between individual 1 and individual 2. Value must be "1", "2", or "3". Higher-degree relatives are considered unrelated.
82
+ - **constraints** *(optional)*: Semicolon-delimited list of possible configurations of kinship relation. For example, a parental 1st-degree relation can be constrained with "parent-child;child-parent". Many kinship inference methods will classify 1st-degree relation types, which can be used as relation constraints. Valid constraints: "parent-child", "child-parent", "siblings", "maternal aunt/uncle-nephew/niece", "maternal nephew/niece-aunt/uncle", "paternal aunt/uncle-nephew/niece", "paternal nephew/niece-aunt/uncle", "maternal grandparent-grandchild", "maternal grandchild-grandparent", "paternal grandparent-grandchild", "paternal grandchild-grandparent" "maternal half-siblings", "paternal half-siblings".
83
+ - **force_constraints** *(optional)*: Whether the corresponding constraint should be forced. If provided, value must be "True" or "False". If "True", the constraint must be followed. If "False", breaking the constraint counts as one inconsistency. Defaults to "False".
84
+ </details>
85
+ </dd>
86
+ </dl>
87
+
88
+ **Output** (-o) (*optional*): Path to directory for saving repare outputs. Defaults to the current working directory.
89
+
90
+ **Max Candidate Pedigrees** (-m) (*optional*): Maximum number of candidate pedigrees to keep after each algorithm iteration. Defaults to 1000.
91
+
92
+ **Epsilon** (-e) (*optional*): Parameter for adapted epsilon-greedy sampling at the end of each algorithm iteration. Defaults to 0.2.
93
+
94
+ **Seed** (-s) (*optional*): Random seed for reproducibility. Defaults to 42.
95
+
96
+ **Do Not Plot** (-d) (*flag*): If set, do not plot reconstructed pedigree(s).
97
+
98
+ **Write Alternate Pedigrees** (-w) (*flag*): If set, write outputs for alternate reconstructed pedigrees to disk.
99
+
100
+ **Verbose** (-v) (*flag*): If set, enable verbose output (INFO-level logging).
101
+
102
+ <p align="center">
103
+ <img src="https://raw.githubusercontent.com/ehuangc/repare/main/examples/algorithm_diagram.svg" alt="Reconstruction Process Diagram" />
104
+ <br>
105
+ <em>Diagram of repare's pedigree reconstruction process</em>
106
+ </p>
107
+
108
+ ## Reproducibility
109
+ We recommend using [pixi](https://pixi.sh/) to reproduce the results in this repo.
110
+ ```
111
+ git clone https://github.com/ehuangc/repare.git
112
+ cd repare
113
+ pixi shell
114
+ ```
115
+
116
+ Once in the pixi shell, you can run the script(s) corresponding to the results you'd like to reproduce. For example:
117
+ ```
118
+ python benchmarks/published/run_parameter_experiment.py
119
+ exit
120
+ ```
121
+ To install pixi, see [this page](https://pixi.sh/latest/installation/).
repare-0.1.1/README.md ADDED
@@ -0,0 +1,100 @@
1
+ 🌲 **repare** is a Python package for (ancient) pedigree reconstruction.
2
+
3
+ ## Installation
4
+
5
+ ### Recommended
6
+ ```
7
+ conda create -n "repare" -c conda-forge python=3.13 pygraphviz matplotlib networkx pandas tqdm
8
+ conda activate repare
9
+ pip install repare
10
+ ```
11
+ repare uses PyGraphviz to plot reconstructed pedigrees. Since PyGraphviz relies on Graphviz which cannot be installed using `pip`, we recommend installing repare and its dependencies in a fresh conda environment, as shown above.
12
+
13
+ If you don't need to plot reconstructed pedigrees, you can install repare directly with `pip install repare`. If you need to plot reconstructed pedigrees and have your own Graphviz installation, you can install repare and Pygraphviz with `pip install repare[plot]`.
14
+
15
+ To install conda, see [this page](https://www.anaconda.com/docs/getting-started/miniconda/install). To install PyGraphviz and Graphviz (yourself), see [this page](https://pygraphviz.github.io/documentation/stable/install.html).
16
+
17
+
18
+ ## Usage
19
+
20
+ We recommend running repare through its command-line interface.
21
+ ```
22
+ repare -n NODES -r RELATIONS [-o OUTPUT] [-m MAX_CANDIDATE_PEDIGREES] [-e EPSILON] [-s SEED] [-d] [-w] [-v]
23
+ ```
24
+
25
+ > [!NOTE]
26
+ > Minimal command:
27
+ > ```
28
+ > repare -n nodes.csv -r relations.csv
29
+ > ```
30
+ > For example data inputs, see [examples/nodes.csv](examples/nodes.csv) and [examples/relations.csv](examples/relations.csv).
31
+
32
+ ### Inputs
33
+ **Nodes** (-n) (*required*): Path to a CSV file that contains information about the individuals to be analyzed by repare.
34
+
35
+ <dl>
36
+ <dd>
37
+ <details open>
38
+ <summary><ins>Nodes CSV file columns</ins></summary>
39
+
40
+ - **id** *(required)*: ID of individual. Cannot be fully numeric, as numeric IDs are reserved for placeholder nodes.
41
+ - **sex** *(required)*: Genetic sex of individual. Value must be "M" or "F".
42
+ - **y_haplogroup** *(required)*: Y chromosome haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
43
+ - **mt_haplogroup** *(required)*: Mitochondrial haplogroup of individual. Can include "*" as a wildcard expansion character at the end if haplogroup is not fully inferred.
44
+ - **can_have_children** *(optional)*: Whether the individual *can* have offspring (e.g., as indicated by age of death). If provided, value must be "True" or "False". Defaults to "True".
45
+ - **can_be_inbred** *(optional)*: Whether the individual *can* have parents related at the 3rd-degree or closer (e.g., as indicated by ROH). If provided, value must be "True" or "False". Defaults to "True".
46
+ - **years_before_present** *(optional)*: (Approximate) date of birth of individual, in years before present. If provided, will be used to prune temporally invalid pedigrees. *This column should only be used when backed by strong dating evidence.*
47
+ </details>
48
+ </dd>
49
+ </dl>
50
+
51
+ **Relations** (-r) (*required*): Path to a CSV file that contains information about inferred pairwise kinship relations. Methods to infer these kinship relations include [KIN](https://doi.org/10.1186/s13059-023-02847-7) and [READv2](https://doi.org/10.1186/s13059-024-03350-3). All individuals included in this file must be specified in the nodes CSV.
52
+
53
+ <dl>
54
+ <dd>
55
+ <details open>
56
+ <summary><ins>Relations CSV file columns</ins></summary>
57
+
58
+ - **id1** *(required)*: ID of individual 1.
59
+ - **id2** *(required)*: ID of individual 2.
60
+ - **degree** *(required)*: Degree of (inferred) kinship relation between individual 1 and individual 2. Value must be "1", "2", or "3". Higher-degree relatives are considered unrelated.
61
+ - **constraints** *(optional)*: Semicolon-delimited list of possible configurations of kinship relation. For example, a parental 1st-degree relation can be constrained with "parent-child;child-parent". Many kinship inference methods will classify 1st-degree relation types, which can be used as relation constraints. Valid constraints: "parent-child", "child-parent", "siblings", "maternal aunt/uncle-nephew/niece", "maternal nephew/niece-aunt/uncle", "paternal aunt/uncle-nephew/niece", "paternal nephew/niece-aunt/uncle", "maternal grandparent-grandchild", "maternal grandchild-grandparent", "paternal grandparent-grandchild", "paternal grandchild-grandparent" "maternal half-siblings", "paternal half-siblings".
62
+ - **force_constraints** *(optional)*: Whether the corresponding constraint should be forced. If provided, value must be "True" or "False". If "True", the constraint must be followed. If "False", breaking the constraint counts as one inconsistency. Defaults to "False".
63
+ </details>
64
+ </dd>
65
+ </dl>
66
+
67
+ **Output** (-o) (*optional*): Path to directory for saving repare outputs. Defaults to the current working directory.
68
+
69
+ **Max Candidate Pedigrees** (-m) (*optional*): Maximum number of candidate pedigrees to keep after each algorithm iteration. Defaults to 1000.
70
+
71
+ **Epsilon** (-e) (*optional*): Parameter for adapted epsilon-greedy sampling at the end of each algorithm iteration. Defaults to 0.2.
72
+
73
+ **Seed** (-s) (*optional*): Random seed for reproducibility. Defaults to 42.
74
+
75
+ **Do Not Plot** (-d) (*flag*): If set, do not plot reconstructed pedigree(s).
76
+
77
+ **Write Alternate Pedigrees** (-w) (*flag*): If set, write outputs for alternate reconstructed pedigrees to disk.
78
+
79
+ **Verbose** (-v) (*flag*): If set, enable verbose output (INFO-level logging).
80
+
81
+ <p align="center">
82
+ <img src="https://raw.githubusercontent.com/ehuangc/repare/main/examples/algorithm_diagram.svg" alt="Reconstruction Process Diagram" />
83
+ <br>
84
+ <em>Diagram of repare's pedigree reconstruction process</em>
85
+ </p>
86
+
87
+ ## Reproducibility
88
+ We recommend using [pixi](https://pixi.sh/) to reproduce the results in this repo.
89
+ ```
90
+ git clone https://github.com/ehuangc/repare.git
91
+ cd repare
92
+ pixi shell
93
+ ```
94
+
95
+ Once in the pixi shell, you can run the script(s) corresponding to the results you'd like to reproduce. For example:
96
+ ```
97
+ python benchmarks/published/run_parameter_experiment.py
98
+ exit
99
+ ```
100
+ To install pixi, see [this page](https://pixi.sh/latest/installation/).
@@ -0,0 +1,81 @@
1
+ import os
2
+
3
+ from evaluator.comparison_utils import (
4
+ get_mt_colormap,
5
+ get_published_pedigree,
6
+ plot_inferred_pedigree,
7
+ plot_published_pedigree,
8
+ write_relation_differences,
9
+ )
10
+ from evaluator.pedigree_evaluator import PedigreeEvaluator
11
+
12
+
13
+ def main():
14
+ """
15
+ Compare the Gurgy inferred and published pedigrees by plotting and writing relation differences.
16
+ """
17
+ data_dir = os.path.join(os.path.dirname(__file__), "data", "gurgy")
18
+ results_dir = os.path.join(os.path.dirname(__file__), "results", "gurgy_comparison")
19
+ os.makedirs(results_dir, exist_ok=True)
20
+
21
+ evaluator = PedigreeEvaluator(
22
+ published_relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
23
+ algorithm_nodes_path=os.path.join(data_dir, "nodes.csv"),
24
+ algorithm_relations_path=os.path.join(data_dir, "inferred_relations_READv2.csv"),
25
+ )
26
+ inferred_pedigree = evaluator.algorithm_pedigree
27
+ published_pedigree = get_published_pedigree(
28
+ nodes_path=os.path.join(data_dir, "nodes.csv"),
29
+ relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
30
+ )
31
+
32
+ mt_haplogroup_to_color = get_mt_colormap(inferred_pedigree, published_pedigree)
33
+ plot_inferred_pedigree(
34
+ inferred_pedigree,
35
+ # Plot as SVG because we will need to crop and shift nodes
36
+ plot_path=os.path.join(results_dir, "inferred_pedigree.svg"),
37
+ mt_haplogroup_to_color=mt_haplogroup_to_color,
38
+ )
39
+ # Define dotted edges to add to the published pedigree plot
40
+ nodes_to_remove = [
41
+ "127", # Placeholder mother of 27 (disconnect GLN276 and GLN215A/GLN215B)
42
+ "26", # Placeholder father of GLN215A and GLN215B (disconnect GLN276 and GLN215A/GLN215B)
43
+ "27", # Placeholder mother of GLN215A and GLN215B (disconnect GLN276 and GLN215A/GLN215B)
44
+ "173", # Placeholder father of 170 (disconnect GLN319 and GLN232C)
45
+ "170", # Placeholder father of GLN232C (disconnect GLN319 and GLN232C)
46
+ "171", # Placeholder mother of GLN232C (disconnect GLN319 and GLN232C)
47
+ "189", # Placeholder mother of 187 (disconnect GLN291 and GLN288)
48
+ "186", # Placeholder father of GLN288 (disconnect GLN291 and GLN288)
49
+ "187", # Placeholder mother of GLN288 (disconnect GLN291 and GLN288)
50
+ ]
51
+ edges_to_remove = [
52
+ ("124", "122"), # Disconnect GLN320 from GLN231A and GLN270B
53
+ ("125", "122"), # Disconnect GLN320 from GLN231A and GLN270B
54
+ ("GLN319", "170"), # Disconnect GLN319 from GLN232C
55
+ ("GLN291", "187"), # Disconnect GLN291 from GLN288
56
+ ]
57
+ dotted_edges_to_add = [
58
+ ("GLN320", "GLN231A"),
59
+ ("GLN320", "GLN270B"),
60
+ ("GLN276", "GLN215A"),
61
+ ("GLN276", "GLN215B"),
62
+ ("GLN319", "GLN232C"),
63
+ ("GLN291", "GLN288"),
64
+ ]
65
+ plot_published_pedigree(
66
+ published_pedigree=published_pedigree,
67
+ # Plot as SVG because we will need to crop and shift nodes
68
+ plot_path=os.path.join(results_dir, "published_pedigree.svg"),
69
+ mt_haplogroup_to_color=mt_haplogroup_to_color,
70
+ nodes_to_remove=nodes_to_remove,
71
+ edges_to_remove=edges_to_remove,
72
+ dotted_edges_to_add=dotted_edges_to_add,
73
+ )
74
+ write_relation_differences(
75
+ evaluator=evaluator,
76
+ path=os.path.join(results_dir, "relation_differences.csv"),
77
+ )
78
+
79
+
80
+ if __name__ == "__main__":
81
+ main()
@@ -0,0 +1,52 @@
1
+ import os
2
+
3
+ from evaluator.comparison_utils import (
4
+ get_mt_colormap,
5
+ get_published_pedigree,
6
+ plot_inferred_pedigree,
7
+ plot_published_pedigree,
8
+ write_relation_differences,
9
+ )
10
+ from evaluator.pedigree_evaluator import PedigreeEvaluator
11
+
12
+
13
+ def main():
14
+ """
15
+ Compare the Nepluyevsky inferred and published pedigrees by plotting and writing relation differences.
16
+ """
17
+ data_dir = os.path.join(os.path.dirname(__file__), "data", "nepluyevsky")
18
+ results_dir = os.path.join(os.path.dirname(__file__), "results", "nepluyevsky_comparison")
19
+ os.makedirs(results_dir, exist_ok=True)
20
+
21
+ evaluator = PedigreeEvaluator(
22
+ published_relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
23
+ algorithm_nodes_path=os.path.join(data_dir, "nodes.csv"),
24
+ algorithm_relations_path=os.path.join(data_dir, "inferred_relations_KIN.csv"),
25
+ )
26
+ inferred_pedigree = evaluator.algorithm_pedigree
27
+ published_pedigree = get_published_pedigree(
28
+ nodes_path=os.path.join(data_dir, "nodes.csv"),
29
+ relations_path=os.path.join(data_dir, "published_exact_relations.csv"),
30
+ )
31
+
32
+ mt_haplogroup_to_color = get_mt_colormap(inferred_pedigree, published_pedigree)
33
+ plot_inferred_pedigree(
34
+ inferred_pedigree,
35
+ # Plot as SVG because we will need to crop and shift nodes
36
+ plot_path=os.path.join(results_dir, "inferred_pedigree.svg"),
37
+ mt_haplogroup_to_color=mt_haplogroup_to_color,
38
+ )
39
+ plot_published_pedigree(
40
+ published_pedigree=published_pedigree,
41
+ # Plot as SVG because we will need to crop and shift nodes
42
+ plot_path=os.path.join(results_dir, "published_pedigree.svg"),
43
+ mt_haplogroup_to_color=mt_haplogroup_to_color,
44
+ )
45
+ write_relation_differences(
46
+ evaluator=evaluator,
47
+ path=os.path.join(results_dir, "relation_differences.csv"),
48
+ )
49
+
50
+
51
+ if __name__ == "__main__":
52
+ main()
@@ -0,0 +1,3 @@
1
+ Alaçamlı, E., Naidoo, T., Güler, M. N., Sağlıcan, E., Aktürk, Ş., Mapelli, I., Vural, K. B., Somel, M., Malmström, H., & Günther, T. (2024). READv2: Advanced and user-friendly detection of biological relatedness in archaeogenomics. *Genome Biology*, *25*(1), 216. [https://doi.org/10.1186/s13059-024-03350-3](https://doi.org/10.1186/s13059-024-03350-3)
2
+
3
+ Rivollat, M., Rohrlach, A. B., Ringbauer, H., Childebayeva, A., Mendisco, F., Barquera, R., Szolek, A., Le Roy, M., Colleran, H., Tuke, J., Aron, F., Pemonge, M.-H., Späth, E., Télouk, P., Rey, L., Goude, G., Balter, V., Krause, J., Rottier, S., … Haak, W. (2023). Extensive pedigrees reveal the social organization of a Neolithic community. *Nature*, *620*(7974), 600–606. [https://doi.org/10.1038/s41586-023-06350-8](https://doi.org/10.1038/s41586-023-06350-8)
@@ -0,0 +1,266 @@
1
+ # Data from Rivollat et al., 2023 Fig. 1
2
+ id1,id2,degree,constraints,force_constraints
3
+ GLN320,GLN231A,2,,
4
+ GLN320,GLN270B,2,,
5
+ GLN231A,GLN270B,1,siblings,True
6
+ GLN231A,GLN322,1,parent-child,True
7
+ GLN270B,GLN322,2,paternal aunt/uncle-nephew/niece,True
8
+ GLN270B,GLN237A,1,parent-child,True
9
+ GLN231A,GLN237A,2,paternal aunt/uncle-nephew/niece,True
10
+ GLN237A,GLN325,1,parent-child,True
11
+ GLN237A,GLN265,1,parent-child,True
12
+ GLN237A,GLN221B,1,parent-child,True
13
+ GLN237A,GLN266,1,parent-child,True
14
+ GLN270B,GLN325,2,paternal grandparent-grandchild,True
15
+ GLN270B,GLN265,2,paternal grandparent-grandchild,True
16
+ GLN270B,GLN221B,2,paternal grandparent-grandchild,True
17
+ GLN270B,GLN266,2,paternal grandparent-grandchild,True
18
+ GLN325,GLN265,1,siblings,True
19
+ GLN325,GLN221B,1,siblings,True
20
+ GLN325,GLN266,1,siblings,True
21
+ GLN265,GLN221B,1,siblings,True
22
+ GLN265,GLN266,1,siblings,True
23
+ GLN221B,GLN266,1,siblings,True
24
+ GLN253,GLN275,1,siblings,True
25
+
26
+ GLN275,GLN216,1,parent-child,True
27
+ GLN325,GLN216,1,parent-child,True
28
+ GLN275,GLN276,1,parent-child,True
29
+ GLN325,GLN276,1,parent-child,True
30
+ GLN237A,GLN276,2,maternal grandparent-grandchild,True
31
+ GLN237A,GLN216,2,maternal grandparent-grandchild,True
32
+ GLN276,GLN216,1,siblings,True
33
+ GLN265,GLN216,2,maternal aunt/uncle-nephew/niece,True
34
+ GLN265,GLN276,2,maternal aunt/uncle-nephew/niece,True
35
+ GLN221B,GLN216,2,maternal aunt/uncle-nephew/niece,True
36
+ GLN221B,GLN276,2,maternal aunt/uncle-nephew/niece,True
37
+ GLN266,GLN216,2,maternal aunt/uncle-nephew/niece,True
38
+ GLN266,GLN276,2,maternal aunt/uncle-nephew/niece,True
39
+ GLN253,GLN216,2,paternal aunt/uncle-nephew/niece,True
40
+ GLN253,GLN276,2,paternal aunt/uncle-nephew/niece,True
41
+ GLN276,GLN215A,2,,
42
+ GLN276,GLN215B,2,,
43
+ GLN215A,GLN215B,1,siblings,True
44
+ GLN265,GLN235,1,parent-child,True
45
+ GLN325,GLN235,2,paternal aunt/uncle-nephew/niece,True
46
+ GLN221B,GLN235,2,paternal aunt/uncle-nephew/niece,True
47
+ GLN266,GLN235,2,paternal aunt/uncle-nephew/niece,True
48
+ GLN237A,GLN235,2,paternal grandparent-grandchild,True
49
+
50
+ GLN266,GLN268B,1,parent-child,True
51
+ GLN325,GLN268B,2,paternal aunt/uncle-nephew/niece,True
52
+ GLN265,GLN268B,2,paternal aunt/uncle-nephew/niece,True
53
+ GLN221B,GLN268B,2,paternal aunt/uncle-nephew/niece,True
54
+ GLN237A,GLN268B,2,paternal grandparent-grandchild,True
55
+ GLN266,GLN243A,1,parent-child,True
56
+ GLN325,GLN243A,2,paternal aunt/uncle-nephew/niece,True
57
+ GLN265,GLN243A,2,paternal aunt/uncle-nephew/niece,True
58
+ GLN221B,GLN243A,2,paternal aunt/uncle-nephew/niece,True
59
+ GLN237A,GLN243A,2,paternal grandparent-grandchild,True
60
+
61
+ GLN268B,GLN243A,1,siblings,True
62
+ GLN269,GLN227,1,parent-child,True
63
+ GLN268B,GLN227,2,paternal aunt/uncle-nephew/niece,True
64
+ GLN243A,GLN227,2,paternal aunt/uncle-nephew/niece,True
65
+ GLN266,GLN227,2,paternal grandparent-grandchild,True
66
+ GLN269,GLN267,1,parent-child,True
67
+ GLN268B,GLN267,2,paternal aunt/uncle-nephew/niece,True
68
+ GLN243A,GLN267,2,paternal aunt/uncle-nephew/niece,True
69
+ GLN266,GLN267,2,paternal grandparent-grandchild,True
70
+ GLN269,GLN268A,1,parent-child,True
71
+ GLN268B,GLN268A,2,paternal aunt/uncle-nephew/niece,True
72
+ GLN243A,GLN268A,2,paternal aunt/uncle-nephew/niece,True
73
+ GLN266,GLN268A,2,paternal grandparent-grandchild,True
74
+ GLN227,GLN267,1,siblings,True
75
+ GLN227,GLN268A,1,siblings,True
76
+ GLN267,GLN268A,1,siblings,True
77
+
78
+ GLN243A,GLN262,1,parent-child,True
79
+ GLN236A,GLN262,1,parent-child,True
80
+ GLN268B,GLN262,2,paternal aunt/uncle-nephew/niece,True
81
+ GLN266,GLN262,2,paternal grandparent-grandchild,True
82
+ GLN243A,GLN236B,2,paternal grandparent-grandchild,True
83
+ GLN236A,GLN236B,2,paternal grandparent-grandchild,True
84
+ GLN262,GLN236B,2,paternal aunt/uncle-nephew/niece,True
85
+ GLN243A,GLN214,2,paternal grandparent-grandchild,True
86
+ GLN236A,GLN214,2,paternal grandparent-grandchild,True
87
+ GLN262,GLN214,2,paternal aunt/uncle-nephew/niece,True
88
+
89
+ GLN237A,GLN255,2,paternal grandparent-grandchild,True
90
+ GLN237A,GLN224,2,paternal grandparent-grandchild,True
91
+ GLN237A,GLN212,2,paternal grandparent-grandchild,True
92
+ GLN237A,GLN317,2,paternal grandparent-grandchild,True
93
+ GLN237A,GLN213,2,paternal grandparent-grandchild,True
94
+
95
+ GLN255,GLN224,1,siblings,True
96
+ GLN255,GLN212,1,siblings,True
97
+ GLN255,GLN317,1,siblings,True
98
+ GLN255,GLN213,1,siblings,True
99
+ GLN224,GLN212,1,siblings,True
100
+ GLN224,GLN317,1,siblings,True
101
+ GLN224,GLN213,1,siblings,True
102
+ GLN212,GLN317,1,siblings,True
103
+ GLN212,GLN213,1,siblings,True
104
+ GLN317,GLN213,1,siblings,True
105
+
106
+ GLN325,GLN255,2,paternal aunt/uncle-nephew/niece,True
107
+ GLN325,GLN224,2,paternal aunt/uncle-nephew/niece,True
108
+ GLN325,GLN212,2,paternal aunt/uncle-nephew/niece,True
109
+ GLN325,GLN317,2,paternal aunt/uncle-nephew/niece,True
110
+ GLN325,GLN213,2,paternal aunt/uncle-nephew/niece,True
111
+ GLN265,GLN255,2,paternal aunt/uncle-nephew/niece,True
112
+ GLN265,GLN224,2,paternal aunt/uncle-nephew/niece,True
113
+ GLN265,GLN212,2,paternal aunt/uncle-nephew/niece,True
114
+ GLN265,GLN317,2,paternal aunt/uncle-nephew/niece,True
115
+ GLN265,GLN213,2,paternal aunt/uncle-nephew/niece,True
116
+ GLN221B,GLN255,2,paternal aunt/uncle-nephew/niece,True
117
+ GLN221B,GLN224,2,paternal aunt/uncle-nephew/niece,True
118
+ GLN221B,GLN212,2,paternal aunt/uncle-nephew/niece,True
119
+ GLN221B,GLN317,2,paternal aunt/uncle-nephew/niece,True
120
+ GLN221B,GLN213,2,paternal aunt/uncle-nephew/niece,True
121
+ GLN266,GLN255,2,paternal aunt/uncle-nephew/niece,True
122
+ GLN266,GLN224,2,paternal aunt/uncle-nephew/niece,True
123
+ GLN266,GLN212,2,paternal aunt/uncle-nephew/niece,True
124
+ GLN266,GLN317,2,paternal aunt/uncle-nephew/niece,True
125
+ GLN266,GLN213,2,paternal aunt/uncle-nephew/niece,True
126
+
127
+ GLN317,GLN202,1,parent-child,True
128
+ GLN315,GLN202,1,parent-child,True
129
+ GLN255,GLN202,2,paternal aunt/uncle-nephew/niece,True
130
+ GLN224,GLN202,2,paternal aunt/uncle-nephew/niece,True
131
+ GLN212,GLN202,2,paternal aunt/uncle-nephew/niece,True
132
+ GLN213,GLN202,2,paternal aunt/uncle-nephew/niece,True
133
+ GLN202,GLN201,1,parent-child,True
134
+ GLN317,GLN201,2,paternal grandparent-grandchild,True
135
+ GLN315,GLN201,2,paternal grandparent-grandchild,True
136
+ GLN317,GLN223,2,paternal grandparent-grandchild,True
137
+ GLN315,GLN223,2,paternal grandparent-grandchild,True
138
+ GLN202,GLN223,2,paternal aunt/uncle-nephew/niece,True
139
+ GLN255,GLN210,2,paternal aunt/uncle-nephew/niece,True
140
+ GLN224,GLN210,2,paternal aunt/uncle-nephew/niece,True
141
+ GLN212,GLN210,2,paternal aunt/uncle-nephew/niece,True
142
+ GLN317,GLN210,2,paternal aunt/uncle-nephew/niece,True
143
+ GLN213,GLN210,2,paternal aunt/uncle-nephew/niece,True
144
+
145
+ GLN237A,GLN321,2,paternal grandparent-grandchild,True
146
+ GLN237A,GLN263,2,paternal grandparent-grandchild,True
147
+ GLN325,GLN321,2,paternal aunt/uncle-nephew/niece,True
148
+ GLN325,GLN263,2,paternal aunt/uncle-nephew/niece,True
149
+ GLN265,GLN321,2,paternal aunt/uncle-nephew/niece,True
150
+ GLN265,GLN263,2,paternal aunt/uncle-nephew/niece,True
151
+ GLN221B,GLN321,2,paternal aunt/uncle-nephew/niece,True
152
+ GLN221B,GLN263,2,paternal aunt/uncle-nephew/niece,True
153
+ GLN266,GLN321,2,paternal aunt/uncle-nephew/niece,True
154
+ GLN266,GLN263,2,paternal aunt/uncle-nephew/niece,True
155
+
156
+ GLN321,GLN263,1,siblings,True
157
+ GLN321,GLN279,2,paternal aunt/uncle-nephew/niece,True
158
+ GLN321,GLN207A,2,paternal aunt/uncle-nephew/niece,True
159
+ GLN321,GLN209,2,paternal aunt/uncle-nephew/niece,True
160
+ GLN321,GLN257,2,paternal aunt/uncle-nephew/niece,True
161
+ GLN263,GLN279,2,paternal aunt/uncle-nephew/niece,True
162
+ GLN263,GLN207A,2,paternal aunt/uncle-nephew/niece,True
163
+ GLN263,GLN209,2,paternal aunt/uncle-nephew/niece,True
164
+ GLN263,GLN257,2,paternal aunt/uncle-nephew/niece,True
165
+ GLN279,GLN207A,1,siblings,True
166
+ GLN207A,GLN282,1,parent-child,True
167
+ GLN279,GLN282,2,paternal aunt/uncle-nephew/niece,True
168
+ GLN207A,GLN204,2,paternal grandparent-grandchild,True
169
+ GLN207A,GLN208,2,paternal grandparent-grandchild,True
170
+ GLN207A,GLN206,2,paternal grandparent-grandchild,True
171
+ GLN282,GLN204,2,paternal aunt/uncle-nephew/niece,True
172
+ GLN282,GLN208,2,paternal aunt/uncle-nephew/niece,True
173
+ GLN282,GLN206,2,paternal aunt/uncle-nephew/niece,True
174
+ GLN208,GLN206,1,siblings,True
175
+
176
+ GLN270B,GLN260,2,paternal grandparent-grandchild,True
177
+ GLN270B,GLN220,2,paternal grandparent-grandchild,True
178
+ GLN270B,GLN241,2,paternal grandparent-grandchild,True
179
+ GLN270B,GLN319,2,paternal grandparent-grandchild,True
180
+ GLN270B,GLN256,2,paternal grandparent-grandchild,True
181
+ GLN270B,GLN261,2,paternal grandparent-grandchild,True
182
+ GLN237A,GLN260,2,paternal aunt/uncle-nephew/niece,True
183
+ GLN237A,GLN220,2,paternal aunt/uncle-nephew/niece,True
184
+ GLN237A,GLN241,2,paternal aunt/uncle-nephew/niece,True
185
+ GLN237A,GLN319,2,paternal aunt/uncle-nephew/niece,True
186
+ GLN237A,GLN256,2,paternal aunt/uncle-nephew/niece,True
187
+ GLN237A,GLN261,2,paternal aunt/uncle-nephew/niece,True
188
+
189
+ GLN260,GLN220,1,siblings,True
190
+ GLN260,GLN241,1,siblings,True
191
+ GLN260,GLN319,1,siblings,True
192
+ GLN220,GLN241,1,siblings,True
193
+ GLN220,GLN319,1,siblings,True
194
+ GLN241,GLN319,1,siblings,True
195
+
196
+ GLN319,GLN232C,2,,
197
+ GLN225,GLN226,1,parent-child,True
198
+ GLN260,GLN226,2,paternal aunt/uncle-nephew/niece,True
199
+ GLN220,GLN226,2,paternal aunt/uncle-nephew/niece,True
200
+ GLN241,GLN226,2,paternal aunt/uncle-nephew/niece,True
201
+ GLN319,GLN226,2,paternal aunt/uncle-nephew/niece,True
202
+
203
+ GLN256,GLN261,1,siblings,True
204
+ GLN256,GLN250,1,parent-child,True
205
+ GLN261,GLN250,2,paternal aunt/uncle-nephew/niece,True
206
+ GLN261,GLN245B,1,parent-child,True
207
+ GLN256,GLN245B,2,paternal aunt/uncle-nephew/niece,True
208
+ GLN245B,GLN245A,1,parent-child,True
209
+ GLN249,GLN245A,1,parent-child,True
210
+ GLN245B,GLN258,1,parent-child,True
211
+ GLN249,GLN258,1,parent-child,True
212
+ GLN245B,GLN244,1,parent-child,True
213
+ GLN249,GLN244,1,parent-child,True
214
+ GLN245A,GLN258,1,siblings,True
215
+ GLN245A,GLN244,1,siblings,True
216
+ GLN258,GLN244,1,siblings,True
217
+ GLN261,GLN245A,2,paternal grandparent-grandchild,True
218
+ GLN261,GLN258,2,paternal grandparent-grandchild,True
219
+ GLN261,GLN244,2,paternal grandparent-grandchild,True
220
+
221
+ GLN261,GLN285A,2,paternal grandparent-grandchild,True
222
+ GLN245B,GLN285A,2,paternal aunt/uncle-nephew/niece,True
223
+ GLN285A,GLN285B,1,parent-child,True
224
+ GLN248,GLN285B,1,parent-child,True
225
+
226
+ GLN305,GLN280,1,parent-child,True
227
+ GLN298,GLN280,1,parent-child,True
228
+ GLN305,GLN300,1,parent-child,True
229
+ GLN298,GLN300,1,parent-child,True
230
+ GLN305,GLN291,1,parent-child,True
231
+ GLN298,GLN291,1,parent-child,True
232
+ GLN280,GLN300,1,siblings,True
233
+ GLN280,GLN291,1,siblings,True
234
+ GLN300,GLN291,1,siblings,True
235
+
236
+ GLN300,GLN307,1,parent-child,True
237
+ GLN300,GLN277,1,parent-child,True
238
+ GLN307,GLN277,1,siblings,True
239
+ GLN280,GLN307,2,paternal aunt/uncle-nephew/niece,True
240
+ GLN280,GLN277,2,paternal aunt/uncle-nephew/niece,True
241
+ GLN291,GLN307,2,paternal aunt/uncle-nephew/niece,True
242
+ GLN291,GLN277,2,paternal aunt/uncle-nephew/niece,True
243
+ GLN305,GLN307,2,paternal grandparent-grandchild,True
244
+ GLN305,GLN277,2,paternal grandparent-grandchild,True
245
+ GLN298,GLN307,2,paternal grandparent-grandchild,True
246
+ GLN298,GLN277,2,paternal grandparent-grandchild,True
247
+
248
+ GLN305,GLN306,2,paternal grandparent-grandchild,True
249
+ GLN298,GLN306,2,paternal grandparent-grandchild,True
250
+ GLN305,GLN301,2,paternal grandparent-grandchild,True
251
+ GLN298,GLN301,2,paternal grandparent-grandchild,True
252
+ GLN280,GLN306,2,paternal aunt/uncle-nephew/niece,True
253
+ GLN280,GLN301,2,paternal aunt/uncle-nephew/niece,True
254
+ GLN300,GLN306,2,paternal aunt/uncle-nephew/niece,True
255
+ GLN300,GLN301,2,paternal aunt/uncle-nephew/niece,True
256
+ GLN291,GLN306,2,paternal aunt/uncle-nephew/niece,True
257
+ GLN291,GLN301,2,paternal aunt/uncle-nephew/niece,True
258
+ GLN306,GLN301,1,siblings,True
259
+ GLN306,GLN309,2,paternal aunt/uncle-nephew/niece,True
260
+ GLN301,GLN309,2,paternal aunt/uncle-nephew/niece,True
261
+ GLN291,GLN288,2,,
262
+ GLN288,GLN289B,1,parent-child,True
263
+
264
+ GLN302,GLN299,1,,
265
+ GLN287,GLN310B,1,siblings,True
266
+ GLN211A,GLN211B,1,siblings,True
@@ -0,0 +1 @@
1
+ Fowler, C., Olalde, I., Cummings, V., Armit, I., Büster, L., Cuthbert, S., Rohland, N., Cheronet, O., Pinhasi, R., & Reich, D. (2022). A high-resolution picture of kinship practices in an Early Neolithic tomb. *Nature*, *601*(7894), 584–587. [https://doi.org/10.1038/s41586-021-04241-4](https://doi.org/10.1038/s41586-021-04241-4)