Skip to content

mecfs_bio.build_system.task.gwaslab.gwaslab_create_sumstats_task

Task to read in a dataframe from disk and process it using the GWASLAB pipeline.

Classes:

Functions:

Attributes:

GenomeBuildMode module-attribute

GenomeBuildMode = Literal['infer', '19', '38']

ValidGwaslabFormat module-attribute

ValidGwaslabFormat = (
    GwaslabKnownFormat | GWASLabColumnSpecifiers
)

GWASLabColumnSpecifiers

Methods:

Attributes:

OR class-attribute instance-attribute

OR: str | None = None

beta class-attribute instance-attribute

beta: str | None = None

chi_sq class-attribute instance-attribute

chi_sq: str | None = None

chrom class-attribute instance-attribute

chrom: str | None = None

ea class-attribute instance-attribute

ea: str | None = None

eaf class-attribute instance-attribute

eaf: str | None = None

info class-attribute instance-attribute

info: str | None = None

maf class-attribute instance-attribute

maf: str | None = None

mlog10p class-attribute instance-attribute

mlog10p: str | None = None

n class-attribute instance-attribute

n: str | None = None

ncase class-attribute instance-attribute

ncase: str | None = None

ncontrol class-attribute instance-attribute

ncontrol: str | None = None

nea class-attribute instance-attribute

nea: str | None = None

neaf class-attribute instance-attribute

neaf: str | None = None

neff class-attribute instance-attribute

neff: str | None = None

or_95l class-attribute instance-attribute

or_95l: str | None = None

or_95u class-attribute instance-attribute

or_95u: str | None = None

p class-attribute instance-attribute

p: str | None = None

pos class-attribute instance-attribute

pos: str | None = None

rsid class-attribute instance-attribute

rsid: str | None = None

se class-attribute instance-attribute

se: str | None = None

snpid class-attribute instance-attribute

snpid: str | None = None

get_selection_pipe

get_selection_pipe() -> SelectColPipe
Source code in mecfs_bio/build_system/task/gwaslab/gwaslab_create_sumstats_task.py
def get_selection_pipe(self) -> SelectColPipe:
    fields = attrs.asdict(self)
    cols = []
    for v in fields.values():
        if v is not None:
            cols.append(v)
    return SelectColPipe(cols)

GWASLabCreateSumstatsTask

Bases: Task

Task that processes a DataFrame of GWAS summary statistics using the GWASLab pipeline. see: https://cloufield.github.io/gwaslab/SumstatsObject/

Methods:

Attributes:

basic_check instance-attribute

basic_check: bool

deps property

deps: list[Task]

df_source_task instance-attribute

df_source_task: Task

drop_col_list class-attribute instance-attribute

drop_col_list: Sequence[str] = tuple()

exclude_hla class-attribute instance-attribute

exclude_hla: bool = False

exclude_sexchr class-attribute instance-attribute

exclude_sexchr: bool = False

filter_hapmap3 class-attribute instance-attribute

filter_hapmap3: bool = False

filter_indels class-attribute instance-attribute

filter_indels: bool = False

filter_palindromic class-attribute instance-attribute

filter_palindromic: bool = False

fmt class-attribute instance-attribute

fmt: GwaslabKnownFormat | GWASLabColumnSpecifiers = (
    "regenie"
)

genome_build instance-attribute

genome_build: GenomeBuildMode

liftover_to class-attribute instance-attribute

liftover_to: GenomeBuild | None = None

meta property

meta: Meta

pre_pipe class-attribute instance-attribute

pre_pipe: DataProcessingPipe = IdentityPipe()

target_asset_id instance-attribute

target_asset_id: AssetId

execute

execute(
    scratch_dir: Path, fetch: Fetch, wf: WF
) -> FileAsset
Source code in mecfs_bio/build_system/task/gwaslab/gwaslab_create_sumstats_task.py
def execute(self, scratch_dir: Path, fetch: Fetch, wf: WF) -> FileAsset:
    df = scan_dataframe_asset(asset=fetch(self._source_id), meta=self._source_meta)
    logger.debug("Applying pre-pipe")
    df = self.pre_pipe.process(df)
    logger.debug("Fetching source dataframe asset...")
    sumstats = _get_sumstats(df, self.fmt, drop_cols=self.drop_col_list)
    _validate_eaf_in_range(sumstats)
    transform_spec = GwasLabTransformSpec(
        basic_check=self.basic_check,
        genome_build=self.genome_build,
        filter_hapmap3=self.filter_hapmap3,
        filter_indels=self.filter_indels,
        filter_palindromic=self.filter_palindromic,
        exclude_hla=self.exclude_hla,
        exclude_sexchr=self.exclude_sexchr,
        liftover_to=self.liftover_to,
    )
    sumstats = transform_gwaslab_sumstats(sumstats, spec=transform_spec)
    out_path = scratch_dir / "pickled_sumstats.pickle"
    gl.dump_pickle(sumstats, path=str(out_path))
    return FileAsset(out_path)

GwasLabTransformSpec

Attributes:

basic_check class-attribute instance-attribute

basic_check: bool = True

exclude_hla class-attribute instance-attribute

exclude_hla: bool = False

exclude_sexchr class-attribute instance-attribute

exclude_sexchr: bool = False

filter_hapmap3 class-attribute instance-attribute

filter_hapmap3: bool = False

filter_indels class-attribute instance-attribute

filter_indels: bool = False

filter_palindromic class-attribute instance-attribute

filter_palindromic: bool = False

genome_build class-attribute instance-attribute

genome_build: GenomeBuildMode = 'infer'

liftover_to class-attribute instance-attribute

liftover_to: GenomeBuild | None = None

transform_gwaslab_sumstats

transform_gwaslab_sumstats(
    sumstats: Sumstats, spec: GwasLabTransformSpec
) -> gl.Sumstats
Source code in mecfs_bio/build_system/task/gwaslab/gwaslab_create_sumstats_task.py
def transform_gwaslab_sumstats(
    sumstats: gl.Sumstats,
    spec: GwasLabTransformSpec,
) -> gl.Sumstats:
    logger.debug("Running gwas summary statistics through gwaslab pipelines...")
    logger.debug(f"Initial sumstats has shape {sumstats.data.shape}")
    if spec.basic_check:
        sumstats.basic_check()
    if spec.genome_build == "infer":
        sumstats.fix_chr()
        sumstats.infer_build()
        build = sumstats.meta["gwaslab"]["genome_build"]
        forced_build = None
        print(f"Build is {build}")
    else:
        build = spec.genome_build
        forced_build = build

    if spec.liftover_to is not None and (build != spec.liftover_to):
        sumstats.liftover(to_build=spec.liftover_to, from_build=forced_build)
        sumstats.infer_build()
        assert sumstats.build == spec.liftover_to
    if spec.filter_hapmap3:
        sumstats.filter_hapmap3(inplace=True, build=forced_build)
    if spec.filter_indels:
        sumstats.filter_indel(inplace=True, mode="out")
    if spec.filter_palindromic:
        sumstats.filter_palindromic(inplace=True, mode="out")
    if spec.exclude_hla:
        sumstats.exclude_hla(inplace=True)
    if spec.exclude_sexchr:
        sumstats = _exclude_sexchr(sumstats)
    _drop_duplicate_variant_keys(sumstats)
    _sumstats_raise_on_error(sumstats)
    logger.debug(f"Finished gwaslab pipe.  Data has shape {sumstats.data.shape}")
    return sumstats