kasm-pkg 0.1.0__py3-none-any.whl

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.
kasm/__init__.py ADDED
@@ -0,0 +1,70 @@
1
+ """kasm — kernel allelic series model."""
2
+
3
+ from kasm import covar
4
+ from kasm._logging import configure_logging, logger
5
+ from kasm.api import (
6
+ RandomFit,
7
+ combine_mixed_effects,
8
+ combine_random_hsq,
9
+ fit_fixed_effects,
10
+ fit_random_effects,
11
+ )
12
+ from kasm.covar import (
13
+ CovarResult,
14
+ compute_random_covar,
15
+ )
16
+ from kasm.dataset import (
17
+ Dataset,
18
+ parse_variant_ids,
19
+ sort_variant_df,
20
+ )
21
+ from kasm.enrichment import EnrichResult, pool_enrichment
22
+ from kasm.fixed_effects import FixedFit
23
+ from kasm.fitting import jackknife_se
24
+ from kasm.kernels import KernelId, KernelLayout, KernelOptions
25
+ from kasm.ldm import LDM, LDMLoader
26
+ from kasm.model import Model
27
+ from kasm.simulation import (
28
+ simulate_burden_effects,
29
+ simulate_sumstats,
30
+ )
31
+ from kasm.suffstats import (
32
+ ExtraEnrichCols,
33
+ ExtSuffStats,
34
+ JKSuffStats,
35
+ SuffStats,
36
+ compute_jk_suffstats,
37
+ )
38
+
39
+ __all__ = [
40
+ "LDM",
41
+ "CovarResult",
42
+ "Dataset",
43
+ "EnrichResult",
44
+ "ExtSuffStats",
45
+ "ExtraEnrichCols",
46
+ "FixedFit",
47
+ "JKSuffStats",
48
+ "KernelId",
49
+ "KernelLayout",
50
+ "KernelOptions",
51
+ "LDMLoader",
52
+ "Model",
53
+ "RandomFit",
54
+ "SuffStats",
55
+ "combine_mixed_effects",
56
+ "combine_random_hsq",
57
+ "covar",
58
+ "configure_logging",
59
+ "compute_jk_suffstats",
60
+ "compute_random_covar",
61
+ "fit_fixed_effects",
62
+ "fit_random_effects",
63
+ "jackknife_se",
64
+ "logger",
65
+ "parse_variant_ids",
66
+ "pool_enrichment",
67
+ "simulate_burden_effects",
68
+ "simulate_sumstats",
69
+ "sort_variant_df",
70
+ ]
kasm/_logging.py ADDED
@@ -0,0 +1,42 @@
1
+ """Logging configuration for kasm workflows."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from pathlib import Path
7
+
8
+ logger = logging.getLogger("kasm")
9
+
10
+
11
+ def configure_logging(
12
+ level: int | str = "INFO", *, filename: str | Path | None = None
13
+ ) -> None:
14
+ """Configure console logging, and optionally file logging, for ``kasm.*``.
15
+
16
+ Only handlers previously installed by this function are replaced. This
17
+ leaves application-owned handlers and the root logger untouched.
18
+ """
19
+ resolved_level = (
20
+ logging._nameToLevel.get(level.upper()) if isinstance(level, str) else level
21
+ )
22
+ if not isinstance(resolved_level, int):
23
+ raise ValueError(f"unknown logging level {level!r}")
24
+ formatter = logging.Formatter(
25
+ "%(asctime)s %(module)s %(levelname)s %(message)s",
26
+ datefmt="%Y-%m-%d %H:%M:%S",
27
+ )
28
+ for handler in tuple(logger.handlers):
29
+ if getattr(handler, "_kasm_managed", False):
30
+ logger.removeHandler(handler)
31
+ handler.close()
32
+ handlers: list[logging.Handler] = [logging.StreamHandler()]
33
+ if filename is not None:
34
+ path = Path(filename)
35
+ path.parent.mkdir(parents=True, exist_ok=True)
36
+ handlers.append(logging.FileHandler(path, mode="a"))
37
+ for handler in handlers:
38
+ handler.setFormatter(formatter)
39
+ handler._kasm_managed = True
40
+ logger.addHandler(handler)
41
+ logger.setLevel(resolved_level)
42
+ logger.propagate = False