Colocalisation step.
This workflow runs colocalisation analyses that assess the degree to which independent signals of the association share the same causal variant in a region of the genome, typically limited by linkage disequilibrium (LD).
Source code in src/gentropy/colocalisation.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 | class ColocalisationStep:
"""Colocalisation step.
This workflow runs colocalisation analyses that assess the degree to which independent signals of the association share the same causal variant in a region of the genome, typically limited by linkage disequilibrium (LD).
"""
__coloc_methods__ = {
method.METHOD_NAME.lower(): method
for method in ColocalisationMethodInterface.__subclasses__()
}
def __init__(
self,
session: Session,
credible_set_path: str,
coloc_path: str,
colocalisation_method: str,
colocalisation_method_params: dict[str, Any] | None = None,
) -> None:
"""Run Colocalisation step.
This step allows for running two colocalisation methods: ecaviar and coloc.
Args:
session (Session): Session object.
credible_set_path (str): Input credible sets path.
coloc_path (str): Output Colocalisation path.
colocalisation_method (str): Colocalisation method.
colocalisation_method_params (dict[str, Any] | None): Keyword arguments passed to the colocalise method of Colocalisation class. Defaults to None
Keyword Args:
priorc1 (float): Prior on variant being causal for trait 1. Defaults to 1e-4. For coloc method only.
priorc2 (float): Prior on variant being causal for trait 2. Defaults to 1e-4. For coloc method only.
priorc12 (float): Prior on variant being causal for both traits. Defaults to 1e-5. For coloc method only.
"""
colocalisation_method = colocalisation_method.lower()
colocalisation_class = self._get_colocalisation_class(colocalisation_method)
# Extract
credible_set = StudyLocus.from_parquet(
session, credible_set_path, recusiveFileLookup=True
)
if colocalisation_method == Coloc.METHOD_NAME.lower():
credible_set = credible_set.filter(
col("finemappingMethod").isin(
FinemappingMethod.SUSIE.value, FinemappingMethod.SUSIE_INF.value
)
)
# Transform
overlaps = credible_set.find_overlaps()
# Make a partial caller to ensure that colocalisation_method_params are added to the call only when dict is not empty
coloc = colocalisation_class.colocalise
if colocalisation_method_params:
coloc = partial(coloc, **colocalisation_method_params)
colocalisation_results = coloc(overlaps)
# Load
colocalisation_results.df.coalesce(session.output_partitions).write.mode(
session.write_mode
).parquet(f"{coloc_path}/{colocalisation_method.lower()}")
@classmethod
def _get_colocalisation_class(
cls, method: str
) -> Type[ColocalisationMethodInterface]:
"""Get colocalisation class.
Args:
method (str): Colocalisation method.
Returns:
Type[ColocalisationMethodInterface]: Class that implements the ColocalisationMethodInterface.
Raises:
ValueError: if method not available.
Examples:
>>> ColocalisationStep._get_colocalisation_class("ECaviar")
<class 'gentropy.method.colocalisation.ECaviar'>
"""
method = method.lower()
if method not in cls.__coloc_methods__:
raise ValueError(f"Colocalisation method {method} not available.")
coloc_method = cls.__coloc_methods__[method]
return coloc_method
|
__init__(session: Session, credible_set_path: str, coloc_path: str, colocalisation_method: str, colocalisation_method_params: dict[str, Any] | None = None) -> None
Run Colocalisation step.
This step allows for running two colocalisation methods: ecaviar and coloc.
Parameters:
Name |
Type |
Description |
Default |
session
|
Session
|
|
required
|
credible_set_path
|
str
|
Input credible sets path.
|
required
|
coloc_path
|
str
|
Output Colocalisation path.
|
required
|
colocalisation_method
|
str
|
|
required
|
colocalisation_method_params
|
dict[str, Any] | None
|
Keyword arguments passed to the colocalise method of Colocalisation class. Defaults to None
|
None
|
Other Parameters:
Name |
Type |
Description |
priorc1 |
float
|
Prior on variant being causal for trait 1. Defaults to 1e-4. For coloc method only.
|
priorc2 |
float
|
Prior on variant being causal for trait 2. Defaults to 1e-4. For coloc method only.
|
priorc12 |
float
|
Prior on variant being causal for both traits. Defaults to 1e-5. For coloc method only.
|
Source code in src/gentropy/colocalisation.py
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 | def __init__(
self,
session: Session,
credible_set_path: str,
coloc_path: str,
colocalisation_method: str,
colocalisation_method_params: dict[str, Any] | None = None,
) -> None:
"""Run Colocalisation step.
This step allows for running two colocalisation methods: ecaviar and coloc.
Args:
session (Session): Session object.
credible_set_path (str): Input credible sets path.
coloc_path (str): Output Colocalisation path.
colocalisation_method (str): Colocalisation method.
colocalisation_method_params (dict[str, Any] | None): Keyword arguments passed to the colocalise method of Colocalisation class. Defaults to None
Keyword Args:
priorc1 (float): Prior on variant being causal for trait 1. Defaults to 1e-4. For coloc method only.
priorc2 (float): Prior on variant being causal for trait 2. Defaults to 1e-4. For coloc method only.
priorc12 (float): Prior on variant being causal for both traits. Defaults to 1e-5. For coloc method only.
"""
colocalisation_method = colocalisation_method.lower()
colocalisation_class = self._get_colocalisation_class(colocalisation_method)
# Extract
credible_set = StudyLocus.from_parquet(
session, credible_set_path, recusiveFileLookup=True
)
if colocalisation_method == Coloc.METHOD_NAME.lower():
credible_set = credible_set.filter(
col("finemappingMethod").isin(
FinemappingMethod.SUSIE.value, FinemappingMethod.SUSIE_INF.value
)
)
# Transform
overlaps = credible_set.find_overlaps()
# Make a partial caller to ensure that colocalisation_method_params are added to the call only when dict is not empty
coloc = colocalisation_class.colocalise
if colocalisation_method_params:
coloc = partial(coloc, **colocalisation_method_params)
colocalisation_results = coloc(overlaps)
# Load
colocalisation_results.df.coalesce(session.output_partitions).write.mode(
session.write_mode
).parquet(f"{coloc_path}/{colocalisation_method.lower()}")
|