From 400144ef133162fe6a2afe5ade64e98134c324b8 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 7 Sep 2023 14:38:23 -0400 Subject: [PATCH 001/106] Add v4 variants file copied from v3 --- .../datasets/gnomad_v4/gnomad_v4_variants.py | 298 ++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py new file mode 100644 index 000000000..f1b96fba2 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -0,0 +1,298 @@ +import itertools + +import hail as hl + +from data_pipeline.data_types.variant import variant_id + + +def nullify_nan(value): + return hl.if_else(hl.is_nan(value), hl.null(value.dtype), value) + + +def freq_index_key(subset=None, pop=None, sex=None, raw=False): + parts = [s for s in [subset, pop, sex] if s is not None] + parts.append("raw" if raw else "adj") + return "-".join(parts) + + +def prepare_gnomad_v3_variants(path): + ds = hl.read_table(path) + + +g = hl.eval(ds.globals) + +subsets = set(m.get("subset", None) for m in g.freq_meta) + + +def freq(ds, *args, **kwargs): + return ds.freq[g.freq_index_dict[freq_index_key(*args, **kwargs)]] + + +############################ +# Derived top level fields # +############################ + +ds = ds.annotate(variant_id=variant_id(ds.locus, ds.alleles)) +ds = ds.rename({"rsid": "rsids"}) + +###################### +# Colocated variants # +###################### + +variants_by_locus = ds.select( + ds.variant_id, + ac_raw=hl.struct(**{subset or "all": freq(ds, subset=subset, raw=True).AC for subset in subsets}), +) +variants_by_locus = variants_by_locus.group_by("locus").aggregate(variants=hl.agg.collect(variants_by_locus.row_value)) + + +def subset_filter(subset): + return lambda variant: variant.ac_raw[subset] > 0 + + +variants_by_locus = variants_by_locus.annotate( + variant_ids=hl.struct( + **{ + subset + or "all": variants_by_locus.variants.filter(subset_filter(subset or "all")).map( + lambda variant: variant.variant_id + ) + for subset in subsets + } + ) +) + +ds = ds.annotate(colocated_variants=variants_by_locus[ds.locus].variant_ids) +ds = ds.annotate( + colocated_variants=hl.struct( + **{ + subset: ds.colocated_variants[subset].filter(lambda variant_id: variant_id != ds.variant_id) + for subset in ds.colocated_variants._fields + } + ) +) + +############### +# Frequencies # +############### + +subset_populations = {} +for subset in subsets: + subset_populations[subset] = set(m.get("pop", None) for m in g.freq_meta if m.get("subset", None) == subset) + + subset_populations[subset].discard(None) + + # "global" population is used for downsamplings + subset_populations[subset].discard("global") + +ds = ds.annotate(in_autosome_or_par=ds.locus.in_autosome_or_par()) + +ds = ds.annotate( + genome=hl.struct( + freq=hl.struct( + **{ + subset + or "all": hl.struct( + ac=freq(ds, subset=subset).AC, + ac_raw=freq(ds, subset=subset, raw=True).AC, + an=freq(ds, subset=subset).AN, + hemizygote_count=hl.if_else( + ds.in_autosome_or_par, 0, hl.or_else(freq(ds, subset=subset, sex="XY").AC, 0) + ), + homozygote_count=freq(ds, subset=subset).homozygote_count, + populations=[ + hl.struct( + id="_".join(filter(bool, [pop, sex])), + ac=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AC, 0), + an=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AN, 0), + hemizygote_count=0 + if sex == "XX" + else hl.if_else( + ds.in_autosome_or_par, + 0, + hl.or_else(freq(ds, subset=subset, pop=pop, sex="XY").AC, 0), + ), + homozygote_count=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).homozygote_count, 0), + ) + for pop, sex in list(itertools.product(subset_populations[subset], [None, "XX", "XY"])) + + [(None, "XX"), (None, "XY")] + ], + ) + for subset in subsets + } + ) + ) +) + +# If a variant is not present in a subset, do not store population frequencies for that subset +ds = ds.annotate( + genome=ds.genome.annotate( + freq=ds.genome.freq.annotate( + **{ + subset + or "all": ds.genome.freq[subset or "all"].annotate( + populations=hl.if_else( + ds.genome.freq[subset or "all"].ac_raw == 0, + hl.empty_array(ds.genome.freq[subset or "all"].populations.dtype.element_type), + ds.genome.freq[subset or "all"].populations, + ) + ) + for subset in subsets + } + ) + ) +) + +ds = ds.drop("freq", "in_autosome_or_par") + +########################################### +# Subsets in which the variant is present # +########################################### + +ds = ds.annotate( + subsets=hl.set( + hl.array([(subset, ds.genome.freq[subset].ac_raw > 0) for subset in subsets if subset is not None]) + .filter(lambda t: t[1]) + .map(lambda t: t[0]) + ) +) + +############################## +# Filtering allele frequency # +############################## + +faf_populations = [pop for pop in subset_populations[None] if f"{pop}-adj" in g.faf_index_dict] + +# Get popmax FAFs +ds = ds.annotate( + genome=ds.genome.annotate( + faf95=hl.rbind( + hl.sorted( + hl.array( + [ + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf95, population=pop) + for pop in faf_populations + ] + ), + key=lambda f: (-f.faf, f.population), + ), + lambda fafs: hl.if_else( + hl.len(fafs) > 0, + hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), + hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + ), + ), + faf99=hl.rbind( + hl.sorted( + hl.array( + [ + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf99, population=pop) + for pop in faf_populations + ] + ), + key=lambda f: (-f.faf, f.population), + ), + lambda fafs: hl.if_else( + hl.len(fafs) > 0, + hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), + hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + ), + ), + ) +) + +ds = ds.drop("faf") + +#################### +# Age distribution # +#################### + +ds = ds.annotate( + genome=ds.genome.annotate( + age_distribution=hl.struct(het=ds.histograms.age_hists.age_hist_ht, hom=ds.histograms.age_hists.age_hist_hom) + ) +) + + +################### +# Quality metrics # +################### + +ds = ds.annotate( + genome=ds.genome.annotate( + filters=ds.filters, + quality_metrics=hl.struct( + allele_balance=hl.struct( + alt_adj=ds.histograms.qual_hists.ab_hist_alt.annotate( + bin_edges=ds.histograms.qual_hists.ab_hist_alt.bin_edges.map( + lambda n: hl.float(hl.format("%.3f", n)) + ) + ), + alt_raw=ds.histograms.raw_qual_hists.ab_hist_alt.annotate( + bin_edges=ds.histograms.raw_qual_hists.ab_hist_alt.bin_edges.map( + lambda n: hl.float(hl.format("%.3f", n)) + ) + ), + ), + genotype_depth=hl.struct( + all_adj=ds.histograms.qual_hists.dp_hist_all, + all_raw=ds.histograms.raw_qual_hists.dp_hist_all, + alt_adj=ds.histograms.qual_hists.dp_hist_alt, + alt_raw=ds.histograms.raw_qual_hists.dp_hist_alt, + ), + genotype_quality=hl.struct( + all_adj=ds.histograms.qual_hists.gq_hist_all, + all_raw=ds.histograms.raw_qual_hists.gq_hist_all, + alt_adj=ds.histograms.qual_hists.gq_hist_alt, + alt_raw=ds.histograms.raw_qual_hists.gq_hist_alt, + ), + site_quality_metrics=[hl.struct(metric="SiteQuality", value=hl.float(nullify_nan(ds.info.QUALapprox)))] + + [ + hl.struct(metric=metric, value=hl.float(nullify_nan(ds.info[metric]))) + for metric in [ + "InbreedingCoeff", + "AS_FS", + "AS_MQ", + "AS_MQRankSum", + "AS_pab_max", + "AS_QUALapprox", + "AS_QD", + "AS_ReadPosRankSum", + "AS_SOR", + "AS_VarDP", + "AS_VQSLOD", + ] + ], + ), + ) +) + +ds = ds.drop("filters", "histograms") + +######### +# Flags # +######### + +ds = ds.annotate( + flags=hl.set( + [ + hl.or_missing(ds.region_flag.lcr, "lcr"), + hl.or_missing(ds.region_flag.segdup, "segdup"), + hl.or_missing( + ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) + | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), + "par", + ), + hl.or_missing(ds.info.monoallelic, "monoallelic"), + ] + ).filter(hl.is_defined) +) + +ds = ds.drop("region_flag") + +################ +# Other fields # +################ + +# Drop unused fields +ds = ds.drop("allele_info", "a_index", "info", "was_split") From 3c573bbec7034c072e879bcf138fec477e2b9b98 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 11 Sep 2023 11:20:41 -0400 Subject: [PATCH 002/106] Add v4 variant dataset script --- .../{src/data_pipeline => }/__init__.py | 0 .../datasets/gnomad_v4/gnomad_v4_variants.py | 475 +++++++++--------- .../pipelines/gnomad_v4_variants.py | 54 ++ 3 files changed, 292 insertions(+), 237 deletions(-) rename data-pipeline/{src/data_pipeline => }/__init__.py (100%) create mode 100644 data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py diff --git a/data-pipeline/src/data_pipeline/__init__.py b/data-pipeline/__init__.py similarity index 100% rename from data-pipeline/src/data_pipeline/__init__.py rename to data-pipeline/__init__.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py index f1b96fba2..cbd421034 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -15,284 +15,285 @@ def freq_index_key(subset=None, pop=None, sex=None, raw=False): return "-".join(parts) -def prepare_gnomad_v3_variants(path): +def prepare_gnomad_v4_variants(path): ds = hl.read_table(path) + g = hl.eval(ds.globals) + subsets = set(m.get("subset", None) for m in g.freq_meta) -g = hl.eval(ds.globals) + def freq(ds, *args, **kwargs): + return ds.freq[g.freq_index_dict[freq_index_key(*args, **kwargs)]] -subsets = set(m.get("subset", None) for m in g.freq_meta) + ############################ + # Derived top level fields # + ############################ + ds = ds.annotate(variant_id=variant_id(ds.locus, ds.alleles)) + ds = ds.rename({"rsid": "rsids"}) -def freq(ds, *args, **kwargs): - return ds.freq[g.freq_index_dict[freq_index_key(*args, **kwargs)]] + ###################### + # Colocated variants # + ###################### - -############################ -# Derived top level fields # -############################ - -ds = ds.annotate(variant_id=variant_id(ds.locus, ds.alleles)) -ds = ds.rename({"rsid": "rsids"}) - -###################### -# Colocated variants # -###################### - -variants_by_locus = ds.select( - ds.variant_id, - ac_raw=hl.struct(**{subset or "all": freq(ds, subset=subset, raw=True).AC for subset in subsets}), -) -variants_by_locus = variants_by_locus.group_by("locus").aggregate(variants=hl.agg.collect(variants_by_locus.row_value)) - - -def subset_filter(subset): - return lambda variant: variant.ac_raw[subset] > 0 - - -variants_by_locus = variants_by_locus.annotate( - variant_ids=hl.struct( - **{ - subset - or "all": variants_by_locus.variants.filter(subset_filter(subset or "all")).map( - lambda variant: variant.variant_id - ) - for subset in subsets - } + variants_by_locus = ds.select( + ds.variant_id, + ac_raw=hl.struct(**{subset or "all": freq(ds, subset=subset, raw=True).AC for subset in subsets}), ) -) - -ds = ds.annotate(colocated_variants=variants_by_locus[ds.locus].variant_ids) -ds = ds.annotate( - colocated_variants=hl.struct( - **{ - subset: ds.colocated_variants[subset].filter(lambda variant_id: variant_id != ds.variant_id) - for subset in ds.colocated_variants._fields - } + variants_by_locus = variants_by_locus.group_by("locus").aggregate( + variants=hl.agg.collect(variants_by_locus.row_value) ) -) - -############### -# Frequencies # -############### - -subset_populations = {} -for subset in subsets: - subset_populations[subset] = set(m.get("pop", None) for m in g.freq_meta if m.get("subset", None) == subset) - - subset_populations[subset].discard(None) - # "global" population is used for downsamplings - subset_populations[subset].discard("global") + def subset_filter(subset): + return lambda variant: variant.ac_raw[subset] > 0 -ds = ds.annotate(in_autosome_or_par=ds.locus.in_autosome_or_par()) - -ds = ds.annotate( - genome=hl.struct( - freq=hl.struct( + variants_by_locus = variants_by_locus.annotate( + variant_ids=hl.struct( **{ subset - or "all": hl.struct( - ac=freq(ds, subset=subset).AC, - ac_raw=freq(ds, subset=subset, raw=True).AC, - an=freq(ds, subset=subset).AN, - hemizygote_count=hl.if_else( - ds.in_autosome_or_par, 0, hl.or_else(freq(ds, subset=subset, sex="XY").AC, 0) - ), - homozygote_count=freq(ds, subset=subset).homozygote_count, - populations=[ - hl.struct( - id="_".join(filter(bool, [pop, sex])), - ac=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AC, 0), - an=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AN, 0), - hemizygote_count=0 - if sex == "XX" - else hl.if_else( - ds.in_autosome_or_par, - 0, - hl.or_else(freq(ds, subset=subset, pop=pop, sex="XY").AC, 0), - ), - homozygote_count=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).homozygote_count, 0), - ) - for pop, sex in list(itertools.product(subset_populations[subset], [None, "XX", "XY"])) - + [(None, "XX"), (None, "XY")] - ], + or "all": variants_by_locus.variants.filter(subset_filter(subset or "all")).map( + lambda variant: variant.variant_id ) for subset in subsets } ) ) -) -# If a variant is not present in a subset, do not store population frequencies for that subset -ds = ds.annotate( - genome=ds.genome.annotate( - freq=ds.genome.freq.annotate( + ds = ds.annotate(colocated_variants=variants_by_locus[ds.locus].variant_ids) + ds = ds.annotate( + colocated_variants=hl.struct( **{ - subset - or "all": ds.genome.freq[subset or "all"].annotate( - populations=hl.if_else( - ds.genome.freq[subset or "all"].ac_raw == 0, - hl.empty_array(ds.genome.freq[subset or "all"].populations.dtype.element_type), - ds.genome.freq[subset or "all"].populations, - ) - ) - for subset in subsets + subset: ds.colocated_variants[subset].filter(lambda variant_id: variant_id != ds.variant_id) + for subset in ds.colocated_variants._fields } ) ) -) -ds = ds.drop("freq", "in_autosome_or_par") + ############### + # Frequencies # + ############### + + subset_populations = {} + for subset in subsets: + subset_populations[subset] = set(m.get("pop", None) for m in g.freq_meta if m.get("subset", None) == subset) + + subset_populations[subset].discard(None) + + # "global" population is used for downsamplings + subset_populations[subset].discard("global") + + ds = ds.annotate(in_autosome_or_par=ds.locus.in_autosome_or_par()) + + ds = ds.annotate( + exome=hl.struct( + freq=hl.struct( + **{ + subset + or "all": hl.struct( + ac=freq(ds, subset=subset).AC, + ac_raw=freq(ds, subset=subset, raw=True).AC, + an=freq(ds, subset=subset).AN, + hemizygote_count=hl.if_else( + ds.in_autosome_or_par, 0, hl.or_else(freq(ds, subset=subset, sex="XY").AC, 0) + ), + homozygote_count=freq(ds, subset=subset).homozygote_count, + populations=[ + hl.struct( + id="_".join(filter(bool, [pop, sex])), + ac=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AC, 0), + an=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AN, 0), + hemizygote_count=0 + if sex == "XX" + else hl.if_else( + ds.in_autosome_or_par, + 0, + hl.or_else(freq(ds, subset=subset, pop=pop, sex="XY").AC, 0), + ), + homozygote_count=hl.or_else( + freq(ds, subset=subset, pop=pop, sex=sex).homozygote_count, 0 + ), + ) + for pop, sex in list(itertools.product(subset_populations[subset], [None, "XX", "XY"])) + + [(None, "XX"), (None, "XY")] + ], + ) + for subset in subsets + } + ) + ) + ) -########################################### -# Subsets in which the variant is present # -########################################### + # If a variant is not present in a subset, do not store population frequencies for that subset + ds = ds.annotate( + exome=ds.exome.annotate( + freq=ds.exome.freq.annotate( + **{ + subset + or "all": ds.exome.freq[subset or "all"].annotate( + populations=hl.if_else( + ds.exome.freq[subset or "all"].ac_raw == 0, + hl.empty_array(ds.exome.freq[subset or "all"].populations.dtype.element_type), + ds.exome.freq[subset or "all"].populations, + ) + ) + for subset in subsets + } + ) + ) + ) -ds = ds.annotate( - subsets=hl.set( - hl.array([(subset, ds.genome.freq[subset].ac_raw > 0) for subset in subsets if subset is not None]) - .filter(lambda t: t[1]) - .map(lambda t: t[0]) + ds = ds.drop("freq", "in_autosome_or_par") + + ########################################### + # Subsets in which the variant is present # + ########################################### + + ds = ds.annotate( + subsets=hl.set( + hl.array([(subset, ds.exome.freq[subset].ac_raw > 0) for subset in subsets if subset is not None]) + .filter(lambda t: t[1]) + .map(lambda t: t[0]) + ) ) -) - -############################## -# Filtering allele frequency # -############################## - -faf_populations = [pop for pop in subset_populations[None] if f"{pop}-adj" in g.faf_index_dict] - -# Get popmax FAFs -ds = ds.annotate( - genome=ds.genome.annotate( - faf95=hl.rbind( - hl.sorted( - hl.array( - [ - hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf95, population=pop) - for pop in faf_populations - ] + + ############################## + # Filtering allele frequency # + ############################## + + faf_populations = [pop for pop in subset_populations[None] if f"{pop}-adj" in g.faf_index_dict] + + # Get popmax FAFs + ds = ds.annotate( + exome=ds.exome.annotate( + faf95=hl.rbind( + hl.sorted( + hl.array( + [ + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf95, population=pop) + for pop in faf_populations + ] + ), + key=lambda f: (-f.faf, f.population), ), - key=lambda f: (-f.faf, f.population), - ), - lambda fafs: hl.if_else( - hl.len(fafs) > 0, - hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), - hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), - ), - ), - faf99=hl.rbind( - hl.sorted( - hl.array( - [ - hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf99, population=pop) - for pop in faf_populations - ] + lambda fafs: hl.if_else( + hl.len(fafs) > 0, + hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), + hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), ), - key=lambda f: (-f.faf, f.population), ), - lambda fafs: hl.if_else( - hl.len(fafs) > 0, - hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), - hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + faf99=hl.rbind( + hl.sorted( + hl.array( + [ + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf99, population=pop) + for pop in faf_populations + ] + ), + key=lambda f: (-f.faf, f.population), + ), + lambda fafs: hl.if_else( + hl.len(fafs) > 0, + hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), + hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + ), ), - ), + ) ) -) -ds = ds.drop("faf") + ds = ds.drop("faf") -#################### -# Age distribution # -#################### + #################### + # Age distribution # + #################### -ds = ds.annotate( - genome=ds.genome.annotate( - age_distribution=hl.struct(het=ds.histograms.age_hists.age_hist_ht, hom=ds.histograms.age_hists.age_hist_hom) + ds = ds.annotate( + exome=ds.exome.annotate( + age_distribution=hl.struct( + het=ds.histograms.age_hists.age_hist_ht, hom=ds.histograms.age_hists.age_hist_hom + ) + ) ) -) - -################### -# Quality metrics # -################### - -ds = ds.annotate( - genome=ds.genome.annotate( - filters=ds.filters, - quality_metrics=hl.struct( - allele_balance=hl.struct( - alt_adj=ds.histograms.qual_hists.ab_hist_alt.annotate( - bin_edges=ds.histograms.qual_hists.ab_hist_alt.bin_edges.map( - lambda n: hl.float(hl.format("%.3f", n)) - ) + ################### + # Quality metrics # + ################### + + ds = ds.annotate( + exome=ds.exome.annotate( + filters=ds.filters, + quality_metrics=hl.struct( + allele_balance=hl.struct( + alt_adj=ds.histograms.qual_hists.ab_hist_alt.annotate( + bin_edges=ds.histograms.qual_hists.ab_hist_alt.bin_edges.map( + lambda n: hl.float(hl.format("%.3f", n)) + ) + ), + alt_raw=ds.histograms.raw_qual_hists.ab_hist_alt.annotate( + bin_edges=ds.histograms.raw_qual_hists.ab_hist_alt.bin_edges.map( + lambda n: hl.float(hl.format("%.3f", n)) + ) + ), ), - alt_raw=ds.histograms.raw_qual_hists.ab_hist_alt.annotate( - bin_edges=ds.histograms.raw_qual_hists.ab_hist_alt.bin_edges.map( - lambda n: hl.float(hl.format("%.3f", n)) - ) + genotype_depth=hl.struct( + all_adj=ds.histograms.qual_hists.dp_hist_all, + all_raw=ds.histograms.raw_qual_hists.dp_hist_all, + alt_adj=ds.histograms.qual_hists.dp_hist_alt, + alt_raw=ds.histograms.raw_qual_hists.dp_hist_alt, ), + genotype_quality=hl.struct( + all_adj=ds.histograms.qual_hists.gq_hist_all, + all_raw=ds.histograms.raw_qual_hists.gq_hist_all, + alt_adj=ds.histograms.qual_hists.gq_hist_alt, + alt_raw=ds.histograms.raw_qual_hists.gq_hist_alt, + ), + site_quality_metrics=[hl.struct(metric="SiteQuality", value=hl.float(nullify_nan(ds.info.QUALapprox)))] + + [ + hl.struct(metric=metric, value=hl.float(nullify_nan(ds.info[metric]))) + for metric in [ + "InbreedingCoeff", + "AS_FS", + "AS_MQ", + "AS_MQRankSum", + "AS_pab_max", + "AS_QUALapprox", + "AS_QD", + "AS_ReadPosRankSum", + "AS_SOR", + "AS_VarDP", + "AS_VQSLOD", + ] + ], ), - genotype_depth=hl.struct( - all_adj=ds.histograms.qual_hists.dp_hist_all, - all_raw=ds.histograms.raw_qual_hists.dp_hist_all, - alt_adj=ds.histograms.qual_hists.dp_hist_alt, - alt_raw=ds.histograms.raw_qual_hists.dp_hist_alt, - ), - genotype_quality=hl.struct( - all_adj=ds.histograms.qual_hists.gq_hist_all, - all_raw=ds.histograms.raw_qual_hists.gq_hist_all, - alt_adj=ds.histograms.qual_hists.gq_hist_alt, - alt_raw=ds.histograms.raw_qual_hists.gq_hist_alt, - ), - site_quality_metrics=[hl.struct(metric="SiteQuality", value=hl.float(nullify_nan(ds.info.QUALapprox)))] - + [ - hl.struct(metric=metric, value=hl.float(nullify_nan(ds.info[metric]))) - for metric in [ - "InbreedingCoeff", - "AS_FS", - "AS_MQ", - "AS_MQRankSum", - "AS_pab_max", - "AS_QUALapprox", - "AS_QD", - "AS_ReadPosRankSum", - "AS_SOR", - "AS_VarDP", - "AS_VQSLOD", - ] - ], - ), + ) ) -) - -ds = ds.drop("filters", "histograms") - -######### -# Flags # -######### - -ds = ds.annotate( - flags=hl.set( - [ - hl.or_missing(ds.region_flag.lcr, "lcr"), - hl.or_missing(ds.region_flag.segdup, "segdup"), - hl.or_missing( - ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) - | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), - "par", - ), - hl.or_missing(ds.info.monoallelic, "monoallelic"), - ] - ).filter(hl.is_defined) -) -ds = ds.drop("region_flag") + ds = ds.drop("filters", "histograms") + + ######### + # Flags # + ######### + + ds = ds.annotate( + flags=hl.set( + [ + hl.or_missing(ds.region_flag.lcr, "lcr"), + hl.or_missing(ds.region_flag.segdup, "segdup"), + hl.or_missing( + ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) + | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), + "par", + ), + hl.or_missing(ds.info.monoallelic, "monoallelic"), + ] + ).filter(hl.is_defined) + ) + + ds = ds.drop("region_flag") + + ################ + # Other fields # + ################ -################ -# Other fields # -################ + # Drop unused fields + ds = ds.drop("allele_info", "a_index", "info", "was_split") -# Drop unused fields -ds = ds.drop("allele_info", "a_index", "info", "was_split") + return ds diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py new file mode 100644 index 000000000..91864e254 --- /dev/null +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -0,0 +1,54 @@ +from data_pipeline.pipeline import Pipeline, run_pipeline + +from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences + +from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import prepare_gnomad_v4_variants + +from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline +from data_pipeline.pipelines.genes import pipeline as genes_pipeline + + +pipeline = Pipeline() + +pipeline.add_task( + "prepare_gnomad_v4_variants", + prepare_gnomad_v4_variants, + "/gnomad_v4/gnomad_v4_variants_base.ht", + {"path": "gs://gnomad-matt-data-pipeline/external_sources/2023-09-07-exome-variants-v4-mock/mock_v4_release.ht"}, +) + +pipeline.add_task( + "annotate_gnomad_v4_variants", + annotate_variants, + "/gnomad_v4/gnomad_v4_variants_annotated_1.ht", + { + "variants_path": pipeline.get_task("prepare_gnomad_v4_variants"), + # We need to subset regions chr1:10030:10150 + "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), + "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", + }, +) + +pipeline.add_task( + "annotate_gnomad_v4_transcript_consequences", + annotate_transcript_consequences, + "/gnomad_v4/gnomad_v4_variants_annotated_2.ht", + { + "variants_path": pipeline.get_task("annotate_gnomad_v4_variants"), + "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), + "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), + }, +) + +############################################### +# Outputs +############################################### + +pipeline.set_outputs({"variants": "annotate_gnomad_v4_transcript_consequences"}) + +############################################### +# Run +############################################### + +if __name__ == "__main__": + run_pipeline(pipeline) From c485a7b426cb050190d4f3def5803123dd612762 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 11 Sep 2023 12:52:39 -0400 Subject: [PATCH 003/106] Add v4 coverage to data-pipeline --- .../{ => src/data_pipeline}/__init__.py | 0 .../src/data_pipeline/data_types/coverage.py | 7 ++- .../pipelines/gnomad_v4_coverage.py | 43 +++++++++++++++++++ .../pipelines/gnomad_v4_variants.py | 3 +- 4 files changed, 51 insertions(+), 2 deletions(-) rename data-pipeline/{ => src/data_pipeline}/__init__.py (100%) create mode 100644 data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py diff --git a/data-pipeline/__init__.py b/data-pipeline/src/data_pipeline/__init__.py similarity index 100% rename from data-pipeline/__init__.py rename to data-pipeline/src/data_pipeline/__init__.py diff --git a/data-pipeline/src/data_pipeline/data_types/coverage.py b/data-pipeline/src/data_pipeline/data_types/coverage.py index c21373ab1..40c7715a8 100644 --- a/data-pipeline/src/data_pipeline/data_types/coverage.py +++ b/data-pipeline/src/data_pipeline/data_types/coverage.py @@ -1,11 +1,16 @@ +from typing import List, Optional import hail as hl from data_pipeline.data_types.locus import x_position -def prepare_coverage(coverage_path): +def prepare_coverage(coverage_path: str, filter_intervals: Optional[List[str]] = None): coverage = hl.read_table(coverage_path) + if filter_intervals: + intervals = [hl.parse_locus_interval(interval, reference_genome="GRCh38") for interval in filter_intervals] + coverage = hl.filter_intervals(coverage, intervals) + coverage = coverage.annotate(xpos=x_position(coverage.locus)) # Median field name is different in v3.0.1 vs v2 diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py new file mode 100644 index 000000000..412c50cea --- /dev/null +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -0,0 +1,43 @@ +from data_pipeline.pipeline import Pipeline, run_pipeline + +from data_pipeline.data_types.coverage import prepare_coverage + + +pipeline = Pipeline() + +pipeline.add_task( + "prepare_gnomad_v4_exome_coverage", + prepare_coverage, + "/gnomad_v4/gnomad_v4_exome_coverage.ht", + # Using v3 coverage as mock for now + { + "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", + "filter_intervals": ["chr1:10030-10150"], + }, +) + +pipeline.add_task( + "prepare_gnomad_v4_genome_coverage", + prepare_coverage, + "/gnomad_v4/gnomad_v4_genome_coverage.ht", + # Using v3 coverage as mock for now + { + "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", + "filter_intervals": ["chr1:10030-10150"], + }, +) + +############################################### +# Outputs +############################################### + +pipeline.set_outputs( + {"exome_coverage": "prepare_gnomad_v4_exome_coverage", "genome_coverage": "prepare_gnomad_v4_genome_coverage"} +) + +############################################### +# Run +############################################### + +if __name__ == "__main__": + run_pipeline(pipeline) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 91864e254..0e53ea055 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -24,8 +24,9 @@ { "variants_path": pipeline.get_task("prepare_gnomad_v4_variants"), # We need to subset regions chr1:10030:10150 + "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), - "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", + # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", }, ) From 387f8f7a56f3f4da0cbf43128d874adef033fb5f Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 18 Sep 2023 13:57:17 -0400 Subject: [PATCH 004/106] Add poetry toml, lockfile, .gitignore --- data-pipeline/.gitignore | 1 + data-pipeline/poetry.lock | 3180 ++++++++++++++++++++++++++++++++++ data-pipeline/pyproject.toml | 24 + 3 files changed, 3205 insertions(+) create mode 100644 data-pipeline/.gitignore create mode 100644 data-pipeline/poetry.lock create mode 100644 data-pipeline/pyproject.toml diff --git a/data-pipeline/.gitignore b/data-pipeline/.gitignore new file mode 100644 index 000000000..1269488f7 --- /dev/null +++ b/data-pipeline/.gitignore @@ -0,0 +1 @@ +data diff --git a/data-pipeline/poetry.lock b/data-pipeline/poetry.lock new file mode 100644 index 000000000..37e3d0105 --- /dev/null +++ b/data-pipeline/poetry.lock @@ -0,0 +1,3180 @@ +[[package]] +name = "aiodns" +version = "2.0.0" +description = "Simple DNS resolver for asyncio" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycares = ">=3.0.0" + +[[package]] +name = "aiohttp" +version = "3.8.5" +description = "Async http client/server framework (asyncio)" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "asttokens" +version = "2.4.0" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "asyncinit" +version = "0.2.4" +description = "Class decorator to enable async __init__" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["pylint (>=2.1,<3.0)", "pytest (>=3.6,<4.0)"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "avro" +version = "1.11.2" +description = "Avro is a serialization and RPC framework." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +snappy = ["python-snappy"] +zstandard = ["zstandard"] + +[[package]] +name = "azure-common" +version = "1.1.28" +description = "Microsoft Azure Client Library for Python (Common)" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "azure-core" +version = "1.29.4" +description = "Microsoft Azure Core Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +requests = ">=2.18.4" +six = ">=1.11.0" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["aiohttp (>=3.0)"] + +[[package]] +name = "azure-identity" +version = "1.14.0" +description = "Microsoft Azure Identity Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-core = ">=1.11.0,<2.0.0" +cryptography = ">=2.5" +msal = ">=1.20.0,<2.0.0" +msal-extensions = ">=0.3.0,<2.0.0" + +[[package]] +name = "azure-mgmt-core" +version = "1.4.0" +description = "Microsoft Azure Management Core Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-core = ">=1.26.2,<2.0.0" + +[[package]] +name = "azure-mgmt-storage" +version = "20.1.0" +description = "Microsoft Azure Storage Management Client Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-common = ">=1.1,<2.0" +azure-mgmt-core = ">=1.3.1,<2.0.0" +msrest = ">=0.6.21" + +[[package]] +name = "azure-storage-blob" +version = "12.18.1" +description = "Microsoft Azure Blob Storage Client Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-core = ">=1.28.0,<2.0.0" +cryptography = ">=2.1.4" +isodate = ">=0.6.1" +typing-extensions = ">=4.3.0" + +[package.extras] +aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "bokeh" +version = "3.2.2" +description = "Interactive plots and applications in the browser from Python" +category = "dev" +optional = false +python-versions = ">=3.9" + +[package.dependencies] +contourpy = ">=1" +Jinja2 = ">=2.9" +numpy = ">=1.16" +packaging = ">=16.8" +pandas = ">=1.2" +pillow = ">=7.1.0" +PyYAML = ">=3.10" +tornado = ">=5.1" +xyzservices = ">=2021.09.1" + +[[package]] +name = "boto3" +version = "1.28.49" +description = "The AWS SDK for Python" +category = "dev" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +botocore = ">=1.31.49,<1.32.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.31.49" +description = "Low-level, data-driven core of boto 3." +category = "dev" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.16.26)"] + +[[package]] +name = "cachetools" +version = "5.3.1" +description = "Extensible memoizing collections and decorators" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "cattrs" +version = "23.1.2" +description = "Composable complex class support for attrs and dataclasses." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=20" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.2.0,<5.0.0)"] +cbor2 = ["cbor2 (>=5.4.6,<6.0.0)"] +msgpack = ["msgpack (>=1.0.2,<2.0.0)"] +orjson = ["orjson (>=3.5.2,<4.0.0)"] +pyyaml = ["PyYAML (>=6.0,<7.0)"] +tomlkit = ["tomlkit (>=0.11.4,<0.12.0)"] +ujson = ["ujson (>=5.4.0,<6.0.0)"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "contourpy" +version = "1.1.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + +[[package]] +name = "cryptography" +version = "41.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "decorator" +version = "4.4.2" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" + +[[package]] +name = "Deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "elasticsearch" +version = "7.17.9" +description = "Python client for Elasticsearch" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.21.1,<2" + +[package.extras] +async = ["aiohttp (>=3,<4)"] +develop = ["black", "coverage", "jinja2", "mock", "pytest", "pytest-cov", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx (<1.7)", "sphinx-rtd-theme"] +docs = ["sphinx (<1.7)", "sphinx-rtd-theme"] +requests = ["requests (>=2.4.0,<3.0.0)"] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "dev" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "google-api-core" +version = "2.11.1" +description = "Google API client core library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.23.0" +description = "Google Authentication Library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" +urllib3 = "<2.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-oauthlib" +version = "0.8.0" +description = "Google Authentication Library" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-cloud-core" +version = "2.3.3" +description = "Google Cloud API client core library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)"] + +[[package]] +name = "google-cloud-storage" +version = "2.10.0" +description = "Google Cloud Storage API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-resumable-media = ">=2.3.2" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<5.0.0dev)"] + +[[package]] +name = "google-crc32c" +version = "1.5.0" +description = "A python wrapper of the C library 'Google CRC32C'" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.6.0" +description = "Utilities for Google Media Downloads and Resumable Uploads" +category = "dev" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.60.0" +description = "Common protobufs used in Google APIs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "hail" +version = "0.2.122" +description = "Scalable library for exploring and analyzing genomic data." +category = "dev" +optional = false +python-versions = ">=3.9" + +[package.dependencies] +aiodns = ">=2.0.0,<3" +aiohttp = ">=3.8.1,<4" +asyncinit = ">=0.2.4,<0.3" +avro = ">=1.10,<1.12" +azure-identity = ">=1.6.0,<2" +azure-mgmt-storage = "20.1.0" +azure-storage-blob = ">=12.11.0,<13" +bokeh = ">=3,<4" +boto3 = ">=1.17,<2.0" +botocore = ">=1.20,<2.0" +decorator = "<5" +Deprecated = ">=1.2.10,<1.3" +dill = ">=0.3.6,<0.4" +frozenlist = ">=1.3.1,<2" +google-auth = ">=2.14.1,<3" +google-auth-oauthlib = ">=0.5.2,<1" +google-cloud-storage = ">=1.25.0" +humanize = ">=1.0.0,<2" +janus = ">=0.6,<1.1" +jproperties = ">=2.1.1,<3" +nest-asyncio = ">=1.5.4,<2" +numpy = "<2" +orjson = ">=3.6.4,<4" +pandas = ">=2,<3" +parsimonious = "<1" +plotly = ">=5.5.0,<6" +protobuf = "3.20.2" +pyspark = ">=3.3.0,<3.4" +python-json-logger = ">=2.0.2,<3" +pyyaml = ">=6.0,<7.0" +requests = ">=2.25.1,<3" +rich = ">=12.6.0,<13" +scipy = ">1.2,<1.12" +sortedcontainers = ">=2.4.0,<3" +tabulate = ">=0.8.9,<1" +typer = ">=0.9.0,<1" +uvloop = {version = ">=0.16.0,<1", markers = "sys_platform != \"win32\""} + +[[package]] +name = "humanize" +version = "1.1.0" +description = "Python humanize utilities" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "ipython" +version = "8.15.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.9" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "janus" +version = "1.0.0" +description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[[package]] +name = "jedi" +version = "0.19.0" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "Jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jproperties" +version = "2.1.1" +description = "Java Property file parser and writer for Python" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.13,<2.0" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "MarkupSafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "msal" +version = "1.24.0" +description = "The Microsoft Authentication Library (MSAL) for Python library" +category = "dev" +optional = false +python-versions = ">=2.7" + +[package.dependencies] +cryptography = ">=0.6,<44" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.13.2,<0.14)"] + +[[package]] +name = "msal-extensions" +version = "1.0.0" +description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +msal = ">=0.4.1,<2.0.0" +portalocker = [ + {version = ">=1.0,<3", markers = "python_version >= \"3.5\" and platform_system != \"Windows\""}, + {version = ">=1.6,<3", markers = "python_version >= \"3.5\" and platform_system == \"Windows\""}, +] + +[[package]] +name = "msrest" +version = "0.7.1" +description = "AutoRest swagger generator Python client runtime." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +azure-core = ">=1.24.0" +certifi = ">=2017.4.17" +isodate = ">=0.6.0" +requests = ">=2.16,<3.0" +requests-oauthlib = ">=0.5.0" + +[package.extras] +async = ["aiodns", "aiohttp (>=3.0)"] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "nest-asyncio" +version = "1.5.8" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "numpy" +version = "1.25.2" +description = "Fundamental package for array computing in Python" +category = "dev" +optional = false +python-versions = ">=3.9" + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "orjson" +version = "3.9.7" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pandas" +version = "2.1.0" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" +optional = false +python-versions = ">=3.9" + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + +[[package]] +name = "parsimonious" +version = "0.10.0" +description = "(Soon to be) the fastest pure-Python PEG parser I could muster" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +regex = ">=2022.3.15" + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "Pillow" +version = "10.0.1" +description = "Python Imaging Library (Fork)" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "plotly" +version = "5.17.0" +description = "An open-source, interactive data visualization library for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +packaging = "*" +tenacity = ">=6.2.0" + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "portalocker" +version = "2.8.2" +description = "Wraps the portalocker recipe for easy usage" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "3.20.2" +description = "Protocol Buffers" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py4j" +version = "0.10.9.5" +description = "Enables Python programs to dynamically access arbitrary Java objects" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[[package]] +name = "pyasn1-modules" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + +[[package]] +name = "pycares" +version = "4.3.0" +description = "Python interface for c-ares" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +cffi = ">=1.5.0" + +[package.extras] +idna = ["idna (>=2.1)"] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "Pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "PyJWT" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyspark" +version = "3.3.3" +description = "Apache Spark Python API" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +py4j = "0.10.9.5" + +[package.extras] +ml = ["numpy (>=1.15)"] +mllib = ["numpy (>=1.15)"] +pandas_on_spark = ["numpy (>=1.15)", "pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] +sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "PyYAML" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "regex" +version = "2023.8.8" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rich" +version = "12.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" +optional = false +python-versions = ">=3.6.3,<4.0.0" + +[package.dependencies] +commonmark = ">=0.9.0,<0.10.0" +pygments = ">=2.6.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "dev" +optional = false +python-versions = ">=3.6,<4" + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "s3transfer" +version = "0.6.2" +description = "An Amazon S3 Transfer Manager" +category = "dev" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[package]] +name = "scipy" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.8" + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.10.0" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "dev" +optional = false +python-versions = ">=2" + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "xyzservices" +version = "2023.7.0" +description = "Source of XYZ tiles providers" +category = "dev" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "29e11461c9eebb7069b1426d42894beaf919f882955e6c5d8665b0b20c4c4219" + +[metadata.files] +aiodns = [ + {file = "aiodns-2.0.0-py2.py3-none-any.whl", hash = "sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de"}, + {file = "aiodns-2.0.0.tar.gz", hash = "sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d"}, +] +aiohttp = [ + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, +] +aiosignal = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] +appnope = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] +asttokens = [ + {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, + {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, +] +async-timeout = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] +asyncinit = [ + {file = "asyncinit-0.2.4-py3-none-any.whl", hash = "sha256:9f11291943488abd15a1463dad98452e3bd6b39e8e6d45bc7cc008a09825b11e"}, + {file = "asyncinit-0.2.4.tar.gz", hash = "sha256:4acaf614f4d6f78babd278bbacf21bd9f7756efc17cd5d7e1bae31ff770b3cfa"}, +] +attrs = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] +avro = [ + {file = "avro-1.11.2.tar.gz", hash = "sha256:53dcd5bffccb9a72136f08d0b18771795eaf4eefb028bbaaed5f4e1787f0e268"}, +] +azure-common = [ + {file = "azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3"}, + {file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"}, +] +azure-core = [ + {file = "azure-core-1.29.4.tar.gz", hash = "sha256:500b3aa9bf2e90c5ccc88bb105d056114ca0ce7d0ce73afb8bc4d714b2fc7568"}, + {file = "azure_core-1.29.4-py3-none-any.whl", hash = "sha256:b03261bcba22c0b9290faf9999cedd23e849ed2577feee90515694cea6bc74bf"}, +] +azure-identity = [ + {file = "azure-identity-1.14.0.zip", hash = "sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1"}, + {file = "azure_identity-1.14.0-py3-none-any.whl", hash = "sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b"}, +] +azure-mgmt-core = [ + {file = "azure-mgmt-core-1.4.0.zip", hash = "sha256:d195208340094f98e5a6661b781cde6f6a051e79ce317caabd8ff97030a9b3ae"}, + {file = "azure_mgmt_core-1.4.0-py3-none-any.whl", hash = "sha256:81071675f186a585555ef01816f2774d49c1c9024cb76e5720c3c0f6b337bb7d"}, +] +azure-mgmt-storage = [ + {file = "azure-mgmt-storage-20.1.0.zip", hash = "sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451"}, + {file = "azure_mgmt_storage-20.1.0-py3-none-any.whl", hash = "sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659"}, +] +azure-storage-blob = [ + {file = "azure-storage-blob-12.18.1.tar.gz", hash = "sha256:d3265c2403c28d8881326c365e9cf7ed2ad55fdac98404eae753548702b31ba2"}, + {file = "azure_storage_blob-12.18.1-py3-none-any.whl", hash = "sha256:00b92568e91d608c04dfd4814c3b180818e690023493bb984c22dfc1a8a96e55"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +bokeh = [ + {file = "bokeh-3.2.2-py3-none-any.whl", hash = "sha256:e31670a013e1ff15c3d4d04f587c8162c4cc9fe1af507fd741d295e6c4e1225b"}, + {file = "bokeh-3.2.2.tar.gz", hash = "sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff"}, +] +boto3 = [ + {file = "boto3-1.28.49-py3-none-any.whl", hash = "sha256:519639859a3c829ccf7073a58b3716cb26cb5906e306fe63eb4beab68bf9bfab"}, + {file = "boto3-1.28.49.tar.gz", hash = "sha256:c9fad1b01a1d7e7bd51150b3175b4c32b79d699ce94708082611f59fde2e097a"}, +] +botocore = [ + {file = "botocore-1.31.49-py3-none-any.whl", hash = "sha256:7d64cb45154e4f34f3a45f551e118caad7379ae831565639e0afe5b2af126c61"}, + {file = "botocore-1.31.49.tar.gz", hash = "sha256:95e9716f27f67d4207f260ab0ea157603ca544d3b82c5f21728b1c732bec1817"}, +] +cachetools = [ + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, +] +cattrs = [ + {file = "cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"}, + {file = "cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657"}, +] +certifi = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +charset-normalizer = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] +click = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +contourpy = [ + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] +cryptography = [ + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, +] +decorator = [ + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, +] +Deprecated = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] +dill = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] +elasticsearch = [ + {file = "elasticsearch-7.17.9-py2.py3-none-any.whl", hash = "sha256:0e2454645dc00517dee4c6de3863411a9c5f1955d013c5fefa29123dadc92f98"}, + {file = "elasticsearch-7.17.9.tar.gz", hash = "sha256:66c4ece2adfe7cc120e2b6a6798a1fd5c777aecf82eec39bb95cef7cfc7ea2b3"}, +] +exceptiongroup = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] +executing = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] +frozenlist = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] +google-api-core = [ + {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, + {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, +] +google-auth = [ + {file = "google-auth-2.23.0.tar.gz", hash = "sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a"}, + {file = "google_auth-2.23.0-py2.py3-none-any.whl", hash = "sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7"}, +] +google-auth-oauthlib = [ + {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, + {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, +] +google-cloud-core = [ + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, +] +google-cloud-storage = [ + {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, + {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, +] +google-crc32c = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] +google-resumable-media = [ + {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, + {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, +] +googleapis-common-protos = [ + {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, + {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, +] +hail = [ + {file = "hail-0.2.122-py3-none-any.whl", hash = "sha256:e1607fe60da9ab4a7abe8671ec0d233a6f1497031d4a219f70384f5f1b3cc116"}, +] +humanize = [ + {file = "humanize-1.1.0-py3-none-any.whl", hash = "sha256:3959c76f1f6c9b43258bb0b0f6b6161d6c07b8717b306c0b713ea36b7999331e"}, + {file = "humanize-1.1.0.tar.gz", hash = "sha256:ad83016fae2453a7486f5be5dba8e19883020c77f6c12c63702f3b6c15ae3c5e"}, +] +idna = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +iniconfig = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] +ipython = [ + {file = "ipython-8.15.0-py3-none-any.whl", hash = "sha256:45a2c3a529296870a97b7de34eda4a31bee16bc7bf954e07d39abe49caf8f887"}, + {file = "ipython-8.15.0.tar.gz", hash = "sha256:2baeb5be6949eeebf532150f81746f8333e2ccce02de1c7eedde3f23ed5e9f1e"}, +] +isodate = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] +janus = [ + {file = "janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a"}, + {file = "janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"}, +] +jedi = [ + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, +] +Jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +jmespath = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] +jproperties = [ + {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, + {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, +] +loguru = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] +MarkupSafe = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] +msal = [ + {file = "msal-1.24.0-py2.py3-none-any.whl", hash = "sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50"}, + {file = "msal-1.24.0.tar.gz", hash = "sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e"}, +] +msal-extensions = [ + {file = "msal-extensions-1.0.0.tar.gz", hash = "sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354"}, + {file = "msal_extensions-1.0.0-py2.py3-none-any.whl", hash = "sha256:91e3db9620b822d0ed2b4d1850056a0f133cba04455e62f11612e40f5502f2ee"}, +] +msrest = [ + {file = "msrest-0.7.1-py3-none-any.whl", hash = "sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32"}, + {file = "msrest-0.7.1.zip", hash = "sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9"}, +] +multidict = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] +numpy = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, +] +oauthlib = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] +orjson = [ + {file = "orjson-3.9.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6df858e37c321cefbf27fe7ece30a950bcc3a75618a804a0dcef7ed9dd9c92d"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5198633137780d78b86bb54dafaaa9baea698b4f059456cd4554ab7009619221"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e736815b30f7e3c9044ec06a98ee59e217a833227e10eb157f44071faddd7c5"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a19e4074bc98793458b4b3ba35a9a1d132179345e60e152a1bb48c538ab863c4"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80acafe396ab689a326ab0d80f8cc61dec0dd2c5dca5b4b3825e7b1e0132c101"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:355efdbbf0cecc3bd9b12589b8f8e9f03c813a115efa53f8dc2a523bfdb01334"}, + {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3aab72d2cef7f1dd6104c89b0b4d6b416b0db5ca87cc2fac5f79c5601f549cc2"}, + {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36b1df2e4095368ee388190687cb1b8557c67bc38400a942a1a77713580b50ae"}, + {file = "orjson-3.9.7-cp310-none-win32.whl", hash = "sha256:e94b7b31aa0d65f5b7c72dd8f8227dbd3e30354b99e7a9af096d967a77f2a580"}, + {file = "orjson-3.9.7-cp310-none-win_amd64.whl", hash = "sha256:82720ab0cf5bb436bbd97a319ac529aee06077ff7e61cab57cee04a596c4f9b4"}, + {file = "orjson-3.9.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1f8b47650f90e298b78ecf4df003f66f54acdba6a0f763cc4df1eab048fe3738"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f738fee63eb263530efd4d2e9c76316c1f47b3bbf38c1bf45ae9625feed0395e"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38e34c3a21ed41a7dbd5349e24c3725be5416641fdeedf8f56fcbab6d981c900"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21a3344163be3b2c7e22cef14fa5abe957a892b2ea0525ee86ad8186921b6cf0"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23be6b22aab83f440b62a6f5975bcabeecb672bc627face6a83bc7aeb495dc7e"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5205ec0dfab1887dd383597012199f5175035e782cdb013c542187d280ca443"}, + {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8769806ea0b45d7bf75cad253fba9ac6700b7050ebb19337ff6b4e9060f963fa"}, + {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f9e01239abea2f52a429fe9d95c96df95f078f0172489d691b4a848ace54a476"}, + {file = "orjson-3.9.7-cp311-none-win32.whl", hash = "sha256:8bdb6c911dae5fbf110fe4f5cba578437526334df381b3554b6ab7f626e5eeca"}, + {file = "orjson-3.9.7-cp311-none-win_amd64.whl", hash = "sha256:9d62c583b5110e6a5cf5169ab616aa4ec71f2c0c30f833306f9e378cf51b6c86"}, + {file = "orjson-3.9.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3cee5c23979deb8d1b82dc4cc49be59cccc0547999dbe9adb434bb7af11cf7"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a347d7b43cb609e780ff8d7b3107d4bcb5b6fd09c2702aa7bdf52f15ed09fa09"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:154fd67216c2ca38a2edb4089584504fbb6c0694b518b9020ad35ecc97252bb9"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea3e63e61b4b0beeb08508458bdff2daca7a321468d3c4b320a758a2f554d31"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb0b0b2476f357eb2975ff040ef23978137aa674cd86204cfd15d2d17318588"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b9a20a03576c6b7022926f614ac5a6b0914486825eac89196adf3267c6489d"}, + {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:915e22c93e7b7b636240c5a79da5f6e4e84988d699656c8e27f2ac4c95b8dcc0"}, + {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f26fb3e8e3e2ee405c947ff44a3e384e8fa1843bc35830fe6f3d9a95a1147b6e"}, + {file = "orjson-3.9.7-cp312-none-win_amd64.whl", hash = "sha256:d8692948cada6ee21f33db5e23460f71c8010d6dfcfe293c9b96737600a7df78"}, + {file = "orjson-3.9.7-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7bab596678d29ad969a524823c4e828929a90c09e91cc438e0ad79b37ce41166"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ef3d371ea0b7239ace284cab9cd00d9c92b73119a7c274b437adb09bda35e6"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f8fcf696bbbc584c0c7ed4adb92fd2ad7d153a50258842787bc1524e50d7081"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90fe73a1f0321265126cbba13677dcceb367d926c7a65807bd80916af4c17047"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45a47f41b6c3beeb31ac5cf0ff7524987cfcce0a10c43156eb3ee8d92d92bf22"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a2937f528c84e64be20cb80e70cea76a6dfb74b628a04dab130679d4454395c"}, + {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b4fb306c96e04c5863d52ba8d65137917a3d999059c11e659eba7b75a69167bd"}, + {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:410aa9d34ad1089898f3db461b7b744d0efcf9252a9415bbdf23540d4f67589f"}, + {file = "orjson-3.9.7-cp37-none-win32.whl", hash = "sha256:26ffb398de58247ff7bde895fe30817a036f967b0ad0e1cf2b54bda5f8dcfdd9"}, + {file = "orjson-3.9.7-cp37-none-win_amd64.whl", hash = "sha256:bcb9a60ed2101af2af450318cd89c6b8313e9f8df4e8fb12b657b2e97227cf08"}, + {file = "orjson-3.9.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5da9032dac184b2ae2da4bce423edff7db34bfd936ebd7d4207ea45840f03905"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7951af8f2998045c656ba8062e8edf5e83fd82b912534ab1de1345de08a41d2b"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8e59650292aa3a8ea78073fc84184538783966528e442a1b9ed653aa282edcf"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9274ba499e7dfb8a651ee876d80386b481336d3868cba29af839370514e4dce0"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca1706e8b8b565e934c142db6a9592e6401dc430e4b067a97781a997070c5378"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cc275cf6dcb1a248e1876cdefd3f9b5f01063854acdfd687ec360cd3c9712a"}, + {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:11c10f31f2c2056585f89d8229a56013bc2fe5de51e095ebc71868d070a8dd81"}, + {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cf334ce1d2fadd1bf3e5e9bf15e58e0c42b26eb6590875ce65bd877d917a58aa"}, + {file = "orjson-3.9.7-cp38-none-win32.whl", hash = "sha256:76a0fc023910d8a8ab64daed8d31d608446d2d77c6474b616b34537aa7b79c7f"}, + {file = "orjson-3.9.7-cp38-none-win_amd64.whl", hash = "sha256:7a34a199d89d82d1897fd4a47820eb50947eec9cda5fd73f4578ff692a912f89"}, + {file = "orjson-3.9.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e7e7f44e091b93eb39db88bb0cb765db09b7a7f64aea2f35e7d86cbf47046c65"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d647b2a9c45a23a84c3e70e19d120011cba5f56131d185c1b78685457320bb"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0eb850a87e900a9c484150c414e21af53a6125a13f6e378cf4cc11ae86c8f9c5"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f4b0042d8388ac85b8330b65406c84c3229420a05068445c13ca28cc222f1f7"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd3e7aae977c723cc1dbb82f97babdb5e5fbce109630fbabb2ea5053523c89d3"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c616b796358a70b1f675a24628e4823b67d9e376df2703e893da58247458956"}, + {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3ba725cf5cf87d2d2d988d39c6a2a8b6fc983d78ff71bc728b0be54c869c884"}, + {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4891d4c934f88b6c29b56395dfc7014ebf7e10b9e22ffd9877784e16c6b2064f"}, + {file = "orjson-3.9.7-cp39-none-win32.whl", hash = "sha256:14d3fb6cd1040a4a4a530b28e8085131ed94ebc90d72793c59a713de34b60838"}, + {file = "orjson-3.9.7-cp39-none-win_amd64.whl", hash = "sha256:9ef82157bbcecd75d6296d5d8b2d792242afcd064eb1ac573f8847b52e58f677"}, + {file = "orjson-3.9.7.tar.gz", hash = "sha256:85e39198f78e2f7e054d296395f6c96f5e02892337746ef5b6a1bf3ed5910142"}, +] +packaging = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] +pandas = [ + {file = "pandas-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:40dd20439ff94f1b2ed55b393ecee9cb6f3b08104c2c40b0cb7186a2f0046242"}, + {file = "pandas-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4f38e4fedeba580285eaac7ede4f686c6701a9e618d8a857b138a126d067f2f"}, + {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6a0fe052cf27ceb29be9429428b4918f3740e37ff185658f40d8702f0b3e09"}, + {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d81e1813191070440d4c7a413cb673052b3b4a984ffd86b8dd468c45742d3cc"}, + {file = "pandas-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb20252720b1cc1b7d0b2879ffc7e0542dd568f24d7c4b2347cb035206936421"}, + {file = "pandas-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:38f74ef7ebc0ffb43b3d633e23d74882bce7e27bfa09607f3c5d3e03ffd9a4a5"}, + {file = "pandas-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cda72cc8c4761c8f1d97b169661f23a86b16fdb240bdc341173aee17e4d6cedd"}, + {file = "pandas-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d97daeac0db8c993420b10da4f5f5b39b01fc9ca689a17844e07c0a35ac96b4b"}, + {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c58b1113892e0c8078f006a167cc210a92bdae23322bb4614f2f0b7a4b510f"}, + {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:629124923bcf798965b054a540f9ccdfd60f71361255c81fa1ecd94a904b9dd3"}, + {file = "pandas-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:70cf866af3ab346a10debba8ea78077cf3a8cd14bd5e4bed3d41555a3280041c"}, + {file = "pandas-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d53c8c1001f6a192ff1de1efe03b31a423d0eee2e9e855e69d004308e046e694"}, + {file = "pandas-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86f100b3876b8c6d1a2c66207288ead435dc71041ee4aea789e55ef0e06408cb"}, + {file = "pandas-2.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28f330845ad21c11db51e02d8d69acc9035edfd1116926ff7245c7215db57957"}, + {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a6ccf0963db88f9b12df6720e55f337447aea217f426a22d71f4213a3099a6"}, + {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99e678180bc59b0c9443314297bddce4ad35727a1a2656dbe585fd78710b3b9"}, + {file = "pandas-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644"}, + {file = "pandas-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437"}, + {file = "pandas-2.1.0.tar.gz", hash = "sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918"}, +] +parsimonious = [ + {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, + {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, +] +parso = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +Pillow = [ + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, +] +plotly = [ + {file = "plotly-5.17.0-py2.py3-none-any.whl", hash = "sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3"}, + {file = "plotly-5.17.0.tar.gz", hash = "sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97"}, +] +pluggy = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] +portalocker = [ + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] +protobuf = [ + {file = "protobuf-3.20.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559"}, + {file = "protobuf-3.20.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804"}, + {file = "protobuf-3.20.2-cp310-cp310-win32.whl", hash = "sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c"}, + {file = "protobuf-3.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f"}, + {file = "protobuf-3.20.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0"}, + {file = "protobuf-3.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d"}, + {file = "protobuf-3.20.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b"}, + {file = "protobuf-3.20.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359"}, + {file = "protobuf-3.20.2-cp37-cp37m-win32.whl", hash = "sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe"}, + {file = "protobuf-3.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334"}, + {file = "protobuf-3.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a"}, + {file = "protobuf-3.20.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0"}, + {file = "protobuf-3.20.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978"}, + {file = "protobuf-3.20.2-cp38-cp38-win32.whl", hash = "sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151"}, + {file = "protobuf-3.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3"}, + {file = "protobuf-3.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d"}, + {file = "protobuf-3.20.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb"}, + {file = "protobuf-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3"}, + {file = "protobuf-3.20.2-cp39-cp39-win32.whl", hash = "sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1"}, + {file = "protobuf-3.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422"}, + {file = "protobuf-3.20.2-py2.py3-none-any.whl", hash = "sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019"}, + {file = "protobuf-3.20.2.tar.gz", hash = "sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +pure-eval = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] +py4j = [ + {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"}, + {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"}, +] +pyasn1 = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] +pyasn1-modules = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] +pycares = [ + {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824"}, + {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136"}, + {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4"}, + {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4"}, + {file = "pycares-4.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf"}, + {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452"}, + {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6"}, + {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515"}, + {file = "pycares-4.3.0-cp310-cp310-win32.whl", hash = "sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974"}, + {file = "pycares-4.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329"}, + {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566"}, + {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a"}, + {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080"}, + {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323"}, + {file = "pycares-4.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079"}, + {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4"}, + {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb"}, + {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2"}, + {file = "pycares-4.3.0-cp311-cp311-win32.whl", hash = "sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe"}, + {file = "pycares-4.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903"}, + {file = "pycares-4.3.0-cp36-cp36m-win32.whl", hash = "sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9"}, + {file = "pycares-4.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783"}, + {file = "pycares-4.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac"}, + {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7"}, + {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5"}, + {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8"}, + {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de"}, + {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef"}, + {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9"}, + {file = "pycares-4.3.0-cp37-cp37m-win32.whl", hash = "sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e"}, + {file = "pycares-4.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7"}, + {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d"}, + {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae"}, + {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164"}, + {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088"}, + {file = "pycares-4.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd"}, + {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e"}, + {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d"}, + {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791"}, + {file = "pycares-4.3.0-cp38-cp38-win32.whl", hash = "sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0"}, + {file = "pycares-4.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be"}, + {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8"}, + {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9"}, + {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804"}, + {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161"}, + {file = "pycares-4.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7"}, + {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0"}, + {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587"}, + {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4"}, + {file = "pycares-4.3.0-cp39-cp39-win32.whl", hash = "sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc"}, + {file = "pycares-4.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5"}, + {file = "pycares-4.3.0.tar.gz", hash = "sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +Pygments = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] +PyJWT = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] +pyspark = [ + {file = "pyspark-3.3.3.tar.gz", hash = "sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f"}, +] +pytest = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-json-logger = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] +pytz = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] +pywin32 = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] +PyYAML = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] +regex = [ + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, +] +requests = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] +requests-oauthlib = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] +rich = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] +rsa = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] +s3transfer = [ + {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, + {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, +] +scipy = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +sortedcontainers = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] +stack-data = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] +tabulate = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] +tenacity = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tornado = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] +tqdm = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] +traitlets = [ + {file = "traitlets-5.10.0-py3-none-any.whl", hash = "sha256:417745a96681fbb358e723d5346a547521f36e9bd0d50ba7ab368fff5d67aa54"}, + {file = "traitlets-5.10.0.tar.gz", hash = "sha256:f584ea209240466e66e91f3c81aa7d004ba4cf794990b0c775938a1544217cd1"}, +] +typer = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] +typing-extensions = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] +tzdata = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] +urllib3 = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] +uvloop = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] +wcwidth = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] +win32-setctime = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] +wrapt = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] +xyzservices = [ + {file = "xyzservices-2023.7.0-py3-none-any.whl", hash = "sha256:88e9cbf22b31a2f9c1b242e2b18690f5c705f0e539c9bfd37a10399e1037731b"}, + {file = "xyzservices-2023.7.0.tar.gz", hash = "sha256:0ec928742227d6f5d4367ea7b457fcfed943429f4de2949b5b02a82cdf5569d6"}, +] +yarl = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] diff --git a/data-pipeline/pyproject.toml b/data-pipeline/pyproject.toml new file mode 100644 index 000000000..4b63b4164 --- /dev/null +++ b/data-pipeline/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "data-pipeline" +version = "0.1.0" +description = "" +authors = ["gnomAD team "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.9" +elasticsearch = ">=7.17,<8.0" +tqdm = "^4.66.1" +loguru = "^0.7.2" + + +[tool.poetry.group.dev.dependencies] +attrs = "^23.1.0" +cattrs = "^23.1.2" +hail = "^0.2.122" +pytest = "^7.4.2" +ipython = "^8.15.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 4a1f83040cd71e5bcafc750f09b13a4f17adf15d Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 18 Sep 2023 13:58:23 -0400 Subject: [PATCH 005/106] Add input ht types and basic validation test --- .../gnomad_v4/types/initial_globals.py | 111 +++++++ .../gnomad_v4/types/initial_variant.py | 302 ++++++++++++++++++ data-pipeline/tests/v4/test_inputs.py | 38 +++ 3 files changed, 451 insertions(+) create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py create mode 100644 data-pipeline/tests/v4/test_inputs.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py new file mode 100644 index 000000000..66c825950 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py @@ -0,0 +1,111 @@ +import attr +from typing import List, Dict, Tuple + + +@attr.define +class FilteringModelFeature: + a_index: int + n_alt_alleles: int + AS_pab_max: float + AS_MQRankSum: float + AS_SOR: float + AS_ReadPosRankSum: float + + +@attr.define +class FeatureMedians: + key: List[str] + value: FilteringModelFeature + + +@attr.define +class TestResult: + rf_prediction: str + rf_label: str + n: int + + +@attr.define +class Cutoff: + bin: float + min_score: float + + +@attr.define +class MetaString: + key: str + value: str + + +@attr.define +class MetaInt: + key: str + value: int + + +@attr.define +class MetaFloat: + key: List[str] + value: float + + +@attr.define +class FilteringModel: + model_name: str + score_name: str + feature_medians: List[FeatureMedians] + variants_by_strata: List[MetaFloat] + features_importance: List[MetaFloat] + features: List[str] + test_results: List[TestResult] + rf_snv_cutoff: Cutoff + rf_indel_cutoff: Cutoff + inbreeding_cutoff: float + model_id: str + + +@attr.define +class ToolVersions: + dbsnp_version: str + cadd_version: str + revel_version: str + splicaai_version: str + primateai_version: str + pangolin_version: str + vrs_version: str + + +@attr.define +class VepGlobals: + vep_version: str + vep_csq_header: str + vep_help: str + vep_config: str + + +@attr.define +class AgeDistribution: + bin_edges: List[float] + bin_freq: List[int] + n_smaller: int + n_larger: int + + +@attr.define +class Globals: + freq_meta: List[List[MetaString]] + freq_index_dict: List[MetaInt] + faf_meta: List[List[MetaString]] + faf_index_dict: List[MetaInt] + freq_sample_count: List[int] + filtering_model: FilteringModel + tool_versions: ToolVersions + vep_globals: VepGlobals + age_distribution: AgeDistribution + age_index_dict: List[MetaInt] + age_meta: List[List[MetaString]] + grpmax_index_dict: List[MetaInt] + grpmax_meta: List[List[MetaString]] + README: List[MetaString] + gnomad_qc_repo: str + gnomad_methods_repo: str diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py new file mode 100644 index 000000000..0e4e36978 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -0,0 +1,302 @@ +import attr +from typing import List, Dict, Optional, Set, Tuple, Union + + +# Locus Type +@attr.define +class Locus: + contig: str + position: int + + +# Various Structures +@attr.define +class Frequency: + AC: int + AN: int + homozygote_count: int + AF: Union[float, None] + + +@attr.define +class Grpmax: + AC: Union[int, None] + AN: Union[int, None] + homozygote_count: Union[int, None] + AF: Union[float, None] + grp: Union[str, None] + faf95: Union[float, None] + + +# Many rows in sample data are (NA, NA,... etc) +# +---------------------------------------------------------------------------------------------+ +# | grpmax | +# +---------------------------------------------------------------------------------------------+ +# | array Date: Tue, 19 Sep 2023 12:59:21 -0400 Subject: [PATCH 006/106] Add data_pipline types and helpers --- data-pipeline/pyproject.toml | 3 + data-pipeline/src/data_pipeline/__init__.py | 1 + data-pipeline/src/data_pipeline/config.py | 56 +++++++++++++ .../src/data_pipeline/helpers/logging.py | 25 ++++++ data-pipeline/src/data_pipeline/pipeline.py | 82 +++++++++++++------ 5 files changed, 140 insertions(+), 27 deletions(-) create mode 100644 data-pipeline/src/data_pipeline/config.py create mode 100644 data-pipeline/src/data_pipeline/helpers/logging.py diff --git a/data-pipeline/pyproject.toml b/data-pipeline/pyproject.toml index 4b63b4164..82673f89c 100644 --- a/data-pipeline/pyproject.toml +++ b/data-pipeline/pyproject.toml @@ -22,3 +22,6 @@ ipython = "^8.15.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.black] +line-length = 120 diff --git a/data-pipeline/src/data_pipeline/__init__.py b/data-pipeline/src/data_pipeline/__init__.py index e69de29bb..91e8a700b 100644 --- a/data-pipeline/src/data_pipeline/__init__.py +++ b/data-pipeline/src/data_pipeline/__init__.py @@ -0,0 +1 @@ +from data_pipeline.helpers.logging import * diff --git a/data-pipeline/src/data_pipeline/config.py b/data-pipeline/src/data_pipeline/config.py new file mode 100644 index 000000000..32d3ec636 --- /dev/null +++ b/data-pipeline/src/data_pipeline/config.py @@ -0,0 +1,56 @@ +import os +import attr +from pathlib import Path +from hail import Optional + +DATA_ENV = os.getenv("DATA_ENV", "local") + + +@attr.define +class DataPaths: + root: str + + @classmethod + def create(cls, root=None, **kwargs): + dataset_paths = {} + + if root: + dataset_attrs = attr.fields(DataPaths) + + for ds in dataset_attrs: + if ds.name == "root": + dataset_paths.update({"root": root}) + + for item, path in kwargs.items(): + if item in dataset_paths: + dataset_paths.update({item: path}) + + return cls(**dataset_paths) + + def make_local_folder(self): + if "gs://" not in self.data_path: + Path(self.data_path).mkdir(parents=True, exist_ok=True) + + +# @attr.define +# class GnomadV4 +# gnomad_v4_exome_variants_sites_ht_path: str = "external_datasets/mock_v4_release.ht" + + +@attr.define +class PipelineConfig: + data_paths: DataPaths + compute_env: str = "local" + data_env: str = "tiny" + + +config = PipelineConfig( + data_env="local", + data_paths=DataPaths.create(os.path.join("data")), +) + + +if DATA_ENV == "dataproc": + config = PipelineConfig( + data_paths=DataPaths.create(os.path.join("gs://gnomad-matt-data-pipeline")), + ) diff --git a/data-pipeline/src/data_pipeline/helpers/logging.py b/data-pipeline/src/data_pipeline/helpers/logging.py new file mode 100644 index 000000000..3bfb5ae86 --- /dev/null +++ b/data-pipeline/src/data_pipeline/helpers/logging.py @@ -0,0 +1,25 @@ +import json +import sys + +from cattrs import unstructure +from loguru import logger + +config = { + "handlers": [ + { + "sink": sys.stdout, + "format": "{time:YYYY-MM-DDTHH:mm} | {level: <8} | {name}:{function}:{line} - {message}", # noqa + }, + ] +} + +logger.configure(**config) +logger.level("CONFIG", no=38, icon="🐍") + +# clear log file after each run +log_file = open("out.log", "w") +logger.add("out.log", backtrace=True, diagnose=True) + + +def log_json(obj): + logger.info(json.dumps(unstructure(obj), indent=2)) diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index 5958a4276..5db3a362f 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -6,10 +6,13 @@ import subprocess import tempfile import time +from typing import List, Optional, Union +import attr from collections import OrderedDict import hail as hl +from data_pipeline.config import config logger = logging.getLogger("gnomad_data_pipeline") logger.setLevel(logging.INFO) @@ -56,12 +59,18 @@ def modified_time(path): _pipeline_config = {} +_pipeline_config["output_root"] = config.data_paths.root + +@attr.define class DownloadTask: - def __init__(self, name, url, output_path): - self._name = name - self._url = url - self._output_path = output_path + _name: str + _url: str + _output_path: str + + @classmethod + def create(cls, name, url, output_path): + return cls(name, url, output_path) def get_output_path(self): return _pipeline_config["output_root"] + self._output_path @@ -95,19 +104,34 @@ def run(self, force=False): logger.info("Skipping %s", self._name) +@attr.define class Task: - def __init__(self, name, work, output_path, inputs=None, params=None): - self._name = name - self._work = work - self._output_path = output_path - self._inputs = inputs or {} - self._params = params or {} + _name: str + _task_function: str + _output_path: str + _inputs: dict + _params: dict + + @classmethod + def create( + cls, name: str, task_function: str, output_path: str, inputs: Optional[dict] = {}, params: Optional[dict] = {} + ): + return cls(name, task_function, output_path, inputs, params) def get_output_path(self): return _pipeline_config["output_root"] + self._output_path def get_inputs(self): - return {k: v.get_output_path() if isinstance(v, (Task, DownloadTask)) else v for k, v in self._inputs.items()} + paths = {} + + for k, v in self._inputs.items(): + if isinstance(v, (Task, DownloadTask)): + paths.update({k: v.get_output_path()}) + else: + new_path = os.path.join(config.data_paths.root, v) + paths.update({k: os.path.join(config.data_paths.root, v)}) + + return paths def should_run(self): output_path = self.get_output_path() @@ -129,7 +153,7 @@ def run(self, force=False): if should_run: logger.info("Running %s (%s)", self._name, reason) start = time.perf_counter() - result = self._work(**self.get_inputs(), **self._params) + result = self._task_function(**self.get_inputs(), **self._params) result.write(output_path, overwrite=True) # pylint: disable=unexpected-keyword-arg stop = time.perf_counter() elapsed = stop - start @@ -138,28 +162,31 @@ def run(self, force=False): logger.info("Skipping %s", self._name) +@attr.define class Pipeline: - def __init__(self): - self._tasks = OrderedDict() - self._outputs = {} - - def add_task(self, name, *args, **kwargs): - task = Task(name, *args, **kwargs) + name: str + _tasks: OrderedDict = OrderedDict() + _outputs: dict = {} + + def add_task( + self, name: str, task_function: str, output_path: str, inputs: Optional[dict] = {}, params: Optional[dict] = {} + ): + task = Task.create(name, task_function, output_path, inputs, params) self._tasks[name] = task return task - def add_download_task(self, name, *args, **kwargs): - task = DownloadTask(name, *args, **kwargs) + def add_download_task(self, name, *args, **kwargs) -> DownloadTask: + task = DownloadTask.create(name, *args, **kwargs) self._tasks[name] = task return task - def get_task(self, name): + def get_task(self, name: str) -> Union[Task, DownloadTask]: try: return self._tasks[name] except KeyError as error: raise ValueError(f"Pipeline contains no task named '{name}'") from error - def get_all_tasks(self): + def get_all_task_names(self) -> List[str]: return list(self._tasks.keys()) def run(self, force_tasks=None): @@ -178,20 +205,21 @@ def get_output(self, output_name): def run_pipeline(pipeline): - tasks = pipeline.get_all_tasks() + task_names = pipeline.get_all_task_names() parser = argparse.ArgumentParser() - parser.add_argument("--output-root", required=True) + parser.add_argument("--output-root") group = parser.add_mutually_exclusive_group() - group.add_argument("--force", choices=tasks, nargs="+") + group.add_argument("--force", choices=task_names, nargs="+") group.add_argument("--force-all", action="store_true") args = parser.parse_args() - _pipeline_config["output_root"] = args.output_root.rstrip("/") + if args.output_root: + _pipeline_config["output_root"] = args.output_root.rstrip("/") pipeline_args = {} if args.force_all: - pipeline_args["force_tasks"] = tasks + pipeline_args["force_tasks"] = task_names elif args.force: pipeline_args["force_tasks"] = args.force From 71d2b3b570761936ffbe972968b3d9847089a042 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 19 Sep 2023 13:01:26 -0400 Subject: [PATCH 007/106] Add ht schema generation workflow --- .../input_path/mock_v4_release.ht.schema | 338 ++++++++++++++++++ .../gnomad_v4_exome_variants_base.ht.schema | 334 +++++++++++++++++ .../datasets/gnomad_v4/gnomad_v4_variants.py | 28 +- .../gnomad_v4/types/initial_variant.py | 76 ++-- .../data_pipeline/helpers/write_schemas.py | 61 ++++ .../pipelines/gnomad_v4_variants.py | 75 ++-- 6 files changed, 829 insertions(+), 83 deletions(-) create mode 100644 data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema create mode 100644 data-pipeline/src/data_pipeline/helpers/write_schemas.py diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema new file mode 100644 index 000000000..cb85362bc --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema @@ -0,0 +1,338 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'freq': array + 'grpmax': array + 'faf': array + 'a_index': int32 + 'was_split': bool + 'rsid': set + 'filters': set + 'info': struct { + QUALapprox: int64, + SB: array, + MQ: float64, + MQRankSum: float64, + VarDP: int32, + AS_ReadPosRankSum: float64, + AS_pab_max: float64, + AS_QD: float32, + AS_MQ: float64, + QD: float32, + AS_MQRankSum: float64, + FS: float64, + AS_FS: float64, + ReadPosRankSum: float64, + AS_QUALapprox: int64, + AS_SB_TABLE: array, + AS_VarDP: int32, + AS_SOR: float64, + SOR: float64, + singleton: bool, + transmitted_singleton: bool, + omni: bool, + mills: bool, + monoallelic: bool, + AS_VQSLOD: float64, + InbreedingCoeff: float64, + vrs: struct { + VRS_Allele_IDs: array, + VRS_Starts: array, + VRS_Ends: array, + VRS_States: array + } + } + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + polyphen_prediction: str, + polyphen_score: float64, + protein_end: int32, + protein_start: int32, + protein_id: str, + sift_prediction: str, + sift_score: float64, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'region_flag': struct { + lcr: bool, + segdup: bool, + non_par: bool + } + 'allele_info': struct { + variant_type: str, + allele_type: str, + n_alt_alleles: int32, + was_mixed: bool + } + 'histograms': struct { + qual_hists: struct { + gq_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + gq_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + ab_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + raw_qual_hists: struct { + gq_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + gq_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + ab_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + age_hists: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + age_hist_ht: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }> + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema new file mode 100644 index 000000000..89fba5a59 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema @@ -0,0 +1,334 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + polyphen_prediction: str, + polyphen_score: float64, + protein_end: int32, + protein_start: int32, + protein_id: str, + sift_prediction: str, + sift_score: float64, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py index cbd421034..2b8314b8e 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -15,8 +15,8 @@ def freq_index_key(subset=None, pop=None, sex=None, raw=False): return "-".join(parts) -def prepare_gnomad_v4_variants(path): - ds = hl.read_table(path) +def prepare_gnomad_v4_variants(input_path): + ds = hl.read_table(input_path) g = hl.eval(ds.globals) subsets = set(m.get("subset", None) for m in g.freq_meta) @@ -84,7 +84,7 @@ def subset_filter(subset): ds = ds.annotate(in_autosome_or_par=ds.locus.in_autosome_or_par()) ds = ds.annotate( - exome=hl.struct( + gnomad=hl.struct( freq=hl.struct( **{ subset @@ -124,15 +124,15 @@ def subset_filter(subset): # If a variant is not present in a subset, do not store population frequencies for that subset ds = ds.annotate( - exome=ds.exome.annotate( - freq=ds.exome.freq.annotate( + gnomad=ds.gnomad.annotate( + freq=ds.gnomad.freq.annotate( **{ subset - or "all": ds.exome.freq[subset or "all"].annotate( + or "all": ds.gnomad.freq[subset or "all"].annotate( populations=hl.if_else( - ds.exome.freq[subset or "all"].ac_raw == 0, - hl.empty_array(ds.exome.freq[subset or "all"].populations.dtype.element_type), - ds.exome.freq[subset or "all"].populations, + ds.gnomad.freq[subset or "all"].ac_raw == 0, + hl.empty_array(ds.gnomad.freq[subset or "all"].populations.dtype.element_type), + ds.gnomad.freq[subset or "all"].populations, ) ) for subset in subsets @@ -149,7 +149,7 @@ def subset_filter(subset): ds = ds.annotate( subsets=hl.set( - hl.array([(subset, ds.exome.freq[subset].ac_raw > 0) for subset in subsets if subset is not None]) + hl.array([(subset, ds.gnomad.freq[subset].ac_raw > 0) for subset in subsets if subset is not None]) .filter(lambda t: t[1]) .map(lambda t: t[0]) ) @@ -163,7 +163,7 @@ def subset_filter(subset): # Get popmax FAFs ds = ds.annotate( - exome=ds.exome.annotate( + gnomad=ds.gnomad.annotate( faf95=hl.rbind( hl.sorted( hl.array( @@ -196,7 +196,7 @@ def subset_filter(subset): hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), ), ), - ) + ), ) ds = ds.drop("faf") @@ -206,7 +206,7 @@ def subset_filter(subset): #################### ds = ds.annotate( - exome=ds.exome.annotate( + gnomad=ds.gnomad.annotate( age_distribution=hl.struct( het=ds.histograms.age_hists.age_hist_ht, hom=ds.histograms.age_hists.age_hist_hom ) @@ -218,7 +218,7 @@ def subset_filter(subset): ################### ds = ds.annotate( - exome=ds.exome.annotate( + gnomad=ds.gnomad.annotate( filters=ds.filters, quality_metrics=hl.struct( allele_balance=hl.struct( diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 0e4e36978..2d810ef5a 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -130,69 +130,69 @@ class Domain: @attr.define class TranscriptConsequence: - allele_num: int - amino_acids: str - appris: str - biotype: str + allele_num: Union[int, None] + amino_acids: Union[str, None] + appris: Union[str, None] + biotype: Union[str, None] canonical: Union[int, None] - ccds: str + ccds: Union[str, None] cdna_start: Union[int, None] cdna_end: Union[int, None] cds_end: Union[int, None] cds_start: Union[int, None] - codons: str + codons: Union[str, None] consequence_terms: List[str] - distance: int + distance: Union[int, None] domains: Union[List[Domain], None] - exon: str - flags: str - gene_id: str + exon: Union[str, None] + flags: Union[str, None] + gene_id: Union[str, None] gene_pheno: Union[int, None] - gene_symbol: str - gene_symbol_source: str - hgnc_id: str - hgvsc: str - hgvsp: str + gene_symbol: Union[str, None] + gene_symbol_source: Union[str, None] + hgnc_id: Union[str, None] + hgvsc: Union[str, None] + hgvsp: Union[str, None] hgvs_offset: Union[int, None] - impact: str - intron: str - lof: str - lof_flags: str - lof_filter: str - lof_info: str - mane_select: str - mane_plus_clinical: str + impact: Union[str, None] + intron: Union[str, None] + lof: Union[str, None] + lof_flags: Union[str, None] + lof_filter: Union[str, None] + lof_info: Union[str, None] + mane_select: Union[str, None] + mane_plus_clinical: Union[str, None] mirna: Union[List[str], None] - polyphen_prediction: str + polyphen_prediction: Union[str, None] polyphen_score: Union[float, None] protein_end: Union[int, None] protein_start: Union[int, None] - protein_id: str + protein_id: Union[str, None] sift_prediction: Union[str, None] sift_score: Union[float, None] - source: str - strand: int - transcript_id: str + source: Union[str, None] + strand: Union[int, None] + transcript_id: Union[str, None] tsl: Union[int, None] uniprot_isoform: Union[List[str], None] - variant_allele: str + variant_allele: Union[str, None] @attr.define class Vep: - allele_string: str - end: int - id: str - input: str + allele_string: Union[str, None] + end: Union[int, None] + id: Union[str, None] + input: Union[str, None] intergenic_consequences: Union[List[Consequence], None] - most_severe_consequence: str + most_severe_consequence: Union[str, None] motif_feature_consequences: Union[List[Consequence], None] regulatory_feature_consequences: Union[List[Consequence], None] - seq_region_name: str - start: int - strand: int + seq_region_name: Union[str, None] + start: Union[int, None] + strand: Union[int, None] transcript_consequences: List[TranscriptConsequence] - variant_class: str + variant_class: Union[str, None] @attr.define diff --git a/data-pipeline/src/data_pipeline/helpers/write_schemas.py b/data-pipeline/src/data_pipeline/helpers/write_schemas.py new file mode 100644 index 000000000..666ec99d0 --- /dev/null +++ b/data-pipeline/src/data_pipeline/helpers/write_schemas.py @@ -0,0 +1,61 @@ +import os +from pathlib import Path +import hail as hl +from loguru import logger + +from data_pipeline.pipelines.gnomad_v4_variants import ( + pipeline as gnomad_v4_variant_pipeline, +) + +from data_pipeline.pipeline import Task + +from data_pipeline.config import config + + +def make_dir(path): + Path(path).mkdir(parents=True, exist_ok=True) + + +SCHEMA_PATH = "schemas" + +pipelines = [gnomad_v4_variant_pipeline] + + +def schema_writer(schema_path): + def describe_handler(text): + make_dir(os.path.dirname(schema_path)) + with open(schema_path, "w") as file: + file.write(text) + + return describe_handler + + +for pipeline in pipelines: + pipeline_name = pipeline.name + task_names = pipeline.get_all_task_names() + out_dir = os.path.join(SCHEMA_PATH, pipeline_name) + + for task_name in task_names: + task = gnomad_v4_variant_pipeline.get_task(task_name) + inputs = task.get_inputs() + output_path = task.get_output_path() + + # logger.info(f"out dir {out_dir}") + logger.info(f"task_name: {task}") + logger.info(f"inputs {str(inputs)}") + logger.info(f"output_path {str(output_path)}") + + tables = { + **inputs, + "output": output_path, + } + + logger.info(tables) + + for table_name, table_path in tables.items(): + ht = hl.read_table(table_path) + schema_path = os.path.join( + SCHEMA_PATH, pipeline_name, task_name, table_name, f"{os.path.basename(table_path)}.schema" + ) + describe_handler = schema_writer(schema_path) + ht.describe(handler=describe_handler) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 0e53ea055..6da147d37 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,51 +1,64 @@ from data_pipeline.pipeline import Pipeline, run_pipeline -from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences - +from data_pipeline.config import config from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import prepare_gnomad_v4_variants -from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline -from data_pipeline.pipelines.genes import pipeline as genes_pipeline +# from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences +# from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline +# from data_pipeline.pipelines.genes import pipeline as genes_pipeline -pipeline = Pipeline() -pipeline.add_task( - "prepare_gnomad_v4_variants", - prepare_gnomad_v4_variants, - "/gnomad_v4/gnomad_v4_variants_base.ht", - {"path": "gs://gnomad-matt-data-pipeline/external_sources/2023-09-07-exome-variants-v4-mock/mock_v4_release.ht"}, -) +pipeline = Pipeline(name="gnomad_v4_variants") pipeline.add_task( - "annotate_gnomad_v4_variants", - annotate_variants, - "/gnomad_v4/gnomad_v4_variants_annotated_1.ht", - { - "variants_path": pipeline.get_task("prepare_gnomad_v4_variants"), - # We need to subset regions chr1:10030:10150 - "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), - "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), - # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", + name="prepare_gnomad_v4_exome_variants", + task_function=prepare_gnomad_v4_variants, + output_path="/gnomad_v4/gnomad_v4_exome_variants_base.ht", + inputs={ + "input_path": "external_datasets/mock_v4_release.ht", }, + # params={"sequencing_type": "exome"}, ) -pipeline.add_task( - "annotate_gnomad_v4_transcript_consequences", - annotate_transcript_consequences, - "/gnomad_v4/gnomad_v4_variants_annotated_2.ht", - { - "variants_path": pipeline.get_task("annotate_gnomad_v4_variants"), - "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), - "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), - }, -) +# pipeline.add_task( +# "prepare_gnomad_v4_genome_variants", +# prepare_gnomad_v4_variants, +# "/gnomad_v4/gnomad_v4_genome_variants_base.ht", +# { +# "path": "gs://gnomad-matt-data-pipeline/external_sources/2023-09-07-exome-variants-v4-mock/mock_v4_release.ht", +# "type": "genome", +# }, +# ) + +# pipeline.add_task( +# "annotate_gnomad_v4_variants", +# annotate_variants, +# "/gnomad_v4/gnomad_v4_variants_annotated_1.ht", +# { +# "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), +# "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), +# "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), +# # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", +# }, +# ) + +# pipeline.add_task( +# "annotate_gnomad_v4_transcript_consequences", +# annotate_transcript_consequences, +# "/gnomad_v4/gnomad_v4_variants_annotated_2.ht", +# { +# "variants_path": pipeline.get_task("annotate_gnomad_v4_variants"), +# "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), +# "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), +# }, +# ) ############################################### # Outputs ############################################### -pipeline.set_outputs({"variants": "annotate_gnomad_v4_transcript_consequences"}) +# pipeline.set_outputs({"variants": "annotate_gnomad_v4_transcript_consequences"}) ############################################### # Run From 7b59a9e1b7febaa12c36f18d2106c97366627cb3 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 19 Sep 2023 13:43:34 -0400 Subject: [PATCH 008/106] Add input validation for step 1 output --- .../gnomad_v4/types/prepare_variants_step1.py | 134 ++++++++++++++++++ data-pipeline/tests/v4/test_inputs.py | 29 +++- 2 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py new file mode 100644 index 000000000..2c3284c12 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py @@ -0,0 +1,134 @@ +import attr +from typing import List, Set, Dict, Union + + +from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( + InSilicoPredictors, + Vep, + TranscriptConsequence, + Rf, + InSilicoPredictors, + Grpmax, + Locus, +) + + +@attr.define +class Population: + id: str + ac: int + an: int + hemizygote_count: int + homozygote_count: int + + +@attr.define +class Freq: + ac: int + ac_raw: int + an: int + hemizygote_count: int + homozygote_count: int + populations: list[Population] + + +@attr.define +class FreqBySubset: + all: Freq + non_ukb: Freq + + +@attr.define +class FAF: + popmax: float + popmax_population: str + + +@attr.define +class BinDetails: + bin_edges: list[float] + bin_freq: list[int] + n_smaller: int + n_larger: int + + +@attr.define +class MetricsDetail: + bin_edges: list[float] + bin_freq: list[int] + n_smaller: int + n_larger: int + + +@attr.define +class MetricValue: + metric: str + value: Union[float, None] # Is it OK if some are none? + + +@attr.define +class AlleleBalanceQualityMetrics: + alt_adj: MetricsDetail + alt_raw: MetricsDetail + + +@attr.define +class GenotypeDepthQualityMetrics: + all_adj: MetricsDetail + all_raw: MetricsDetail + alt_adj: MetricsDetail + alt_raw: MetricsDetail + + +@attr.define +class GenotypeQualityQualityMetrics: + all_adj: MetricsDetail + all_raw: MetricsDetail + alt_adj: MetricsDetail + alt_raw: MetricsDetail + + +@attr.define +class QualityMetrics: + allele_balance: AlleleBalanceQualityMetrics + genotype_depth: GenotypeDepthQualityMetrics + genotype_quality: GenotypeQualityQualityMetrics + site_quality_metrics: List[MetricValue] + + +@attr.define +class AgeDistributions: + het: List[BinDetails] + hom: List[BinDetails] + + +@attr.define +class Gnomad: + freq: FreqBySubset + faf95: FAF + faf99: FAF + age_distribution: AgeDistributions + filters: set[str] + quality_metrics: QualityMetrics + + +@attr.define +class ColocatedVariants: + all: List[str] + non_ukb: List[str] + + +@attr.define +class Variant: + locus: Locus + alleles: list[str] + grpmax: List[Grpmax] + rsids: Union[Set[str], None] + vep: Union[Vep, None] + rf: Rf + in_silico_predictors: InSilicoPredictors + variant_id: str + colocated_variants: ColocatedVariants + gnomad: Gnomad + subsets: set[str] + flags: set[str] diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index c58890cd2..e0f40fd25 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -1,11 +1,18 @@ from typing import List -from cattrs import structure, transform_error -from data_pipeline.datasets.gnomad_v4.types.initial_variant import InitialVariant +from cattrs import structure, transform_error, structure_attrs_fromdict import hail as hl import json from loguru import logger +from data_pipeline.pipelines.gnomad_v4_variants import ( + pipeline as gnomad_v4_variant_pipeline, +) + from data_pipeline.datasets.gnomad_v4.types.initial_globals import Globals +from data_pipeline.datasets.gnomad_v4.types.initial_variant import InitialVariant +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as Step1Variant + +step1_task = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants") def ht_to_json(ht: hl.Table, field: str = "row"): @@ -25,14 +32,24 @@ def ht_to_json(ht: hl.Table, field: str = "row"): def test_globals_input_validation(): - ht = hl.read_table("./data/mock_v4_release.ht") + input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] + ht = hl.read_table(input_path) result = ht_to_json(ht, "globals")[0] logger.info(result) structure(result, Globals) -def test_variant_input_validation(): - ht = hl.read_table("./data/mock_v4_release.ht") +def test_validate_variant_input(): + input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] + ht = hl.read_table(input_path) + # ht = ht.sample(0.1, seed=1234) + result = ht_to_json(ht) + [structure_attrs_fromdict(variant, InitialVariant) for variant in result] + + +def test_validate_step1_output(): + output_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() + ht = hl.read_table(output_path) # ht = ht.sample(0.1, seed=1234) result = ht_to_json(ht) - structure(result, List[InitialVariant]) + [structure_attrs_fromdict(variant, Step1Variant) for variant in result] From 729804b756cf4112fa58112d88d8ebb53d8b5c36 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 19 Sep 2023 14:30:24 -0400 Subject: [PATCH 009/106] Add output validation/schemas for step 2 --- .../gnomad_v4_exome_coverage.ht.schema | 21 + .../gnomad_v4_genome_coverage.ht.schema | 21 + ...ad_v4_exome_variants_annotated_1.ht.schema | 362 ++++++++++++++++++ .../gnomad_v4_exome_variants_base.ht.schema | 334 ++++++++++++++++ .../gnomad_v4/types/prepare_variants_step2.py | 29 ++ data-pipeline/src/data_pipeline/pipeline.py | 1 + .../pipelines/gnomad_v4_coverage.py | 22 +- .../pipelines/gnomad_v4_variants.py | 38 +- data-pipeline/tests/v4/test_inputs.py | 9 + 9 files changed, 808 insertions(+), 29 deletions(-) create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema new file mode 100644 index 000000000..cc7c55027 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema @@ -0,0 +1,21 @@ +---------------------------------------- +Global fields: + None +---------------------------------------- +Row fields: + 'locus': locus + 'xpos': int64 + 'mean': float64 + 'median': int32 + 'over_1': float32 + 'over_5': float32 + 'over_10': float32 + 'over_15': float32 + 'over_20': float32 + 'over_25': float32 + 'over_30': float32 + 'over_50': float32 + 'over_100': float32 +---------------------------------------- +Key: ['locus'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema new file mode 100644 index 000000000..cc7c55027 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema @@ -0,0 +1,21 @@ +---------------------------------------- +Global fields: + None +---------------------------------------- +Row fields: + 'locus': locus + 'xpos': int64 + 'mean': float64 + 'median': int32 + 'over_1': float32 + 'over_5': float32 + 'over_10': float32 + 'over_15': float32 + 'over_20': float32 + 'over_25': float32 + 'over_30': float32 + 'over_50': float32 + 'over_100': float32 +---------------------------------------- +Key: ['locus'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema new file mode 100644 index 000000000..2d79bcce0 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema @@ -0,0 +1,362 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + polyphen_prediction: str, + polyphen_score: float64, + protein_end: int32, + protein_start: int32, + protein_id: str, + sift_prediction: str, + sift_score: float64, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set + 'coverage': struct { + exome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + }, + genome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + } + } +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema new file mode 100644 index 000000000..89fba5a59 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema @@ -0,0 +1,334 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + polyphen_prediction: str, + polyphen_score: float64, + protein_end: int32, + protein_start: int32, + protein_id: str, + sift_prediction: str, + sift_score: float64, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py new file mode 100644 index 000000000..144da0965 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py @@ -0,0 +1,29 @@ +import attr +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as InputVariant + + +@attr.define +class CoverageDetail: + mean: float + median: int + over_1: float + over_5: float + over_10: float + over_15: float + over_20: float + over_25: float + over_30: float + over_50: float + over_100: float + + +@attr.define +class Coverage: + exome: CoverageDetail + genome: CoverageDetail + + +@attr.define +class Variant(InputVariant): + coverage: Coverage + # caids go here too diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index 5db3a362f..b395e3fc4 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -128,6 +128,7 @@ def get_inputs(self): if isinstance(v, (Task, DownloadTask)): paths.update({k: v.get_output_path()}) else: + logger.info(v) new_path = os.path.join(config.data_paths.root, v) paths.update({k: os.path.join(config.data_paths.root, v)}) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index 412c50cea..cfccb0c2d 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -3,28 +3,28 @@ from data_pipeline.data_types.coverage import prepare_coverage -pipeline = Pipeline() +pipeline = Pipeline(name="gnomad_v4_coverage") pipeline.add_task( - "prepare_gnomad_v4_exome_coverage", - prepare_coverage, - "/gnomad_v4/gnomad_v4_exome_coverage.ht", + name="prepare_gnomad_v4_exome_coverage", + task_function=prepare_coverage, + output_path="/gnomad_v4/gnomad_v4_exome_coverage.ht", # Using v3 coverage as mock for now - { + inputs={ "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", - "filter_intervals": ["chr1:10030-10150"], }, + params={"filter_intervals": ["chr1:10030-10150"]}, ) pipeline.add_task( - "prepare_gnomad_v4_genome_coverage", - prepare_coverage, - "/gnomad_v4/gnomad_v4_genome_coverage.ht", + name="prepare_gnomad_v4_genome_coverage", + task_function=prepare_coverage, + output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", # Using v3 coverage as mock for now - { + inputs={ "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", - "filter_intervals": ["chr1:10030-10150"], }, + params={"filter_intervals": ["chr1:10030-10150"]}, ) ############################################### diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 6da147d37..573bc6550 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -3,9 +3,10 @@ from data_pipeline.config import config from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import prepare_gnomad_v4_variants -# from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences +from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences # from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline + # from data_pipeline.pipelines.genes import pipeline as genes_pipeline @@ -22,26 +23,27 @@ ) # pipeline.add_task( -# "prepare_gnomad_v4_genome_variants", -# prepare_gnomad_v4_variants, -# "/gnomad_v4/gnomad_v4_genome_variants_base.ht", -# { -# "path": "gs://gnomad-matt-data-pipeline/external_sources/2023-09-07-exome-variants-v4-mock/mock_v4_release.ht", -# "type": "genome", +# name="prepare_gnomad_v4_genome_variants", +# task_function=prepare_gnomad_v4_variants, +# output_path="/gnomad_v4/gnomad_v4_genome_variants_base.ht", +# inputs={ +# "input_path": "external_datasets/mock_v4_release.ht", # }, # ) -# pipeline.add_task( -# "annotate_gnomad_v4_variants", -# annotate_variants, -# "/gnomad_v4/gnomad_v4_variants_annotated_1.ht", -# { -# "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), -# "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), -# "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), -# # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", -# }, -# ) +pipeline.add_task( + "annotate_gnomad_v4_exome_variants", + annotate_variants, + "/gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", + { + "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), + "exome_coverage_path": "tiny_datasets/gnomad_v4_exome_coverage.ht", + "genome_coverage_path": "tiny_datasets/gnomad_v4_genome_coverage.ht", + # "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), + # "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), + # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", + }, +) # pipeline.add_task( # "annotate_gnomad_v4_transcript_consequences", diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index e0f40fd25..64987f32c 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -11,6 +11,7 @@ from data_pipeline.datasets.gnomad_v4.types.initial_globals import Globals from data_pipeline.datasets.gnomad_v4.types.initial_variant import InitialVariant from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as Step1Variant +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step2 import Variant as Step2Variant step1_task = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants") @@ -53,3 +54,11 @@ def test_validate_step1_output(): # ht = ht.sample(0.1, seed=1234) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step1Variant) for variant in result] + + +def test_validate_step2_output(): + output_path = gnomad_v4_variant_pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() + ht = hl.read_table(output_path) + # ht = ht.sample(0.1, seed=1234) + result = ht_to_json(ht) + [structure_attrs_fromdict(variant, Step2Variant) for variant in result] From 7dab98f6e710c115276e90ed2cb458bb67cf4af7 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 21 Sep 2023 10:25:36 -0400 Subject: [PATCH 010/106] Add io validation for step 3 --- data-pipeline/poetry.lock | 156 +++++++- data-pipeline/pyproject.toml | 20 + .../mane_select_transcripts.ht.schema | 14 + .../gnomad_v4_variants_annotated_2.ht.schema | 297 ++++++++++++++ ...omad_v4_variants_annotated_2.ht.schema.min | 226 +++++++++++ .../transcripts_grch38_base.ht.schema | 97 +++++ ...ad_v4_exome_variants_annotated_1.ht.schema | 362 ++++++++++++++++++ data-pipeline/src/data_pipeline/config.py | 5 +- .../gnomad_v4/types/prepare_variants_step3.py | 58 +++ data-pipeline/src/data_pipeline/pipeline.py | 23 +- .../pipelines/gnomad_v4_variants.py | 32 +- data-pipeline/tests/v4/test_inputs.py | 12 +- 12 files changed, 1278 insertions(+), 24 deletions(-) create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema create mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py diff --git a/data-pipeline/poetry.lock b/data-pipeline/poetry.lock index 37e3d0105..8083f8bfc 100644 --- a/data-pipeline/poetry.lock +++ b/data-pipeline/poetry.lock @@ -48,6 +48,22 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "astroid" +version = "2.15.6" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + [[package]] name = "asttokens" version = "2.4.0" @@ -721,6 +737,20 @@ python-versions = "*" [package.dependencies] six = "*" +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + [[package]] name = "janus" version = "1.0.0" @@ -781,6 +811,14 @@ python-versions = "*" [package.dependencies] six = ">=1.13,<2.0" +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "loguru" version = "0.7.2" @@ -815,6 +853,14 @@ python-versions = ">=3.5" [package.dependencies] traitlets = "*" +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "msal" version = "1.24.0" @@ -1012,6 +1058,18 @@ python-versions = ">=3.8" docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + [[package]] name = "plotly" version = "5.17.0" @@ -1167,6 +1225,32 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pylint" +version = "2.17.5" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +astroid = ">=2.15.6,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + [[package]] name = "pyspark" version = "3.3.3" @@ -1405,6 +1489,14 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "tomlkit" +version = "0.12.1" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "tornado" version = "6.3.3" @@ -1552,7 +1644,7 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "29e11461c9eebb7069b1426d42894beaf919f882955e6c5d8665b0b20c4c4219" +content-hash = "0d8f91bff53e125b97b70ea71cf99c637323c13caa58489d462fedf7a9ad409a" [metadata.files] aiodns = [ @@ -1656,6 +1748,10 @@ appnope = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] +astroid = [ + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, +] asttokens = [ {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, @@ -2212,6 +2308,10 @@ isodate = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, ] +isort = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] janus = [ {file = "janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a"}, {file = "janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"}, @@ -2232,6 +2332,44 @@ jproperties = [ {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, ] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] loguru = [ {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, @@ -2292,6 +2430,10 @@ matplotlib-inline = [ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, ] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] msal = [ {file = "msal-1.24.0-py2.py3-none-any.whl", hash = "sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50"}, {file = "msal-1.24.0.tar.gz", hash = "sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e"}, @@ -2574,6 +2716,10 @@ Pillow = [ {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, ] +platformdirs = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] plotly = [ {file = "plotly-5.17.0-py2.py3-none-any.whl", hash = "sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3"}, {file = "plotly-5.17.0.tar.gz", hash = "sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97"}, @@ -2700,6 +2846,10 @@ PyJWT = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] +pylint = [ + {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, + {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, +] pyspark = [ {file = "pyspark-3.3.3.tar.gz", hash = "sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f"}, ] @@ -2944,6 +3094,10 @@ tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +tomlkit = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] tornado = [ {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, diff --git a/data-pipeline/pyproject.toml b/data-pipeline/pyproject.toml index 82673f89c..502abf9ac 100644 --- a/data-pipeline/pyproject.toml +++ b/data-pipeline/pyproject.toml @@ -18,6 +18,7 @@ cattrs = "^23.1.2" hail = "^0.2.122" pytest = "^7.4.2" ipython = "^8.15.0" +pylint = "^2.17.5" [build-system] requires = ["poetry-core"] @@ -25,3 +26,22 @@ build-backend = "poetry.core.masonry.api" [tool.black] line-length = 120 + +[tool.pylint.basic] +# ds: frequently used name for a variable containing a Hail table +good-names = [ + "ds", +] + +[tool.pylint.messages_control] +disable = [ + # Ignore refactor and convention categories + "R", + "C", +] + +[tool.pylint.miscellaneous] +notes = [ + "FIXME", + "TODO", +] diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema new file mode 100644 index 000000000..37028eb17 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema @@ -0,0 +1,14 @@ +---------------------------------------- +Global fields: + 'version': str +---------------------------------------- +Row fields: + 'gene_id': str + 'matched_gene_version': str + 'ensembl_id': str + 'ensembl_version': str + 'refseq_id': str + 'refseq_version': str +---------------------------------------- +Key: ['gene_id'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema new file mode 100644 index 000000000..f32eebf40 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema @@ -0,0 +1,297 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str + 'mane_transcripts_version': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set + 'coverage': struct { + exome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + }, + genome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + } + } + 'transcript_consequences': array, + domains: set, + gene_id: str, + gene_symbol: str, + hgvsc: str, + hgvsp: str, + is_canonical: bool, + lof_filter: str, + lof_flags: str, + lof: str, + major_consequence: str, + polyphen_prediction: str, + sift_prediction: str, + transcript_id: str, + transcript_version: str, + gene_version: str, + is_mane_select: bool, + is_mane_select_version: bool, + refseq_id: str, + refseq_version: str + }> +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min new file mode 100644 index 000000000..2c5eb8661 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min @@ -0,0 +1,226 @@ +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set + 'coverage': struct { + exome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + }, + genome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + } + } + 'transcript_consequences': array, + domains: set, + gene_id: str, + gene_symbol: str, + hgvsc: str, + hgvsp: str, + is_canonical: bool, + lof_filter: str, + lof_flags: str, + lof: str, + major_consequence: str, + polyphen_prediction: str, + sift_prediction: str, + transcript_id: str, + transcript_version: str, + gene_version: str, + is_mane_select: bool, + is_mane_select_version: bool, + refseq_id: str, + refseq_version: str + }> +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema new file mode 100644 index 000000000..633610b9d --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema @@ -0,0 +1,97 @@ +---------------------------------------- +Global fields: + 'annotations': struct { + canonical_transcript: struct {}, + mane_select_transcript: struct { + version: str + } + } +---------------------------------------- +Row fields: + 'gene': struct { + interval: interval>, + gene_id: str, + gene_version: str, + gencode_symbol: str, + chrom: str, + strand: str, + start: int32, + stop: int32, + xstart: int64, + xstop: int64, + exons: array, + transcripts: array>, + transcript_id: str, + transcript_version: str, + gene_id: str, + gene_version: str, + chrom: str, + strand: str, + start: int32, + stop: int32, + xstart: int64, + xstop: int64, + exons: array, + reference_genome: str, + refseq_id: str, + refseq_version: str + }>, + hgnc_id: str, + symbol: str, + name: str, + previous_symbols: set, + alias_symbols: set, + omim_id: str, + ncbi_id: str, + symbol_upper_case: str, + search_terms: set, + reference_genome: str, + flags: set, + canonical_transcript_id: str, + mane_select_transcript: struct { + matched_gene_version: str, + ensembl_id: str, + ensembl_version: str, + refseq_id: str, + refseq_version: str + }, + preferred_transcript_id: str, + preferred_transcript_source: str + } + 'interval': interval> + 'transcript_id': str + 'transcript_version': str + 'gene_id': str + 'gene_version': str + 'chrom': str + 'strand': str + 'start': int32 + 'stop': int32 + 'xstart': int64 + 'xstop': int64 + 'exons': array + 'reference_genome': str + 'refseq_id': str + 'refseq_version': str +---------------------------------------- +Key: ['transcript_id'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema new file mode 100644 index 000000000..2d79bcce0 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema @@ -0,0 +1,362 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'faf_meta': array> + 'faf_index_dict': dict + 'freq_sample_count': array + 'filtering_model': struct { + model_name: str, + score_name: str, + feature_medians: dict, + variants_by_strata: dict, + features_importance: dict, + features: array, + test_results: array, + rf_snv_cutoff: struct { + bin: float64, + min_score: float64 + }, + rf_indel_cutoff: struct { + bin: float64, + min_score: float64 + }, + inbreeding_cutoff: float64, + model_id: str + } + 'tool_versions': struct { + dbsnp_version: str, + cadd_version: str, + revel_version: str, + splicaai_version: str, + primateai_version: str, + pangolin_version: str, + vrs_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_csq_header: str, + vep_help: str, + vep_config: str + } + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'age_index_dict': dict + 'age_meta': array> + 'grpmax_index_dict': dict + 'grpmax_meta': array> + 'README': dict + 'gnomad_qc_repo': str + 'gnomad_methods_repo': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'grpmax': array + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + polyphen_prediction: str, + polyphen_score: float64, + protein_end: int32, + protein_start: int32, + protein_id: str, + sift_prediction: str, + sift_score: float64, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'rf': struct { + rf_positive_label: bool, + rf_negative_label: bool, + rf_label: str, + rf_train: bool, + rf_tp_probability: float64 + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32, + has_duplicate: bool + }, + revel: struct { + revel_score: float64, + has_duplicate: bool + }, + splice_ai: struct { + splice_ai_score: float32, + splice_consequence: str, + has_duplicate: bool + }, + pangolin: struct { + pangolin_score: float64 + } + } + 'variant_id': str + 'colocated_variants': struct { + all: array, + non_ukb: array + } + 'gnomad': struct { + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + populations: array + } + }, + faf95: struct { + popmax: float64, + popmax_population: str + }, + faf99: struct { + popmax: float64, + popmax_population: str + }, + age_distribution: struct { + het: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }>, + hom: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }> + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array + } + } + 'subsets': set + 'flags': set + 'coverage': struct { + exome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + }, + genome: struct { + mean: float64, + median: int32, + over_1: float32, + over_5: float32, + over_10: float32, + over_15: float32, + over_20: float32, + over_25: float32, + over_30: float32, + over_50: float32, + over_100: float32 + } + } +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/src/data_pipeline/config.py b/data-pipeline/src/data_pipeline/config.py index 32d3ec636..2d5deaf8c 100644 --- a/data-pipeline/src/data_pipeline/config.py +++ b/data-pipeline/src/data_pipeline/config.py @@ -1,7 +1,6 @@ import os import attr from pathlib import Path -from hail import Optional DATA_ENV = os.getenv("DATA_ENV", "local") @@ -28,8 +27,8 @@ def create(cls, root=None, **kwargs): return cls(**dataset_paths) def make_local_folder(self): - if "gs://" not in self.data_path: - Path(self.data_path).mkdir(parents=True, exist_ok=True) + if "gs://" not in self.root: + Path(self.root).mkdir(parents=True, exist_ok=True) # @attr.define diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py new file mode 100644 index 000000000..a70a977b9 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py @@ -0,0 +1,58 @@ +from typing import List, Union, Set +import attr +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step2 import Coverage + +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import ColocatedVariants, Gnomad + +from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( + InSilicoPredictors, + Vep, + Domain, + TranscriptConsequence, + Rf, + InSilicoPredictors, + Grpmax, + Locus, +) + + +@attr.define +class TranscriptConsequence: + biotype: Union[str, None] + consequence_terms: list[str] + domains: Union[List[Domain], None] + gene_id: Union[str, None] + gene_symbol: Union[str, None] + hgvsc: Union[str, None] + hgvsp: Union[str, None] + is_canonical: bool + lof: Union[str, None] + lof_flags: Union[str, None] + lof_filter: Union[str, None] + lof_info: Union[str, None] + major_consequence: str + polyphen_prediction: Union[str, None] + sift_prediction: Union[str, None] + transcript_id: Union[str, None] + transcript_version: Union[str, None] + transcript_id: Union[str, None] + is_mane_select: bool + is_mane_select_version: bool + refseq_id: str + refseq_version: str + + +@attr.define +class Variant: + locus: Locus + alleles: list[str] + grpmax: List[Grpmax] + rsids: Union[Set[str], None] + rf: Rf + in_silico_predictors: InSilicoPredictors + variant_id: str + colocated_variants: ColocatedVariants + gnomad: Gnomad + subsets: set[str] + flags: set[str] + transcript_consequences: Union[List[TranscriptConsequence], None] diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index b395e3fc4..a1c42b934 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -114,8 +114,17 @@ class Task: @classmethod def create( - cls, name: str, task_function: str, output_path: str, inputs: Optional[dict] = {}, params: Optional[dict] = {} + cls, + name: str, + task_function: str, + output_path: str, + inputs: Optional[dict] = None, + params: Optional[dict] = None, ): + if inputs is None: + inputs = {} + if params is None: + params = {} return cls(name, task_function, output_path, inputs, params) def get_output_path(self): @@ -129,7 +138,6 @@ def get_inputs(self): paths.update({k: v.get_output_path()}) else: logger.info(v) - new_path = os.path.join(config.data_paths.root, v) paths.update({k: os.path.join(config.data_paths.root, v)}) return paths @@ -170,8 +178,17 @@ class Pipeline: _outputs: dict = {} def add_task( - self, name: str, task_function: str, output_path: str, inputs: Optional[dict] = {}, params: Optional[dict] = {} + self, + name: str, + task_function: str, + output_path: str, + inputs: Optional[dict] = None, + params: Optional[dict] = None, ): + if inputs is None: + inputs = {} + if params is None: + params = {} task = Task.create(name, task_function, output_path, inputs, params) self._tasks[name] = task return task diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 573bc6550..f785dec6c 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -32,10 +32,10 @@ # ) pipeline.add_task( - "annotate_gnomad_v4_exome_variants", - annotate_variants, - "/gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", - { + name="annotate_gnomad_v4_exome_variants", + task_function=annotate_variants, + output_path="/gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", + inputs={ "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), "exome_coverage_path": "tiny_datasets/gnomad_v4_exome_coverage.ht", "genome_coverage_path": "tiny_datasets/gnomad_v4_genome_coverage.ht", @@ -45,22 +45,24 @@ }, ) -# pipeline.add_task( -# "annotate_gnomad_v4_transcript_consequences", -# annotate_transcript_consequences, -# "/gnomad_v4/gnomad_v4_variants_annotated_2.ht", -# { -# "variants_path": pipeline.get_task("annotate_gnomad_v4_variants"), -# "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), -# "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), -# }, -# ) +pipeline.add_task( + name="annotate_gnomad_v4_exome_transcript_consequences", + task_function=annotate_transcript_consequences, + output_path="/gnomad_v4/gnomad_v4_variants_annotated_2.ht", + inputs={ + "variants_path": pipeline.get_task("annotate_gnomad_v4_exome_variants"), + "transcripts_path": "genes/transcripts_grch38_base.ht", + "mane_transcripts_path": "genes/mane_select_transcripts.ht" + # "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), + # "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), + }, +) ############################################### # Outputs ############################################### -# pipeline.set_outputs({"variants": "annotate_gnomad_v4_transcript_consequences"}) +pipeline.set_outputs({"variants": "annotate_gnomad_v4_exome_transcript_consequences"}) ############################################### # Run diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index 64987f32c..631e48ccd 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -12,6 +12,7 @@ from data_pipeline.datasets.gnomad_v4.types.initial_variant import InitialVariant from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as Step1Variant from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step2 import Variant as Step2Variant +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step3 import Variant as Step3Variant step1_task = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants") @@ -43,7 +44,6 @@ def test_globals_input_validation(): def test_validate_variant_input(): input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) - # ht = ht.sample(0.1, seed=1234) result = ht_to_json(ht) [structure_attrs_fromdict(variant, InitialVariant) for variant in result] @@ -59,6 +59,14 @@ def test_validate_step1_output(): def test_validate_step2_output(): output_path = gnomad_v4_variant_pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) - # ht = ht.sample(0.1, seed=1234) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step2Variant) for variant in result] + + +def test_validate_step3_output(): + output_path = gnomad_v4_variant_pipeline.get_task( + "annotate_gnomad_v4_exome_transcript_consequences" + ).get_output_path() + ht = hl.read_table(output_path) + result = ht_to_json(ht) + [structure_attrs_fromdict(variant, Step3Variant) for variant in result] From 19d02a56113e26ada85ffca87b809ff05d8a26cb Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 22 Sep 2023 13:12:50 -0400 Subject: [PATCH 011/106] Use ruff for linting instead of pylint --- .github/workflows/data-pipeline-ci.yml | 8 +- data-pipeline/poetry.lock | 385 ++-- data-pipeline/pyproject.toml | 29 +- data-pipeline/requirements.txt | 1581 ++++++++++++++++- data-pipeline/src/data_pipeline/__init__.py | 4 +- .../data_types/variant/__init__.py | 8 + .../transcript_consequence/__init__.py | 2 + .../variant/transcript_consequence/hgvs.py | 4 +- .../src/data_pipeline/datasets/clinvar.py | 8 +- .../gnomad_v2_variant_cooccurrence.py | 6 +- .../gnomad_v4/types/initial_globals.py | 2 +- .../gnomad_v4/types/initial_variant.py | 45 +- .../gnomad_v4/types/prepare_variants_step1.py | 4 +- .../gnomad_v4/types/prepare_variants_step3.py | 4 - .../src/data_pipeline/helpers/__init__.py | 4 + .../src/data_pipeline/helpers/logging.py | 28 +- .../data_pipeline/helpers/write_schemas.py | 4 - .../src/data_pipeline/pipelines/genes.py | 8 +- .../gnomad_v2_lof_curation_results.py | 3 +- .../pipelines/gnomad_v4_variants.py | 1 - data-pipeline/tests/v4/test_inputs.py | 3 +- data-pipeline/update-requirements.sh | 3 + 22 files changed, 1848 insertions(+), 296 deletions(-) create mode 100755 data-pipeline/update-requirements.sh diff --git a/.github/workflows/data-pipeline-ci.yml b/.github/workflows/data-pipeline-ci.yml index 1924adb7b..fc0cae65b 100644 --- a/.github/workflows/data-pipeline-ci.yml +++ b/.github/workflows/data-pipeline-ci.yml @@ -18,7 +18,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.9 - name: Use pip cache uses: actions/cache@v2 with: @@ -29,10 +29,8 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -r requirements-dev.txt - pip install hail pip install -r data-pipeline/requirements.txt - name: Check formatting run: black --check data-pipeline/src/data_pipeline - - name: Run Pylint - run: pylint --disable=fixme data-pipeline/src/data_pipeline + - name: Run Ruff + run: ruff data-pipeline/src/data_pipeline diff --git a/data-pipeline/poetry.lock b/data-pipeline/poetry.lock index 8083f8bfc..7c16f69f9 100644 --- a/data-pipeline/poetry.lock +++ b/data-pipeline/poetry.lock @@ -48,22 +48,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "astroid" -version = "2.15.6" -description = "An abstract syntax tree for Python with inference support." -category = "dev" -optional = false -python-versions = ">=3.7.2" - -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, -] - [[package]] name = "asttokens" version = "2.4.0" @@ -101,7 +85,7 @@ dev = ["pylint (>=2.1,<3.0)", "pytest (>=3.6,<4.0)"] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -211,6 +195,29 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "black" +version = "23.9.1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "bokeh" version = "3.2.2" @@ -232,14 +239,14 @@ xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.28.49" +version = "1.28.52" description = "The AWS SDK for Python" category = "dev" optional = false python-versions = ">= 3.7" [package.dependencies] -botocore = ">=1.31.49,<1.32.0" +botocore = ">=1.31.52,<1.32.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.6.0,<0.7.0" @@ -248,7 +255,7 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.31.49" +version = "1.31.52" description = "Low-level, data-driven core of boto 3." category = "dev" optional = false @@ -274,7 +281,7 @@ python-versions = ">=3.7" name = "cattrs" version = "23.1.2" description = "Composable complex class support for attrs and dataclasses." -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -387,7 +394,7 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "cryptography" -version = "41.0.3" +version = "41.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -461,7 +468,7 @@ requests = ["requests (>=2.4.0,<3.0.0)"] name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" @@ -559,7 +566,7 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] [[package]] name = "google-cloud-storage" -version = "2.10.0" +version = "2.11.0" description = "Google Cloud Storage API client library" category = "dev" optional = false @@ -569,7 +576,7 @@ python-versions = ">=3.7" google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" -google-resumable-media = ">=2.3.2" +google-resumable-media = ">=2.6.0" requests = ">=2.18.0,<3.0.0dev" [package.extras] @@ -617,7 +624,7 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "hail" -version = "0.2.122" +version = "0.2.124" description = "Scalable library for exploring and analyzing genomic data." category = "dev" optional = false @@ -737,20 +744,6 @@ python-versions = "*" [package.dependencies] six = "*" -[[package]] -name = "isort" -version = "5.12.0" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.8.0" - -[package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - [[package]] name = "janus" version = "1.0.0" @@ -811,14 +804,6 @@ python-versions = "*" [package.dependencies] six = ">=1.13,<2.0" -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "loguru" version = "0.7.2" @@ -853,14 +838,6 @@ python-versions = ">=3.5" [package.dependencies] traitlets = "*" -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = ">=3.6" - [[package]] name = "msal" version = "1.24.0" @@ -918,6 +895,14 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" + [[package]] name = "nest-asyncio" version = "1.5.8" @@ -971,10 +956,48 @@ category = "dev" optional = false python-versions = ">=3.9" +[package.dependencies] +numpy = {version = ">=1.23.2", markers = "python_version >= \"3.11\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + +[[package]] +name = "pandas" +version = "2.1.1" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" +optional = false +python-versions = ">=3.9" + [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -1027,6 +1050,14 @@ python-versions = ">=3.6" qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] testing = ["docopt", "pytest (<6.0.0)"] +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "pexpect" version = "4.8.0" @@ -1225,32 +1256,6 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] -[[package]] -name = "pylint" -version = "2.17.5" -description = "python code static checker" -category = "dev" -optional = false -python-versions = ">=3.7.2" - -[package.dependencies] -astroid = ">=2.15.6,<=2.17.0-dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, -] -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] - [[package]] name = "pyspark" version = "3.3.3" @@ -1397,6 +1402,14 @@ python-versions = ">=3.6,<4" [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "ruff" +version = "0.0.290" +description = "An extremely fast Python linter, written in Rust." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "s3transfer" version = "0.6.2" @@ -1489,14 +1502,6 @@ category = "dev" optional = false python-versions = ">=3.7" -[[package]] -name = "tomlkit" -version = "0.12.1" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=3.7" - [[package]] name = "tornado" version = "6.3.3" @@ -1556,7 +1561,7 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" @@ -1644,7 +1649,7 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "0d8f91bff53e125b97b70ea71cf99c637323c13caa58489d462fedf7a9ad409a" +content-hash = "cb9f408003a3e06698cf56c3214b01af7784e09a33970322d5901cc9804e928a" [metadata.files] aiodns = [ @@ -1748,10 +1753,6 @@ appnope = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] -astroid = [ - {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, - {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, -] asttokens = [ {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, @@ -1799,17 +1800,41 @@ backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +black = [ + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, +] bokeh = [ {file = "bokeh-3.2.2-py3-none-any.whl", hash = "sha256:e31670a013e1ff15c3d4d04f587c8162c4cc9fe1af507fd741d295e6c4e1225b"}, {file = "bokeh-3.2.2.tar.gz", hash = "sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff"}, ] boto3 = [ - {file = "boto3-1.28.49-py3-none-any.whl", hash = "sha256:519639859a3c829ccf7073a58b3716cb26cb5906e306fe63eb4beab68bf9bfab"}, - {file = "boto3-1.28.49.tar.gz", hash = "sha256:c9fad1b01a1d7e7bd51150b3175b4c32b79d699ce94708082611f59fde2e097a"}, + {file = "boto3-1.28.52-py3-none-any.whl", hash = "sha256:1d36db102517d62c6968b3b0636303241f56859d12dd071def4882fc6e030b20"}, + {file = "boto3-1.28.52.tar.gz", hash = "sha256:a34fc153cb2f6fb2f79a764286c967392e8aae9412381d943bddc576c4f7631a"}, ] botocore = [ - {file = "botocore-1.31.49-py3-none-any.whl", hash = "sha256:7d64cb45154e4f34f3a45f551e118caad7379ae831565639e0afe5b2af126c61"}, - {file = "botocore-1.31.49.tar.gz", hash = "sha256:95e9716f27f67d4207f260ab0ea157603ca544d3b82c5f21728b1c732bec1817"}, + {file = "botocore-1.31.52-py3-none-any.whl", hash = "sha256:46b0a75a38521aa6a75fddccb1542e002930e609d4e13516f40fef170d32e515"}, + {file = "botocore-1.31.52.tar.gz", hash = "sha256:6d09881c5a8be34b497872ca3936f8757d886a6f42f2a8703411928189cfedc0"}, ] cachetools = [ {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, @@ -2076,29 +2101,29 @@ contourpy = [ {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, ] cryptography = [ - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, - {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, - {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, - {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, + {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, + {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, + {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, ] decorator = [ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, @@ -2204,8 +2229,8 @@ google-cloud-core = [ {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, ] google-cloud-storage = [ - {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, - {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, + {file = "google-cloud-storage-2.11.0.tar.gz", hash = "sha256:6fbf62659b83c8f3a0a743af0d661d2046c97c3a5bfb587c4662c4bc68de3e31"}, + {file = "google_cloud_storage-2.11.0-py2.py3-none-any.whl", hash = "sha256:88cbd7fb3d701c780c4272bc26952db99f25eb283fb4c2208423249f00b5fe53"}, ] google-crc32c = [ {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, @@ -2286,7 +2311,7 @@ googleapis-common-protos = [ {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, ] hail = [ - {file = "hail-0.2.122-py3-none-any.whl", hash = "sha256:e1607fe60da9ab4a7abe8671ec0d233a6f1497031d4a219f70384f5f1b3cc116"}, + {file = "hail-0.2.124-py3-none-any.whl", hash = "sha256:11fe8782adf351fea0674a30462aa34f9a12f5481e0e8ff08954eb16bc6c0bcb"}, ] humanize = [ {file = "humanize-1.1.0-py3-none-any.whl", hash = "sha256:3959c76f1f6c9b43258bb0b0f6b6161d6c07b8717b306c0b713ea36b7999331e"}, @@ -2308,10 +2333,6 @@ isodate = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, ] -isort = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] janus = [ {file = "janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a"}, {file = "janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"}, @@ -2332,44 +2353,6 @@ jproperties = [ {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, ] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] loguru = [ {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, @@ -2430,10 +2413,6 @@ matplotlib-inline = [ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, ] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] msal = [ {file = "msal-1.24.0-py2.py3-none-any.whl", hash = "sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50"}, {file = "msal-1.24.0.tar.gz", hash = "sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e"}, @@ -2522,6 +2501,10 @@ multidict = [ {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] +mypy-extensions = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] nest-asyncio = [ {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, @@ -2643,6 +2626,31 @@ pandas = [ {file = "pandas-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644"}, {file = "pandas-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437"}, {file = "pandas-2.1.0.tar.gz", hash = "sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918"}, + {file = "pandas-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4"}, + {file = "pandas-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4"}, + {file = "pandas-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb"}, + {file = "pandas-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e"}, + {file = "pandas-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2"}, + {file = "pandas-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0"}, + {file = "pandas-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa"}, + {file = "pandas-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98"}, + {file = "pandas-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97"}, + {file = "pandas-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2"}, + {file = "pandas-2.1.1.tar.gz", hash = "sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b"}, ] parsimonious = [ {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, @@ -2652,6 +2660,10 @@ parso = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, ] +pathspec = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, @@ -2846,10 +2858,6 @@ PyJWT = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] -pylint = [ - {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, - {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, -] pyspark = [ {file = "pyspark-3.3.3.tar.gz", hash = "sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f"}, ] @@ -3043,6 +3051,25 @@ rsa = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, ] +ruff = [ + {file = "ruff-0.0.290-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:0e2b09ac4213b11a3520221083866a5816616f3ae9da123037b8ab275066fbac"}, + {file = "ruff-0.0.290-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4ca6285aa77b3d966be32c9a3cd531655b3d4a0171e1f9bf26d66d0372186767"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35e3550d1d9f2157b0fcc77670f7bb59154f223bff281766e61bdd1dd854e0c5"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d748c8bd97874f5751aed73e8dde379ce32d16338123d07c18b25c9a2796574a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982af5ec67cecd099e2ef5e238650407fb40d56304910102d054c109f390bf3c"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bbd37352cea4ee007c48a44c9bc45a21f7ba70a57edfe46842e346651e2b995a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d9be6351b7889462912e0b8185a260c0219c35dfd920fb490c7f256f1d8313e"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75cdc7fe32dcf33b7cec306707552dda54632ac29402775b9e212a3c16aad5e6"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb07f37f7aecdbbc91d759c0c09870ce0fb3eed4025eebedf9c4b98c69abd527"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2ab41bc0ba359d3f715fc7b705bdeef19c0461351306b70a4e247f836b9350ed"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:150bf8050214cea5b990945b66433bf9a5e0cef395c9bc0f50569e7de7540c86"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_i686.whl", hash = "sha256:75386ebc15fe5467248c039f5bf6a0cfe7bfc619ffbb8cd62406cd8811815fca"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ac93eadf07bc4ab4c48d8bb4e427bf0f58f3a9c578862eb85d99d704669f5da0"}, + {file = "ruff-0.0.290-py3-none-win32.whl", hash = "sha256:461fbd1fb9ca806d4e3d5c745a30e185f7cf3ca77293cdc17abb2f2a990ad3f7"}, + {file = "ruff-0.0.290-py3-none-win_amd64.whl", hash = "sha256:f1f49f5ec967fd5778813780b12a5650ab0ebcb9ddcca28d642c689b36920796"}, + {file = "ruff-0.0.290-py3-none-win_arm64.whl", hash = "sha256:ae5a92dfbdf1f0c689433c223f8dac0782c2b2584bd502dfdbc76475669f1ba1"}, + {file = "ruff-0.0.290.tar.gz", hash = "sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d"}, +] s3transfer = [ {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, @@ -3094,10 +3121,6 @@ tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -tomlkit = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, -] tornado = [ {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, diff --git a/data-pipeline/pyproject.toml b/data-pipeline/pyproject.toml index 502abf9ac..d9d567bcd 100644 --- a/data-pipeline/pyproject.toml +++ b/data-pipeline/pyproject.toml @@ -7,18 +7,18 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.9" -elasticsearch = ">=7.17,<8.0" +elasticsearch = "7.17.9" tqdm = "^4.66.1" loguru = "^0.7.2" - - -[tool.poetry.group.dev.dependencies] attrs = "^23.1.0" cattrs = "^23.1.2" + +[tool.poetry.group.dev.dependencies] hail = "^0.2.122" pytest = "^7.4.2" ipython = "^8.15.0" -pylint = "^2.17.5" +ruff = "^0.0.290" +black = "^23.9.1" [build-system] requires = ["poetry-core"] @@ -27,21 +27,6 @@ build-backend = "poetry.core.masonry.api" [tool.black] line-length = 120 -[tool.pylint.basic] -# ds: frequently used name for a variable containing a Hail table -good-names = [ - "ds", -] - -[tool.pylint.messages_control] -disable = [ - # Ignore refactor and convention categories - "R", - "C", -] +[tool.ruff] +line-length = 120 -[tool.pylint.miscellaneous] -notes = [ - "FIXME", - "TODO", -] diff --git a/data-pipeline/requirements.txt b/data-pipeline/requirements.txt index 5e2f3db3c..3f2112239 100644 --- a/data-pipeline/requirements.txt +++ b/data-pipeline/requirements.txt @@ -1,3 +1,1578 @@ -elasticsearch~=7.17 -hail -tqdm +aiodns==2.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d \ + --hash=sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de +aiohttp==3.8.5 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67 \ + --hash=sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c \ + --hash=sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda \ + --hash=sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755 \ + --hash=sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d \ + --hash=sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5 \ + --hash=sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548 \ + --hash=sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690 \ + --hash=sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84 \ + --hash=sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4 \ + --hash=sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a \ + --hash=sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a \ + --hash=sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9 \ + --hash=sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef \ + --hash=sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b \ + --hash=sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a \ + --hash=sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d \ + --hash=sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945 \ + --hash=sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634 \ + --hash=sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7 \ + --hash=sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691 \ + --hash=sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802 \ + --hash=sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c \ + --hash=sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0 \ + --hash=sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8 \ + --hash=sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82 \ + --hash=sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a \ + --hash=sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975 \ + --hash=sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b \ + --hash=sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d \ + --hash=sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3 \ + --hash=sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7 \ + --hash=sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e \ + --hash=sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5 \ + --hash=sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649 \ + --hash=sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff \ + --hash=sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e \ + --hash=sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c \ + --hash=sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22 \ + --hash=sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df \ + --hash=sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e \ + --hash=sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780 \ + --hash=sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905 \ + --hash=sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51 \ + --hash=sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543 \ + --hash=sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6 \ + --hash=sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873 \ + --hash=sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f \ + --hash=sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35 \ + --hash=sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938 \ + --hash=sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b \ + --hash=sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d \ + --hash=sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8 \ + --hash=sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c \ + --hash=sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af \ + --hash=sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42 \ + --hash=sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3 \ + --hash=sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc \ + --hash=sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8 \ + --hash=sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410 \ + --hash=sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c \ + --hash=sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825 \ + --hash=sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9 \ + --hash=sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53 \ + --hash=sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a \ + --hash=sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc \ + --hash=sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8 \ + --hash=sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c \ + --hash=sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a \ + --hash=sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b \ + --hash=sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd \ + --hash=sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14 \ + --hash=sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2 \ + --hash=sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c \ + --hash=sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9 \ + --hash=sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692 \ + --hash=sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1 \ + --hash=sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa \ + --hash=sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a \ + --hash=sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de \ + --hash=sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91 \ + --hash=sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761 \ + --hash=sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd \ + --hash=sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced \ + --hash=sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28 \ + --hash=sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8 \ + --hash=sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824 +aiosignal==1.3.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ + --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 +appnope==0.1.3 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "darwin" \ + --hash=sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24 \ + --hash=sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e +asttokens==2.4.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e \ + --hash=sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69 +async-timeout==4.0.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ + --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 +asyncinit==0.2.4 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:4acaf614f4d6f78babd278bbacf21bd9f7756efc17cd5d7e1bae31ff770b3cfa \ + --hash=sha256:9f11291943488abd15a1463dad98452e3bd6b39e8e6d45bc7cc008a09825b11e +attrs==23.1.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +avro==1.11.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:53dcd5bffccb9a72136f08d0b18771795eaf4eefb028bbaaed5f4e1787f0e268 +azure-common==1.1.28 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3 \ + --hash=sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad +azure-core==1.29.4 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:500b3aa9bf2e90c5ccc88bb105d056114ca0ce7d0ce73afb8bc4d714b2fc7568 \ + --hash=sha256:b03261bcba22c0b9290faf9999cedd23e849ed2577feee90515694cea6bc74bf +azure-identity==1.14.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1 \ + --hash=sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b +azure-mgmt-core==1.4.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:81071675f186a585555ef01816f2774d49c1c9024cb76e5720c3c0f6b337bb7d \ + --hash=sha256:d195208340094f98e5a6661b781cde6f6a051e79ce317caabd8ff97030a9b3ae +azure-mgmt-storage==20.1.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451 \ + --hash=sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659 +azure-storage-blob==12.18.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:00b92568e91d608c04dfd4814c3b180818e690023493bb984c22dfc1a8a96e55 \ + --hash=sha256:d3265c2403c28d8881326c365e9cf7ed2ad55fdac98404eae753548702b31ba2 +backcall==0.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e \ + --hash=sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255 +black==23.9.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f \ + --hash=sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7 \ + --hash=sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100 \ + --hash=sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573 \ + --hash=sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d \ + --hash=sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f \ + --hash=sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9 \ + --hash=sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300 \ + --hash=sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948 \ + --hash=sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325 \ + --hash=sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9 \ + --hash=sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71 \ + --hash=sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186 \ + --hash=sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f \ + --hash=sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe \ + --hash=sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855 \ + --hash=sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80 \ + --hash=sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393 \ + --hash=sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c \ + --hash=sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204 \ + --hash=sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377 \ + --hash=sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301 +bokeh==3.2.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff \ + --hash=sha256:e31670a013e1ff15c3d4d04f587c8162c4cc9fe1af507fd741d295e6c4e1225b +boto3==1.28.52 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1d36db102517d62c6968b3b0636303241f56859d12dd071def4882fc6e030b20 \ + --hash=sha256:a34fc153cb2f6fb2f79a764286c967392e8aae9412381d943bddc576c4f7631a +botocore==1.31.52 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:46b0a75a38521aa6a75fddccb1542e002930e609d4e13516f40fef170d32e515 \ + --hash=sha256:6d09881c5a8be34b497872ca3936f8757d886a6f42f2a8703411928189cfedc0 +cachetools==5.3.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590 \ + --hash=sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b +cattrs==23.1.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4 \ + --hash=sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657 +certifi==2023.7.22 ; python_version >= "3.9" and python_version < "4" \ + --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ + --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +cffi==1.15.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 +charset-normalizer==3.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96 \ + --hash=sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c \ + --hash=sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710 \ + --hash=sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706 \ + --hash=sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020 \ + --hash=sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252 \ + --hash=sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad \ + --hash=sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329 \ + --hash=sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a \ + --hash=sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f \ + --hash=sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6 \ + --hash=sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4 \ + --hash=sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a \ + --hash=sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46 \ + --hash=sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2 \ + --hash=sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23 \ + --hash=sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace \ + --hash=sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd \ + --hash=sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982 \ + --hash=sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10 \ + --hash=sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2 \ + --hash=sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea \ + --hash=sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09 \ + --hash=sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5 \ + --hash=sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149 \ + --hash=sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489 \ + --hash=sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9 \ + --hash=sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80 \ + --hash=sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592 \ + --hash=sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3 \ + --hash=sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6 \ + --hash=sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed \ + --hash=sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c \ + --hash=sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200 \ + --hash=sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a \ + --hash=sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e \ + --hash=sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d \ + --hash=sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6 \ + --hash=sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623 \ + --hash=sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669 \ + --hash=sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3 \ + --hash=sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa \ + --hash=sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9 \ + --hash=sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2 \ + --hash=sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f \ + --hash=sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1 \ + --hash=sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4 \ + --hash=sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a \ + --hash=sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8 \ + --hash=sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3 \ + --hash=sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029 \ + --hash=sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f \ + --hash=sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959 \ + --hash=sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22 \ + --hash=sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7 \ + --hash=sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952 \ + --hash=sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346 \ + --hash=sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e \ + --hash=sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d \ + --hash=sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299 \ + --hash=sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd \ + --hash=sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a \ + --hash=sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3 \ + --hash=sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037 \ + --hash=sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94 \ + --hash=sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c \ + --hash=sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858 \ + --hash=sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a \ + --hash=sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449 \ + --hash=sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c \ + --hash=sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918 \ + --hash=sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1 \ + --hash=sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c \ + --hash=sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac \ + --hash=sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa +click==8.1.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de +colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" and platform_system == "Windows" or python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +commonmark==0.9.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ + --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 +contourpy==1.1.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e \ + --hash=sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6 \ + --hash=sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33 \ + --hash=sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8 \ + --hash=sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d \ + --hash=sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104 \ + --hash=sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70 \ + --hash=sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882 \ + --hash=sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d \ + --hash=sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27 \ + --hash=sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c \ + --hash=sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f \ + --hash=sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48 \ + --hash=sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e \ + --hash=sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a \ + --hash=sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37 \ + --hash=sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf \ + --hash=sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a \ + --hash=sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2 \ + --hash=sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e \ + --hash=sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e \ + --hash=sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655 \ + --hash=sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545 \ + --hash=sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027 \ + --hash=sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15 \ + --hash=sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94 \ + --hash=sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439 \ + --hash=sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163 \ + --hash=sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532 \ + --hash=sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2 \ + --hash=sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 \ + --hash=sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d \ + --hash=sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1 \ + --hash=sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b \ + --hash=sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9 \ + --hash=sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916 \ + --hash=sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23 \ + --hash=sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa \ + --hash=sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb \ + --hash=sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a \ + --hash=sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e \ + --hash=sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442 \ + --hash=sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae \ + --hash=sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103 \ + --hash=sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684 \ + --hash=sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34 \ + --hash=sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d \ + --hash=sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d \ + --hash=sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999 \ + --hash=sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 \ + --hash=sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45 \ + --hash=sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc \ + --hash=sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa \ + --hash=sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f \ + --hash=sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18 \ + --hash=sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718 \ + --hash=sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab \ + --hash=sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8 \ + --hash=sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9 \ + --hash=sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3 \ + --hash=sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae \ + --hash=sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76 \ + --hash=sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493 \ + --hash=sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb \ + --hash=sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5 \ + --hash=sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba \ + --hash=sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9 \ + --hash=sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed \ + --hash=sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0 \ + --hash=sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217 \ + --hash=sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887 \ + --hash=sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887 \ + --hash=sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62 \ + --hash=sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4 \ + --hash=sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f \ + --hash=sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431 \ + --hash=sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b \ + --hash=sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3 \ + --hash=sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce \ + --hash=sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b \ + --hash=sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21 \ + --hash=sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e \ + --hash=sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1 \ + --hash=sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a \ + --hash=sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f \ + --hash=sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002 \ + --hash=sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b \ + --hash=sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85 \ + --hash=sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e \ + --hash=sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7 \ + --hash=sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251 \ + --hash=sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970 \ + --hash=sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0 \ + --hash=sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7 \ + --hash=sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256 +cryptography==41.0.4 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67 \ + --hash=sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311 \ + --hash=sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8 \ + --hash=sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13 \ + --hash=sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143 \ + --hash=sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f \ + --hash=sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829 \ + --hash=sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd \ + --hash=sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397 \ + --hash=sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac \ + --hash=sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d \ + --hash=sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a \ + --hash=sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839 \ + --hash=sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e \ + --hash=sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6 \ + --hash=sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9 \ + --hash=sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860 \ + --hash=sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca \ + --hash=sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91 \ + --hash=sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d \ + --hash=sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714 \ + --hash=sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb \ + --hash=sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f +decorator==4.4.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760 \ + --hash=sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7 +deprecated==1.2.14 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c \ + --hash=sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3 +dill==0.3.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \ + --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03 +elasticsearch==7.17.9 ; python_version >= "3.9" and python_version < "4" \ + --hash=sha256:0e2454645dc00517dee4c6de3863411a9c5f1955d013c5fefa29123dadc92f98 \ + --hash=sha256:66c4ece2adfe7cc120e2b6a6798a1fd5c777aecf82eec39bb95cef7cfc7ea2b3 +exceptiongroup==1.1.3 ; python_version >= "3.9" and python_version < "3.11" \ + --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ + --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 +executing==1.2.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc \ + --hash=sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107 +frozenlist==1.4.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6 \ + --hash=sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01 \ + --hash=sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251 \ + --hash=sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9 \ + --hash=sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b \ + --hash=sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87 \ + --hash=sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf \ + --hash=sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f \ + --hash=sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0 \ + --hash=sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2 \ + --hash=sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b \ + --hash=sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc \ + --hash=sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c \ + --hash=sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467 \ + --hash=sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9 \ + --hash=sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1 \ + --hash=sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a \ + --hash=sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79 \ + --hash=sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167 \ + --hash=sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300 \ + --hash=sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf \ + --hash=sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea \ + --hash=sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2 \ + --hash=sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab \ + --hash=sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3 \ + --hash=sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb \ + --hash=sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087 \ + --hash=sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc \ + --hash=sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8 \ + --hash=sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62 \ + --hash=sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f \ + --hash=sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326 \ + --hash=sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c \ + --hash=sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431 \ + --hash=sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963 \ + --hash=sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7 \ + --hash=sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef \ + --hash=sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3 \ + --hash=sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956 \ + --hash=sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781 \ + --hash=sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472 \ + --hash=sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc \ + --hash=sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839 \ + --hash=sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672 \ + --hash=sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3 \ + --hash=sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503 \ + --hash=sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d \ + --hash=sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8 \ + --hash=sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b \ + --hash=sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc \ + --hash=sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f \ + --hash=sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559 \ + --hash=sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b \ + --hash=sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95 \ + --hash=sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb \ + --hash=sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963 \ + --hash=sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919 \ + --hash=sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f \ + --hash=sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3 \ + --hash=sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1 \ + --hash=sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e +google-api-core==2.11.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a \ + --hash=sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a +google-auth-oauthlib==0.8.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576 \ + --hash=sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593 +google-auth==2.23.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7 \ + --hash=sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a +google-cloud-core==2.3.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb \ + --hash=sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863 +google-cloud-storage==2.11.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:6fbf62659b83c8f3a0a743af0d661d2046c97c3a5bfb587c4662c4bc68de3e31 \ + --hash=sha256:88cbd7fb3d701c780c4272bc26952db99f25eb283fb4c2208423249f00b5fe53 +google-crc32c==1.5.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ + --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ + --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ + --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ + --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ + --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ + --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ + --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ + --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ + --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ + --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ + --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ + --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ + --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ + --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ + --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ + --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ + --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ + --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ + --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ + --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ + --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ + --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ + --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ + --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ + --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ + --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ + --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ + --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ + --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ + --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ + --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ + --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ + --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ + --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ + --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ + --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ + --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ + --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ + --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ + --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ + --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ + --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ + --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ + --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ + --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ + --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ + --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ + --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ + --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ + --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ + --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ + --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ + --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ + --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ + --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ + --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ + --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ + --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ + --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ + --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ + --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ + --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ + --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ + --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ + --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ + --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ + --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 +google-resumable-media==2.6.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7 \ + --hash=sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b +googleapis-common-protos==1.60.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918 \ + --hash=sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708 +hail==0.2.124 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:11fe8782adf351fea0674a30462aa34f9a12f5481e0e8ff08954eb16bc6c0bcb +humanize==1.1.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:3959c76f1f6c9b43258bb0b0f6b6161d6c07b8717b306c0b713ea36b7999331e \ + --hash=sha256:ad83016fae2453a7486f5be5dba8e19883020c77f6c12c63702f3b6c15ae3c5e +idna==3.4 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +iniconfig==2.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 +ipython==8.15.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2baeb5be6949eeebf532150f81746f8333e2ccce02de1c7eedde3f23ed5e9f1e \ + --hash=sha256:45a2c3a529296870a97b7de34eda4a31bee16bc7bf954e07d39abe49caf8f887 +isodate==0.6.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96 \ + --hash=sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9 +janus==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a \ + --hash=sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612 +jedi==0.19.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4 \ + --hash=sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e +jinja2==3.1.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 +jmespath==1.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ + --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe +jproperties==2.1.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29 \ + --hash=sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664 +loguru==0.7.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb \ + --hash=sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac +markupsafe==2.1.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ + --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ + --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ + --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ + --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ + --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ + --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ + --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ + --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ + --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ + --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ + --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ + --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ + --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ + --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ + --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ + --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ + --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ + --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ + --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ + --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ + --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ + --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ + --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ + --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ + --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ + --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ + --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ + --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ + --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ + --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ + --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ + --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ + --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ + --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ + --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ + --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ + --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ + --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ + --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ + --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ + --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ + --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ + --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ + --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ + --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ + --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ + --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ + --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ + --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 +matplotlib-inline==0.1.6 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 \ + --hash=sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304 +msal-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:91e3db9620b822d0ed2b4d1850056a0f133cba04455e62f11612e40f5502f2ee \ + --hash=sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354 +msal==1.24.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e \ + --hash=sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50 +msrest==0.7.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32 \ + --hash=sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9 +multidict==6.0.4 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9 \ + --hash=sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8 \ + --hash=sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03 \ + --hash=sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710 \ + --hash=sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161 \ + --hash=sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664 \ + --hash=sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569 \ + --hash=sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067 \ + --hash=sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313 \ + --hash=sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706 \ + --hash=sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2 \ + --hash=sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636 \ + --hash=sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49 \ + --hash=sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93 \ + --hash=sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603 \ + --hash=sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0 \ + --hash=sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60 \ + --hash=sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4 \ + --hash=sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e \ + --hash=sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1 \ + --hash=sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60 \ + --hash=sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951 \ + --hash=sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc \ + --hash=sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe \ + --hash=sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95 \ + --hash=sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d \ + --hash=sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8 \ + --hash=sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed \ + --hash=sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2 \ + --hash=sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775 \ + --hash=sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87 \ + --hash=sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c \ + --hash=sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2 \ + --hash=sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98 \ + --hash=sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3 \ + --hash=sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe \ + --hash=sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78 \ + --hash=sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660 \ + --hash=sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176 \ + --hash=sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e \ + --hash=sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988 \ + --hash=sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c \ + --hash=sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c \ + --hash=sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0 \ + --hash=sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449 \ + --hash=sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f \ + --hash=sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde \ + --hash=sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5 \ + --hash=sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d \ + --hash=sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac \ + --hash=sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a \ + --hash=sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9 \ + --hash=sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca \ + --hash=sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11 \ + --hash=sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35 \ + --hash=sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063 \ + --hash=sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b \ + --hash=sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982 \ + --hash=sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258 \ + --hash=sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1 \ + --hash=sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52 \ + --hash=sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480 \ + --hash=sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7 \ + --hash=sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461 \ + --hash=sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d \ + --hash=sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc \ + --hash=sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779 \ + --hash=sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a \ + --hash=sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547 \ + --hash=sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0 \ + --hash=sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171 \ + --hash=sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf \ + --hash=sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d \ + --hash=sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba +mypy-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 +nest-asyncio==1.5.8 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb \ + --hash=sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d +numpy==1.25.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2 \ + --hash=sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55 \ + --hash=sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf \ + --hash=sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01 \ + --hash=sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca \ + --hash=sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901 \ + --hash=sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d \ + --hash=sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4 \ + --hash=sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf \ + --hash=sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380 \ + --hash=sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044 \ + --hash=sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545 \ + --hash=sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f \ + --hash=sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f \ + --hash=sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3 \ + --hash=sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364 \ + --hash=sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9 \ + --hash=sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418 \ + --hash=sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f \ + --hash=sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295 \ + --hash=sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3 \ + --hash=sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187 \ + --hash=sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926 \ + --hash=sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357 \ + --hash=sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760 +oauthlib==3.2.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \ + --hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918 +orjson==3.9.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:01d647b2a9c45a23a84c3e70e19d120011cba5f56131d185c1b78685457320bb \ + --hash=sha256:0eb850a87e900a9c484150c414e21af53a6125a13f6e378cf4cc11ae86c8f9c5 \ + --hash=sha256:11c10f31f2c2056585f89d8229a56013bc2fe5de51e095ebc71868d070a8dd81 \ + --hash=sha256:14d3fb6cd1040a4a4a530b28e8085131ed94ebc90d72793c59a713de34b60838 \ + --hash=sha256:154fd67216c2ca38a2edb4089584504fbb6c0694b518b9020ad35ecc97252bb9 \ + --hash=sha256:1c3cee5c23979deb8d1b82dc4cc49be59cccc0547999dbe9adb434bb7af11cf7 \ + --hash=sha256:1eb0b0b2476f357eb2975ff040ef23978137aa674cd86204cfd15d2d17318588 \ + --hash=sha256:1f8b47650f90e298b78ecf4df003f66f54acdba6a0f763cc4df1eab048fe3738 \ + --hash=sha256:21a3344163be3b2c7e22cef14fa5abe957a892b2ea0525ee86ad8186921b6cf0 \ + --hash=sha256:23be6b22aab83f440b62a6f5975bcabeecb672bc627face6a83bc7aeb495dc7e \ + --hash=sha256:26ffb398de58247ff7bde895fe30817a036f967b0ad0e1cf2b54bda5f8dcfdd9 \ + --hash=sha256:2f8fcf696bbbc584c0c7ed4adb92fd2ad7d153a50258842787bc1524e50d7081 \ + --hash=sha256:355efdbbf0cecc3bd9b12589b8f8e9f03c813a115efa53f8dc2a523bfdb01334 \ + --hash=sha256:36b1df2e4095368ee388190687cb1b8557c67bc38400a942a1a77713580b50ae \ + --hash=sha256:38e34c3a21ed41a7dbd5349e24c3725be5416641fdeedf8f56fcbab6d981c900 \ + --hash=sha256:3aab72d2cef7f1dd6104c89b0b4d6b416b0db5ca87cc2fac5f79c5601f549cc2 \ + --hash=sha256:410aa9d34ad1089898f3db461b7b744d0efcf9252a9415bbdf23540d4f67589f \ + --hash=sha256:45a47f41b6c3beeb31ac5cf0ff7524987cfcce0a10c43156eb3ee8d92d92bf22 \ + --hash=sha256:4891d4c934f88b6c29b56395dfc7014ebf7e10b9e22ffd9877784e16c6b2064f \ + --hash=sha256:4c616b796358a70b1f675a24628e4823b67d9e376df2703e893da58247458956 \ + --hash=sha256:5198633137780d78b86bb54dafaaa9baea698b4f059456cd4554ab7009619221 \ + --hash=sha256:5a2937f528c84e64be20cb80e70cea76a6dfb74b628a04dab130679d4454395c \ + --hash=sha256:5da9032dac184b2ae2da4bce423edff7db34bfd936ebd7d4207ea45840f03905 \ + --hash=sha256:5e736815b30f7e3c9044ec06a98ee59e217a833227e10eb157f44071faddd7c5 \ + --hash=sha256:63ef3d371ea0b7239ace284cab9cd00d9c92b73119a7c274b437adb09bda35e6 \ + --hash=sha256:70b9a20a03576c6b7022926f614ac5a6b0914486825eac89196adf3267c6489d \ + --hash=sha256:76a0fc023910d8a8ab64daed8d31d608446d2d77c6474b616b34537aa7b79c7f \ + --hash=sha256:7951af8f2998045c656ba8062e8edf5e83fd82b912534ab1de1345de08a41d2b \ + --hash=sha256:7a34a199d89d82d1897fd4a47820eb50947eec9cda5fd73f4578ff692a912f89 \ + --hash=sha256:7bab596678d29ad969a524823c4e828929a90c09e91cc438e0ad79b37ce41166 \ + --hash=sha256:7ea3e63e61b4b0beeb08508458bdff2daca7a321468d3c4b320a758a2f554d31 \ + --hash=sha256:80acafe396ab689a326ab0d80f8cc61dec0dd2c5dca5b4b3825e7b1e0132c101 \ + --hash=sha256:82720ab0cf5bb436bbd97a319ac529aee06077ff7e61cab57cee04a596c4f9b4 \ + --hash=sha256:83cc275cf6dcb1a248e1876cdefd3f9b5f01063854acdfd687ec360cd3c9712a \ + --hash=sha256:85e39198f78e2f7e054d296395f6c96f5e02892337746ef5b6a1bf3ed5910142 \ + --hash=sha256:8769806ea0b45d7bf75cad253fba9ac6700b7050ebb19337ff6b4e9060f963fa \ + --hash=sha256:8bdb6c911dae5fbf110fe4f5cba578437526334df381b3554b6ab7f626e5eeca \ + --hash=sha256:8f4b0042d8388ac85b8330b65406c84c3229420a05068445c13ca28cc222f1f7 \ + --hash=sha256:90fe73a1f0321265126cbba13677dcceb367d926c7a65807bd80916af4c17047 \ + --hash=sha256:915e22c93e7b7b636240c5a79da5f6e4e84988d699656c8e27f2ac4c95b8dcc0 \ + --hash=sha256:9274ba499e7dfb8a651ee876d80386b481336d3868cba29af839370514e4dce0 \ + --hash=sha256:9d62c583b5110e6a5cf5169ab616aa4ec71f2c0c30f833306f9e378cf51b6c86 \ + --hash=sha256:9ef82157bbcecd75d6296d5d8b2d792242afcd064eb1ac573f8847b52e58f677 \ + --hash=sha256:a19e4074bc98793458b4b3ba35a9a1d132179345e60e152a1bb48c538ab863c4 \ + --hash=sha256:a347d7b43cb609e780ff8d7b3107d4bcb5b6fd09c2702aa7bdf52f15ed09fa09 \ + --hash=sha256:b4fb306c96e04c5863d52ba8d65137917a3d999059c11e659eba7b75a69167bd \ + --hash=sha256:b6df858e37c321cefbf27fe7ece30a950bcc3a75618a804a0dcef7ed9dd9c92d \ + --hash=sha256:b8e59650292aa3a8ea78073fc84184538783966528e442a1b9ed653aa282edcf \ + --hash=sha256:bcb9a60ed2101af2af450318cd89c6b8313e9f8df4e8fb12b657b2e97227cf08 \ + --hash=sha256:c3ba725cf5cf87d2d2d988d39c6a2a8b6fc983d78ff71bc728b0be54c869c884 \ + --hash=sha256:ca1706e8b8b565e934c142db6a9592e6401dc430e4b067a97781a997070c5378 \ + --hash=sha256:cd3e7aae977c723cc1dbb82f97babdb5e5fbce109630fbabb2ea5053523c89d3 \ + --hash=sha256:cf334ce1d2fadd1bf3e5e9bf15e58e0c42b26eb6590875ce65bd877d917a58aa \ + --hash=sha256:d8692948cada6ee21f33db5e23460f71c8010d6dfcfe293c9b96737600a7df78 \ + --hash=sha256:e5205ec0dfab1887dd383597012199f5175035e782cdb013c542187d280ca443 \ + --hash=sha256:e7e7f44e091b93eb39db88bb0cb765db09b7a7f64aea2f35e7d86cbf47046c65 \ + --hash=sha256:e94b7b31aa0d65f5b7c72dd8f8227dbd3e30354b99e7a9af096d967a77f2a580 \ + --hash=sha256:f26fb3e8e3e2ee405c947ff44a3e384e8fa1843bc35830fe6f3d9a95a1147b6e \ + --hash=sha256:f738fee63eb263530efd4d2e9c76316c1f47b3bbf38c1bf45ae9625feed0395e \ + --hash=sha256:f9e01239abea2f52a429fe9d95c96df95f078f0172489d691b4a848ace54a476 +packaging==23.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \ + --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f +pandas==2.1.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437 \ + --hash=sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614 \ + --hash=sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97 \ + --hash=sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2 \ + --hash=sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8 \ + --hash=sha256:28f330845ad21c11db51e02d8d69acc9035edfd1116926ff7245c7215db57957 \ + --hash=sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0 \ + --hash=sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750 \ + --hash=sha256:38f74ef7ebc0ffb43b3d633e23d74882bce7e27bfa09607f3c5d3e03ffd9a4a5 \ + --hash=sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea \ + --hash=sha256:40dd20439ff94f1b2ed55b393ecee9cb6f3b08104c2c40b0cb7186a2f0046242 \ + --hash=sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2 \ + --hash=sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2 \ + --hash=sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa \ + --hash=sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4 \ + --hash=sha256:629124923bcf798965b054a540f9ccdfd60f71361255c81fa1ecd94a904b9dd3 \ + --hash=sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918 \ + --hash=sha256:6e6a0fe052cf27ceb29be9429428b4918f3740e37ff185658f40d8702f0b3e09 \ + --hash=sha256:70cf866af3ab346a10debba8ea78077cf3a8cd14bd5e4bed3d41555a3280041c \ + --hash=sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb \ + --hash=sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6 \ + --hash=sha256:86f100b3876b8c6d1a2c66207288ead435dc71041ee4aea789e55ef0e06408cb \ + --hash=sha256:9d81e1813191070440d4c7a413cb673052b3b4a984ffd86b8dd468c45742d3cc \ + --hash=sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d \ + --hash=sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e \ + --hash=sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98 \ + --hash=sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644 \ + --hash=sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a \ + --hash=sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0 \ + --hash=sha256:b9a6ccf0963db88f9b12df6720e55f337447aea217f426a22d71f4213a3099a6 \ + --hash=sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4 \ + --hash=sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49 \ + --hash=sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd \ + --hash=sha256:cda72cc8c4761c8f1d97b169661f23a86b16fdb240bdc341173aee17e4d6cedd \ + --hash=sha256:d4f38e4fedeba580285eaac7ede4f686c6701a9e618d8a857b138a126d067f2f \ + --hash=sha256:d53c8c1001f6a192ff1de1efe03b31a423d0eee2e9e855e69d004308e046e694 \ + --hash=sha256:d8c58b1113892e0c8078f006a167cc210a92bdae23322bb4614f2f0b7a4b510f \ + --hash=sha256:d97daeac0db8c993420b10da4f5f5b39b01fc9ca689a17844e07c0a35ac96b4b \ + --hash=sha256:d99e678180bc59b0c9443314297bddce4ad35727a1a2656dbe585fd78710b3b9 \ + --hash=sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e \ + --hash=sha256:eb20252720b1cc1b7d0b2879ffc7e0542dd568f24d7c4b2347cb035206936421 \ + --hash=sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317 \ + --hash=sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b \ + --hash=sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363 +parsimonious==0.10.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c \ + --hash=sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f +parso==0.8.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ + --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 +pathspec==0.11.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ + --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 +pexpect==4.8.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ + --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \ + --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c +pickleshare==0.7.5 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 +pillow==10.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff \ + --hash=sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f \ + --hash=sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21 \ + --hash=sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635 \ + --hash=sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a \ + --hash=sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f \ + --hash=sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1 \ + --hash=sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d \ + --hash=sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db \ + --hash=sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849 \ + --hash=sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7 \ + --hash=sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876 \ + --hash=sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3 \ + --hash=sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317 \ + --hash=sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91 \ + --hash=sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d \ + --hash=sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b \ + --hash=sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd \ + --hash=sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed \ + --hash=sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500 \ + --hash=sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7 \ + --hash=sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a \ + --hash=sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a \ + --hash=sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0 \ + --hash=sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf \ + --hash=sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f \ + --hash=sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1 \ + --hash=sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088 \ + --hash=sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971 \ + --hash=sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a \ + --hash=sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205 \ + --hash=sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54 \ + --hash=sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08 \ + --hash=sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21 \ + --hash=sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d \ + --hash=sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08 \ + --hash=sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e \ + --hash=sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf \ + --hash=sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b \ + --hash=sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145 \ + --hash=sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2 \ + --hash=sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d \ + --hash=sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d \ + --hash=sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf \ + --hash=sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad \ + --hash=sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d \ + --hash=sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1 \ + --hash=sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4 \ + --hash=sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2 \ + --hash=sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19 \ + --hash=sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37 \ + --hash=sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4 \ + --hash=sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68 \ + --hash=sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1 +platformdirs==3.10.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d \ + --hash=sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d +plotly==5.17.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97 \ + --hash=sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3 +pluggy==1.3.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ + --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 +portalocker==2.8.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33 \ + --hash=sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e +prompt-toolkit==3.0.39 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac \ + --hash=sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88 +protobuf==3.20.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ + --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ + --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ + --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ + --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ + --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ + --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ + --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ + --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ + --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ + --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ + --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ + --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ + --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ + --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ + --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ + --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ + --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ + --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ + --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ + --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ + --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 +ptyprocess==0.7.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 +pure-eval==0.2.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 \ + --hash=sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3 +py4j==0.10.9.5 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6 \ + --hash=sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04 +pyasn1-modules==0.3.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c \ + --hash=sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d +pyasn1==0.5.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ + --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde +pycares==4.3.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164 \ + --hash=sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be \ + --hash=sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824 \ + --hash=sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e \ + --hash=sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4 \ + --hash=sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587 \ + --hash=sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4 \ + --hash=sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd \ + --hash=sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088 \ + --hash=sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323 \ + --hash=sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2 \ + --hash=sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515 \ + --hash=sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5 \ + --hash=sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4 \ + --hash=sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5 \ + --hash=sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de \ + --hash=sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac \ + --hash=sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7 \ + --hash=sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9 \ + --hash=sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566 \ + --hash=sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080 \ + --hash=sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8 \ + --hash=sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb \ + --hash=sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8 \ + --hash=sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0 \ + --hash=sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc \ + --hash=sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9 \ + --hash=sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe \ + --hash=sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4 \ + --hash=sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7 \ + --hash=sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329 \ + --hash=sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452 \ + --hash=sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9 \ + --hash=sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d \ + --hash=sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d \ + --hash=sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6 \ + --hash=sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791 \ + --hash=sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903 \ + --hash=sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136 \ + --hash=sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0 \ + --hash=sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7 \ + --hash=sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804 \ + --hash=sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae \ + --hash=sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e \ + --hash=sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45 \ + --hash=sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079 \ + --hash=sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161 \ + --hash=sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783 \ + --hash=sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974 \ + --hash=sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a \ + --hash=sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef \ + --hash=sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf +pycparser==2.21 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 +pygments==2.16.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ + --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 +pyjwt[crypto]==2.8.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ + --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 +pyspark==3.3.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f +pytest==7.4.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002 \ + --hash=sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069 +python-dateutil==2.8.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-json-logger==2.0.7 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c \ + --hash=sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd +pytz==2023.3.post1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ + --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 +pywin32==306 ; python_version >= "3.9" and platform_system == "Windows" and python_version < "4.0" \ + --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ + --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \ + --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \ + --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \ + --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \ + --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \ + --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \ + --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \ + --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \ + --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \ + --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \ + --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \ + --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \ + --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0 +pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ + --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ + --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ + --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ + --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ + --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ + --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ + --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ + --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ + --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ + --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ + --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ + --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ + --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ + --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ + --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ + --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ + --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ + --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ + --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ + --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ + --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ + --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ + --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ + --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ + --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ + --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ + --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ + --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ + --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ + --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ + --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ + --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ + --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ + --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ + --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ + --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ + --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ + --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ + --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ + --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ + --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ + --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ + --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ + --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ + --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ + --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ + --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ + --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ + --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f +regex==2023.8.8 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf \ + --hash=sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46 \ + --hash=sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18 \ + --hash=sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7 \ + --hash=sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7 \ + --hash=sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9 \ + --hash=sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559 \ + --hash=sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71 \ + --hash=sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280 \ + --hash=sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898 \ + --hash=sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684 \ + --hash=sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3 \ + --hash=sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9 \ + --hash=sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8 \ + --hash=sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca \ + --hash=sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c \ + --hash=sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c \ + --hash=sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab \ + --hash=sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd \ + --hash=sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56 \ + --hash=sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586 \ + --hash=sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7 \ + --hash=sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103 \ + --hash=sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac \ + --hash=sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177 \ + --hash=sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109 \ + --hash=sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033 \ + --hash=sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb \ + --hash=sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61 \ + --hash=sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800 \ + --hash=sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb \ + --hash=sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8 \ + --hash=sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570 \ + --hash=sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34 \ + --hash=sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e \ + --hash=sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4 \ + --hash=sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb \ + --hash=sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7 \ + --hash=sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208 \ + --hash=sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc \ + --hash=sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb \ + --hash=sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3 \ + --hash=sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504 \ + --hash=sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb \ + --hash=sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57 \ + --hash=sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b \ + --hash=sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601 \ + --hash=sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116 \ + --hash=sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8 \ + --hash=sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6 \ + --hash=sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6 \ + --hash=sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93 \ + --hash=sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09 \ + --hash=sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a \ + --hash=sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921 \ + --hash=sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a \ + --hash=sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495 \ + --hash=sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6 \ + --hash=sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7 \ + --hash=sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236 \ + --hash=sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235 \ + --hash=sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470 \ + --hash=sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b \ + --hash=sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5 \ + --hash=sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61 \ + --hash=sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c \ + --hash=sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db \ + --hash=sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be \ + --hash=sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96 \ + --hash=sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a \ + --hash=sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2 \ + --hash=sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63 \ + --hash=sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef \ + --hash=sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739 \ + --hash=sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e \ + --hash=sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217 \ + --hash=sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90 \ + --hash=sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4 \ + --hash=sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8 \ + --hash=sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3 \ + --hash=sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357 \ + --hash=sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4 \ + --hash=sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b \ + --hash=sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882 \ + --hash=sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a \ + --hash=sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675 \ + --hash=sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf \ + --hash=sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e +requests-oauthlib==1.3.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 \ + --hash=sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a +requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 +rich==12.6.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ + --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 +rsa==4.9 ; python_version >= "3.9" and python_version < "4" \ + --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ + --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 +ruff==0.0.290 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0e2b09ac4213b11a3520221083866a5816616f3ae9da123037b8ab275066fbac \ + --hash=sha256:150bf8050214cea5b990945b66433bf9a5e0cef395c9bc0f50569e7de7540c86 \ + --hash=sha256:1d9be6351b7889462912e0b8185a260c0219c35dfd920fb490c7f256f1d8313e \ + --hash=sha256:2ab41bc0ba359d3f715fc7b705bdeef19c0461351306b70a4e247f836b9350ed \ + --hash=sha256:35e3550d1d9f2157b0fcc77670f7bb59154f223bff281766e61bdd1dd854e0c5 \ + --hash=sha256:461fbd1fb9ca806d4e3d5c745a30e185f7cf3ca77293cdc17abb2f2a990ad3f7 \ + --hash=sha256:4ca6285aa77b3d966be32c9a3cd531655b3d4a0171e1f9bf26d66d0372186767 \ + --hash=sha256:75386ebc15fe5467248c039f5bf6a0cfe7bfc619ffbb8cd62406cd8811815fca \ + --hash=sha256:75cdc7fe32dcf33b7cec306707552dda54632ac29402775b9e212a3c16aad5e6 \ + --hash=sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d \ + --hash=sha256:982af5ec67cecd099e2ef5e238650407fb40d56304910102d054c109f390bf3c \ + --hash=sha256:ac93eadf07bc4ab4c48d8bb4e427bf0f58f3a9c578862eb85d99d704669f5da0 \ + --hash=sha256:ae5a92dfbdf1f0c689433c223f8dac0782c2b2584bd502dfdbc76475669f1ba1 \ + --hash=sha256:bbd37352cea4ee007c48a44c9bc45a21f7ba70a57edfe46842e346651e2b995a \ + --hash=sha256:d748c8bd97874f5751aed73e8dde379ce32d16338123d07c18b25c9a2796574a \ + --hash=sha256:eb07f37f7aecdbbc91d759c0c09870ce0fb3eed4025eebedf9c4b98c69abd527 \ + --hash=sha256:f1f49f5ec967fd5778813780b12a5650ab0ebcb9ddcca28d642c689b36920796 +s3transfer==0.6.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084 \ + --hash=sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861 +scipy==1.9.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31 \ + --hash=sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108 \ + --hash=sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0 \ + --hash=sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b \ + --hash=sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e \ + --hash=sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e \ + --hash=sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5 \ + --hash=sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840 \ + --hash=sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58 \ + --hash=sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523 \ + --hash=sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd \ + --hash=sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab \ + --hash=sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c \ + --hash=sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb \ + --hash=sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096 \ + --hash=sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0 \ + --hash=sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc \ + --hash=sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9 \ + --hash=sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c \ + --hash=sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95 \ + --hash=sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027 +six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 +sortedcontainers==2.4.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +stack-data==0.6.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815 \ + --hash=sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8 +tabulate==0.9.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tenacity==8.2.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a \ + --hash=sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c +tomli==2.0.1 ; python_version >= "3.9" and python_version < "3.11" \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f +tornado==6.3.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f \ + --hash=sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5 \ + --hash=sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d \ + --hash=sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3 \ + --hash=sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2 \ + --hash=sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a \ + --hash=sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16 \ + --hash=sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a \ + --hash=sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17 \ + --hash=sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0 \ + --hash=sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe +tqdm==4.66.1 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386 \ + --hash=sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7 +traitlets==5.10.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:417745a96681fbb358e723d5346a547521f36e9bd0d50ba7ab368fff5d67aa54 \ + --hash=sha256:f584ea209240466e66e91f3c81aa7d004ba4cf794990b0c775938a1544217cd1 +typer==0.9.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2 \ + --hash=sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee +typing-extensions==4.8.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ + --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +tzdata==2023.3 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a \ + --hash=sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda +urllib3==1.26.16 ; python_version >= "3.9" and python_version < "4" \ + --hash=sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f \ + --hash=sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14 +uvloop==0.17.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ + --hash=sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d \ + --hash=sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1 \ + --hash=sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595 \ + --hash=sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b \ + --hash=sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05 \ + --hash=sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8 \ + --hash=sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20 \ + --hash=sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded \ + --hash=sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c \ + --hash=sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8 \ + --hash=sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474 \ + --hash=sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f \ + --hash=sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62 \ + --hash=sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376 \ + --hash=sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c \ + --hash=sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e \ + --hash=sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b \ + --hash=sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4 \ + --hash=sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578 \ + --hash=sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811 \ + --hash=sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d \ + --hash=sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738 \ + --hash=sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa \ + --hash=sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9 \ + --hash=sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539 \ + --hash=sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c \ + --hash=sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718 \ + --hash=sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667 \ + --hash=sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c \ + --hash=sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024 +wcwidth==0.2.6 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e \ + --hash=sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0 +win32-setctime==1.1.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" \ + --hash=sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2 \ + --hash=sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad +wrapt==1.15.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \ + --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \ + --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \ + --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \ + --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \ + --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \ + --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \ + --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \ + --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \ + --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \ + --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \ + --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \ + --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \ + --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \ + --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \ + --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \ + --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \ + --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \ + --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \ + --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \ + --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \ + --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \ + --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \ + --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \ + --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \ + --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \ + --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \ + --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \ + --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \ + --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \ + --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \ + --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \ + --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \ + --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \ + --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \ + --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \ + --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \ + --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \ + --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \ + --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \ + --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \ + --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \ + --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \ + --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \ + --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \ + --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \ + --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \ + --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \ + --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \ + --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \ + --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \ + --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \ + --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \ + --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \ + --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \ + --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \ + --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \ + --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \ + --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \ + --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \ + --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \ + --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \ + --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \ + --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \ + --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \ + --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \ + --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \ + --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \ + --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \ + --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \ + --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \ + --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \ + --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \ + --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \ + --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639 +xyzservices==2023.7.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:0ec928742227d6f5d4367ea7b457fcfed943429f4de2949b5b02a82cdf5569d6 \ + --hash=sha256:88e9cbf22b31a2f9c1b242e2b18690f5c705f0e539c9bfd37a10399e1037731b +yarl==1.9.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571 \ + --hash=sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3 \ + --hash=sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3 \ + --hash=sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c \ + --hash=sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7 \ + --hash=sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04 \ + --hash=sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191 \ + --hash=sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea \ + --hash=sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4 \ + --hash=sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4 \ + --hash=sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095 \ + --hash=sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e \ + --hash=sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74 \ + --hash=sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef \ + --hash=sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33 \ + --hash=sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde \ + --hash=sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45 \ + --hash=sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf \ + --hash=sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b \ + --hash=sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac \ + --hash=sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0 \ + --hash=sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528 \ + --hash=sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716 \ + --hash=sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb \ + --hash=sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18 \ + --hash=sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72 \ + --hash=sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6 \ + --hash=sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582 \ + --hash=sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5 \ + --hash=sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368 \ + --hash=sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc \ + --hash=sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9 \ + --hash=sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be \ + --hash=sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a \ + --hash=sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80 \ + --hash=sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8 \ + --hash=sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6 \ + --hash=sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417 \ + --hash=sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574 \ + --hash=sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59 \ + --hash=sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608 \ + --hash=sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82 \ + --hash=sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1 \ + --hash=sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3 \ + --hash=sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d \ + --hash=sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8 \ + --hash=sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc \ + --hash=sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac \ + --hash=sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8 \ + --hash=sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955 \ + --hash=sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0 \ + --hash=sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367 \ + --hash=sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb \ + --hash=sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a \ + --hash=sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623 \ + --hash=sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2 \ + --hash=sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6 \ + --hash=sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7 \ + --hash=sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4 \ + --hash=sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051 \ + --hash=sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938 \ + --hash=sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8 \ + --hash=sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9 \ + --hash=sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3 \ + --hash=sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5 \ + --hash=sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9 \ + --hash=sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333 \ + --hash=sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185 \ + --hash=sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3 \ + --hash=sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560 \ + --hash=sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b \ + --hash=sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7 \ + --hash=sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78 \ + --hash=sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7 diff --git a/data-pipeline/src/data_pipeline/__init__.py b/data-pipeline/src/data_pipeline/__init__.py index 91e8a700b..7d5d167cc 100644 --- a/data-pipeline/src/data_pipeline/__init__.py +++ b/data-pipeline/src/data_pipeline/__init__.py @@ -1 +1,3 @@ -from data_pipeline.helpers.logging import * +from data_pipeline.helpers.logging import create_logger + +create_logger() diff --git a/data-pipeline/src/data_pipeline/data_types/variant/__init__.py b/data-pipeline/src/data_pipeline/data_types/variant/__init__.py index 33cf8b8c5..0df4505fd 100644 --- a/data-pipeline/src/data_pipeline/data_types/variant/__init__.py +++ b/data-pipeline/src/data_pipeline/data_types/variant/__init__.py @@ -1,3 +1,11 @@ from .annotate_variants import annotate_variants from .transcript_consequence.annotate_transcript_consequences import annotate_transcript_consequences from .variant_id import variant_id, variant_ids, compressed_variant_id + +__all__ = [ + "annotate_variants", + "annotate_transcript_consequences", + "variant_id", + "variant_ids", + "compressed_variant_id", +] diff --git a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/__init__.py b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/__init__.py index 10432a567..81b58c5e7 100644 --- a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/__init__.py +++ b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/__init__.py @@ -1 +1,3 @@ from .vep import consequence_term_rank + +__all__ = ["consequence_term_rank"] diff --git a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/hgvs.py b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/hgvs.py index a87c4d715..54bd1b184 100644 --- a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/hgvs.py +++ b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/hgvs.py @@ -37,8 +37,8 @@ def hgvsp_from_consequence_amino_acids(csq): lambda protein_letters: "p." + protein_letters + hl.str(csq.protein_start) + protein_letters, hl.delimit( csq.amino_acids.split("") - .filter(lambda l: l != "") - .map(lambda l: PROTEIN_LETTERS_1TO3.get(l)), # pylint: disable=unnecessary-lambda + .filter(lambda letter: letter != "") + .map(lambda letter: PROTEIN_LETTERS_1TO3.get(letter)), # pylint: disable=unnecessary-lambda "", ), ), diff --git a/data-pipeline/src/data_pipeline/datasets/clinvar.py b/data-pipeline/src/data_pipeline/datasets/clinvar.py index 0fd6f4efc..c32d75988 100644 --- a/data-pipeline/src/data_pipeline/datasets/clinvar.py +++ b/data-pipeline/src/data_pipeline/datasets/clinvar.py @@ -61,7 +61,7 @@ def _parse_submission(submission_element, trait_mapping_list_element): if trait_mapping_list_element is not None: xref_elements = trait_element.findall("XRef") for xref_element in xref_elements: - selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='XRef'][@MappingValue='{xref_element.attrib['ID']}']" + selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='XRef'][@MappingValue='{xref_element.attrib['ID']}']" # noqa mapping_element = trait_mapping_list_element.find(selector) if mapping_element is not None: break @@ -69,7 +69,7 @@ def _parse_submission(submission_element, trait_mapping_list_element): if mapping_element is None: preferred_name_element = trait_element.find("./Name/ElementValue[@Type='Preferred']") if preferred_name_element is not None and trait_mapping_list_element is not None: - selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='Name'][@MappingValue=\"{preferred_name_element.text}\"]" + selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='Name'][@MappingValue=\"{preferred_name_element.text}\"]" # noqa mapping_element = trait_mapping_list_element.find(selector) if mapping_element is None: @@ -79,7 +79,7 @@ def _parse_submission(submission_element, trait_mapping_list_element): preferred_name_element = name_element if trait_mapping_list_element is not None: - selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='Name'][@MappingValue=\"{name_element.text}\"]" + selector = f"./TraitMapping[@ClinicalAssertionID='{submission_element.attrib['ID']}'][@TraitType='{trait_element.attrib['Type']}'][@MappingType='Name'][@MappingValue=\"{name_element.text}\"]" # noqa mapping_element = trait_mapping_list_element.find(selector) if mapping_element: break @@ -112,7 +112,7 @@ def _parse_variant(variant_element): variant["locations"] = {} allele_element = variant_element.findall("./InterpretedRecord/SimpleAllele") print( - f' Skipping variant with Allele ID: {allele_element[0].attrib["AlleleID"]} due to anomalous Chromosome value of "Un"' + f' Skipping variant with Allele ID: {allele_element[0].attrib["AlleleID"]} due to anomalous Chromosome value of "Un"' # noqa ) break variant["locations"][element.attrib["Assembly"]] = { diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v2/gnomad_v2_variant_cooccurrence.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v2/gnomad_v2_variant_cooccurrence.py index 0cb33f96b..77d249a08 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v2/gnomad_v2_variant_cooccurrence.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v2/gnomad_v2_variant_cooccurrence.py @@ -4,8 +4,10 @@ def fix_haplotype_counts(genotype_counts, haplotype_counts): - # hl.experimental.haplotype_freq_em returns all NaNs in some cases, such as when one of the two variants does not occur. - # However, we only need to use it when there are samples that are heterozygous for both variants (genotype_counts[4] > 0). + # hl.experimental.haplotype_freq_em returns all NaNs in some cases + # such as when one of the two variants does not occur. + # However, we only need to use it when there are samples that are + # heterozygous for both variants (genotype_counts[4] > 0). # In other cases, we can directly calculate haplotype counts. return hl.if_else( genotype_counts[4] > 0, diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py index 66c825950..ef0536728 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py @@ -1,5 +1,5 @@ import attr -from typing import List, Dict, Tuple +from typing import List @attr.define diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 2d810ef5a..21bc6b6bd 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -1,15 +1,13 @@ import attr -from typing import List, Dict, Optional, Set, Tuple, Union +from typing import List, Set, Union -# Locus Type @attr.define class Locus: contig: str position: int -# Various Structures @attr.define class Frequency: AC: int @@ -28,53 +26,12 @@ class Grpmax: faf95: Union[float, None] -# Many rows in sample data are (NA, NA,... etc) -# +---------------------------------------------------------------------------------------------+ -# | grpmax | -# +---------------------------------------------------------------------------------------------+ -# | array{time:YYYY-MM-DDTHH:mm} | {level: <8} | {name}:{function}:{line} - {message}", # noqa - }, - ] -} -logger.configure(**config) -logger.level("CONFIG", no=38, icon="🐍") +def create_logger(): + config = { + "handlers": [ + { + "sink": sys.stdout, + "format": "{time:YYYY-MM-DDTHH:mm} | {level: <8} | {name}:{function}:{line} - {message}", # noqa + }, + ] + } -# clear log file after each run -log_file = open("out.log", "w") -logger.add("out.log", backtrace=True, diagnose=True) + logger.configure(**config) + logger.level("CONFIG", no=38, icon="🐍") + + # clear log file after each run + open("out.log", "w") + logger.add("out.log", backtrace=True, diagnose=True) def log_json(obj): diff --git a/data-pipeline/src/data_pipeline/helpers/write_schemas.py b/data-pipeline/src/data_pipeline/helpers/write_schemas.py index 666ec99d0..a6d681b21 100644 --- a/data-pipeline/src/data_pipeline/helpers/write_schemas.py +++ b/data-pipeline/src/data_pipeline/helpers/write_schemas.py @@ -7,10 +7,6 @@ pipeline as gnomad_v4_variant_pipeline, ) -from data_pipeline.pipeline import Task - -from data_pipeline.config import config - def make_dir(path): Path(path).mkdir(parents=True, exist_ok=True) diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index f3046ce97..9d7f9fa3b 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -61,7 +61,7 @@ pipeline.add_download_task( "download_hgnc", - f"https://www.genenames.org/cgi-bin/download/custom?{'&'.join('col=' + column for column in HGNC_COLUMNS)}&status=Approved&hgnc_dbtag=on&order_by=gd_app_sym_sort&format=text&submit=submit", + f"https://www.genenames.org/cgi-bin/download/custom?{'&'.join('col=' + column for column in HGNC_COLUMNS)}&status=Approved&hgnc_dbtag=on&order_by=gd_app_sym_sort&format=text&submit=submit", # noqa "/external_sources/hgnc.tsv", ) @@ -86,8 +86,10 @@ ############################################### # Note: MANE Select transcripts are used to sort variant transcript consequences. -# If this URL is updated, all GRCh38 variants must be reloaded in Elasticsearch (gnomAD v3, mitochondrial variants, ClinVar GRCh38). -# Updating this file without reloading variants may result in an unexpected order of transcript consequences for some variants. +# If this URL is updated, all GRCh38 variants must be reloaded in +# Elasticsearch (gnomAD v3, mitochondrial variants, ClinVar GRCh38). +# Updating this file without reloading variants may result in +# an unexpected order of transcript consequences for some variants. MANE_TRANSCRIPTS_URL = ( "https://ftp.ncbi.nlm.nih.gov/refseq/MANE/MANE_human/release_0.95/MANE.GRCh38.v0.95.summary.txt.gz" ) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v2_lof_curation_results.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v2_lof_curation_results.py index a15ba6249..7264a3a91 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v2_lof_curation_results.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v2_lof_curation_results.py @@ -13,7 +13,8 @@ "/gnomad_v2/gnomad_v2_lof_curation_results.ht", {"genes_path": genes_pipeline.get_output("genes_grch37")}, { - # If a result for a variant/gene pair is present in more than one file, the result in the first file in this list takes precedence. + # If a result for a variant/gene pair is present in more than one file, + # the result in the first file in this list takes precedence. "curation_result_paths": [ "gs://gcp-public-data--gnomad/truth-sets/source/lof-curation/NSD1_curation_results.csv", "gs://gcp-public-data--gnomad/truth-sets/source/lof-curation/gnomAD_addendum_curation_results.csv", diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index f785dec6c..7cd7aae57 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,6 +1,5 @@ from data_pipeline.pipeline import Pipeline, run_pipeline -from data_pipeline.config import config from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import prepare_gnomad_v4_variants from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index 631e48ccd..66ae9f79a 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -1,5 +1,4 @@ -from typing import List -from cattrs import structure, transform_error, structure_attrs_fromdict +from cattrs import structure, structure_attrs_fromdict import hail as hl import json from loguru import logger diff --git a/data-pipeline/update-requirements.sh b/data-pipeline/update-requirements.sh new file mode 100755 index 000000000..5e4d8db49 --- /dev/null +++ b/data-pipeline/update-requirements.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# +poetry export --with dev >requirements.txt From 7bbb4182049ff293aae76f5e7425ce0948a87bbb Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 26 Sep 2023 12:37:15 -0400 Subject: [PATCH 012/106] Add pyright/pytest config --- .github/workflows/data-pipeline-ci.yml | 2 + data-pipeline/check.sh | 15 ++++++++ data-pipeline/poetry.lock | 53 +++++++++++++++++++++++++- data-pipeline/pyproject.toml | 17 +++++++++ data-pipeline/pytest.ini | 8 ++++ data-pipeline/requirements.txt | 9 +++++ 6 files changed, 103 insertions(+), 1 deletion(-) create mode 100755 data-pipeline/check.sh create mode 100644 data-pipeline/pytest.ini diff --git a/.github/workflows/data-pipeline-ci.yml b/.github/workflows/data-pipeline-ci.yml index fc0cae65b..43c267748 100644 --- a/.github/workflows/data-pipeline-ci.yml +++ b/.github/workflows/data-pipeline-ci.yml @@ -34,3 +34,5 @@ jobs: run: black --check data-pipeline/src/data_pipeline - name: Run Ruff run: ruff data-pipeline/src/data_pipeline + - name: Run Pyright + run: pyright diff --git a/data-pipeline/check.sh b/data-pipeline/check.sh new file mode 100755 index 000000000..23f14f12a --- /dev/null +++ b/data-pipeline/check.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +echo "┏━━━ Running pyright ━━━━━━━━━━━━━━━━━━━" +pyright + +echo "┏━━━ Running black ━━━━━━━━━━━━━━━━━━━" +black src/data_pipeline +black tests + +echo "┏━━━ Running ruff ━━━━━━━━━━━━━━━━━━━" +ruff src/data_pipeline +ruff tests --fix + +echo "┏━━━ Running pytest ━━━━━━━━━━━━━━━━━━━" +pytest -m only diff --git a/data-pipeline/poetry.lock b/data-pipeline/poetry.lock index 7c16f69f9..7c8ed50a5 100644 --- a/data-pipeline/poetry.lock +++ b/data-pipeline/poetry.lock @@ -911,6 +911,17 @@ category = "dev" optional = false python-versions = ">=3.5" +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" + +[package.dependencies] +setuptools = "*" + [[package]] name = "numpy" version = "1.25.2" @@ -1256,6 +1267,21 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pyright" +version = "1.1.327" +description = "Command line wrapper for pyright" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + [[package]] name = "pyspark" version = "3.3.3" @@ -1440,6 +1466,19 @@ dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -1649,7 +1688,7 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "cb9f408003a3e06698cf56c3214b01af7784e09a33970322d5901cc9804e928a" +content-hash = "c02345219ed0dad93461e529a731a2bee3c0a63288392c5786869d5ab67d4c11" [metadata.files] aiodns = [ @@ -2509,6 +2548,10 @@ nest-asyncio = [ {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, ] +nodeenv = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] numpy = [ {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, @@ -2858,6 +2901,10 @@ PyJWT = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] +pyright = [ + {file = "pyright-1.1.327-py3-none-any.whl", hash = "sha256:3462cda239e9140276238bbdbd0b59d77406f1c2e14d8cb8c20c8e25639c6b3c"}, + {file = "pyright-1.1.327.tar.gz", hash = "sha256:ba74148ad64f22020dbbed6781c4bdb38ecb8a7ca90dc3c87a4f08d1c0e11592"}, +] pyspark = [ {file = "pyspark-3.3.3.tar.gz", hash = "sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f"}, ] @@ -3097,6 +3144,10 @@ scipy = [ {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, ] +setuptools = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, diff --git a/data-pipeline/pyproject.toml b/data-pipeline/pyproject.toml index d9d567bcd..4c169a487 100644 --- a/data-pipeline/pyproject.toml +++ b/data-pipeline/pyproject.toml @@ -19,6 +19,7 @@ pytest = "^7.4.2" ipython = "^8.15.0" ruff = "^0.0.290" black = "^23.9.1" +pyright = "^1.1.327" [build-system] requires = ["poetry-core"] @@ -30,3 +31,19 @@ line-length = 120 [tool.ruff] line-length = 120 +[tool.pyright] +include = [ +"src/data_pipeline/pipeline.py", +"src/data_pipeline/config.py", +"src/data_pipeline/helpers/write_schemas.py", +"src/data_pipeline/helpers/logging.py", +"src/data_pipeline/pipelines/gnomad_v4_variants.py", +"src/data_pipeline/pipelines/gnomad_v4_coverage.py", +# "src/data_pipeline/datasets/gnomad_v4", +"tests" +] +reportMissingImports = true +reportMissingTypeStubs = false +typeCheckingMode = "basic" +pythonVersion = "3.9" + diff --git a/data-pipeline/pytest.ini b/data-pipeline/pytest.ini new file mode 100644 index 000000000..f0593b3a9 --- /dev/null +++ b/data-pipeline/pytest.ini @@ -0,0 +1,8 @@ +[pytest] +testpaths = + tests +addopts = --strict -W ignore -v -s --durations=0 +markers = + only: marked with "only" + long: takes a long time + broken: test is broken diff --git a/data-pipeline/requirements.txt b/data-pipeline/requirements.txt index 3f2112239..d56f745f7 100644 --- a/data-pipeline/requirements.txt +++ b/data-pipeline/requirements.txt @@ -790,6 +790,9 @@ mypy-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ nest-asyncio==1.5.8 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb \ --hash=sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d +nodeenv==1.8.0 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \ + --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec numpy==1.25.2 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2 \ --hash=sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55 \ @@ -1113,6 +1116,9 @@ pygments==2.16.1 ; python_version >= "3.9" and python_version < "4.0" \ pyjwt[crypto]==2.8.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 +pyright==1.1.327 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:3462cda239e9140276238bbdbd0b59d77406f1c2e14d8cb8c20c8e25639c6b3c \ + --hash=sha256:ba74148ad64f22020dbbed6781c4bdb38ecb8a7ca90dc3c87a4f08d1c0e11592 pyspark==3.3.3 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f pytest==7.4.2 ; python_version >= "3.9" and python_version < "4.0" \ @@ -1337,6 +1343,9 @@ scipy==1.9.3 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c \ --hash=sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95 \ --hash=sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027 +setuptools==68.2.2 ; python_version >= "3.9" and python_version < "4.0" \ + --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ + --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 From 87d27cf04bdc5b0be37b6f042c7b1820df0d9b30 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 26 Sep 2023 12:39:34 -0400 Subject: [PATCH 013/106] Develop pipeline config --- data-pipeline/src/data_pipeline/config.py | 65 ++++++++++++++----- .../src/data_pipeline/helpers/logging.py | 8 +-- .../data_pipeline/helpers/write_schemas.py | 2 +- data-pipeline/src/data_pipeline/pipeline.py | 42 +++++++----- .../pipelines/gnomad_v4_coverage.py | 5 +- .../pipelines/gnomad_v4_variants.py | 15 +++-- data-pipeline/tests/pipeline/test_config.py | 63 ++++++++++++++++++ data-pipeline/tests/pipeline/test_pipeline.py | 63 ++++++++++++++++++ data-pipeline/tests/v4/test_inputs.py | 1 + 9 files changed, 219 insertions(+), 45 deletions(-) create mode 100644 data-pipeline/tests/pipeline/test_config.py create mode 100644 data-pipeline/tests/pipeline/test_pipeline.py diff --git a/data-pipeline/src/data_pipeline/config.py b/data-pipeline/src/data_pipeline/config.py index 2d5deaf8c..2994fbe25 100644 --- a/data-pipeline/src/data_pipeline/config.py +++ b/data-pipeline/src/data_pipeline/config.py @@ -1,5 +1,6 @@ import os import attr +from enum import Enum from pathlib import Path DATA_ENV = os.getenv("DATA_ENV", "local") @@ -31,25 +32,57 @@ def make_local_folder(self): Path(self.root).mkdir(parents=True, exist_ok=True) -# @attr.define -# class GnomadV4 -# gnomad_v4_exome_variants_sites_ht_path: str = "external_datasets/mock_v4_release.ht" +class ComputeEnvironment(Enum): + local = "local" + cicd = "cicd" + dataproc = "dataproc" -@attr.define -class PipelineConfig: - data_paths: DataPaths - compute_env: str = "local" - data_env: str = "tiny" +class DataEnvironment(Enum): + tiny = "tiny" + full = "full" -config = PipelineConfig( - data_env="local", - data_paths=DataPaths.create(os.path.join("data")), -) +def is_valid_fn(cls): + def is_valid(instance, attribute, value): + if not isinstance(value, cls): + raise ValueError(f"Expected {cls} enum, got {type(value)}") + return is_valid -if DATA_ENV == "dataproc": - config = PipelineConfig( - data_paths=DataPaths.create(os.path.join("gs://gnomad-matt-data-pipeline")), - ) + +@attr.define +class PipelineConfig: + name: str + input_paths: DataPaths + output_paths: DataPaths + data_env: DataEnvironment = attr.field(validator=is_valid_fn(DataEnvironment)) + compute_env: ComputeEnvironment = attr.field(validator=is_valid_fn(ComputeEnvironment)) + + @classmethod + def create( + cls, + name: str, + input_root: str, + output_root: str, + data_env=DataEnvironment.tiny, + compute_env=ComputeEnvironment.local, + ): + input_paths = DataPaths.create(input_root) + output_paths = DataPaths.create(output_root) + return cls(name, input_paths, output_paths, data_env, compute_env) + + +# config = PipelineConfig.create( +# name= +# input_root="data_in", +# output_root="data_out", +# compute_env=ComputeEnvironment.local, +# data_env=DataEnvironment.tiny, +# ) + + +# if DATA_ENV == "dataproc": +# config = PipelineConfig( +# output_path=DataPaths.create(os.path.join("gs://gnomad-matt-data-pipeline")), +# ) diff --git a/data-pipeline/src/data_pipeline/helpers/logging.py b/data-pipeline/src/data_pipeline/helpers/logging.py index 49cc7d639..8a31e69c6 100644 --- a/data-pipeline/src/data_pipeline/helpers/logging.py +++ b/data-pipeline/src/data_pipeline/helpers/logging.py @@ -6,16 +6,14 @@ def create_logger(): - config = { - "handlers": [ + logger.configure( + handlers=[ { "sink": sys.stdout, "format": "{time:YYYY-MM-DDTHH:mm} | {level: <8} | {name}:{function}:{line} - {message}", # noqa }, ] - } - - logger.configure(**config) + ) logger.level("CONFIG", no=38, icon="🐍") # clear log file after each run diff --git a/data-pipeline/src/data_pipeline/helpers/write_schemas.py b/data-pipeline/src/data_pipeline/helpers/write_schemas.py index a6d681b21..314afd960 100644 --- a/data-pipeline/src/data_pipeline/helpers/write_schemas.py +++ b/data-pipeline/src/data_pipeline/helpers/write_schemas.py @@ -27,7 +27,7 @@ def describe_handler(text): for pipeline in pipelines: - pipeline_name = pipeline.name + pipeline_name = pipeline.config.name task_names = pipeline.get_all_task_names() out_dir = os.path.join(SCHEMA_PATH, pipeline_name) diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index a1c42b934..ac13117ec 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -6,13 +6,13 @@ import subprocess import tempfile import time -from typing import List, Optional, Union +from typing import Callable, List, Optional, Union import attr from collections import OrderedDict import hail as hl -from data_pipeline.config import config +from data_pipeline.config import PipelineConfig logger = logging.getLogger("gnomad_data_pipeline") logger.setLevel(logging.INFO) @@ -57,23 +57,24 @@ def modified_time(path): return file_system.modified_time(check_path) -_pipeline_config = {} +# _pipeline_config = {} -_pipeline_config["output_root"] = config.data_paths.root +# _pipeline_config["output_root"] = config.output_paths.root @attr.define class DownloadTask: + _config: PipelineConfig _name: str _url: str _output_path: str @classmethod - def create(cls, name, url, output_path): - return cls(name, url, output_path) + def create(cls, config: PipelineConfig, name: str, url: str, output_path: str): + return cls(config, name, url, output_path) def get_output_path(self): - return _pipeline_config["output_root"] + self._output_path + return self._config.output_paths.root + self._output_path def should_run(self): output_path = self.get_output_path() @@ -82,6 +83,9 @@ def should_run(self): return (False, None) + def get_inputs(self): + raise NotImplementedError("Method not valid for DownloadTask") + def run(self, force=False): output_path = self.get_output_path() should_run, reason = (True, "Forced") if force else self.should_run() @@ -106,8 +110,9 @@ def run(self, force=False): @attr.define class Task: + _config: PipelineConfig _name: str - _task_function: str + _task_function: Callable _output_path: str _inputs: dict _params: dict @@ -115,8 +120,9 @@ class Task: @classmethod def create( cls, + config: PipelineConfig, name: str, - task_function: str, + task_function: Callable, output_path: str, inputs: Optional[dict] = None, params: Optional[dict] = None, @@ -125,10 +131,10 @@ def create( inputs = {} if params is None: params = {} - return cls(name, task_function, output_path, inputs, params) + return cls(config, name, task_function, output_path, inputs, params) def get_output_path(self): - return _pipeline_config["output_root"] + self._output_path + return self._config.output_paths.root + self._output_path def get_inputs(self): paths = {} @@ -138,7 +144,7 @@ def get_inputs(self): paths.update({k: v.get_output_path()}) else: logger.info(v) - paths.update({k: os.path.join(config.data_paths.root, v)}) + paths.update({k: os.path.join(self._config.output_paths.root, v)}) return paths @@ -173,14 +179,14 @@ def run(self, force=False): @attr.define class Pipeline: - name: str + config: PipelineConfig _tasks: OrderedDict = OrderedDict() _outputs: dict = {} def add_task( self, name: str, - task_function: str, + task_function: Callable, output_path: str, inputs: Optional[dict] = None, params: Optional[dict] = None, @@ -189,12 +195,12 @@ def add_task( inputs = {} if params is None: params = {} - task = Task.create(name, task_function, output_path, inputs, params) + task = Task.create(self.config, name, task_function, output_path, inputs, params) self._tasks[name] = task return task def add_download_task(self, name, *args, **kwargs) -> DownloadTask: - task = DownloadTask.create(name, *args, **kwargs) + task = DownloadTask.create(self.config, name, *args, **kwargs) self._tasks[name] = task return task @@ -232,8 +238,8 @@ def run_pipeline(pipeline): group.add_argument("--force-all", action="store_true") args = parser.parse_args() - if args.output_root: - _pipeline_config["output_root"] = args.output_root.rstrip("/") + # if args.output_root: + # _pipeline_config["output_root"] = args.output_root.rstrip("/") pipeline_args = {} if args.force_all: diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index cfccb0c2d..39fec5c3c 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -1,9 +1,12 @@ from data_pipeline.pipeline import Pipeline, run_pipeline +from data_pipeline.config import PipelineConfig from data_pipeline.data_types.coverage import prepare_coverage -pipeline = Pipeline(name="gnomad_v4_coverage") +pipeline = Pipeline( + config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") +) pipeline.add_task( name="prepare_gnomad_v4_exome_coverage", diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 7cd7aae57..004658ce3 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,15 +1,23 @@ +from data_pipeline.config import PipelineConfig from data_pipeline.pipeline import Pipeline, run_pipeline -from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import prepare_gnomad_v4_variants +from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import ( + prepare_gnomad_v4_variants, +) -from data_pipeline.data_types.variant import annotate_variants, annotate_transcript_consequences +from data_pipeline.data_types.variant import ( + annotate_variants, + annotate_transcript_consequences, +) # from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline # from data_pipeline.pipelines.genes import pipeline as genes_pipeline -pipeline = Pipeline(name="gnomad_v4_variants") +pipeline = Pipeline( + config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") +) pipeline.add_task( name="prepare_gnomad_v4_exome_variants", @@ -18,7 +26,6 @@ inputs={ "input_path": "external_datasets/mock_v4_release.ht", }, - # params={"sequencing_type": "exome"}, ) # pipeline.add_task( diff --git a/data-pipeline/tests/pipeline/test_config.py b/data-pipeline/tests/pipeline/test_config.py new file mode 100644 index 000000000..d630b4ef8 --- /dev/null +++ b/data-pipeline/tests/pipeline/test_config.py @@ -0,0 +1,63 @@ +# from loguru import logger +import os +import pytest +import tempfile + +from data_pipeline.config import ComputeEnvironment, DataEnvironment, DataPaths, PipelineConfig + +# from data_pipeline.pipeline import Pipeline + + +@pytest.fixture +def input_tmp(): + with tempfile.TemporaryDirectory() as temp_dir: + with open(os.path.join(temp_dir, "sample_tiny.txt"), "w") as f: + f.write("tiny dataset") + with open(os.path.join(temp_dir, "sample_full.txt"), "w") as f: + f.write("full dataset") + yield temp_dir + + +@pytest.fixture +def output_tmp(): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + +@pytest.mark.only +def test_config_created(input_tmp, output_tmp): + config = PipelineConfig.create(name="test", input_root=input_tmp, output_root=output_tmp) + assert isinstance(config, PipelineConfig) + assert isinstance(config.input_paths, DataPaths) + assert isinstance(config.output_paths, DataPaths) + assert isinstance(config.compute_env, ComputeEnvironment) + assert isinstance(config.data_env, DataEnvironment) + + +@pytest.mark.only +def test_config_read_input_file(input_tmp, output_tmp): + config = PipelineConfig.create( + name="test", + input_root=input_tmp, + output_root=output_tmp, + ) + sample = os.path.join(config.input_paths.root, "sample_tiny.txt") + with open(sample, "r") as f: + assert f.read() == "tiny dataset" + + +# @pytest.mark.only +# def test_pipeline_tasks(ht_1_fixture: TestHt, ht_2_fixture: TestHt): +# def task_1_fn(): +# pass + +# pipeline = Pipeline("p1") + +# pipeline.add_task( +# name="task_1_join_hts", +# task_function=task_1_fn, +# output_path="/gnomad_v4/gnomad_v4_exome_variants_base.ht", +# inputs={ +# "input_ht_1": ht_1_fixture.path, +# }, +# ) diff --git a/data-pipeline/tests/pipeline/test_pipeline.py b/data-pipeline/tests/pipeline/test_pipeline.py new file mode 100644 index 000000000..764d20803 --- /dev/null +++ b/data-pipeline/tests/pipeline/test_pipeline.py @@ -0,0 +1,63 @@ +from loguru import logger +import pytest +import tempfile +import hail as hl + + +data_1 = [ + {"a": 5, "b": 10}, + {"a": 0, "b": 200}, + {"a": 66, "b": 500}, +] + +ht_1 = hl.Table.parallelize(hl.literal(data_1, "array")) +ht_1 = ht_1.key_by("a") +ht_1_globals = { + "metadata": {"color": "green", "date": "yesterday", "release": "2"}, +} +ht_1 = ht_1.annotate_globals(**ht_1_globals) + +data_2 = [ + {"a": 5, "c": "foo"}, + {"a": 2, "c": "bar"}, + {"a": 66, "c": "baz"}, +] + +ht_2 = hl.Table.parallelize(hl.literal(data_2, "array")) +ht_2 = ht_2.key_by("a") + + +@pytest.fixture +def input_dir(): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + +@pytest.fixture +def output_dir(): + with tempfile.TemporaryDirectory() as temp_dir: + yield temp_dir + + +@pytest.mark.only +def test_config(input_dir, output_dir): + logger.info(input_dir) + logger.info(output_dir) + pass + + +# @pytest.mark.only +# def test_pipeline_tasks(ht_1_fixture: TestHt, ht_2_fixture: TestHt): +# def task_1_fn(): +# pass + +# pipeline = Pipeline("p1") + +# pipeline.add_task( +# name="task_1_join_hts", +# task_function=task_1_fn, +# output_path="/gnomad_v4/gnomad_v4_exome_variants_base.ht", +# inputs={ +# "input_ht_1": ht_1_fixture.path, +# }, +# ) diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index 66ae9f79a..416f44be5 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -32,6 +32,7 @@ def ht_to_json(ht: hl.Table, field: str = "row"): return objs +# @pytest.mark.only def test_globals_input_validation(): input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) From c385c335c7538c45f62d3e6af6e5c7d2db118351 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 26 Sep 2023 13:56:23 -0400 Subject: [PATCH 014/106] Add working pipeline test --- .github/workflows/data-pipeline-ci.yml | 2 +- data-pipeline/pytest.ini | 2 +- data-pipeline/src/data_pipeline/pipeline.py | 19 +++---- data-pipeline/tests/pipeline/test_config.py | 51 ++++++++++++++----- data-pipeline/tests/pipeline/test_pipeline.py | 2 - 5 files changed, 47 insertions(+), 29 deletions(-) diff --git a/.github/workflows/data-pipeline-ci.yml b/.github/workflows/data-pipeline-ci.yml index 43c267748..4e96e18a5 100644 --- a/.github/workflows/data-pipeline-ci.yml +++ b/.github/workflows/data-pipeline-ci.yml @@ -35,4 +35,4 @@ jobs: - name: Run Ruff run: ruff data-pipeline/src/data_pipeline - name: Run Pyright - run: pyright + run: pyright --project data-pipeline diff --git a/data-pipeline/pytest.ini b/data-pipeline/pytest.ini index f0593b3a9..2a1a9fdb2 100644 --- a/data-pipeline/pytest.ini +++ b/data-pipeline/pytest.ini @@ -1,6 +1,6 @@ [pytest] testpaths = - tests + tests/pipeline addopts = --strict -W ignore -v -s --durations=0 markers = only: marked with "only" diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index ac13117ec..eb2ef7d84 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -10,16 +10,12 @@ import attr from collections import OrderedDict +from loguru import logger + import hail as hl from data_pipeline.config import PipelineConfig -logger = logging.getLogger("gnomad_data_pipeline") -logger.setLevel(logging.INFO) -handler = logging.StreamHandler() -handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")) -logger.addHandler(handler) - class GoogleCloudStorageFileSystem: def exists(self, path): # pylint: disable=no-self-use @@ -90,7 +86,7 @@ def run(self, force=False): output_path = self.get_output_path() should_run, reason = (True, "Forced") if force else self.should_run() if should_run: - logger.info("Running %s (%s)", self._name, reason) + logger.info(f"Running {self._name} ({reason}") start = time.perf_counter() with tempfile.NamedTemporaryFile() as tmp: @@ -143,7 +139,6 @@ def get_inputs(self): if isinstance(v, (Task, DownloadTask)): paths.update({k: v.get_output_path()}) else: - logger.info(v) paths.update({k: os.path.join(self._config.output_paths.root, v)}) return paths @@ -166,15 +161,15 @@ def run(self, force=False): output_path = self.get_output_path() should_run, reason = (True, "Forced") if force else self.should_run() if should_run: - logger.info("Running %s (%s)", self._name, reason) + logger.info(f"Running {self._name} ({reason})") start = time.perf_counter() result = self._task_function(**self.get_inputs(), **self._params) result.write(output_path, overwrite=True) # pylint: disable=unexpected-keyword-arg stop = time.perf_counter() elapsed = stop - start - logger.info("Finished %s in %dm%02ds", self._name, elapsed // 60, elapsed % 60) + logger.info(f"Finished {self._name} in {elapsed // 60}m{elapsed % 60:02}s") else: - logger.info("Skipping %s", self._name) + logger.info(f"Skipping %s", self._name) @attr.define @@ -228,7 +223,7 @@ def get_output(self, output_name): return self._tasks[task_name] -def run_pipeline(pipeline): +def run_pipeline(pipeline: Pipeline): task_names = pipeline.get_all_task_names() parser = argparse.ArgumentParser() diff --git a/data-pipeline/tests/pipeline/test_config.py b/data-pipeline/tests/pipeline/test_config.py index d630b4ef8..47e6b102f 100644 --- a/data-pipeline/tests/pipeline/test_config.py +++ b/data-pipeline/tests/pipeline/test_config.py @@ -2,8 +2,10 @@ import os import pytest import tempfile +import attr from data_pipeline.config import ComputeEnvironment, DataEnvironment, DataPaths, PipelineConfig +from data_pipeline.pipeline import Pipeline # from data_pipeline.pipeline import Pipeline @@ -46,18 +48,41 @@ def test_config_read_input_file(input_tmp, output_tmp): assert f.read() == "tiny dataset" -# @pytest.mark.only -# def test_pipeline_tasks(ht_1_fixture: TestHt, ht_2_fixture: TestHt): -# def task_1_fn(): -# pass +@attr.define +class WritableFile: + text: str = "Hi" -# pipeline = Pipeline("p1") + def update_text(self, text: str): + self.text = text -# pipeline.add_task( -# name="task_1_join_hts", -# task_function=task_1_fn, -# output_path="/gnomad_v4/gnomad_v4_exome_variants_base.ht", -# inputs={ -# "input_ht_1": ht_1_fixture.path, -# }, -# ) + def write(self, path, overwrite=False): + with open(path, "w") as f: + f.write(self.text) + + +@pytest.mark.only +def test_pipeline_tasks(input_tmp, output_tmp): + def task_1_fn(input_file_path): + with open(input_file_path, "r") as f: + input_data = f.read() + output_data = WritableFile() + output_data.update_text(f"{input_data} processed") + return output_data + + config = PipelineConfig.create(name="pipeline1", input_root=input_tmp, output_root=output_tmp) + + pipeline = Pipeline(config=config) + + pipeline.add_task( + name="process_data", + task_function=task_1_fn, + output_path="/my_output.txt", + inputs={ + "input_file_path": os.path.join(input_tmp, "sample_tiny.txt"), + }, + ) + + pipeline.run() + + with open(os.path.join(output_tmp, "my_output.txt"), "r") as f: + assert f.read() == "tiny dataset processed" diff --git a/data-pipeline/tests/pipeline/test_pipeline.py b/data-pipeline/tests/pipeline/test_pipeline.py index 764d20803..a915b21a5 100644 --- a/data-pipeline/tests/pipeline/test_pipeline.py +++ b/data-pipeline/tests/pipeline/test_pipeline.py @@ -39,14 +39,12 @@ def output_dir(): yield temp_dir -@pytest.mark.only def test_config(input_dir, output_dir): logger.info(input_dir) logger.info(output_dir) pass -# @pytest.mark.only # def test_pipeline_tasks(ht_1_fixture: TestHt, ht_2_fixture: TestHt): # def task_1_fn(): # pass From eeb235376bd021ad1dafba3b01cee023ce840b05 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 28 Sep 2023 10:46:01 -0400 Subject: [PATCH 015/106] Add PipelineMock for faking outputs from other pipelines --- data-pipeline/check.sh | 2 +- data-pipeline/src/data_pipeline/pipeline.py | 29 +++++-- .../src/data_pipeline/pipelines/genes.py | 3 +- .../pipelines/gnomad_v4_coverage.py | 2 +- .../pipelines/gnomad_v4_variants.py | 75 +++++++++++++------ data-pipeline/tests/pipeline/test_config.py | 4 +- data-pipeline/tests/v4/test_inputs.py | 3 +- 7 files changed, 83 insertions(+), 35 deletions(-) diff --git a/data-pipeline/check.sh b/data-pipeline/check.sh index 23f14f12a..2f46fc934 100755 --- a/data-pipeline/check.sh +++ b/data-pipeline/check.sh @@ -8,7 +8,7 @@ black src/data_pipeline black tests echo "┏━━━ Running ruff ━━━━━━━━━━━━━━━━━━━" -ruff src/data_pipeline +ruff src/data_pipeline --fix ruff tests --fix echo "┏━━━ Running pytest ━━━━━━━━━━━━━━━━━━━" diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index eb2ef7d84..4e8b41660 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -1,12 +1,12 @@ import argparse import datetime -import logging import os import shutil import subprocess import tempfile import time -from typing import Callable, List, Optional, Union +from pathlib import Path +from typing import Callable, Dict, List, Optional, Union import attr from collections import OrderedDict @@ -130,7 +130,7 @@ def create( return cls(config, name, task_function, output_path, inputs, params) def get_output_path(self): - return self._config.output_paths.root + self._output_path + return os.path.join(self._config.output_paths.root, self._output_path) def get_inputs(self): paths = {} @@ -139,7 +139,8 @@ def get_inputs(self): if isinstance(v, (Task, DownloadTask)): paths.update({k: v.get_output_path()}) else: - paths.update({k: os.path.join(self._config.output_paths.root, v)}) + logger.info(k) + paths.update({k: os.path.join(self._config.input_paths.root, v)}) return paths @@ -164,12 +165,16 @@ def run(self, force=False): logger.info(f"Running {self._name} ({reason})") start = time.perf_counter() result = self._task_function(**self.get_inputs(), **self._params) + + if "gs://" not in self._config.output_paths.root: + Path(self._config.output_paths.root).mkdir(parents=True, exist_ok=True) + result.write(output_path, overwrite=True) # pylint: disable=unexpected-keyword-arg stop = time.perf_counter() elapsed = stop - start logger.info(f"Finished {self._name} in {elapsed // 60}m{elapsed % 60:02}s") else: - logger.info(f"Skipping %s", self._name) + logger.info("Skipping %s", self._name) @attr.define @@ -223,6 +228,20 @@ def get_output(self, output_name): return self._tasks[task_name] +@attr.define +class PipelineMock: + output_mappings: Dict[str, str] + + @classmethod + def create(cls, output_mappings: Dict[str, str]): + return cls(output_mappings) + + def get_output(self, output_name): + if output_name in self.output_mappings: + return self.output_mappings.get(output_name) + raise ValueError("Output name is not valid") + + def run_pipeline(pipeline: Pipeline): task_names = pipeline.get_all_task_names() diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index 9d7f9fa3b..cb3e8c898 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -1,4 +1,5 @@ import hail as hl +from data_pipeline.config import PipelineConfig from data_pipeline.pipeline import Pipeline, run_pipeline @@ -29,7 +30,7 @@ ) from data_pipeline.data_types.gene import reject_par_y_genes -pipeline = Pipeline() +pipeline = Pipeline(PipelineConfig.create(name="genes", input_root="data_in", output_root="data_out")) # TODO: FIXME ############################################### # Import GENCODE and HGNC files diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index 39fec5c3c..c33d293ad 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -5,7 +5,7 @@ pipeline = Pipeline( - config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") + config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") # TODO: FIXME ) pipeline.add_task( diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 004658ce3..f321bd65b 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,5 +1,8 @@ +import os +from loguru import logger + from data_pipeline.config import PipelineConfig -from data_pipeline.pipeline import Pipeline, run_pipeline +from data_pipeline.pipeline import Pipeline, PipelineMock, run_pipeline from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import ( prepare_gnomad_v4_variants, @@ -10,22 +13,48 @@ annotate_transcript_consequences, ) -# from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline -# from data_pipeline.pipelines.genes import pipeline as genes_pipeline +DATA_ENV = os.getenv("DATA_ENV", "local") +logger.info(DATA_ENV) + + +if DATA_ENV == "local": + coverage_pipeline = PipelineMock.create( + { + "exome_coverage": "coverage/gnomad_v4_exome_coverage.ht", + "genome_coverage": "coverage/gnomad_v4_genome_coverage.ht", + } + ) + genes_pipeline = PipelineMock.create( + { + "base_transcripts_grch38": "genes/transcripts_grch38_base.ht", + "mane_select_transcripts": "genes/mane_select_transcripts.ht", + } + ) + config = PipelineConfig.create( + name="gnomad_v4_variants", + input_root="data/v4_mock/inputs", + output_root="data/v4_mock/outputs", + ) +else: + from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline + from data_pipeline.pipelines.genes import pipeline as genes_pipeline + + config = PipelineConfig.create( + name="gnomad_v4_variants", + input_root="gs://gnomad-matt-data-pipeline/2023-09-26/inputs", + output_root="gs://gnomad-matt-data-pipeline/2023-09-26/outputs", + ) -pipeline = Pipeline( - config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") -) + +pipeline = Pipeline(config=config) pipeline.add_task( name="prepare_gnomad_v4_exome_variants", task_function=prepare_gnomad_v4_variants, - output_path="/gnomad_v4/gnomad_v4_exome_variants_base.ht", - inputs={ - "input_path": "external_datasets/mock_v4_release.ht", - }, + output_path="gnomad_v4/gnomad_v4_exome_variants_base.ht", + inputs={"input_path": "variants/mock_v4_release.ht"}, ) # pipeline.add_task( @@ -40,27 +69,25 @@ pipeline.add_task( name="annotate_gnomad_v4_exome_variants", task_function=annotate_variants, - output_path="/gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", - inputs={ - "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), - "exome_coverage_path": "tiny_datasets/gnomad_v4_exome_coverage.ht", - "genome_coverage_path": "tiny_datasets/gnomad_v4_genome_coverage.ht", - # "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), - # "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), - # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", - }, + output_path="gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", + inputs=( + { + "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), + "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), + "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), + # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", + } + ), ) pipeline.add_task( name="annotate_gnomad_v4_exome_transcript_consequences", task_function=annotate_transcript_consequences, - output_path="/gnomad_v4/gnomad_v4_variants_annotated_2.ht", + output_path="gnomad_v4/gnomad_v4_variants_annotated_2.ht", inputs={ "variants_path": pipeline.get_task("annotate_gnomad_v4_exome_variants"), - "transcripts_path": "genes/transcripts_grch38_base.ht", - "mane_transcripts_path": "genes/mane_select_transcripts.ht" - # "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), - # "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), + "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), + "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), }, ) diff --git a/data-pipeline/tests/pipeline/test_config.py b/data-pipeline/tests/pipeline/test_config.py index 47e6b102f..00faf60c8 100644 --- a/data-pipeline/tests/pipeline/test_config.py +++ b/data-pipeline/tests/pipeline/test_config.py @@ -76,9 +76,9 @@ def task_1_fn(input_file_path): pipeline.add_task( name="process_data", task_function=task_1_fn, - output_path="/my_output.txt", + output_path="my_output.txt", inputs={ - "input_file_path": os.path.join(input_tmp, "sample_tiny.txt"), + "input_file_path": "sample_tiny.txt", }, ) diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index 416f44be5..afc7a58b1 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -1,3 +1,4 @@ +import pytest from cattrs import structure, structure_attrs_fromdict import hail as hl import json @@ -32,7 +33,7 @@ def ht_to_json(ht: hl.Table, field: str = "row"): return objs -# @pytest.mark.only +@pytest.mark.only def test_globals_input_validation(): input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) From c2115e94394e1f6a74a51843b5d9733d92ba2369 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 28 Sep 2023 14:37:15 -0400 Subject: [PATCH 016/106] Simplify pipeline config --- data-pipeline/src/data_pipeline/config.py | 81 +++---------------- data-pipeline/src/data_pipeline/pipeline.py | 10 +-- .../src/data_pipeline/pipelines/genes.py | 2 +- .../pipelines/gnomad_v4_coverage.py | 2 +- .../pipelines/gnomad_v4_variants.py | 21 ++--- data-pipeline/tests/pipeline/test_config.py | 28 ++++--- 6 files changed, 49 insertions(+), 95 deletions(-) diff --git a/data-pipeline/src/data_pipeline/config.py b/data-pipeline/src/data_pipeline/config.py index 2994fbe25..c95a2f59c 100644 --- a/data-pipeline/src/data_pipeline/config.py +++ b/data-pipeline/src/data_pipeline/config.py @@ -1,48 +1,21 @@ -import os import attr from enum import Enum -from pathlib import Path - -DATA_ENV = os.getenv("DATA_ENV", "local") - - -@attr.define -class DataPaths: - root: str - - @classmethod - def create(cls, root=None, **kwargs): - dataset_paths = {} - - if root: - dataset_attrs = attr.fields(DataPaths) - - for ds in dataset_attrs: - if ds.name == "root": - dataset_paths.update({"root": root}) - - for item, path in kwargs.items(): - if item in dataset_paths: - dataset_paths.update({item: path}) - - return cls(**dataset_paths) - - def make_local_folder(self): - if "gs://" not in self.root: - Path(self.root).mkdir(parents=True, exist_ok=True) - - -class ComputeEnvironment(Enum): - local = "local" - cicd = "cicd" - dataproc = "dataproc" class DataEnvironment(Enum): - tiny = "tiny" + mock = "mock" full = "full" +def get_data_environment(env_value: str) -> DataEnvironment: + try: + # Using the Enum's name to get the actual enum item. + return DataEnvironment[env_value] + except KeyError: + valid_options = ", ".join([e.name for e in DataEnvironment]) + raise ValueError(f"Invalid value '{env_value}'. Allowed values are: {valid_options}") + + def is_valid_fn(cls): def is_valid(instance, attribute, value): if not isinstance(value, cls): @@ -54,35 +27,5 @@ def is_valid(instance, attribute, value): @attr.define class PipelineConfig: name: str - input_paths: DataPaths - output_paths: DataPaths - data_env: DataEnvironment = attr.field(validator=is_valid_fn(DataEnvironment)) - compute_env: ComputeEnvironment = attr.field(validator=is_valid_fn(ComputeEnvironment)) - - @classmethod - def create( - cls, - name: str, - input_root: str, - output_root: str, - data_env=DataEnvironment.tiny, - compute_env=ComputeEnvironment.local, - ): - input_paths = DataPaths.create(input_root) - output_paths = DataPaths.create(output_root) - return cls(name, input_paths, output_paths, data_env, compute_env) - - -# config = PipelineConfig.create( -# name= -# input_root="data_in", -# output_root="data_out", -# compute_env=ComputeEnvironment.local, -# data_env=DataEnvironment.tiny, -# ) - - -# if DATA_ENV == "dataproc": -# config = PipelineConfig( -# output_path=DataPaths.create(os.path.join("gs://gnomad-matt-data-pipeline")), -# ) + input_root: str + output_root: str diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index 4e8b41660..4d9a07fb9 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -70,7 +70,7 @@ def create(cls, config: PipelineConfig, name: str, url: str, output_path: str): return cls(config, name, url, output_path) def get_output_path(self): - return self._config.output_paths.root + self._output_path + return self._config.output_root + self._output_path def should_run(self): output_path = self.get_output_path() @@ -130,7 +130,7 @@ def create( return cls(config, name, task_function, output_path, inputs, params) def get_output_path(self): - return os.path.join(self._config.output_paths.root, self._output_path) + return os.path.join(self._config.output_root, self._output_path) def get_inputs(self): paths = {} @@ -140,7 +140,7 @@ def get_inputs(self): paths.update({k: v.get_output_path()}) else: logger.info(k) - paths.update({k: os.path.join(self._config.input_paths.root, v)}) + paths.update({k: os.path.join(self._config.input_root, v)}) return paths @@ -166,8 +166,8 @@ def run(self, force=False): start = time.perf_counter() result = self._task_function(**self.get_inputs(), **self._params) - if "gs://" not in self._config.output_paths.root: - Path(self._config.output_paths.root).mkdir(parents=True, exist_ok=True) + if "gs://" not in self._config.output_root: + Path(self._config.output_root).mkdir(parents=True, exist_ok=True) result.write(output_path, overwrite=True) # pylint: disable=unexpected-keyword-arg stop = time.perf_counter() diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index cb3e8c898..ce3a99cc2 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -30,7 +30,7 @@ ) from data_pipeline.data_types.gene import reject_par_y_genes -pipeline = Pipeline(PipelineConfig.create(name="genes", input_root="data_in", output_root="data_out")) # TODO: FIXME +pipeline = Pipeline(PipelineConfig(name="genes", input_root="data_in", output_root="data_out")) # TODO: FIXME ############################################### # Import GENCODE and HGNC files diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index c33d293ad..bbef03db8 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -5,7 +5,7 @@ pipeline = Pipeline( - config=PipelineConfig.create(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") # TODO: FIXME + config=PipelineConfig(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") # TODO: FIXME ) pipeline.add_task( diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index f321bd65b..92c0e2c11 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,7 +1,6 @@ import os -from loguru import logger -from data_pipeline.config import PipelineConfig +from data_pipeline.config import PipelineConfig, get_data_environment, DataEnvironment from data_pipeline.pipeline import Pipeline, PipelineMock, run_pipeline from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import ( @@ -13,13 +12,11 @@ annotate_transcript_consequences, ) +DATA_ENV = os.getenv("DATA_ENV", "mock") -DATA_ENV = os.getenv("DATA_ENV", "local") +data_environment = get_data_environment(DATA_ENV) -logger.info(DATA_ENV) - - -if DATA_ENV == "local": +if data_environment == DataEnvironment.mock: coverage_pipeline = PipelineMock.create( { "exome_coverage": "coverage/gnomad_v4_exome_coverage.ht", @@ -32,20 +29,24 @@ "mane_select_transcripts": "genes/mane_select_transcripts.ht", } ) - config = PipelineConfig.create( + config = PipelineConfig( name="gnomad_v4_variants", input_root="data/v4_mock/inputs", output_root="data/v4_mock/outputs", ) -else: +elif data_environment == DataEnvironment.full: from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline from data_pipeline.pipelines.genes import pipeline as genes_pipeline - config = PipelineConfig.create( + config = PipelineConfig( name="gnomad_v4_variants", input_root="gs://gnomad-matt-data-pipeline/2023-09-26/inputs", output_root="gs://gnomad-matt-data-pipeline/2023-09-26/outputs", ) +else: + raise EnvironmentError( + f"Data environment invalid. Set DATA_ENV to one of {', '.join([e.name for e in DataEnvironment])}" + ) pipeline = Pipeline(config=config) diff --git a/data-pipeline/tests/pipeline/test_config.py b/data-pipeline/tests/pipeline/test_config.py index 00faf60c8..7ed8c1f43 100644 --- a/data-pipeline/tests/pipeline/test_config.py +++ b/data-pipeline/tests/pipeline/test_config.py @@ -4,7 +4,7 @@ import tempfile import attr -from data_pipeline.config import ComputeEnvironment, DataEnvironment, DataPaths, PipelineConfig +from data_pipeline.config import DataEnvironment, PipelineConfig, get_data_environment from data_pipeline.pipeline import Pipeline # from data_pipeline.pipeline import Pipeline @@ -26,24 +26,34 @@ def output_tmp(): yield temp_dir +@pytest.mark.only +def test_get_data_environment_defaults_mock(): + data_environment = get_data_environment("mock") + assert data_environment == DataEnvironment.mock + + +@pytest.mark.only +def test_get_data_environment_raises_if_invalid_environment(): + with pytest.raises(ValueError, match="Invalid value 'nonexisting_environment'. Allowed values are"): + get_data_environment("nonexisting_environment") + + @pytest.mark.only def test_config_created(input_tmp, output_tmp): - config = PipelineConfig.create(name="test", input_root=input_tmp, output_root=output_tmp) + config = PipelineConfig(name="test", input_root=input_tmp, output_root=output_tmp) assert isinstance(config, PipelineConfig) - assert isinstance(config.input_paths, DataPaths) - assert isinstance(config.output_paths, DataPaths) - assert isinstance(config.compute_env, ComputeEnvironment) - assert isinstance(config.data_env, DataEnvironment) + assert isinstance(config.input_root, str) + assert isinstance(config.output_root, str) @pytest.mark.only def test_config_read_input_file(input_tmp, output_tmp): - config = PipelineConfig.create( + config = PipelineConfig( name="test", input_root=input_tmp, output_root=output_tmp, ) - sample = os.path.join(config.input_paths.root, "sample_tiny.txt") + sample = os.path.join(config.input_root, "sample_tiny.txt") with open(sample, "r") as f: assert f.read() == "tiny dataset" @@ -69,7 +79,7 @@ def task_1_fn(input_file_path): output_data.update_text(f"{input_data} processed") return output_data - config = PipelineConfig.create(name="pipeline1", input_root=input_tmp, output_root=output_tmp) + config = PipelineConfig(name="pipeline1", input_root=input_tmp, output_root=output_tmp) pipeline = Pipeline(config=config) From 219e5da412df5f5135249f4ec36717a5f016c434 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 29 Sep 2023 10:57:31 -0400 Subject: [PATCH 017/106] Add mock_data test configuration --- data-pipeline/check.sh | 10 +++++++++- data-pipeline/pytest.ini | 5 +++-- data-pipeline/src/data_pipeline/pipeline.py | 9 ++++----- .../data_pipeline/pipelines/gnomad_v4_variants.py | 8 +++++--- data-pipeline/tests/pipeline/test_config.py | 15 ++++----------- data-pipeline/tests/pipeline/test_pipeline.py | 1 + data-pipeline/tests/v4/test_inputs.py | 9 ++++++--- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/data-pipeline/check.sh b/data-pipeline/check.sh index 2f46fc934..86a86c7ea 100755 --- a/data-pipeline/check.sh +++ b/data-pipeline/check.sh @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# +echo "┏━━━ Clean ━━━━━━━━━━━━━━━━━━━" +find . -type d -name "__pycache__" -exec rm -r {} + +find . -name "*.pyc" -exec rm -f {} + echo "┏━━━ Running pyright ━━━━━━━━━━━━━━━━━━━" pyright @@ -12,4 +16,8 @@ ruff src/data_pipeline --fix ruff tests --fix echo "┏━━━ Running pytest ━━━━━━━━━━━━━━━━━━━" -pytest -m only +if [[ "$1" == "--mock-data" ]]; then + pytest -k "mock_data" +else + pytest +fi diff --git a/data-pipeline/pytest.ini b/data-pipeline/pytest.ini index 2a1a9fdb2..51930f78f 100644 --- a/data-pipeline/pytest.ini +++ b/data-pipeline/pytest.ini @@ -1,8 +1,9 @@ [pytest] testpaths = tests/pipeline -addopts = --strict -W ignore -v -s --durations=0 + tests/v4 +addopts = --strict -W ignore -v -s --durations=0 -k "not mock_data and not broken" markers = only: marked with "only" - long: takes a long time + mock_data: requires mock datasets to be available broken: test is broken diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index 4d9a07fb9..6616af042 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -139,7 +139,6 @@ def get_inputs(self): if isinstance(v, (Task, DownloadTask)): paths.update({k: v.get_output_path()}) else: - logger.info(k) paths.update({k: os.path.join(self._config.input_root, v)}) return paths @@ -174,7 +173,7 @@ def run(self, force=False): elapsed = stop - start logger.info(f"Finished {self._name} in {elapsed // 60}m{elapsed % 60:02}s") else: - logger.info("Skipping %s", self._name) + logger.info(f"Skipping {self._name}") @attr.define @@ -213,17 +212,17 @@ def get_task(self, name: str) -> Union[Task, DownloadTask]: def get_all_task_names(self) -> List[str]: return list(self._tasks.keys()) - def run(self, force_tasks=None): + def run(self, force_tasks=None) -> None: for task_name, task in self._tasks.items(): task.run(force=force_tasks and task_name in force_tasks) - def set_outputs(self, outputs): + def set_outputs(self, outputs) -> None: for output_name, task_name in outputs.items(): assert task_name in self._tasks, f"Unable to set output '{output_name}', no task named '{task_name}'" self._outputs = outputs - def get_output(self, output_name): + def get_output(self, output_name) -> str: task_name = self._outputs[output_name] return self._tasks[task_name] diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 92c0e2c11..ce1bf6335 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,5 +1,6 @@ import os + from data_pipeline.config import PipelineConfig, get_data_environment, DataEnvironment from data_pipeline.pipeline import Pipeline, PipelineMock, run_pipeline @@ -14,6 +15,8 @@ DATA_ENV = os.getenv("DATA_ENV", "mock") +pipeline_name = "gnomad_v4_variants" + data_environment = get_data_environment(DATA_ENV) if data_environment == DataEnvironment.mock: @@ -30,7 +33,7 @@ } ) config = PipelineConfig( - name="gnomad_v4_variants", + name=pipeline_name, input_root="data/v4_mock/inputs", output_root="data/v4_mock/outputs", ) @@ -39,7 +42,7 @@ from data_pipeline.pipelines.genes import pipeline as genes_pipeline config = PipelineConfig( - name="gnomad_v4_variants", + name=pipeline_name, input_root="gs://gnomad-matt-data-pipeline/2023-09-26/inputs", output_root="gs://gnomad-matt-data-pipeline/2023-09-26/outputs", ) @@ -48,7 +51,6 @@ f"Data environment invalid. Set DATA_ENV to one of {', '.join([e.name for e in DataEnvironment])}" ) - pipeline = Pipeline(config=config) pipeline.add_task( diff --git a/data-pipeline/tests/pipeline/test_config.py b/data-pipeline/tests/pipeline/test_config.py index 7ed8c1f43..34ad9748f 100644 --- a/data-pipeline/tests/pipeline/test_config.py +++ b/data-pipeline/tests/pipeline/test_config.py @@ -7,8 +7,6 @@ from data_pipeline.config import DataEnvironment, PipelineConfig, get_data_environment from data_pipeline.pipeline import Pipeline -# from data_pipeline.pipeline import Pipeline - @pytest.fixture def input_tmp(): @@ -26,19 +24,16 @@ def output_tmp(): yield temp_dir -@pytest.mark.only def test_get_data_environment_defaults_mock(): data_environment = get_data_environment("mock") assert data_environment == DataEnvironment.mock -@pytest.mark.only def test_get_data_environment_raises_if_invalid_environment(): with pytest.raises(ValueError, match="Invalid value 'nonexisting_environment'. Allowed values are"): get_data_environment("nonexisting_environment") -@pytest.mark.only def test_config_created(input_tmp, output_tmp): config = PipelineConfig(name="test", input_root=input_tmp, output_root=output_tmp) assert isinstance(config, PipelineConfig) @@ -46,7 +41,6 @@ def test_config_created(input_tmp, output_tmp): assert isinstance(config.output_root, str) -@pytest.mark.only def test_config_read_input_file(input_tmp, output_tmp): config = PipelineConfig( name="test", @@ -70,7 +64,6 @@ def write(self, path, overwrite=False): f.write(self.text) -@pytest.mark.only def test_pipeline_tasks(input_tmp, output_tmp): def task_1_fn(input_file_path): with open(input_file_path, "r") as f: @@ -79,11 +72,11 @@ def task_1_fn(input_file_path): output_data.update_text(f"{input_data} processed") return output_data - config = PipelineConfig(name="pipeline1", input_root=input_tmp, output_root=output_tmp) + test_config = PipelineConfig(name="pipeline1", input_root=input_tmp, output_root=output_tmp) - pipeline = Pipeline(config=config) + test_pipeline = Pipeline(config=test_config) - pipeline.add_task( + test_pipeline.add_task( name="process_data", task_function=task_1_fn, output_path="my_output.txt", @@ -92,7 +85,7 @@ def task_1_fn(input_file_path): }, ) - pipeline.run() + test_pipeline.run() with open(os.path.join(output_tmp, "my_output.txt"), "r") as f: assert f.read() == "tiny dataset processed" diff --git a/data-pipeline/tests/pipeline/test_pipeline.py b/data-pipeline/tests/pipeline/test_pipeline.py index a915b21a5..d94328f98 100644 --- a/data-pipeline/tests/pipeline/test_pipeline.py +++ b/data-pipeline/tests/pipeline/test_pipeline.py @@ -39,6 +39,7 @@ def output_dir(): yield temp_dir +@pytest.mark.broken def test_config(input_dir, output_dir): logger.info(input_dir) logger.info(output_dir) diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/tests/v4/test_inputs.py index afc7a58b1..f4922169a 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/tests/v4/test_inputs.py @@ -2,7 +2,6 @@ from cattrs import structure, structure_attrs_fromdict import hail as hl import json -from loguru import logger from data_pipeline.pipelines.gnomad_v4_variants import ( pipeline as gnomad_v4_variant_pipeline, @@ -33,15 +32,16 @@ def ht_to_json(ht: hl.Table, field: str = "row"): return objs -@pytest.mark.only +@pytest.mark.mock_data def test_globals_input_validation(): input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) result = ht_to_json(ht, "globals")[0] - logger.info(result) + # logger.info(result) structure(result, Globals) +@pytest.mark.mock_data def test_validate_variant_input(): input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) @@ -49,6 +49,7 @@ def test_validate_variant_input(): [structure_attrs_fromdict(variant, InitialVariant) for variant in result] +@pytest.mark.mock_data def test_validate_step1_output(): output_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) @@ -57,6 +58,7 @@ def test_validate_step1_output(): [structure_attrs_fromdict(variant, Step1Variant) for variant in result] +@pytest.mark.mock_data def test_validate_step2_output(): output_path = gnomad_v4_variant_pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) @@ -64,6 +66,7 @@ def test_validate_step2_output(): [structure_attrs_fromdict(variant, Step2Variant) for variant in result] +@pytest.mark.mock_data def test_validate_step3_output(): output_path = gnomad_v4_variant_pipeline.get_task( "annotate_gnomad_v4_exome_transcript_consequences" From cf7f5d206bd2951b14e18c1b2092fb52d5d0f97e Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 29 Sep 2023 10:59:33 -0400 Subject: [PATCH 018/106] Update dependencies --- data-pipeline/poetry.lock | 195 ++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 104 deletions(-) diff --git a/data-pipeline/poetry.lock b/data-pipeline/poetry.lock index 7c8ed50a5..e09be346d 100644 --- a/data-pipeline/poetry.lock +++ b/data-pipeline/poetry.lock @@ -98,7 +98,7 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "avro" -version = "1.11.2" +version = "1.11.3" description = "Avro is a serialization and RPC framework." category = "dev" optional = false @@ -172,7 +172,7 @@ msrest = ">=0.6.21" [[package]] name = "azure-storage-blob" -version = "12.18.1" +version = "12.18.2" description = "Microsoft Azure Blob Storage Client Library for Python" category = "dev" optional = false @@ -239,23 +239,23 @@ xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.28.52" +version = "1.28.57" description = "The AWS SDK for Python" category = "dev" optional = false python-versions = ">= 3.7" [package.dependencies] -botocore = ">=1.31.52,<1.32.0" +botocore = ">=1.31.57,<1.32.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.7.0,<0.8.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.31.52" +version = "1.31.57" description = "Low-level, data-driven core of boto 3." category = "dev" optional = false @@ -309,11 +309,11 @@ python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.8" [package.dependencies] pycparser = "*" @@ -496,7 +496,7 @@ python-versions = ">=3.8" [[package]] name = "google-api-core" -version = "2.11.1" +version = "2.12.0" description = "Google API client core library" category = "dev" optional = false @@ -515,7 +515,7 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.23.0" +version = "2.23.2" description = "Google Authentication Library" category = "dev" optional = false @@ -525,7 +525,6 @@ python-versions = ">=3.7" cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -698,7 +697,7 @@ python-versions = ">=3.7" [[package]] name = "ipython" -version = "8.15.0" +version = "8.16.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -840,7 +839,7 @@ traitlets = "*" [[package]] name = "msal" -version = "1.24.0" +version = "1.24.1" description = "The Microsoft Authentication Library (MSAL) for Python library" category = "dev" optional = false @@ -1269,7 +1268,7 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyright" -version = "1.1.327" +version = "1.1.329" description = "Command line wrapper for pyright" category = "dev" optional = false @@ -1438,7 +1437,7 @@ python-versions = ">=3.7" [[package]] name = "s3transfer" -version = "0.6.2" +version = "0.7.0" description = "An Amazon S3 Transfer Manager" category = "dev" optional = false @@ -1568,7 +1567,7 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.10.0" +version = "5.10.1" description = "Traitlets Python configuration system" category = "dev" optional = false @@ -1640,7 +1639,7 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.7" description = "Measures the displayed width of unicode strings in a terminal" category = "dev" optional = false @@ -1809,7 +1808,7 @@ attrs = [ {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] avro = [ - {file = "avro-1.11.2.tar.gz", hash = "sha256:53dcd5bffccb9a72136f08d0b18771795eaf4eefb028bbaaed5f4e1787f0e268"}, + {file = "avro-1.11.3.tar.gz", hash = "sha256:3393bb5139f9cf0791d205756ce1e39a5b58586af5b153d6a3b5a199610e9d17"}, ] azure-common = [ {file = "azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3"}, @@ -1832,8 +1831,8 @@ azure-mgmt-storage = [ {file = "azure_mgmt_storage-20.1.0-py3-none-any.whl", hash = "sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659"}, ] azure-storage-blob = [ - {file = "azure-storage-blob-12.18.1.tar.gz", hash = "sha256:d3265c2403c28d8881326c365e9cf7ed2ad55fdac98404eae753548702b31ba2"}, - {file = "azure_storage_blob-12.18.1-py3-none-any.whl", hash = "sha256:00b92568e91d608c04dfd4814c3b180818e690023493bb984c22dfc1a8a96e55"}, + {file = "azure-storage-blob-12.18.2.tar.gz", hash = "sha256:e11935348981ffc005b848b55db25c04f2d1f90e1ee33000659906b763cf14c8"}, + {file = "azure_storage_blob-12.18.2-py3-none-any.whl", hash = "sha256:ffd864bf9abf33dfc72c6ef37899a19bd9d585a946a2c61e288b4420c035df3a"}, ] backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, @@ -1868,12 +1867,12 @@ bokeh = [ {file = "bokeh-3.2.2.tar.gz", hash = "sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff"}, ] boto3 = [ - {file = "boto3-1.28.52-py3-none-any.whl", hash = "sha256:1d36db102517d62c6968b3b0636303241f56859d12dd071def4882fc6e030b20"}, - {file = "boto3-1.28.52.tar.gz", hash = "sha256:a34fc153cb2f6fb2f79a764286c967392e8aae9412381d943bddc576c4f7631a"}, + {file = "boto3-1.28.57-py3-none-any.whl", hash = "sha256:5ddf24cf52c7fb6aaa332eaa08ae8c2afc8f2d1e8860680728533dd573904e32"}, + {file = "boto3-1.28.57.tar.gz", hash = "sha256:e2d2824ba6459b330d097e94039a9c4f96ae3f4bcdc731d620589ad79dcd16d3"}, ] botocore = [ - {file = "botocore-1.31.52-py3-none-any.whl", hash = "sha256:46b0a75a38521aa6a75fddccb1542e002930e609d4e13516f40fef170d32e515"}, - {file = "botocore-1.31.52.tar.gz", hash = "sha256:6d09881c5a8be34b497872ca3936f8757d886a6f42f2a8703411928189cfedc0"}, + {file = "botocore-1.31.57-py3-none-any.whl", hash = "sha256:af006248276ff8e19e3ec7214478f6257035eb40aed865e405486500471ae71b"}, + {file = "botocore-1.31.57.tar.gz", hash = "sha256:301436174635bec739b225b840fc365ca00e5c1a63e5b2a19ee679d204e01b78"}, ] cachetools = [ {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, @@ -1888,70 +1887,58 @@ certifi = [ {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] charset-normalizer = [ {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, @@ -2252,12 +2239,12 @@ frozenlist = [ {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] google-api-core = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, + {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, + {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, ] google-auth = [ - {file = "google-auth-2.23.0.tar.gz", hash = "sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a"}, - {file = "google_auth-2.23.0-py2.py3-none-any.whl", hash = "sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7"}, + {file = "google-auth-2.23.2.tar.gz", hash = "sha256:5a9af4be520ba33651471a0264eead312521566f44631cbb621164bc30c8fd40"}, + {file = "google_auth-2.23.2-py2.py3-none-any.whl", hash = "sha256:c2e253347579d483004f17c3bd0bf92e611ef6c7ba24d41c5c59f2e7aeeaf088"}, ] google-auth-oauthlib = [ {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, @@ -2365,8 +2352,8 @@ iniconfig = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] ipython = [ - {file = "ipython-8.15.0-py3-none-any.whl", hash = "sha256:45a2c3a529296870a97b7de34eda4a31bee16bc7bf954e07d39abe49caf8f887"}, - {file = "ipython-8.15.0.tar.gz", hash = "sha256:2baeb5be6949eeebf532150f81746f8333e2ccce02de1c7eedde3f23ed5e9f1e"}, + {file = "ipython-8.16.0-py3-none-any.whl", hash = "sha256:dba644376826a532e362da945a672865be7efda76ecf999219e6021bda85d702"}, + {file = "ipython-8.16.0.tar.gz", hash = "sha256:7a1b2e1e6a3ec5baa466163c451335081f31859883889ff0289c6b21f7a095e2"}, ] isodate = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, @@ -2453,8 +2440,8 @@ matplotlib-inline = [ {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, ] msal = [ - {file = "msal-1.24.0-py2.py3-none-any.whl", hash = "sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50"}, - {file = "msal-1.24.0.tar.gz", hash = "sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e"}, + {file = "msal-1.24.1-py2.py3-none-any.whl", hash = "sha256:ce4320688f95c301ee74a4d0e9dbcfe029a63663a8cc61756f40d0d0d36574ad"}, + {file = "msal-1.24.1.tar.gz", hash = "sha256:aa0972884b3c6fdec53d9a0bd15c12e5bd7b71ac1b66d746f54d128709f3f8f8"}, ] msal-extensions = [ {file = "msal-extensions-1.0.0.tar.gz", hash = "sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354"}, @@ -2902,8 +2889,8 @@ PyJWT = [ {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] pyright = [ - {file = "pyright-1.1.327-py3-none-any.whl", hash = "sha256:3462cda239e9140276238bbdbd0b59d77406f1c2e14d8cb8c20c8e25639c6b3c"}, - {file = "pyright-1.1.327.tar.gz", hash = "sha256:ba74148ad64f22020dbbed6781c4bdb38ecb8a7ca90dc3c87a4f08d1c0e11592"}, + {file = "pyright-1.1.329-py3-none-any.whl", hash = "sha256:c16f88a7ac14ddd0513e62fec56d69c37e3c6b412161ad16aa23a9c7e3dabaf4"}, + {file = "pyright-1.1.329.tar.gz", hash = "sha256:5baf82ff5ecb8c8b3ac400e8536348efbde0b94a09d83d5b440c0d143fd151a8"}, ] pyspark = [ {file = "pyspark-3.3.3.tar.gz", hash = "sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f"}, @@ -3118,8 +3105,8 @@ ruff = [ {file = "ruff-0.0.290.tar.gz", hash = "sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d"}, ] s3transfer = [ - {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, - {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, + {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, + {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, ] scipy = [ {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, @@ -3190,8 +3177,8 @@ tqdm = [ {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] traitlets = [ - {file = "traitlets-5.10.0-py3-none-any.whl", hash = "sha256:417745a96681fbb358e723d5346a547521f36e9bd0d50ba7ab368fff5d67aa54"}, - {file = "traitlets-5.10.0.tar.gz", hash = "sha256:f584ea209240466e66e91f3c81aa7d004ba4cf794990b0c775938a1544217cd1"}, + {file = "traitlets-5.10.1-py3-none-any.whl", hash = "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116"}, + {file = "traitlets-5.10.1.tar.gz", hash = "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542"}, ] typer = [ {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, @@ -3242,8 +3229,8 @@ uvloop = [ {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, ] wcwidth = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.7-py2.py3-none-any.whl", hash = "sha256:fabf3e32999d9b0dab7d19d845149f326f04fe29bac67709ee071dbd92640a36"}, + {file = "wcwidth-0.2.7.tar.gz", hash = "sha256:1b6d30a98ddd5ce9bbdb33658191fd2423fc9da203fe3ef1855407dcb7ee4e26"}, ] win32-setctime = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, From c12c101cd23969b75412c668963b49aa1c92b16f Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 2 Oct 2023 11:14:00 -0400 Subject: [PATCH 019/106] Move input validation out of tests, into pipeline code itself --- .../pipelines/gnomad_v4_validation.py} | 41 ++++++++----------- .../pipelines/gnomad_v4_variants.py | 15 +++++++ 2 files changed, 33 insertions(+), 23 deletions(-) rename data-pipeline/{tests/v4/test_inputs.py => src/data_pipeline/pipelines/gnomad_v4_validation.py} (58%) diff --git a/data-pipeline/tests/v4/test_inputs.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py similarity index 58% rename from data-pipeline/tests/v4/test_inputs.py rename to data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py index f4922169a..ba34e0cb0 100644 --- a/data-pipeline/tests/v4/test_inputs.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py @@ -1,11 +1,10 @@ -import pytest from cattrs import structure, structure_attrs_fromdict import hail as hl import json -from data_pipeline.pipelines.gnomad_v4_variants import ( - pipeline as gnomad_v4_variant_pipeline, -) +from loguru import logger + +from data_pipeline.pipeline import Pipeline from data_pipeline.datasets.gnomad_v4.types.initial_globals import Globals from data_pipeline.datasets.gnomad_v4.types.initial_variant import InitialVariant @@ -13,8 +12,6 @@ from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step2 import Variant as Step2Variant from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step3 import Variant as Step3Variant -step1_task = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants") - def ht_to_json(ht: hl.Table, field: str = "row"): if field == "row": @@ -32,45 +29,43 @@ def ht_to_json(ht: hl.Table, field: str = "row"): return objs -@pytest.mark.mock_data -def test_globals_input_validation(): - input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] +def validate_globals_input(pipeline: Pipeline): + input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) result = ht_to_json(ht, "globals")[0] # logger.info(result) structure(result, Globals) + logger.info("Validated prepare_gnomad_v4_exome_variants input globals") -@pytest.mark.mock_data -def test_validate_variant_input(): - input_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] +def validate_variant_input(pipeline: Pipeline): + input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) result = ht_to_json(ht) [structure_attrs_fromdict(variant, InitialVariant) for variant in result] + logger.info("Validated prepare_gnomad_v4_exome_variants input variants") -@pytest.mark.mock_data -def test_validate_step1_output(): - output_path = gnomad_v4_variant_pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() +def validate_step1_output(pipeline: Pipeline): + output_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) # ht = ht.sample(0.1, seed=1234) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step1Variant) for variant in result] + logger.info("Validated prepare_gnomad_v4_exome_variants (step 1) output") -@pytest.mark.mock_data -def test_validate_step2_output(): - output_path = gnomad_v4_variant_pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() +def validate_step2_output(pipeline: Pipeline): + output_path = pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step2Variant) for variant in result] + logger.info("Validated annotate_gnomad_v4_exome_variants (step 2) output") -@pytest.mark.mock_data -def test_validate_step3_output(): - output_path = gnomad_v4_variant_pipeline.get_task( - "annotate_gnomad_v4_exome_transcript_consequences" - ).get_output_path() +def validate_step3_output(pipeline: Pipeline): + output_path = pipeline.get_task("annotate_gnomad_v4_exome_transcript_consequences").get_output_path() ht = hl.read_table(output_path) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step3Variant) for variant in result] + logger.info("Validated annotate_gnomad_v4_exome_transcript_consequences (step 3) output") diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index ce1bf6335..47ae0b386 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,4 +1,5 @@ import os +from loguru import logger from data_pipeline.config import PipelineConfig, get_data_environment, DataEnvironment @@ -12,6 +13,13 @@ annotate_variants, annotate_transcript_consequences, ) +from data_pipeline.pipelines.gnomad_v4_validation import ( + validate_globals_input, + validate_step1_output, + validate_step2_output, + validate_step3_output, + validate_variant_input, +) DATA_ENV = os.getenv("DATA_ENV", "mock") @@ -106,3 +114,10 @@ if __name__ == "__main__": run_pipeline(pipeline) + + logger.info("Validating pipeline IO formats") + validate_globals_input(pipeline) + validate_variant_input(pipeline) + validate_step1_output(pipeline) + validate_step2_output(pipeline) + validate_step3_output(pipeline) From 3586d6b666709a187ed7833381b724761912565a Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 16 Oct 2023 19:47:48 -0400 Subject: [PATCH 020/106] Update global input schema for new v4 mock variant dataset --- .../gnomad_v4/types/initial_globals.py | 60 +++++++++++-------- .../pipelines/gnomad_v4_validation.py | 6 +- .../pipelines/gnomad_v4_variants.py | 12 ++-- 3 files changed, 47 insertions(+), 31 deletions(-) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py index ef0536728..53a3dc2be 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py @@ -1,5 +1,5 @@ import attr -from typing import List +from typing import List, Dict, Union @attr.define @@ -29,6 +29,7 @@ class TestResult: class Cutoff: bin: float min_score: float + bin_id: str @attr.define @@ -51,17 +52,12 @@ class MetaFloat: @attr.define class FilteringModel: - model_name: str + filter_name: str score_name: str - feature_medians: List[FeatureMedians] - variants_by_strata: List[MetaFloat] - features_importance: List[MetaFloat] - features: List[str] - test_results: List[TestResult] - rf_snv_cutoff: Cutoff - rf_indel_cutoff: Cutoff - inbreeding_cutoff: float - model_id: str + snv_cutoff: Cutoff + indel_cutoff: Cutoff + snv_training_variables: List[str] + indel_training_variables: List[str] @attr.define @@ -69,18 +65,20 @@ class ToolVersions: dbsnp_version: str cadd_version: str revel_version: str - splicaai_version: str - primateai_version: str - pangolin_version: str - vrs_version: str + spliceai_version: str + pangolin_version: List[str] + phylop_version: str + sift_version: str + polyphen_version: str @attr.define class VepGlobals: vep_version: str - vep_csq_header: str vep_help: str vep_config: str + gencode_version: str + mane_select_version: str @attr.define @@ -91,21 +89,35 @@ class AgeDistribution: n_larger: int +@attr.define +class Downsampling: + key: str + value: List[int] + + +@attr.define +class VrsVersions: + vrs_schema_version: str + vrs_python_version: str + seqrepo_version: str + + @attr.define class Globals: freq_meta: List[List[MetaString]] freq_index_dict: List[MetaInt] + freq_meta_sample_count: List[int] faf_meta: List[List[MetaString]] faf_index_dict: List[MetaInt] - freq_sample_count: List[int] filtering_model: FilteringModel tool_versions: ToolVersions vep_globals: VepGlobals age_distribution: AgeDistribution - age_index_dict: List[MetaInt] - age_meta: List[List[MetaString]] - grpmax_index_dict: List[MetaInt] - grpmax_meta: List[List[MetaString]] - README: List[MetaString] - gnomad_qc_repo: str - gnomad_methods_repo: str + joint_freq_index_dict: List[MetaInt] + joint_freq_meta_sample_count: List[int] + joint_faf_meta: List[List[MetaString]] + downsamplings: List[Downsampling] + inbreeding_coeff_cutoff: float + vrs_versions: VrsVersions + date: str + version: str diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py index ba34e0cb0..f67befea5 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py @@ -32,6 +32,7 @@ def ht_to_json(ht: hl.Table, field: str = "row"): def validate_globals_input(pipeline: Pipeline): input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) + ht = ht.sample(0.001, 1337) result = ht_to_json(ht, "globals")[0] # logger.info(result) structure(result, Globals) @@ -41,6 +42,7 @@ def validate_globals_input(pipeline: Pipeline): def validate_variant_input(pipeline: Pipeline): input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) + ht = ht.sample(0.001, 1337) result = ht_to_json(ht) [structure_attrs_fromdict(variant, InitialVariant) for variant in result] logger.info("Validated prepare_gnomad_v4_exome_variants input variants") @@ -49,7 +51,7 @@ def validate_variant_input(pipeline: Pipeline): def validate_step1_output(pipeline: Pipeline): output_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) - # ht = ht.sample(0.1, seed=1234) + ht = ht.sample(0.001, 1337) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step1Variant) for variant in result] logger.info("Validated prepare_gnomad_v4_exome_variants (step 1) output") @@ -58,6 +60,7 @@ def validate_step1_output(pipeline: Pipeline): def validate_step2_output(pipeline: Pipeline): output_path = pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) + ht = ht.sample(0.001, 1337) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step2Variant) for variant in result] logger.info("Validated annotate_gnomad_v4_exome_variants (step 2) output") @@ -66,6 +69,7 @@ def validate_step2_output(pipeline: Pipeline): def validate_step3_output(pipeline: Pipeline): output_path = pipeline.get_task("annotate_gnomad_v4_exome_transcript_consequences").get_output_path() ht = hl.read_table(output_path) + ht = ht.sample(0.001, 1337) result = ht_to_json(ht) [structure_attrs_fromdict(variant, Step3Variant) for variant in result] logger.info("Validated annotate_gnomad_v4_exome_transcript_consequences (step 3) output") diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 47ae0b386..628846978 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -65,7 +65,7 @@ name="prepare_gnomad_v4_exome_variants", task_function=prepare_gnomad_v4_variants, output_path="gnomad_v4/gnomad_v4_exome_variants_base.ht", - inputs={"input_path": "variants/mock_v4_release.ht"}, + inputs={"input_path": "variants/gnomad.exomes.sites.test.ht"}, ) # pipeline.add_task( @@ -113,11 +113,11 @@ ############################################### if __name__ == "__main__": - run_pipeline(pipeline) + # run_pipeline(pipeline) logger.info("Validating pipeline IO formats") validate_globals_input(pipeline) - validate_variant_input(pipeline) - validate_step1_output(pipeline) - validate_step2_output(pipeline) - validate_step3_output(pipeline) + # validate_variant_input(pipeline) + # validate_step1_output(pipeline) + # validate_step2_output(pipeline) + # validate_step3_output(pipeline) From 25558617de40aa98842aa3f647ea72c784f7ce6c Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 16 Oct 2023 20:30:11 -0400 Subject: [PATCH 021/106] Update variant input schema for input schema for new v4 mock variant dataset --- .../gnomad_v4/types/initial_variant.py | 95 +++++++++++-------- .../pipelines/gnomad_v4_validation.py | 6 +- .../pipelines/gnomad_v4_variants.py | 2 +- 3 files changed, 60 insertions(+), 43 deletions(-) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 21bc6b6bd..14f020407 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -20,10 +20,26 @@ class Frequency: class Grpmax: AC: Union[int, None] AN: Union[int, None] + AF: Union[float, None] homozygote_count: Union[int, None] + faf95: Union[float, None] + grp: Union[str, None] = None + + +@attr.define +class JointGrpmax: + AC: Union[int, None] + AN: Union[int, None] AF: Union[float, None] - grp: Union[str, None] + homozygote_count: Union[int, None] faf95: Union[float, None] + gen_anc: Union[str, None] + + +@attr.define +class GrpmaxBySubset: + gnomad: Union[Grpmax, None] + non_ukb: Union[Grpmax, None] @attr.define @@ -32,6 +48,20 @@ class Faf: faf99: float +@attr.define +class GenAncFafMax: + faf95_max: Union[float, None] + faf95_max_gen_anc: str + faf99_max: Union[float, None] + faf99_max_gen_anc: str + + +@attr.define +class GenAncFafMaxBySubset: + gnomad: Union[GenAncFafMax, None] + non_ukb: Union[GenAncFafMax, None] + + @attr.define class Vrs: VRS_Allele_IDs: List[str] @@ -45,17 +75,17 @@ class Info: QUALapprox: int SB: List[int] MQ: float - MQRankSum: float + MQRankSum: Union[float, None] VarDP: int AS_ReadPosRankSum: Union[float, None] - AS_pab_max: float + AS_pab_max: Union[float, None] AS_QD: float AS_MQ: float QD: float - AS_MQRankSum: float - FS: float - AS_FS: float - ReadPosRankSum: float + AS_MQRankSum: Union[float, None] + FS: Union[float, None] + AS_FS: Union[float, None] + ReadPosRankSum: Union[float, None] AS_QUALapprox: int AS_SB_TABLE: List[int] AS_VarDP: int @@ -67,8 +97,8 @@ class Info: mills: bool monoallelic: bool AS_VQSLOD: float - InbreedingCoeff: float - vrs: Vrs # defined later + inbreeding_coeff: float + vrs: Vrs @attr.define @@ -120,13 +150,9 @@ class TranscriptConsequence: mane_select: Union[str, None] mane_plus_clinical: Union[str, None] mirna: Union[List[str], None] - polyphen_prediction: Union[str, None] - polyphen_score: Union[float, None] protein_end: Union[int, None] protein_start: Union[int, None] protein_id: Union[str, None] - sift_prediction: Union[str, None] - sift_score: Union[float, None] source: Union[str, None] strand: Union[int, None] transcript_id: Union[str, None] @@ -162,7 +188,7 @@ class Rf: @attr.define -class RegionFlag: +class RegionFlags: lcr: bool segdup: bool non_par: bool @@ -196,47 +222,31 @@ class QualHistograms: @attr.define class AgeHistograms: age_hist_hom: Histogram - age_hist_ht: Histogram + age_hist_het: Histogram @attr.define class Histograms: qual_hists: QualHistograms raw_qual_hists: QualHistograms - age_hists: List[AgeHistograms] # Should this be a list? + age_hists: AgeHistograms @attr.define class CaddPredictor: phred: float raw_score: float - has_duplicate: bool - - -@attr.define -class RevelPredictor: - revel_score: float - has_duplicate: bool - - -@attr.define -class SpliceAiPredictor: - splice_ai_score: Union[float, None] - splice_consequence: Union[str, None] - has_duplicate: Union[bool, None] - - -@attr.define -class PangolinPredictor: - pangolin_score: float @attr.define class InSilicoPredictors: cadd: CaddPredictor - revel: Union[RevelPredictor, None] - splice_ai: Union[SpliceAiPredictor, None] - pangolin: PangolinPredictor + revel_max: Union[float, None] + spliceai_ds_max: Union[float, None] + pangolin_largest_ds: float + phylop: float + sift_max: Union[float, None] + polyphen_max: Union[float, None] @attr.define @@ -244,16 +254,19 @@ class InitialVariant: locus: Locus alleles: List[str] freq: List[Frequency] - grpmax: List[Grpmax] + grpmax: GrpmaxBySubset faf: List[Union[Faf, None]] + gen_anc_faf_max: GenAncFafMaxBySubset + joint_freq: List[Frequency] + joint_grpmax: Union[Frequency, None] + joint_faf: List[Union[Faf, None]] a_index: int was_split: bool rsid: Union[Set[str], None] filters: Set[str] info: Info vep: Union[Vep, None] - rf: Rf - region_flag: RegionFlag + region_flags: RegionFlags allele_info: AlleleInfo histograms: Histograms in_silico_predictors: InSilicoPredictors diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py index f67befea5..c0320f825 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py @@ -44,7 +44,11 @@ def validate_variant_input(pipeline: Pipeline): ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) result = ht_to_json(ht) - [structure_attrs_fromdict(variant, InitialVariant) for variant in result] + + for variant in result: + if variant: + structure_attrs_fromdict(variant, InitialVariant) + logger.info("Validated prepare_gnomad_v4_exome_variants input variants") diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 628846978..7f04dad49 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -117,7 +117,7 @@ logger.info("Validating pipeline IO formats") validate_globals_input(pipeline) - # validate_variant_input(pipeline) + validate_variant_input(pipeline) # validate_step1_output(pipeline) # validate_step2_output(pipeline) # validate_step3_output(pipeline) From 0dbd8e3d260324236cc80b98193878a99c8a1a73 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 16 Oct 2023 21:31:08 -0400 Subject: [PATCH 022/106] Update to latest mock table 2023-10-16 --- .../gnomad_v4/types/initial_variant.py | 30 +++++++------------ .../pipelines/gnomad_v4_validation.py | 6 +++- .../pipelines/gnomad_v4_variants.py | 2 +- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 14f020407..1864468af 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -22,18 +22,7 @@ class Grpmax: AN: Union[int, None] AF: Union[float, None] homozygote_count: Union[int, None] - faf95: Union[float, None] - grp: Union[str, None] = None - - -@attr.define -class JointGrpmax: - AC: Union[int, None] - AN: Union[int, None] - AF: Union[float, None] - homozygote_count: Union[int, None] - faf95: Union[float, None] - gen_anc: Union[str, None] + gen_anc: Union[str, None] = None @attr.define @@ -49,7 +38,7 @@ class Faf: @attr.define -class GenAncFafMax: +class FafMax: faf95_max: Union[float, None] faf95_max_gen_anc: str faf99_max: Union[float, None] @@ -57,9 +46,9 @@ class GenAncFafMax: @attr.define -class GenAncFafMaxBySubset: - gnomad: Union[GenAncFafMax, None] - non_ukb: Union[GenAncFafMax, None] +class FafMaxBySubset: + gnomad: Union[FafMax, None] + non_ukb: Union[FafMax, None] @attr.define @@ -256,10 +245,11 @@ class InitialVariant: freq: List[Frequency] grpmax: GrpmaxBySubset faf: List[Union[Faf, None]] - gen_anc_faf_max: GenAncFafMaxBySubset - joint_freq: List[Frequency] - joint_grpmax: Union[Frequency, None] - joint_faf: List[Union[Faf, None]] + fafmax: FafMaxBySubset + joint_freq: Union[List[Frequency], None] + joint_grpmax: Union[Grpmax, None] + joint_faf: Union[List[Union[Faf, None]], None] + joint_fafmax: Union[FafMax, None] a_index: int was_split: bool rsid: Union[Set[str], None] diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py index c0320f825..f57278272 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py @@ -47,7 +47,11 @@ def validate_variant_input(pipeline: Pipeline): for variant in result: if variant: - structure_attrs_fromdict(variant, InitialVariant) + try: + structure_attrs_fromdict(variant, InitialVariant) + except TypeError as e: + logger.info(variant) + logger.info(e) logger.info("Validated prepare_gnomad_v4_exome_variants input variants") diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 7f04dad49..60740d541 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -65,7 +65,7 @@ name="prepare_gnomad_v4_exome_variants", task_function=prepare_gnomad_v4_variants, output_path="gnomad_v4/gnomad_v4_exome_variants_base.ht", - inputs={"input_path": "variants/gnomad.exomes.sites.test.ht"}, + inputs={"input_path": "variants/gnomad.exomes.sites.test.updated_101623.ht"}, ) # pipeline.add_task( From 998691848d97f2c9f83e185c51df4ca54cf15a78 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 17 Oct 2023 11:48:55 -0400 Subject: [PATCH 023/106] Add missing region flags --- .../data_pipeline/datasets/gnomad_v4/types/initial_variant.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 1864468af..a44e37607 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -181,6 +181,9 @@ class RegionFlags: lcr: bool segdup: bool non_par: bool + fail_interval_qc: bool + outside_ukb_capture_region: bool + outside_broad_capture_region: bool @attr.define From be450261558bebc8efc452042b31ee917373b8a3 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 18 Oct 2023 09:46:30 -0400 Subject: [PATCH 024/106] Make pipeline config optional --- data-pipeline/requirements.txt | 1593 +---------------- .../data_pipeline/helpers/write_schemas.py | 57 +- data-pipeline/src/data_pipeline/pipeline.py | 43 +- 3 files changed, 62 insertions(+), 1631 deletions(-) diff --git a/data-pipeline/requirements.txt b/data-pipeline/requirements.txt index d56f745f7..6fc42d12e 100644 --- a/data-pipeline/requirements.txt +++ b/data-pipeline/requirements.txt @@ -1,1587 +1,6 @@ -aiodns==2.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d \ - --hash=sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de -aiohttp==3.8.5 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67 \ - --hash=sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c \ - --hash=sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda \ - --hash=sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755 \ - --hash=sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d \ - --hash=sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5 \ - --hash=sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548 \ - --hash=sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690 \ - --hash=sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84 \ - --hash=sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4 \ - --hash=sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a \ - --hash=sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a \ - --hash=sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9 \ - --hash=sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef \ - --hash=sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b \ - --hash=sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a \ - --hash=sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d \ - --hash=sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945 \ - --hash=sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634 \ - --hash=sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7 \ - --hash=sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691 \ - --hash=sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802 \ - --hash=sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c \ - --hash=sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0 \ - --hash=sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8 \ - --hash=sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82 \ - --hash=sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a \ - --hash=sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975 \ - --hash=sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b \ - --hash=sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d \ - --hash=sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3 \ - --hash=sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7 \ - --hash=sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e \ - --hash=sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5 \ - --hash=sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649 \ - --hash=sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff \ - --hash=sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e \ - --hash=sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c \ - --hash=sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22 \ - --hash=sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df \ - --hash=sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e \ - --hash=sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780 \ - --hash=sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905 \ - --hash=sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51 \ - --hash=sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543 \ - --hash=sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6 \ - --hash=sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873 \ - --hash=sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f \ - --hash=sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35 \ - --hash=sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938 \ - --hash=sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b \ - --hash=sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d \ - --hash=sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8 \ - --hash=sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c \ - --hash=sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af \ - --hash=sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42 \ - --hash=sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3 \ - --hash=sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc \ - --hash=sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8 \ - --hash=sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410 \ - --hash=sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c \ - --hash=sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825 \ - --hash=sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9 \ - --hash=sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53 \ - --hash=sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a \ - --hash=sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc \ - --hash=sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8 \ - --hash=sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c \ - --hash=sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a \ - --hash=sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b \ - --hash=sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd \ - --hash=sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14 \ - --hash=sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2 \ - --hash=sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c \ - --hash=sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9 \ - --hash=sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692 \ - --hash=sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1 \ - --hash=sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa \ - --hash=sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a \ - --hash=sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de \ - --hash=sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91 \ - --hash=sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761 \ - --hash=sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd \ - --hash=sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced \ - --hash=sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28 \ - --hash=sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8 \ - --hash=sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824 -aiosignal==1.3.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ - --hash=sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17 -appnope==0.1.3 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "darwin" \ - --hash=sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24 \ - --hash=sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e -asttokens==2.4.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e \ - --hash=sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69 -async-timeout==4.0.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ - --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 -asyncinit==0.2.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:4acaf614f4d6f78babd278bbacf21bd9f7756efc17cd5d7e1bae31ff770b3cfa \ - --hash=sha256:9f11291943488abd15a1463dad98452e3bd6b39e8e6d45bc7cc008a09825b11e -attrs==23.1.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 -avro==1.11.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:53dcd5bffccb9a72136f08d0b18771795eaf4eefb028bbaaed5f4e1787f0e268 -azure-common==1.1.28 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3 \ - --hash=sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad -azure-core==1.29.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:500b3aa9bf2e90c5ccc88bb105d056114ca0ce7d0ce73afb8bc4d714b2fc7568 \ - --hash=sha256:b03261bcba22c0b9290faf9999cedd23e849ed2577feee90515694cea6bc74bf -azure-identity==1.14.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1 \ - --hash=sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b -azure-mgmt-core==1.4.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:81071675f186a585555ef01816f2774d49c1c9024cb76e5720c3c0f6b337bb7d \ - --hash=sha256:d195208340094f98e5a6661b781cde6f6a051e79ce317caabd8ff97030a9b3ae -azure-mgmt-storage==20.1.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451 \ - --hash=sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659 -azure-storage-blob==12.18.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:00b92568e91d608c04dfd4814c3b180818e690023493bb984c22dfc1a8a96e55 \ - --hash=sha256:d3265c2403c28d8881326c365e9cf7ed2ad55fdac98404eae753548702b31ba2 -backcall==0.2.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e \ - --hash=sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255 -black==23.9.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f \ - --hash=sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7 \ - --hash=sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100 \ - --hash=sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573 \ - --hash=sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d \ - --hash=sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f \ - --hash=sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9 \ - --hash=sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300 \ - --hash=sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948 \ - --hash=sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325 \ - --hash=sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9 \ - --hash=sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71 \ - --hash=sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186 \ - --hash=sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f \ - --hash=sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe \ - --hash=sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855 \ - --hash=sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80 \ - --hash=sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393 \ - --hash=sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c \ - --hash=sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204 \ - --hash=sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377 \ - --hash=sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301 -bokeh==3.2.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff \ - --hash=sha256:e31670a013e1ff15c3d4d04f587c8162c4cc9fe1af507fd741d295e6c4e1225b -boto3==1.28.52 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1d36db102517d62c6968b3b0636303241f56859d12dd071def4882fc6e030b20 \ - --hash=sha256:a34fc153cb2f6fb2f79a764286c967392e8aae9412381d943bddc576c4f7631a -botocore==1.31.52 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:46b0a75a38521aa6a75fddccb1542e002930e609d4e13516f40fef170d32e515 \ - --hash=sha256:6d09881c5a8be34b497872ca3936f8757d886a6f42f2a8703411928189cfedc0 -cachetools==5.3.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590 \ - --hash=sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b -cattrs==23.1.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4 \ - --hash=sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657 -certifi==2023.7.22 ; python_version >= "3.9" and python_version < "4" \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 -cffi==1.15.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ - --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ - --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ - --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ - --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ - --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ - --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ - --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ - --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ - --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ - --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ - --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ - --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ - --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ - --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ - --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ - --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ - --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ - --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ - --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ - --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ - --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ - --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ - --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ - --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ - --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ - --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ - --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ - --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ - --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ - --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ - --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ - --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ - --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ - --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ - --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ - --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ - --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ - --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ - --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ - --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ - --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ - --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ - --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ - --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ - --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ - --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ - --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ - --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ - --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ - --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ - --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ - --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ - --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ - --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ - --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ - --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ - --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ - --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ - --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ - --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ - --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ - --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ - --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 -charset-normalizer==3.2.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96 \ - --hash=sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c \ - --hash=sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710 \ - --hash=sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706 \ - --hash=sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020 \ - --hash=sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252 \ - --hash=sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad \ - --hash=sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329 \ - --hash=sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a \ - --hash=sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f \ - --hash=sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6 \ - --hash=sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4 \ - --hash=sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a \ - --hash=sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46 \ - --hash=sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2 \ - --hash=sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23 \ - --hash=sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace \ - --hash=sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd \ - --hash=sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982 \ - --hash=sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10 \ - --hash=sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2 \ - --hash=sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea \ - --hash=sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09 \ - --hash=sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5 \ - --hash=sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149 \ - --hash=sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489 \ - --hash=sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9 \ - --hash=sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80 \ - --hash=sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592 \ - --hash=sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3 \ - --hash=sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6 \ - --hash=sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed \ - --hash=sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c \ - --hash=sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200 \ - --hash=sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a \ - --hash=sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e \ - --hash=sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d \ - --hash=sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6 \ - --hash=sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623 \ - --hash=sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669 \ - --hash=sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3 \ - --hash=sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa \ - --hash=sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9 \ - --hash=sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2 \ - --hash=sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f \ - --hash=sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1 \ - --hash=sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4 \ - --hash=sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a \ - --hash=sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8 \ - --hash=sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3 \ - --hash=sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029 \ - --hash=sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f \ - --hash=sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959 \ - --hash=sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22 \ - --hash=sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7 \ - --hash=sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952 \ - --hash=sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346 \ - --hash=sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e \ - --hash=sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d \ - --hash=sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299 \ - --hash=sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd \ - --hash=sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a \ - --hash=sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3 \ - --hash=sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037 \ - --hash=sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94 \ - --hash=sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c \ - --hash=sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858 \ - --hash=sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a \ - --hash=sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449 \ - --hash=sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c \ - --hash=sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918 \ - --hash=sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1 \ - --hash=sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c \ - --hash=sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac \ - --hash=sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa -click==8.1.7 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ - --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de -colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" and platform_system == "Windows" or python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 -commonmark==0.9.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ - --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 -contourpy==1.1.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e \ - --hash=sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6 \ - --hash=sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33 \ - --hash=sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8 \ - --hash=sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d \ - --hash=sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104 \ - --hash=sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70 \ - --hash=sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882 \ - --hash=sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d \ - --hash=sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27 \ - --hash=sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c \ - --hash=sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f \ - --hash=sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48 \ - --hash=sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e \ - --hash=sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a \ - --hash=sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37 \ - --hash=sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf \ - --hash=sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a \ - --hash=sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2 \ - --hash=sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e \ - --hash=sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e \ - --hash=sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655 \ - --hash=sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545 \ - --hash=sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027 \ - --hash=sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15 \ - --hash=sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94 \ - --hash=sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439 \ - --hash=sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163 \ - --hash=sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532 \ - --hash=sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2 \ - --hash=sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 \ - --hash=sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d \ - --hash=sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1 \ - --hash=sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b \ - --hash=sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9 \ - --hash=sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916 \ - --hash=sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23 \ - --hash=sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa \ - --hash=sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb \ - --hash=sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a \ - --hash=sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e \ - --hash=sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442 \ - --hash=sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae \ - --hash=sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103 \ - --hash=sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684 \ - --hash=sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34 \ - --hash=sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d \ - --hash=sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d \ - --hash=sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999 \ - --hash=sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 \ - --hash=sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45 \ - --hash=sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc \ - --hash=sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa \ - --hash=sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f \ - --hash=sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18 \ - --hash=sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718 \ - --hash=sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab \ - --hash=sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8 \ - --hash=sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9 \ - --hash=sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3 \ - --hash=sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae \ - --hash=sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76 \ - --hash=sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493 \ - --hash=sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb \ - --hash=sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5 \ - --hash=sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba \ - --hash=sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9 \ - --hash=sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed \ - --hash=sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0 \ - --hash=sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217 \ - --hash=sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887 \ - --hash=sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887 \ - --hash=sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62 \ - --hash=sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4 \ - --hash=sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f \ - --hash=sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431 \ - --hash=sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b \ - --hash=sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3 \ - --hash=sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce \ - --hash=sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b \ - --hash=sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21 \ - --hash=sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e \ - --hash=sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1 \ - --hash=sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a \ - --hash=sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f \ - --hash=sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002 \ - --hash=sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b \ - --hash=sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85 \ - --hash=sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e \ - --hash=sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7 \ - --hash=sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251 \ - --hash=sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970 \ - --hash=sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0 \ - --hash=sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7 \ - --hash=sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256 -cryptography==41.0.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67 \ - --hash=sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311 \ - --hash=sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8 \ - --hash=sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13 \ - --hash=sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143 \ - --hash=sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f \ - --hash=sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829 \ - --hash=sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd \ - --hash=sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397 \ - --hash=sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac \ - --hash=sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d \ - --hash=sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a \ - --hash=sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839 \ - --hash=sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e \ - --hash=sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6 \ - --hash=sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9 \ - --hash=sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860 \ - --hash=sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca \ - --hash=sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91 \ - --hash=sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d \ - --hash=sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714 \ - --hash=sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb \ - --hash=sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f -decorator==4.4.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760 \ - --hash=sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7 -deprecated==1.2.14 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c \ - --hash=sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3 -dill==0.3.7 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \ - --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03 -elasticsearch==7.17.9 ; python_version >= "3.9" and python_version < "4" \ - --hash=sha256:0e2454645dc00517dee4c6de3863411a9c5f1955d013c5fefa29123dadc92f98 \ - --hash=sha256:66c4ece2adfe7cc120e2b6a6798a1fd5c777aecf82eec39bb95cef7cfc7ea2b3 -exceptiongroup==1.1.3 ; python_version >= "3.9" and python_version < "3.11" \ - --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ - --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 -executing==1.2.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc \ - --hash=sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107 -frozenlist==1.4.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6 \ - --hash=sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01 \ - --hash=sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251 \ - --hash=sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9 \ - --hash=sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b \ - --hash=sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87 \ - --hash=sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf \ - --hash=sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f \ - --hash=sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0 \ - --hash=sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2 \ - --hash=sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b \ - --hash=sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc \ - --hash=sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c \ - --hash=sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467 \ - --hash=sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9 \ - --hash=sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1 \ - --hash=sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a \ - --hash=sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79 \ - --hash=sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167 \ - --hash=sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300 \ - --hash=sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf \ - --hash=sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea \ - --hash=sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2 \ - --hash=sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab \ - --hash=sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3 \ - --hash=sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb \ - --hash=sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087 \ - --hash=sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc \ - --hash=sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8 \ - --hash=sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62 \ - --hash=sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f \ - --hash=sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326 \ - --hash=sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c \ - --hash=sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431 \ - --hash=sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963 \ - --hash=sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7 \ - --hash=sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef \ - --hash=sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3 \ - --hash=sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956 \ - --hash=sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781 \ - --hash=sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472 \ - --hash=sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc \ - --hash=sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839 \ - --hash=sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672 \ - --hash=sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3 \ - --hash=sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503 \ - --hash=sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d \ - --hash=sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8 \ - --hash=sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b \ - --hash=sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc \ - --hash=sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f \ - --hash=sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559 \ - --hash=sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b \ - --hash=sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95 \ - --hash=sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb \ - --hash=sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963 \ - --hash=sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919 \ - --hash=sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f \ - --hash=sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3 \ - --hash=sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1 \ - --hash=sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e -google-api-core==2.11.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a \ - --hash=sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a -google-auth-oauthlib==0.8.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576 \ - --hash=sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593 -google-auth==2.23.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2cec41407bd1e207f5b802638e32bb837df968bb5c05f413d0fa526fac4cf7a7 \ - --hash=sha256:753a26312e6f1eaeec20bc6f2644a10926697da93446e1f8e24d6d32d45a922a -google-cloud-core==2.3.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb \ - --hash=sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863 -google-cloud-storage==2.11.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:6fbf62659b83c8f3a0a743af0d661d2046c97c3a5bfb587c4662c4bc68de3e31 \ - --hash=sha256:88cbd7fb3d701c780c4272bc26952db99f25eb283fb4c2208423249f00b5fe53 -google-crc32c==1.5.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ - --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ - --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ - --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ - --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ - --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ - --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ - --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ - --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ - --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ - --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ - --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ - --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ - --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ - --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ - --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ - --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ - --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ - --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ - --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ - --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ - --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ - --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ - --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ - --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ - --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ - --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ - --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ - --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ - --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ - --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ - --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ - --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ - --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ - --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ - --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ - --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ - --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ - --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ - --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ - --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ - --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ - --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ - --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ - --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ - --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ - --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ - --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ - --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ - --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ - --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ - --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ - --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ - --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ - --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ - --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ - --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ - --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ - --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ - --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ - --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ - --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ - --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ - --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ - --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ - --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ - --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ - --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 -google-resumable-media==2.6.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7 \ - --hash=sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b -googleapis-common-protos==1.60.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918 \ - --hash=sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708 -hail==0.2.124 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:11fe8782adf351fea0674a30462aa34f9a12f5481e0e8ff08954eb16bc6c0bcb -humanize==1.1.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:3959c76f1f6c9b43258bb0b0f6b6161d6c07b8717b306c0b713ea36b7999331e \ - --hash=sha256:ad83016fae2453a7486f5be5dba8e19883020c77f6c12c63702f3b6c15ae3c5e -idna==3.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 -iniconfig==2.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 -ipython==8.15.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2baeb5be6949eeebf532150f81746f8333e2ccce02de1c7eedde3f23ed5e9f1e \ - --hash=sha256:45a2c3a529296870a97b7de34eda4a31bee16bc7bf954e07d39abe49caf8f887 -isodate==0.6.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96 \ - --hash=sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9 -janus==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a \ - --hash=sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612 -jedi==0.19.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4 \ - --hash=sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e -jinja2==3.1.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 -jmespath==1.0.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ - --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe -jproperties==2.1.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29 \ - --hash=sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664 -loguru==0.7.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb \ - --hash=sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac -markupsafe==2.1.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 -matplotlib-inline==0.1.6 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 \ - --hash=sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304 -msal-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:91e3db9620b822d0ed2b4d1850056a0f133cba04455e62f11612e40f5502f2ee \ - --hash=sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354 -msal==1.24.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:7d2ecdad41a5f73bb2b813f3061a4cf47c924621105a8ed137586fcb9d8f827e \ - --hash=sha256:a7f2f342b80ba3fe168218003b6798cc81b83c9745284bf63fb8d4ec8e2dbc50 -msrest==0.7.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32 \ - --hash=sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9 -multidict==6.0.4 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9 \ - --hash=sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8 \ - --hash=sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03 \ - --hash=sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710 \ - --hash=sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161 \ - --hash=sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664 \ - --hash=sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569 \ - --hash=sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067 \ - --hash=sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313 \ - --hash=sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706 \ - --hash=sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2 \ - --hash=sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636 \ - --hash=sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49 \ - --hash=sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93 \ - --hash=sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603 \ - --hash=sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0 \ - --hash=sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60 \ - --hash=sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4 \ - --hash=sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e \ - --hash=sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1 \ - --hash=sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60 \ - --hash=sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951 \ - --hash=sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc \ - --hash=sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe \ - --hash=sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95 \ - --hash=sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d \ - --hash=sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8 \ - --hash=sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed \ - --hash=sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2 \ - --hash=sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775 \ - --hash=sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87 \ - --hash=sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c \ - --hash=sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2 \ - --hash=sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98 \ - --hash=sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3 \ - --hash=sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe \ - --hash=sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78 \ - --hash=sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660 \ - --hash=sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176 \ - --hash=sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e \ - --hash=sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988 \ - --hash=sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c \ - --hash=sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c \ - --hash=sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0 \ - --hash=sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449 \ - --hash=sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f \ - --hash=sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde \ - --hash=sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5 \ - --hash=sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d \ - --hash=sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac \ - --hash=sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a \ - --hash=sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9 \ - --hash=sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca \ - --hash=sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11 \ - --hash=sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35 \ - --hash=sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063 \ - --hash=sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b \ - --hash=sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982 \ - --hash=sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258 \ - --hash=sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1 \ - --hash=sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52 \ - --hash=sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480 \ - --hash=sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7 \ - --hash=sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461 \ - --hash=sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d \ - --hash=sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc \ - --hash=sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779 \ - --hash=sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a \ - --hash=sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547 \ - --hash=sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0 \ - --hash=sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171 \ - --hash=sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf \ - --hash=sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d \ - --hash=sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba -mypy-extensions==1.0.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ - --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 -nest-asyncio==1.5.8 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb \ - --hash=sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d -nodeenv==1.8.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \ - --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec -numpy==1.25.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2 \ - --hash=sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55 \ - --hash=sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf \ - --hash=sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01 \ - --hash=sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca \ - --hash=sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901 \ - --hash=sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d \ - --hash=sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4 \ - --hash=sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf \ - --hash=sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380 \ - --hash=sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044 \ - --hash=sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545 \ - --hash=sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f \ - --hash=sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f \ - --hash=sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3 \ - --hash=sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364 \ - --hash=sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9 \ - --hash=sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418 \ - --hash=sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f \ - --hash=sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295 \ - --hash=sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3 \ - --hash=sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187 \ - --hash=sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926 \ - --hash=sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357 \ - --hash=sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760 -oauthlib==3.2.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \ - --hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918 -orjson==3.9.7 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:01d647b2a9c45a23a84c3e70e19d120011cba5f56131d185c1b78685457320bb \ - --hash=sha256:0eb850a87e900a9c484150c414e21af53a6125a13f6e378cf4cc11ae86c8f9c5 \ - --hash=sha256:11c10f31f2c2056585f89d8229a56013bc2fe5de51e095ebc71868d070a8dd81 \ - --hash=sha256:14d3fb6cd1040a4a4a530b28e8085131ed94ebc90d72793c59a713de34b60838 \ - --hash=sha256:154fd67216c2ca38a2edb4089584504fbb6c0694b518b9020ad35ecc97252bb9 \ - --hash=sha256:1c3cee5c23979deb8d1b82dc4cc49be59cccc0547999dbe9adb434bb7af11cf7 \ - --hash=sha256:1eb0b0b2476f357eb2975ff040ef23978137aa674cd86204cfd15d2d17318588 \ - --hash=sha256:1f8b47650f90e298b78ecf4df003f66f54acdba6a0f763cc4df1eab048fe3738 \ - --hash=sha256:21a3344163be3b2c7e22cef14fa5abe957a892b2ea0525ee86ad8186921b6cf0 \ - --hash=sha256:23be6b22aab83f440b62a6f5975bcabeecb672bc627face6a83bc7aeb495dc7e \ - --hash=sha256:26ffb398de58247ff7bde895fe30817a036f967b0ad0e1cf2b54bda5f8dcfdd9 \ - --hash=sha256:2f8fcf696bbbc584c0c7ed4adb92fd2ad7d153a50258842787bc1524e50d7081 \ - --hash=sha256:355efdbbf0cecc3bd9b12589b8f8e9f03c813a115efa53f8dc2a523bfdb01334 \ - --hash=sha256:36b1df2e4095368ee388190687cb1b8557c67bc38400a942a1a77713580b50ae \ - --hash=sha256:38e34c3a21ed41a7dbd5349e24c3725be5416641fdeedf8f56fcbab6d981c900 \ - --hash=sha256:3aab72d2cef7f1dd6104c89b0b4d6b416b0db5ca87cc2fac5f79c5601f549cc2 \ - --hash=sha256:410aa9d34ad1089898f3db461b7b744d0efcf9252a9415bbdf23540d4f67589f \ - --hash=sha256:45a47f41b6c3beeb31ac5cf0ff7524987cfcce0a10c43156eb3ee8d92d92bf22 \ - --hash=sha256:4891d4c934f88b6c29b56395dfc7014ebf7e10b9e22ffd9877784e16c6b2064f \ - --hash=sha256:4c616b796358a70b1f675a24628e4823b67d9e376df2703e893da58247458956 \ - --hash=sha256:5198633137780d78b86bb54dafaaa9baea698b4f059456cd4554ab7009619221 \ - --hash=sha256:5a2937f528c84e64be20cb80e70cea76a6dfb74b628a04dab130679d4454395c \ - --hash=sha256:5da9032dac184b2ae2da4bce423edff7db34bfd936ebd7d4207ea45840f03905 \ - --hash=sha256:5e736815b30f7e3c9044ec06a98ee59e217a833227e10eb157f44071faddd7c5 \ - --hash=sha256:63ef3d371ea0b7239ace284cab9cd00d9c92b73119a7c274b437adb09bda35e6 \ - --hash=sha256:70b9a20a03576c6b7022926f614ac5a6b0914486825eac89196adf3267c6489d \ - --hash=sha256:76a0fc023910d8a8ab64daed8d31d608446d2d77c6474b616b34537aa7b79c7f \ - --hash=sha256:7951af8f2998045c656ba8062e8edf5e83fd82b912534ab1de1345de08a41d2b \ - --hash=sha256:7a34a199d89d82d1897fd4a47820eb50947eec9cda5fd73f4578ff692a912f89 \ - --hash=sha256:7bab596678d29ad969a524823c4e828929a90c09e91cc438e0ad79b37ce41166 \ - --hash=sha256:7ea3e63e61b4b0beeb08508458bdff2daca7a321468d3c4b320a758a2f554d31 \ - --hash=sha256:80acafe396ab689a326ab0d80f8cc61dec0dd2c5dca5b4b3825e7b1e0132c101 \ - --hash=sha256:82720ab0cf5bb436bbd97a319ac529aee06077ff7e61cab57cee04a596c4f9b4 \ - --hash=sha256:83cc275cf6dcb1a248e1876cdefd3f9b5f01063854acdfd687ec360cd3c9712a \ - --hash=sha256:85e39198f78e2f7e054d296395f6c96f5e02892337746ef5b6a1bf3ed5910142 \ - --hash=sha256:8769806ea0b45d7bf75cad253fba9ac6700b7050ebb19337ff6b4e9060f963fa \ - --hash=sha256:8bdb6c911dae5fbf110fe4f5cba578437526334df381b3554b6ab7f626e5eeca \ - --hash=sha256:8f4b0042d8388ac85b8330b65406c84c3229420a05068445c13ca28cc222f1f7 \ - --hash=sha256:90fe73a1f0321265126cbba13677dcceb367d926c7a65807bd80916af4c17047 \ - --hash=sha256:915e22c93e7b7b636240c5a79da5f6e4e84988d699656c8e27f2ac4c95b8dcc0 \ - --hash=sha256:9274ba499e7dfb8a651ee876d80386b481336d3868cba29af839370514e4dce0 \ - --hash=sha256:9d62c583b5110e6a5cf5169ab616aa4ec71f2c0c30f833306f9e378cf51b6c86 \ - --hash=sha256:9ef82157bbcecd75d6296d5d8b2d792242afcd064eb1ac573f8847b52e58f677 \ - --hash=sha256:a19e4074bc98793458b4b3ba35a9a1d132179345e60e152a1bb48c538ab863c4 \ - --hash=sha256:a347d7b43cb609e780ff8d7b3107d4bcb5b6fd09c2702aa7bdf52f15ed09fa09 \ - --hash=sha256:b4fb306c96e04c5863d52ba8d65137917a3d999059c11e659eba7b75a69167bd \ - --hash=sha256:b6df858e37c321cefbf27fe7ece30a950bcc3a75618a804a0dcef7ed9dd9c92d \ - --hash=sha256:b8e59650292aa3a8ea78073fc84184538783966528e442a1b9ed653aa282edcf \ - --hash=sha256:bcb9a60ed2101af2af450318cd89c6b8313e9f8df4e8fb12b657b2e97227cf08 \ - --hash=sha256:c3ba725cf5cf87d2d2d988d39c6a2a8b6fc983d78ff71bc728b0be54c869c884 \ - --hash=sha256:ca1706e8b8b565e934c142db6a9592e6401dc430e4b067a97781a997070c5378 \ - --hash=sha256:cd3e7aae977c723cc1dbb82f97babdb5e5fbce109630fbabb2ea5053523c89d3 \ - --hash=sha256:cf334ce1d2fadd1bf3e5e9bf15e58e0c42b26eb6590875ce65bd877d917a58aa \ - --hash=sha256:d8692948cada6ee21f33db5e23460f71c8010d6dfcfe293c9b96737600a7df78 \ - --hash=sha256:e5205ec0dfab1887dd383597012199f5175035e782cdb013c542187d280ca443 \ - --hash=sha256:e7e7f44e091b93eb39db88bb0cb765db09b7a7f64aea2f35e7d86cbf47046c65 \ - --hash=sha256:e94b7b31aa0d65f5b7c72dd8f8227dbd3e30354b99e7a9af096d967a77f2a580 \ - --hash=sha256:f26fb3e8e3e2ee405c947ff44a3e384e8fa1843bc35830fe6f3d9a95a1147b6e \ - --hash=sha256:f738fee63eb263530efd4d2e9c76316c1f47b3bbf38c1bf45ae9625feed0395e \ - --hash=sha256:f9e01239abea2f52a429fe9d95c96df95f078f0172489d691b4a848ace54a476 -packaging==23.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \ - --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f -pandas==2.1.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437 \ - --hash=sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614 \ - --hash=sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97 \ - --hash=sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2 \ - --hash=sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8 \ - --hash=sha256:28f330845ad21c11db51e02d8d69acc9035edfd1116926ff7245c7215db57957 \ - --hash=sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0 \ - --hash=sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750 \ - --hash=sha256:38f74ef7ebc0ffb43b3d633e23d74882bce7e27bfa09607f3c5d3e03ffd9a4a5 \ - --hash=sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea \ - --hash=sha256:40dd20439ff94f1b2ed55b393ecee9cb6f3b08104c2c40b0cb7186a2f0046242 \ - --hash=sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2 \ - --hash=sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2 \ - --hash=sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa \ - --hash=sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4 \ - --hash=sha256:629124923bcf798965b054a540f9ccdfd60f71361255c81fa1ecd94a904b9dd3 \ - --hash=sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918 \ - --hash=sha256:6e6a0fe052cf27ceb29be9429428b4918f3740e37ff185658f40d8702f0b3e09 \ - --hash=sha256:70cf866af3ab346a10debba8ea78077cf3a8cd14bd5e4bed3d41555a3280041c \ - --hash=sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb \ - --hash=sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6 \ - --hash=sha256:86f100b3876b8c6d1a2c66207288ead435dc71041ee4aea789e55ef0e06408cb \ - --hash=sha256:9d81e1813191070440d4c7a413cb673052b3b4a984ffd86b8dd468c45742d3cc \ - --hash=sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d \ - --hash=sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e \ - --hash=sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98 \ - --hash=sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644 \ - --hash=sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a \ - --hash=sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0 \ - --hash=sha256:b9a6ccf0963db88f9b12df6720e55f337447aea217f426a22d71f4213a3099a6 \ - --hash=sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4 \ - --hash=sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49 \ - --hash=sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd \ - --hash=sha256:cda72cc8c4761c8f1d97b169661f23a86b16fdb240bdc341173aee17e4d6cedd \ - --hash=sha256:d4f38e4fedeba580285eaac7ede4f686c6701a9e618d8a857b138a126d067f2f \ - --hash=sha256:d53c8c1001f6a192ff1de1efe03b31a423d0eee2e9e855e69d004308e046e694 \ - --hash=sha256:d8c58b1113892e0c8078f006a167cc210a92bdae23322bb4614f2f0b7a4b510f \ - --hash=sha256:d97daeac0db8c993420b10da4f5f5b39b01fc9ca689a17844e07c0a35ac96b4b \ - --hash=sha256:d99e678180bc59b0c9443314297bddce4ad35727a1a2656dbe585fd78710b3b9 \ - --hash=sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e \ - --hash=sha256:eb20252720b1cc1b7d0b2879ffc7e0542dd568f24d7c4b2347cb035206936421 \ - --hash=sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317 \ - --hash=sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b \ - --hash=sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363 -parsimonious==0.10.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c \ - --hash=sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f -parso==0.8.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ - --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 -pathspec==0.11.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ - --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 -pexpect==4.8.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ - --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \ - --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c -pickleshare==0.7.5 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca \ - --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 -pillow==10.0.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff \ - --hash=sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f \ - --hash=sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21 \ - --hash=sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635 \ - --hash=sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a \ - --hash=sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f \ - --hash=sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1 \ - --hash=sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d \ - --hash=sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db \ - --hash=sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849 \ - --hash=sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7 \ - --hash=sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876 \ - --hash=sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3 \ - --hash=sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317 \ - --hash=sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91 \ - --hash=sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d \ - --hash=sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b \ - --hash=sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd \ - --hash=sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed \ - --hash=sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500 \ - --hash=sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7 \ - --hash=sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a \ - --hash=sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a \ - --hash=sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0 \ - --hash=sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf \ - --hash=sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f \ - --hash=sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1 \ - --hash=sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088 \ - --hash=sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971 \ - --hash=sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a \ - --hash=sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205 \ - --hash=sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54 \ - --hash=sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08 \ - --hash=sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21 \ - --hash=sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d \ - --hash=sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08 \ - --hash=sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e \ - --hash=sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf \ - --hash=sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b \ - --hash=sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145 \ - --hash=sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2 \ - --hash=sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d \ - --hash=sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d \ - --hash=sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf \ - --hash=sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad \ - --hash=sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d \ - --hash=sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1 \ - --hash=sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4 \ - --hash=sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2 \ - --hash=sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19 \ - --hash=sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37 \ - --hash=sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4 \ - --hash=sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68 \ - --hash=sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1 -platformdirs==3.10.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d \ - --hash=sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d -plotly==5.17.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97 \ - --hash=sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3 -pluggy==1.3.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ - --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 -portalocker==2.8.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33 \ - --hash=sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e -prompt-toolkit==3.0.39 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac \ - --hash=sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88 -protobuf==3.20.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ - --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ - --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ - --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ - --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ - --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ - --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ - --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ - --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ - --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ - --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ - --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ - --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ - --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ - --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ - --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ - --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ - --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ - --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ - --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ - --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ - --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 -ptyprocess==0.7.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ - --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ - --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 -pure-eval==0.2.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 \ - --hash=sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3 -py4j==0.10.9.5 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6 \ - --hash=sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04 -pyasn1-modules==0.3.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c \ - --hash=sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d -pyasn1==0.5.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57 \ - --hash=sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde -pycares==4.3.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164 \ - --hash=sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be \ - --hash=sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824 \ - --hash=sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e \ - --hash=sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4 \ - --hash=sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587 \ - --hash=sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4 \ - --hash=sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd \ - --hash=sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088 \ - --hash=sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323 \ - --hash=sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2 \ - --hash=sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515 \ - --hash=sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5 \ - --hash=sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4 \ - --hash=sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5 \ - --hash=sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de \ - --hash=sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac \ - --hash=sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7 \ - --hash=sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9 \ - --hash=sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566 \ - --hash=sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080 \ - --hash=sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8 \ - --hash=sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb \ - --hash=sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8 \ - --hash=sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0 \ - --hash=sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc \ - --hash=sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9 \ - --hash=sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe \ - --hash=sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4 \ - --hash=sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7 \ - --hash=sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329 \ - --hash=sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452 \ - --hash=sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9 \ - --hash=sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d \ - --hash=sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d \ - --hash=sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6 \ - --hash=sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791 \ - --hash=sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903 \ - --hash=sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136 \ - --hash=sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0 \ - --hash=sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7 \ - --hash=sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804 \ - --hash=sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae \ - --hash=sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e \ - --hash=sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45 \ - --hash=sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079 \ - --hash=sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161 \ - --hash=sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783 \ - --hash=sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974 \ - --hash=sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a \ - --hash=sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef \ - --hash=sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf -pycparser==2.21 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 -pygments==2.16.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 -pyjwt[crypto]==2.8.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 -pyright==1.1.327 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:3462cda239e9140276238bbdbd0b59d77406f1c2e14d8cb8c20c8e25639c6b3c \ - --hash=sha256:ba74148ad64f22020dbbed6781c4bdb38ecb8a7ca90dc3c87a4f08d1c0e11592 -pyspark==3.3.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:384d2ad7090cd1db5b2d2ac497bda409d86ab3a27272833e1a27efadf45e4d2f -pytest==7.4.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002 \ - --hash=sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069 -python-dateutil==2.8.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 -python-json-logger==2.0.7 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c \ - --hash=sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd -pytz==2023.3.post1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b \ - --hash=sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7 -pywin32==306 ; python_version >= "3.9" and platform_system == "Windows" and python_version < "4.0" \ - --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ - --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \ - --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \ - --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \ - --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \ - --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \ - --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \ - --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \ - --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \ - --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \ - --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \ - --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \ - --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \ - --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0 -pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f -regex==2023.8.8 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf \ - --hash=sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46 \ - --hash=sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18 \ - --hash=sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7 \ - --hash=sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7 \ - --hash=sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9 \ - --hash=sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559 \ - --hash=sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71 \ - --hash=sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280 \ - --hash=sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898 \ - --hash=sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684 \ - --hash=sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3 \ - --hash=sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9 \ - --hash=sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8 \ - --hash=sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca \ - --hash=sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c \ - --hash=sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c \ - --hash=sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab \ - --hash=sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd \ - --hash=sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56 \ - --hash=sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586 \ - --hash=sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7 \ - --hash=sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103 \ - --hash=sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac \ - --hash=sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177 \ - --hash=sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109 \ - --hash=sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033 \ - --hash=sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb \ - --hash=sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61 \ - --hash=sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800 \ - --hash=sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb \ - --hash=sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8 \ - --hash=sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570 \ - --hash=sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34 \ - --hash=sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e \ - --hash=sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4 \ - --hash=sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb \ - --hash=sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7 \ - --hash=sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208 \ - --hash=sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc \ - --hash=sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb \ - --hash=sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3 \ - --hash=sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504 \ - --hash=sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb \ - --hash=sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57 \ - --hash=sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b \ - --hash=sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601 \ - --hash=sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116 \ - --hash=sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8 \ - --hash=sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6 \ - --hash=sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6 \ - --hash=sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93 \ - --hash=sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09 \ - --hash=sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a \ - --hash=sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921 \ - --hash=sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a \ - --hash=sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495 \ - --hash=sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6 \ - --hash=sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7 \ - --hash=sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236 \ - --hash=sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235 \ - --hash=sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470 \ - --hash=sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b \ - --hash=sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5 \ - --hash=sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61 \ - --hash=sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c \ - --hash=sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db \ - --hash=sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be \ - --hash=sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96 \ - --hash=sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a \ - --hash=sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2 \ - --hash=sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63 \ - --hash=sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef \ - --hash=sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739 \ - --hash=sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e \ - --hash=sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217 \ - --hash=sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90 \ - --hash=sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4 \ - --hash=sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8 \ - --hash=sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3 \ - --hash=sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357 \ - --hash=sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4 \ - --hash=sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b \ - --hash=sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882 \ - --hash=sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a \ - --hash=sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675 \ - --hash=sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf \ - --hash=sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e -requests-oauthlib==1.3.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5 \ - --hash=sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a -requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 -rich==12.6.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ - --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 -rsa==4.9 ; python_version >= "3.9" and python_version < "4" \ - --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ - --hash=sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21 -ruff==0.0.290 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0e2b09ac4213b11a3520221083866a5816616f3ae9da123037b8ab275066fbac \ - --hash=sha256:150bf8050214cea5b990945b66433bf9a5e0cef395c9bc0f50569e7de7540c86 \ - --hash=sha256:1d9be6351b7889462912e0b8185a260c0219c35dfd920fb490c7f256f1d8313e \ - --hash=sha256:2ab41bc0ba359d3f715fc7b705bdeef19c0461351306b70a4e247f836b9350ed \ - --hash=sha256:35e3550d1d9f2157b0fcc77670f7bb59154f223bff281766e61bdd1dd854e0c5 \ - --hash=sha256:461fbd1fb9ca806d4e3d5c745a30e185f7cf3ca77293cdc17abb2f2a990ad3f7 \ - --hash=sha256:4ca6285aa77b3d966be32c9a3cd531655b3d4a0171e1f9bf26d66d0372186767 \ - --hash=sha256:75386ebc15fe5467248c039f5bf6a0cfe7bfc619ffbb8cd62406cd8811815fca \ - --hash=sha256:75cdc7fe32dcf33b7cec306707552dda54632ac29402775b9e212a3c16aad5e6 \ - --hash=sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d \ - --hash=sha256:982af5ec67cecd099e2ef5e238650407fb40d56304910102d054c109f390bf3c \ - --hash=sha256:ac93eadf07bc4ab4c48d8bb4e427bf0f58f3a9c578862eb85d99d704669f5da0 \ - --hash=sha256:ae5a92dfbdf1f0c689433c223f8dac0782c2b2584bd502dfdbc76475669f1ba1 \ - --hash=sha256:bbd37352cea4ee007c48a44c9bc45a21f7ba70a57edfe46842e346651e2b995a \ - --hash=sha256:d748c8bd97874f5751aed73e8dde379ce32d16338123d07c18b25c9a2796574a \ - --hash=sha256:eb07f37f7aecdbbc91d759c0c09870ce0fb3eed4025eebedf9c4b98c69abd527 \ - --hash=sha256:f1f49f5ec967fd5778813780b12a5650ab0ebcb9ddcca28d642c689b36920796 -s3transfer==0.6.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084 \ - --hash=sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861 -scipy==1.9.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31 \ - --hash=sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108 \ - --hash=sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0 \ - --hash=sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b \ - --hash=sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e \ - --hash=sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e \ - --hash=sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5 \ - --hash=sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840 \ - --hash=sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58 \ - --hash=sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523 \ - --hash=sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd \ - --hash=sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab \ - --hash=sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c \ - --hash=sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb \ - --hash=sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096 \ - --hash=sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0 \ - --hash=sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc \ - --hash=sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9 \ - --hash=sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c \ - --hash=sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95 \ - --hash=sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027 -setuptools==68.2.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a -six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -sortedcontainers==2.4.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ - --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 -stack-data==0.6.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815 \ - --hash=sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8 -tabulate==0.9.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ - --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f -tenacity==8.2.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a \ - --hash=sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c -tomli==2.0.1 ; python_version >= "3.9" and python_version < "3.11" \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f -tornado==6.3.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f \ - --hash=sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5 \ - --hash=sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d \ - --hash=sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3 \ - --hash=sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2 \ - --hash=sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a \ - --hash=sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16 \ - --hash=sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a \ - --hash=sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17 \ - --hash=sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0 \ - --hash=sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe -tqdm==4.66.1 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386 \ - --hash=sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7 -traitlets==5.10.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:417745a96681fbb358e723d5346a547521f36e9bd0d50ba7ab368fff5d67aa54 \ - --hash=sha256:f584ea209240466e66e91f3c81aa7d004ba4cf794990b0c775938a1544217cd1 -typer==0.9.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2 \ - --hash=sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee -typing-extensions==4.8.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef -tzdata==2023.3 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a \ - --hash=sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda -urllib3==1.26.16 ; python_version >= "3.9" and python_version < "4" \ - --hash=sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f \ - --hash=sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14 -uvloop==0.17.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform != "win32" \ - --hash=sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d \ - --hash=sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1 \ - --hash=sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595 \ - --hash=sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b \ - --hash=sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05 \ - --hash=sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8 \ - --hash=sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20 \ - --hash=sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded \ - --hash=sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c \ - --hash=sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8 \ - --hash=sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474 \ - --hash=sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f \ - --hash=sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62 \ - --hash=sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376 \ - --hash=sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c \ - --hash=sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e \ - --hash=sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b \ - --hash=sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4 \ - --hash=sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578 \ - --hash=sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811 \ - --hash=sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d \ - --hash=sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738 \ - --hash=sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa \ - --hash=sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9 \ - --hash=sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539 \ - --hash=sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c \ - --hash=sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718 \ - --hash=sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667 \ - --hash=sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c \ - --hash=sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024 -wcwidth==0.2.6 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e \ - --hash=sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0 -win32-setctime==1.1.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" \ - --hash=sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2 \ - --hash=sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad -wrapt==1.15.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 \ - --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 \ - --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a \ - --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c \ - --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 \ - --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 \ - --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f \ - --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 \ - --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 \ - --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 \ - --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 \ - --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 \ - --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e \ - --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c \ - --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e \ - --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c \ - --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 \ - --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff \ - --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e \ - --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 \ - --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 \ - --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 \ - --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 \ - --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a \ - --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 \ - --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 \ - --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd \ - --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 \ - --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 \ - --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 \ - --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e \ - --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d \ - --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec \ - --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 \ - --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e \ - --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 \ - --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 \ - --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb \ - --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 \ - --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 \ - --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 \ - --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd \ - --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 \ - --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 \ - --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 \ - --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb \ - --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e \ - --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b \ - --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 \ - --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 \ - --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 \ - --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba \ - --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 \ - --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 \ - --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 \ - --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 \ - --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 \ - --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 \ - --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f \ - --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 \ - --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc \ - --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 \ - --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee \ - --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a \ - --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 \ - --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b \ - --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 \ - --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 \ - --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 \ - --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 \ - --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 \ - --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 \ - --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 \ - --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 \ - --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639 -xyzservices==2023.7.0 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:0ec928742227d6f5d4367ea7b457fcfed943429f4de2949b5b02a82cdf5569d6 \ - --hash=sha256:88e9cbf22b31a2f9c1b242e2b18690f5c705f0e539c9bfd37a10399e1037731b -yarl==1.9.2 ; python_version >= "3.9" and python_version < "4.0" \ - --hash=sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571 \ - --hash=sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3 \ - --hash=sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3 \ - --hash=sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c \ - --hash=sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7 \ - --hash=sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04 \ - --hash=sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191 \ - --hash=sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea \ - --hash=sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4 \ - --hash=sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4 \ - --hash=sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095 \ - --hash=sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e \ - --hash=sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74 \ - --hash=sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef \ - --hash=sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33 \ - --hash=sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde \ - --hash=sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45 \ - --hash=sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf \ - --hash=sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b \ - --hash=sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac \ - --hash=sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0 \ - --hash=sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528 \ - --hash=sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716 \ - --hash=sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb \ - --hash=sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18 \ - --hash=sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72 \ - --hash=sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6 \ - --hash=sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582 \ - --hash=sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5 \ - --hash=sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368 \ - --hash=sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc \ - --hash=sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9 \ - --hash=sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be \ - --hash=sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a \ - --hash=sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80 \ - --hash=sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8 \ - --hash=sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6 \ - --hash=sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417 \ - --hash=sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574 \ - --hash=sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59 \ - --hash=sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608 \ - --hash=sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82 \ - --hash=sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1 \ - --hash=sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3 \ - --hash=sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d \ - --hash=sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8 \ - --hash=sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc \ - --hash=sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac \ - --hash=sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8 \ - --hash=sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955 \ - --hash=sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0 \ - --hash=sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367 \ - --hash=sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb \ - --hash=sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a \ - --hash=sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623 \ - --hash=sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2 \ - --hash=sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6 \ - --hash=sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7 \ - --hash=sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4 \ - --hash=sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051 \ - --hash=sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938 \ - --hash=sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8 \ - --hash=sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9 \ - --hash=sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3 \ - --hash=sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5 \ - --hash=sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9 \ - --hash=sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333 \ - --hash=sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185 \ - --hash=sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3 \ - --hash=sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560 \ - --hash=sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b \ - --hash=sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7 \ - --hash=sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78 \ - --hash=sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7 +elasticsearch~=7.17 +hail +tqdm +loguru +attrs +cattrs diff --git a/data-pipeline/src/data_pipeline/helpers/write_schemas.py b/data-pipeline/src/data_pipeline/helpers/write_schemas.py index 314afd960..c5a254c75 100644 --- a/data-pipeline/src/data_pipeline/helpers/write_schemas.py +++ b/data-pipeline/src/data_pipeline/helpers/write_schemas.py @@ -27,31 +27,32 @@ def describe_handler(text): for pipeline in pipelines: - pipeline_name = pipeline.config.name - task_names = pipeline.get_all_task_names() - out_dir = os.path.join(SCHEMA_PATH, pipeline_name) - - for task_name in task_names: - task = gnomad_v4_variant_pipeline.get_task(task_name) - inputs = task.get_inputs() - output_path = task.get_output_path() - - # logger.info(f"out dir {out_dir}") - logger.info(f"task_name: {task}") - logger.info(f"inputs {str(inputs)}") - logger.info(f"output_path {str(output_path)}") - - tables = { - **inputs, - "output": output_path, - } - - logger.info(tables) - - for table_name, table_path in tables.items(): - ht = hl.read_table(table_path) - schema_path = os.path.join( - SCHEMA_PATH, pipeline_name, task_name, table_name, f"{os.path.basename(table_path)}.schema" - ) - describe_handler = schema_writer(schema_path) - ht.describe(handler=describe_handler) + if pipeline.config: + pipeline_name = pipeline.config.name + task_names = pipeline.get_all_task_names() + out_dir = os.path.join(SCHEMA_PATH, pipeline_name) + + for task_name in task_names: + task = gnomad_v4_variant_pipeline.get_task(task_name) + inputs = task.get_inputs() + output_path = task.get_output_path() + + # logger.info(f"out dir {out_dir}") + logger.info(f"task_name: {task}") + logger.info(f"inputs {str(inputs)}") + logger.info(f"output_path {str(output_path)}") + + tables = { + **inputs, + "output": output_path, + } + + logger.info(tables) + + for table_name, table_path in tables.items(): + ht = hl.read_table(table_path) + schema_path = os.path.join( + SCHEMA_PATH, pipeline_name, task_name, table_name, f"{os.path.basename(table_path)}.schema" + ) + describe_handler = schema_writer(schema_path) + ht.describe(handler=describe_handler) diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index 6616af042..e0759b0db 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -53,24 +53,25 @@ def modified_time(path): return file_system.modified_time(check_path) -# _pipeline_config = {} - -# _pipeline_config["output_root"] = config.output_paths.root +_pipeline_config = {} @attr.define class DownloadTask: - _config: PipelineConfig + _config: Optional[PipelineConfig] _name: str _url: str _output_path: str @classmethod - def create(cls, config: PipelineConfig, name: str, url: str, output_path: str): + def create(cls, config: Optional[PipelineConfig], name: str, url: str, output_path: str): return cls(config, name, url, output_path) def get_output_path(self): - return self._config.output_root + self._output_path + if self._config: + return self._config.output_root + self._output_path + else: + return _pipeline_config["output_root"] + self._output_path def should_run(self): output_path = self.get_output_path() @@ -106,17 +107,17 @@ def run(self, force=False): @attr.define class Task: - _config: PipelineConfig _name: str _task_function: Callable _output_path: str _inputs: dict _params: dict + _config: Optional[PipelineConfig] = None @classmethod def create( cls, - config: PipelineConfig, + config: Optional[PipelineConfig], name: str, task_function: Callable, output_path: str, @@ -127,10 +128,13 @@ def create( inputs = {} if params is None: params = {} - return cls(config, name, task_function, output_path, inputs, params) + return cls(name, task_function, output_path, inputs, params, config) def get_output_path(self): - return os.path.join(self._config.output_root, self._output_path) + if self._config: + return os.path.join(self._config.output_root, self._output_path) + else: + return _pipeline_config["output_root"] + self._output_path def get_inputs(self): paths = {} @@ -139,7 +143,13 @@ def get_inputs(self): if isinstance(v, (Task, DownloadTask)): paths.update({k: v.get_output_path()}) else: - paths.update({k: os.path.join(self._config.input_root, v)}) + if self._config: + if self._config.input_root: + paths.update({k: os.path.join(self._config.input_root, v)}) + else: + paths.update({k: v}) + else: + paths.update({k: v}) return paths @@ -165,8 +175,9 @@ def run(self, force=False): start = time.perf_counter() result = self._task_function(**self.get_inputs(), **self._params) - if "gs://" not in self._config.output_root: - Path(self._config.output_root).mkdir(parents=True, exist_ok=True) + if self._config: + if "gs://" not in self._config.output_root: + Path(self._config.output_root).mkdir(parents=True, exist_ok=True) result.write(output_path, overwrite=True) # pylint: disable=unexpected-keyword-arg stop = time.perf_counter() @@ -178,7 +189,7 @@ def run(self, force=False): @attr.define class Pipeline: - config: PipelineConfig + config: Optional[PipelineConfig] = None _tasks: OrderedDict = OrderedDict() _outputs: dict = {} @@ -251,8 +262,8 @@ def run_pipeline(pipeline: Pipeline): group.add_argument("--force-all", action="store_true") args = parser.parse_args() - # if args.output_root: - # _pipeline_config["output_root"] = args.output_root.rstrip("/") + if args.output_root: + _pipeline_config["output_root"] = args.output_root.rstrip("/") pipeline_args = {} if args.force_all: From dd249f77c81ae339168f92150cabc5e7c3e5f244 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 18 Oct 2023 12:51:36 -0400 Subject: [PATCH 025/106] Update v4 variants validation and scripts --- .../gnomad_v4_variants_annotated_2.ht.schema | 240 ++++++----- ...ad_v4_exome_variants_annotated_1.ht.schema | 242 ++++++----- .../gnomad_v4_exome_coverage.ht.schema | 21 +- ...ad_v4_exome_variants_annotated_1.ht.schema | 242 ++++++----- .../gnomad_v4_exome_variants_base.ht.schema | 224 ++++++----- ...exomes.sites.test.updated_101623.ht.schema | 377 ++++++++++++++++++ .../gnomad_v4_exome_variants_base.ht.schema | 224 ++++++----- .../src/data_pipeline/data_types/coverage.py | 17 +- .../annotate_transcript_consequences.py | 45 ++- .../gnomad_v4}/gnomad_v4_validation.py | 51 ++- .../datasets/gnomad_v4/gnomad_v4_variants.py | 53 +-- .../gnomad_v4/types/initial_globals.py | 2 +- .../gnomad_v4/types/initial_variant.py | 13 +- .../gnomad_v4/types/prepare_variants_step1.py | 18 +- .../gnomad_v4/types/prepare_variants_step2.py | 5 +- .../gnomad_v4/types/prepare_variants_step3.py | 18 +- .../pipelines/gnomad_v4_coverage.py | 36 +- .../pipelines/gnomad_v4_variants.py | 21 +- data-pipeline/update-requirements.sh | 2 +- 19 files changed, 1216 insertions(+), 635 deletions(-) create mode 100644 data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema rename data-pipeline/src/data_pipeline/{pipelines => datasets/gnomad_v4}/gnomad_v4_validation.py (74%) diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema index f32eebf40..acec64e03 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema @@ -2,168 +2,206 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, - min_score: float64 + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - rf_indel_cutoff: struct { - bin: float64, - min_score: float64 + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 } 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str - } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'date': str + 'version': str 'mane_transcripts_version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': array + 'joint_grpmax': struct { AC: int32, AF: float64, AN: int32, homozygote_count: int32, - grp: str, - faf95: float64 + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } 'rsids': set - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool - }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool + raw_score: float32 }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } 'variant_id': str 'colocated_variants': struct { - all: array, - non_ukb: array + non_ukb: array, + all: array } 'gnomad': struct { freq: struct { - all: struct { + non_ukb: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array }, - non_ukb: struct { + all: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array } }, faf95: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, faf99: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, age_distribution: struct { - het: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }>, - hom: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }> + } }, filters: set, quality_metrics: struct { @@ -245,15 +283,15 @@ Row fields: exome: struct { mean: float64, median: int32, - over_1: float32, - over_5: float32, - over_10: float32, - over_15: float32, - over_20: float32, - over_25: float32, - over_30: float32, - over_50: float32, - over_100: float32 + over_1: float64, + over_5: float64, + over_10: float64, + over_15: float64, + over_20: float64, + over_25: float64, + over_30: float64, + over_50: float64, + over_100: float64 }, genome: struct { mean: float64, @@ -282,8 +320,6 @@ Row fields: lof_flags: str, lof: str, major_consequence: str, - polyphen_prediction: str, - sift_prediction: str, transcript_id: str, transcript_version: str, gene_version: str, diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema index 2d79bcce0..47acd44e2 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema @@ -2,83 +2,129 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, - min_score: float64 + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - rf_indel_cutoff: struct { - bin: float64, - min_score: float64 + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 } 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'date': str + 'version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': array + 'joint_grpmax': struct { AC: int32, AF: float64, AN: int32, homozygote_count: int32, - grp: str, - faf95: float64 + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } 'rsids': set 'vep': struct { allele_string: str, @@ -153,13 +199,9 @@ Row fields: mane_select: str, mane_plus_clinical: str, mirna: array, - polyphen_prediction: str, - polyphen_score: float64, protein_end: int32, protein_start: int32, protein_id: str, - sift_prediction: str, - sift_score: float64, source: str, strand: int32, transcript_id: str, @@ -169,89 +211,81 @@ Row fields: }>, variant_class: str } - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool - }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool + raw_score: float32 }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } 'variant_id': str 'colocated_variants': struct { - all: array, - non_ukb: array + non_ukb: array, + all: array } 'gnomad': struct { freq: struct { - all: struct { + non_ukb: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array }, - non_ukb: struct { + all: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array } }, faf95: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, faf99: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, age_distribution: struct { - het: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }>, - hom: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }> + } }, filters: set, quality_metrics: struct { @@ -333,15 +367,15 @@ Row fields: exome: struct { mean: float64, median: int32, - over_1: float32, - over_5: float32, - over_10: float32, - over_15: float32, - over_20: float32, - over_25: float32, - over_30: float32, - over_50: float32, - over_100: float32 + over_1: float64, + over_5: float64, + over_10: float64, + over_15: float64, + over_20: float64, + over_25: float64, + over_30: float64, + over_50: float64, + over_100: float64 }, genome: struct { mean: float64, diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema index cc7c55027..fd46dcb24 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema @@ -1,21 +1,22 @@ ---------------------------------------- Global fields: - None + 'coverage_stats_meta': array> + 'coverage_stats_meta_sample_count': array ---------------------------------------- Row fields: 'locus': locus 'xpos': int64 'mean': float64 'median': int32 - 'over_1': float32 - 'over_5': float32 - 'over_10': float32 - 'over_15': float32 - 'over_20': float32 - 'over_25': float32 - 'over_30': float32 - 'over_50': float32 - 'over_100': float32 + 'over_1': float64 + 'over_5': float64 + 'over_10': float64 + 'over_15': float64 + 'over_20': float64 + 'over_25': float64 + 'over_30': float64 + 'over_50': float64 + 'over_100': float64 ---------------------------------------- Key: ['locus'] ---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema index 2d79bcce0..47acd44e2 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema @@ -2,83 +2,129 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, - min_score: float64 + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - rf_indel_cutoff: struct { - bin: float64, - min_score: float64 + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 } 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'date': str + 'version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': array + 'joint_grpmax': struct { AC: int32, AF: float64, AN: int32, homozygote_count: int32, - grp: str, - faf95: float64 + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } 'rsids': set 'vep': struct { allele_string: str, @@ -153,13 +199,9 @@ Row fields: mane_select: str, mane_plus_clinical: str, mirna: array, - polyphen_prediction: str, - polyphen_score: float64, protein_end: int32, protein_start: int32, protein_id: str, - sift_prediction: str, - sift_score: float64, source: str, strand: int32, transcript_id: str, @@ -169,89 +211,81 @@ Row fields: }>, variant_class: str } - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool - }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool + raw_score: float32 }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } 'variant_id': str 'colocated_variants': struct { - all: array, - non_ukb: array + non_ukb: array, + all: array } 'gnomad': struct { freq: struct { - all: struct { + non_ukb: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array }, - non_ukb: struct { + all: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array } }, faf95: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, faf99: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, age_distribution: struct { - het: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }>, - hom: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }> + } }, filters: set, quality_metrics: struct { @@ -333,15 +367,15 @@ Row fields: exome: struct { mean: float64, median: int32, - over_1: float32, - over_5: float32, - over_10: float32, - over_15: float32, - over_20: float32, - over_25: float32, - over_30: float32, - over_50: float32, - over_100: float32 + over_1: float64, + over_5: float64, + over_10: float64, + over_15: float64, + over_20: float64, + over_25: float64, + over_30: float64, + over_50: float64, + over_100: float64 }, genome: struct { mean: float64, diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema index 89fba5a59..6e124ecbc 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema @@ -2,83 +2,129 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, - min_score: float64 + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - rf_indel_cutoff: struct { - bin: float64, - min_score: float64 + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 } 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str - } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'date': str + 'version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': array + 'joint_grpmax': struct { AC: int32, AF: float64, AN: int32, homozygote_count: int32, - grp: str, - faf95: float64 + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } 'rsids': set 'vep': struct { allele_string: str, @@ -153,13 +199,9 @@ Row fields: mane_select: str, mane_plus_clinical: str, mirna: array, - polyphen_prediction: str, - polyphen_score: float64, protein_end: int32, protein_start: int32, protein_id: str, - sift_prediction: str, - sift_score: float64, source: str, strand: int32, transcript_id: str, @@ -169,89 +211,81 @@ Row fields: }>, variant_class: str } - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool + raw_score: float32 }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool - }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } 'variant_id': str 'colocated_variants': struct { - all: array, - non_ukb: array + non_ukb: array, + all: array } 'gnomad': struct { freq: struct { - all: struct { + non_ukb: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array }, - non_ukb: struct { + all: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array } }, faf95: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, faf99: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, age_distribution: struct { - het: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }>, - hom: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }> + } }, filters: set, quality_metrics: struct { diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema new file mode 100644 index 000000000..9852ccb58 --- /dev/null +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema @@ -0,0 +1,377 @@ +---------------------------------------- +Global fields: + 'freq_meta': array> + 'freq_index_dict': dict + 'freq_meta_sample_count': array + 'faf_meta': array> + 'faf_index_dict': dict + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> + 'filtering_model': struct { + filter_name: str, + score_name: str, + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str + }, + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str + }, + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 + } + 'tool_versions': struct { + cadd_version: str, + revel_version: str, + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str + } + 'vep_globals': struct { + vep_version: str, + vep_help: str, + vep_config: str, + gencode_version: str, + mane_select_version: str + } + 'date': str + 'version': str +---------------------------------------- +Row fields: + 'locus': locus + 'alleles': array + 'freq': array + 'grpmax': struct { + gnomad: struct { + AC: int32, + AF: float64, + AN: int32, + homozygote_count: int64, + gen_anc: str + }, + non_ukb: struct { + AC: int32, + AF: float64, + AN: int32, + homozygote_count: int64, + gen_anc: str + } + } + 'faf': array + 'fafmax': struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + } + 'joint_freq': array + 'joint_grpmax': struct { + AC: int32, + AF: float64, + AN: int32, + homozygote_count: int32, + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + 'a_index': int32 + 'was_split': bool + 'rsid': set + 'filters': set + 'info': struct { + FS: float64, + MQ: float64, + MQRankSum: float64, + QUALapprox: int64, + QD: float64, + ReadPosRankSum: float64, + SB: array, + SOR: float64, + VarDP: int32, + AS_FS: float64, + AS_MQ: float64, + AS_MQRankSum: float64, + AS_pab_max: float64, + AS_QUALapprox: int64, + AS_QD: float64, + AS_ReadPosRankSum: float64, + AS_SB_TABLE: array, + AS_SOR: float64, + AS_VarDP: int32, + singleton: bool, + transmitted_singleton: bool, + omni: bool, + mills: bool, + monoallelic: bool, + only_het: bool, + AS_VQSLOD: float64, + inbreeding_coeff: float64, + vrs: struct { + VRS_Allele_IDs: array, + VRS_Starts: array, + VRS_Ends: array, + VRS_States: array + } + } + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + protein_end: int32, + protein_start: int32, + protein_id: str, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool + } + 'region_flags': struct { + non_par: bool, + lcr: bool, + segdup: bool, + fail_interval_qc: bool, + outside_ukb_capture_region: bool, + outside_broad_capture_region: bool + } + 'allele_info': struct { + variant_type: str, + n_alt_alleles: int32, + has_star: bool, + allele_type: str, + was_mixed: bool + } + 'histograms': struct { + qual_hists: struct { + gq_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + gq_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + ab_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + raw_qual_hists: struct { + gq_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_all: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + gq_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + dp_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + ab_hist_alt: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + age_hists: struct { + age_hist_het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + age_hist_hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + } + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } +---------------------------------------- +Key: ['locus', 'alleles'] +---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema index 89fba5a59..6e124ecbc 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema @@ -2,83 +2,129 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': dict> 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, - min_score: float64 + snv_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - rf_indel_cutoff: struct { - bin: float64, - min_score: float64 + indel_cutoff: struct { + bin: int32, + min_score: float64, + bin_id: str }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array + } + 'inbreeding_coeff_cutoff': float64 + 'interval_qc_parameters': struct { + per_platform: bool, + all_platforms: bool, + high_qual_cutoffs: dict>, + min_platform_size: int32 } 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str - } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'date': str + 'version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': array + 'joint_grpmax': struct { AC: int32, AF: float64, AN: int32, homozygote_count: int32, - grp: str, - faf95: float64 + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } 'rsids': set 'vep': struct { allele_string: str, @@ -153,13 +199,9 @@ Row fields: mane_select: str, mane_plus_clinical: str, mirna: array, - polyphen_prediction: str, - polyphen_score: float64, protein_end: int32, protein_start: int32, protein_id: str, - sift_prediction: str, - sift_score: float64, source: str, strand: int32, transcript_id: str, @@ -169,89 +211,81 @@ Row fields: }>, variant_class: str } - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool + raw_score: float32 }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool - }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } 'variant_id': str 'colocated_variants': struct { - all: array, - non_ukb: array + non_ukb: array, + all: array } 'gnomad': struct { freq: struct { - all: struct { + non_ukb: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array }, - non_ukb: struct { + all: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int32, - populations: array } }, faf95: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, faf99: struct { - popmax: float64, - popmax_population: str + grpmax: float64, + grpmax_gen_anc: str }, age_distribution: struct { - het: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }>, - hom: array, bin_freq: array, n_smaller: int64, n_larger: int64 - }> + } }, filters: set, quality_metrics: struct { diff --git a/data-pipeline/src/data_pipeline/data_types/coverage.py b/data-pipeline/src/data_pipeline/data_types/coverage.py index 40c7715a8..b59d33503 100644 --- a/data-pipeline/src/data_pipeline/data_types/coverage.py +++ b/data-pipeline/src/data_pipeline/data_types/coverage.py @@ -7,14 +7,17 @@ def prepare_coverage(coverage_path: str, filter_intervals: Optional[List[str]] = None): coverage = hl.read_table(coverage_path) - if filter_intervals: - intervals = [hl.parse_locus_interval(interval, reference_genome="GRCh38") for interval in filter_intervals] - coverage = hl.filter_intervals(coverage, intervals) - coverage = coverage.annotate(xpos=x_position(coverage.locus)) + coverage_fields = coverage.row.dtype.fields + + # Specific to v4, the data is contained in a coverage_stats field and we take the first element + if "coverage_stats" in coverage_fields: + if type(coverage.coverage_stats) == hl.expr.expressions.typed_expressions.ArrayStructExpression: + coverage = coverage.annotate(**coverage.coverage_stats[0]) + # Median field name is different in v3.0.1 vs v2 - if "median" not in coverage.row.dtype.fields: + if "median" not in coverage_fields: coverage = coverage.annotate(median=coverage.median_approx) # Drop extra fields in v3 @@ -33,4 +36,8 @@ def prepare_coverage(coverage_path: str, filter_intervals: Optional[List[str]] = "over_100", ) + if filter_intervals: + intervals = [hl.parse_locus_interval(interval, reference_genome="GRCh38") for interval in filter_intervals] + coverage = hl.filter_intervals(coverage, intervals) + return coverage diff --git a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/annotate_transcript_consequences.py b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/annotate_transcript_consequences.py index 8025ef597..6b0853413 100644 --- a/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/annotate_transcript_consequences.py +++ b/data-pipeline/src/data_pipeline/data_types/variant/transcript_consequence/annotate_transcript_consequences.py @@ -35,25 +35,32 @@ def annotate_transcript_consequences(variants_path, transcripts_path, mane_trans ) ) - transcript_consequences = transcript_consequences.map( - lambda c: c.select( - "biotype", - "consequence_terms", - "domains", - "gene_id", - "gene_symbol", - "hgvsc", - "hgvsp", - "is_canonical", - "lof_filter", - "lof_flags", - "lof", - "major_consequence", - "polyphen_prediction", - "sift_prediction", - "transcript_id", - ) - ) + consequences = [ + "biotype", + "consequence_terms", + "domains", + "gene_id", + "gene_symbol", + "hgvsc", + "hgvsp", + "is_canonical", + "lof_filter", + "lof_flags", + "lof", + "major_consequence", + # "polyphen_prediction", + # "sift_prediction", + "transcript_id", + ] + + available_consequences = list(transcript_consequences[0]) + + if "polyphen_prediction" in available_consequences: + consequences.append("polyphen_prediction") + if "sift_prediction" in available_consequences: + consequences.append("sift_prediction") + + transcript_consequences = transcript_consequences.map(lambda c: c.select(*consequences)) transcripts = hl.read_table(transcripts_path) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py similarity index 74% rename from data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py rename to data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py index f57278272..494ec9a99 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py @@ -1,4 +1,11 @@ -from cattrs import structure, structure_attrs_fromdict +from cattrs import ( + ClassValidationError, + IterableValidationError, + # IterableValidationError, + structure, + Converter, + transform_error, +) import hail as hl import json @@ -12,6 +19,28 @@ from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step2 import Variant as Step2Variant from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step3 import Variant as Step3Variant +c = Converter(forbid_extra_keys=True) + + +def validate_rows(ht: hl.Table, cls: object): + result = ht_to_json(ht) + + for variant in result: + if variant: + try: + c.structure_attrs_fromdict(variant, cls) + except ClassValidationError as e: + logger.error(e) + logger.error(transform_error(e)) + # raise Exception(e) + except IterableValidationError as e: + logger.error(e) + logger.error(transform_error(e)) + raise Exception(e) + except Exception as e: + logger.error(e) + # raise Exception(e) + def ht_to_json(ht: hl.Table, field: str = "row"): if field == "row": @@ -43,16 +72,7 @@ def validate_variant_input(pipeline: Pipeline): input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) - result = ht_to_json(ht) - - for variant in result: - if variant: - try: - structure_attrs_fromdict(variant, InitialVariant) - except TypeError as e: - logger.info(variant) - logger.info(e) - + validate_rows(ht, InitialVariant) logger.info("Validated prepare_gnomad_v4_exome_variants input variants") @@ -60,8 +80,7 @@ def validate_step1_output(pipeline: Pipeline): output_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) - result = ht_to_json(ht) - [structure_attrs_fromdict(variant, Step1Variant) for variant in result] + validate_rows(ht, Step1Variant) logger.info("Validated prepare_gnomad_v4_exome_variants (step 1) output") @@ -69,8 +88,7 @@ def validate_step2_output(pipeline: Pipeline): output_path = pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) - result = ht_to_json(ht) - [structure_attrs_fromdict(variant, Step2Variant) for variant in result] + validate_rows(ht, Step2Variant) logger.info("Validated annotate_gnomad_v4_exome_variants (step 2) output") @@ -78,6 +96,5 @@ def validate_step3_output(pipeline: Pipeline): output_path = pipeline.get_task("annotate_gnomad_v4_exome_transcript_consequences").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) - result = ht_to_json(ht) - [structure_attrs_fromdict(variant, Step3Variant) for variant in result] + validate_rows(ht, Step3Variant) logger.info("Validated annotate_gnomad_v4_exome_transcript_consequences (step 3) output") diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py index 2b8314b8e..101c563fb 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -12,10 +12,10 @@ def nullify_nan(value): def freq_index_key(subset=None, pop=None, sex=None, raw=False): parts = [s for s in [subset, pop, sex] if s is not None] parts.append("raw" if raw else "adj") - return "-".join(parts) + return "_".join(parts) -def prepare_gnomad_v4_variants(input_path): +def prepare_gnomad_v4_variants(input_path: str): ds = hl.read_table(input_path) g = hl.eval(ds.globals) @@ -72,14 +72,16 @@ def subset_filter(subset): # Frequencies # ############### - subset_populations = {} + subset_ancestry_groups = {} for subset in subsets: - subset_populations[subset] = set(m.get("pop", None) for m in g.freq_meta if m.get("subset", None) == subset) + subset_ancestry_groups[subset] = set( + m.get("gen_anc", None) for m in g.freq_meta if m.get("subset", None) == subset + ) - subset_populations[subset].discard(None) + subset_ancestry_groups[subset].discard(None) # "global" population is used for downsamplings - subset_populations[subset].discard("global") + subset_ancestry_groups[subset].discard("global") ds = ds.annotate(in_autosome_or_par=ds.locus.in_autosome_or_par()) @@ -96,7 +98,7 @@ def subset_filter(subset): ds.in_autosome_or_par, 0, hl.or_else(freq(ds, subset=subset, sex="XY").AC, 0) ), homozygote_count=freq(ds, subset=subset).homozygote_count, - populations=[ + ancestry_groups=[ hl.struct( id="_".join(filter(bool, [pop, sex])), ac=hl.or_else(freq(ds, subset=subset, pop=pop, sex=sex).AC, 0), @@ -112,7 +114,7 @@ def subset_filter(subset): freq(ds, subset=subset, pop=pop, sex=sex).homozygote_count, 0 ), ) - for pop, sex in list(itertools.product(subset_populations[subset], [None, "XX", "XY"])) + for pop, sex in list(itertools.product(subset_ancestry_groups[subset], [None, "XX", "XY"])) + [(None, "XX"), (None, "XY")] ], ) @@ -129,10 +131,10 @@ def subset_filter(subset): **{ subset or "all": ds.gnomad.freq[subset or "all"].annotate( - populations=hl.if_else( + ancestry_groups=hl.if_else( ds.gnomad.freq[subset or "all"].ac_raw == 0, - hl.empty_array(ds.gnomad.freq[subset or "all"].populations.dtype.element_type), - ds.gnomad.freq[subset or "all"].populations, + hl.empty_array(ds.gnomad.freq[subset or "all"].ancestry_groups.dtype.element_type), + ds.gnomad.freq[subset or "all"].ancestry_groups, ) ) for subset in subsets @@ -159,16 +161,16 @@ def subset_filter(subset): # Filtering allele frequency # ############################## - faf_populations = [pop for pop in subset_populations[None] if f"{pop}-adj" in g.faf_index_dict] + faf_populations = [pop for pop in subset_ancestry_groups[None] if f"{pop}_adj" in g.faf_index_dict] - # Get popmax FAFs + # Get grpmax FAFs ds = ds.annotate( gnomad=ds.gnomad.annotate( faf95=hl.rbind( hl.sorted( hl.array( [ - hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf95, population=pop) + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}_adj"]].faf95, population=pop) for pop in faf_populations ] ), @@ -176,15 +178,15 @@ def subset_filter(subset): ), lambda fafs: hl.if_else( hl.len(fafs) > 0, - hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), - hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + hl.struct(grpmax=fafs[0].faf, grpmax_gen_anc=fafs[0].population), + hl.struct(grpmax=hl.null(hl.tfloat), grpmax_gen_anc=hl.null(hl.tstr)), ), ), faf99=hl.rbind( hl.sorted( hl.array( [ - hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}-adj"]].faf99, population=pop) + hl.struct(faf=ds.faf[g.faf_index_dict[f"{pop}_adj"]].faf99, population=pop) for pop in faf_populations ] ), @@ -192,8 +194,8 @@ def subset_filter(subset): ), lambda fafs: hl.if_else( hl.len(fafs) > 0, - hl.struct(popmax=fafs[0].faf, popmax_population=fafs[0].population), - hl.struct(popmax=hl.null(hl.tfloat), popmax_population=hl.null(hl.tstr)), + hl.struct(grpmax=fafs[0].faf, grpmax_gen_anc=fafs[0].population), + hl.struct(grpmax=hl.null(hl.tfloat), grpmax_gen_anc=hl.null(hl.tstr)), ), ), ), @@ -208,7 +210,7 @@ def subset_filter(subset): ds = ds.annotate( gnomad=ds.gnomad.annotate( age_distribution=hl.struct( - het=ds.histograms.age_hists.age_hist_ht, hom=ds.histograms.age_hists.age_hist_hom + het=ds.histograms.age_hists.age_hist_het, hom=ds.histograms.age_hists.age_hist_hom ) ) ) @@ -249,7 +251,7 @@ def subset_filter(subset): + [ hl.struct(metric=metric, value=hl.float(nullify_nan(ds.info[metric]))) for metric in [ - "InbreedingCoeff", + "inbreeding_coeff", "AS_FS", "AS_MQ", "AS_MQRankSum", @@ -275,8 +277,11 @@ def subset_filter(subset): ds = ds.annotate( flags=hl.set( [ - hl.or_missing(ds.region_flag.lcr, "lcr"), - hl.or_missing(ds.region_flag.segdup, "segdup"), + hl.or_missing(ds.region_flags.lcr, "lcr"), + hl.or_missing(ds.region_flags.segdup, "segdup"), + hl.or_missing(ds.region_flags.fail_interval_qc, "fail_interval_qc"), + hl.or_missing(ds.region_flags.outside_ukb_capture_region, "outside_ukb_capture_region"), + hl.or_missing(ds.region_flags.outside_broad_capture_region, "outside_broad_capture_region"), hl.or_missing( ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), @@ -287,7 +292,7 @@ def subset_filter(subset): ).filter(hl.is_defined) ) - ds = ds.drop("region_flag") + ds = ds.drop("region_flags") ################ # Other fields # diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py index 53a3dc2be..05b8e2760 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py @@ -1,5 +1,5 @@ import attr -from typing import List, Dict, Union +from typing import List @attr.define diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index a44e37607..a4d31ca0f 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -88,10 +88,13 @@ class Info: AS_VQSLOD: float inbreeding_coeff: float vrs: Vrs + only_het: bool @attr.define class Consequence: + regulatory_feature_id: str + biotype: str allele_num: int consequence_terms: List[str] impact: str @@ -167,15 +170,6 @@ class Vep: variant_class: Union[str, None] -@attr.define -class Rf: - rf_positive_label: bool - rf_negative_label: bool - rf_label: str - rf_train: bool - rf_tp_probability: float - - @attr.define class RegionFlags: lcr: bool @@ -192,6 +186,7 @@ class AlleleInfo: allele_type: str n_alt_alleles: int was_mixed: bool + has_star: bool @attr.define diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py index c234861ec..c94da3442 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py @@ -3,16 +3,15 @@ from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( + GrpmaxBySubset, InSilicoPredictors, Vep, - Rf, - Grpmax, Locus, ) @attr.define -class Population: +class AncestryGroup: id: str ac: int an: int @@ -27,7 +26,7 @@ class Freq: an: int hemizygote_count: int homozygote_count: int - populations: list[Population] + ancestry_groups: list[AncestryGroup] @attr.define @@ -38,8 +37,8 @@ class FreqBySubset: @attr.define class FAF: - popmax: float - popmax_population: str + grpmax: float + grpmax_gen_anc: str @attr.define @@ -96,8 +95,8 @@ class QualityMetrics: @attr.define class AgeDistributions: - het: List[BinDetails] - hom: List[BinDetails] + het: BinDetails + hom: BinDetails @attr.define @@ -120,10 +119,9 @@ class ColocatedVariants: class Variant: locus: Locus alleles: list[str] - grpmax: List[Grpmax] + grpmax: GrpmaxBySubset rsids: Union[Set[str], None] vep: Union[Vep, None] - rf: Rf in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py index 144da0965..3b4ea94ec 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py @@ -1,3 +1,4 @@ +from typing import Union import attr from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as InputVariant @@ -19,8 +20,8 @@ class CoverageDetail: @attr.define class Coverage: - exome: CoverageDetail - genome: CoverageDetail + exome: Union[CoverageDetail, None] + genome: Union[CoverageDetail, None] @attr.define diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py index 939919db2..c86e292d9 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py @@ -5,9 +5,8 @@ from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( InSilicoPredictors, - Domain, - Rf, - Grpmax, + # Domain, + # Grpmax, Locus, ) @@ -16,7 +15,8 @@ class TranscriptConsequence: biotype: Union[str, None] consequence_terms: list[str] - domains: Union[List[Domain], None] + # domains: Union[List[Domain], None] + domains: Union[List[str], None] gene_id: Union[str, None] gene_symbol: Union[str, None] hgvsc: Union[str, None] @@ -25,13 +25,14 @@ class TranscriptConsequence: lof: Union[str, None] lof_flags: Union[str, None] lof_filter: Union[str, None] - lof_info: Union[str, None] + # lof_info: Union[str, None] major_consequence: str - polyphen_prediction: Union[str, None] - sift_prediction: Union[str, None] + # polyphen_prediction: Union[str, None] + # sift_prediction: Union[str, None] transcript_id: Union[str, None] transcript_version: Union[str, None] transcript_id: Union[str, None] + gene_version: str is_mane_select: bool is_mane_select_version: bool refseq_id: str @@ -42,9 +43,8 @@ class TranscriptConsequence: class Variant: locus: Locus alleles: list[str] - grpmax: List[Grpmax] + # grpmax: List[Grpmax] rsids: Union[Set[str], None] - rf: Rf in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index bbef03db8..89e2ad238 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -1,41 +1,41 @@ from data_pipeline.pipeline import Pipeline, run_pipeline -from data_pipeline.config import PipelineConfig from data_pipeline.data_types.coverage import prepare_coverage -pipeline = Pipeline( - config=PipelineConfig(name="gnomad_v4_variants", input_root="data_in", output_root="data_out") # TODO: FIXME -) +pipeline = Pipeline() pipeline.add_task( name="prepare_gnomad_v4_exome_coverage", task_function=prepare_coverage, - output_path="/gnomad_v4/gnomad_v4_exome_coverage.ht", + output_path="/gnomad_v4/gnomad_v4_exome_coverage_cnv_test.ht", # Using v3 coverage as mock for now inputs={ - "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", + "coverage_path": "gs://gnomad-v4-coverage-testing/release/4.0/ht/exomes/gnomad.exomes.v4.0.coverage.ht", }, - params={"filter_intervals": ["chr1:10030-10150"]}, + params={"filter_intervals": ["chr1:1007979-119987180"]}, ) -pipeline.add_task( - name="prepare_gnomad_v4_genome_coverage", - task_function=prepare_coverage, - output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", - # Using v3 coverage as mock for now - inputs={ - "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", - }, - params={"filter_intervals": ["chr1:10030-10150"]}, -) +# pipeline.add_task( +# name="prepare_gnomad_v4_genome_coverage", +# task_function=prepare_coverage, +# output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", +# # Using v3 coverage as mock for now +# inputs={ +# "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", +# }, +# params={"filter_intervals": ["chr1:55039447-55064852"]}, +# ) ############################################### # Outputs ############################################### pipeline.set_outputs( - {"exome_coverage": "prepare_gnomad_v4_exome_coverage", "genome_coverage": "prepare_gnomad_v4_genome_coverage"} + { + "exome_coverage": "prepare_gnomad_v4_exome_coverage", + # "genome_coverage": "prepare_gnomad_v4_genome_coverage", + } ) ############################################### diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 60740d541..e8682f204 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -9,16 +9,17 @@ prepare_gnomad_v4_variants, ) -from data_pipeline.data_types.variant import ( - annotate_variants, - annotate_transcript_consequences, -) -from data_pipeline.pipelines.gnomad_v4_validation import ( +from data_pipeline.datasets.gnomad_v4.gnomad_v4_validation import ( validate_globals_input, + validate_variant_input, validate_step1_output, validate_step2_output, validate_step3_output, - validate_variant_input, +) + +from data_pipeline.data_types.variant import ( + annotate_variants, + annotate_transcript_consequences, ) DATA_ENV = os.getenv("DATA_ENV", "mock") @@ -113,11 +114,11 @@ ############################################### if __name__ == "__main__": - # run_pipeline(pipeline) + run_pipeline(pipeline) logger.info("Validating pipeline IO formats") validate_globals_input(pipeline) validate_variant_input(pipeline) - # validate_step1_output(pipeline) - # validate_step2_output(pipeline) - # validate_step3_output(pipeline) + validate_step1_output(pipeline) + validate_step2_output(pipeline) + validate_step3_output(pipeline) diff --git a/data-pipeline/update-requirements.sh b/data-pipeline/update-requirements.sh index 5e4d8db49..a44236630 100755 --- a/data-pipeline/update-requirements.sh +++ b/data-pipeline/update-requirements.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash # -poetry export --with dev >requirements.txt +poetry export --without-hashes --with dev >requirements.txt From 349385feb8629172e22d410e49c080031d4f88e7 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Thu, 19 Oct 2023 11:46:23 -0400 Subject: [PATCH 026/106] Add development dependencies to requirements --- data-pipeline/requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data-pipeline/requirements.txt b/data-pipeline/requirements.txt index 6fc42d12e..6aa0f0793 100644 --- a/data-pipeline/requirements.txt +++ b/data-pipeline/requirements.txt @@ -4,3 +4,7 @@ tqdm loguru attrs cattrs +pytest +ruff +black +pyright From 74d131b1593a8aff5dd903634c804bd0fd4cff67 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 20 Oct 2023 11:02:15 -0400 Subject: [PATCH 027/106] Export variants and coverage to elasticsearch --- .../datasets/gnomad_v4/types/__init__.py | 0 data-pipeline/src/data_pipeline/pipeline.py | 4 +- .../pipelines/export_to_elasticsearch.py | 39 ++++++++++++++++--- .../src/data_pipeline/pipelines/genes.py | 8 +++- .../pipelines/gnomad_v4_coverage.py | 27 +++++++------ .../pipelines/gnomad_v4_variants.py | 11 ++++-- 6 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/__init__.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/__init__.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/data-pipeline/src/data_pipeline/pipeline.py b/data-pipeline/src/data_pipeline/pipeline.py index e0759b0db..8d58d0de4 100644 --- a/data-pipeline/src/data_pipeline/pipeline.py +++ b/data-pipeline/src/data_pipeline/pipeline.py @@ -146,6 +146,8 @@ def get_inputs(self): if self._config: if self._config.input_root: paths.update({k: os.path.join(self._config.input_root, v)}) + if "gs://" in v: + paths.update({k: v}) else: paths.update({k: v}) else: @@ -233,7 +235,7 @@ def set_outputs(self, outputs) -> None: self._outputs = outputs - def get_output(self, output_name) -> str: + def get_output(self, output_name) -> Union[Task, DownloadTask]: task_name = self._outputs[output_name] return self._tasks[task_name] diff --git a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py index be674106f..758f7135e 100644 --- a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py +++ b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py @@ -36,6 +36,8 @@ pipeline as gnomad_v3_mitochondrial_coverage_pipeline, ) from data_pipeline.pipelines.gnomad_v3_short_tandem_repeats import pipeline as gnomad_v3_short_tandem_repeats_pipeline +from data_pipeline.pipelines.gnomad_v4_variants import pipeline as gnomad_v4_variants_pipeline +from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as gnomad_v4_coverage_pipeline from data_pipeline.pipelines.gnomad_v4_cnvs import pipeline as gnomad_v4_cnvs_pipeline @@ -114,6 +116,37 @@ def add_liftover_document_id(ds): }, }, ############################################################################################################## + # gnomAD v4 + ############################################################################################################## + "gnomad_v4_exome_variants": { + "get_table": lambda: subset_table( + add_variant_document_id( + hl.read_table(gnomad_v4_variants_pipeline.get_output("exome_variants").get_output_path()) + ) + ), + "args": { + "index": "gnomad_v4_variants", + "index_fields": [ + "document_id", + "variant_id", + "rsids", + # "caid", + "locus", + "transcript_consequences.gene_id", + "transcript_consequences.transcript_id", + ], + "id_field": "document_id", + "num_shards": 2, + "block_size": 1_000, + }, + }, + "gnomad_v4_exome_coverage": { + "get_table": lambda: subset_table( + hl.read_table(gnomad_v4_coverage_pipeline.get_output("exome_coverage").get_output_path()) + ), + "args": {"index": "gnomad_v4_exome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, + }, + ############################################################################################################## # gnomAD v4 CNVs ############################################################################################################## "gnomad_v4_cnvs": { @@ -126,12 +159,6 @@ def add_liftover_document_id(ds): "block_size": 1_000, }, }, - "gnomad_v4_exome_coverage": { - "get_table": lambda: hl.read_table( - "gs://gnomad-matt-data-pipeline/gnomad_v4_coverage_test_2023-10-12-1142/gnomad_v4_exome_coverage.ht" - ), - "args": {"index": "gnomad_v4_exome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, - }, "gnomad_v4_cnv_track_callable": { "get_table": lambda: subset_table( hl.read_table(gnomad_v4_cnv_coverage_pipeline.get_output("track_percent_callable").get_output_path()) diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index ce3a99cc2..2a85abe44 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -30,7 +30,13 @@ ) from data_pipeline.data_types.gene import reject_par_y_genes -pipeline = Pipeline(PipelineConfig(name="genes", input_root="data_in", output_root="data_out")) # TODO: FIXME +pipeline = Pipeline( + # PipelineConfig( + # name="genes", + # input_root="gs://gnomad-matt-data-pipeline/2023-10-19/inputs", + # output_root="gs://gnomad-matt-data-pipeline/2023-10-19/outputs", + # ) +) # TODO: FIXME ############################################### # Import GENCODE and HGNC files diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index 89e2ad238..2a88eeb52 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -8,24 +8,23 @@ pipeline.add_task( name="prepare_gnomad_v4_exome_coverage", task_function=prepare_coverage, - output_path="/gnomad_v4/gnomad_v4_exome_coverage_cnv_test.ht", - # Using v3 coverage as mock for now + output_path="/gnomad_v4/gnomad_v4_exome_coverage.ht", inputs={ "coverage_path": "gs://gnomad-v4-coverage-testing/release/4.0/ht/exomes/gnomad.exomes.v4.0.coverage.ht", }, - params={"filter_intervals": ["chr1:1007979-119987180"]}, + params={"filter_intervals": ["chr1:55039447-55064852"]}, ) -# pipeline.add_task( -# name="prepare_gnomad_v4_genome_coverage", -# task_function=prepare_coverage, -# output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", -# # Using v3 coverage as mock for now -# inputs={ -# "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", -# }, -# params={"filter_intervals": ["chr1:55039447-55064852"]}, -# ) +pipeline.add_task( + name="prepare_gnomad_v4_genome_coverage", + task_function=prepare_coverage, + output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", + # Using v3 coverage as mock for now + inputs={ + "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", + }, + params={"filter_intervals": ["chr1:55039447-55064852"]}, +) ############################################### # Outputs @@ -34,7 +33,7 @@ pipeline.set_outputs( { "exome_coverage": "prepare_gnomad_v4_exome_coverage", - # "genome_coverage": "prepare_gnomad_v4_genome_coverage", + "genome_coverage": "prepare_gnomad_v4_genome_coverage", } ) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index e8682f204..6004610d3 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -22,7 +22,7 @@ annotate_transcript_consequences, ) -DATA_ENV = os.getenv("DATA_ENV", "mock") +DATA_ENV = os.getenv("DATA_ENV", "full") pipeline_name = "gnomad_v4_variants" @@ -52,9 +52,10 @@ config = PipelineConfig( name=pipeline_name, - input_root="gs://gnomad-matt-data-pipeline/2023-09-26/inputs", - output_root="gs://gnomad-matt-data-pipeline/2023-09-26/outputs", + input_root="gs://gnomad-matt-data-pipeline/2023-10-19/inputs", + output_root="gs://gnomad-matt-data-pipeline/2023-10-19/outputs", ) + else: raise EnvironmentError( f"Data environment invalid. Set DATA_ENV to one of {', '.join([e.name for e in DataEnvironment])}" @@ -107,7 +108,7 @@ # Outputs ############################################### -pipeline.set_outputs({"variants": "annotate_gnomad_v4_exome_transcript_consequences"}) +pipeline.set_outputs({"exome_variants": "annotate_gnomad_v4_exome_transcript_consequences"}) ############################################### # Run @@ -117,6 +118,8 @@ run_pipeline(pipeline) logger.info("Validating pipeline IO formats") + + # if data_environment == DataEnvironment.mock: validate_globals_input(pipeline) validate_variant_input(pipeline) validate_step1_output(pipeline) From d26e8286157399066ec5ff08978ae2e6b041c751 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 25 Oct 2023 07:46:11 -0400 Subject: [PATCH 028/106] Add combined exomes/genomes to v4 pipeline --- .../gnomad_v4/gnomad_v4_validation.py | 25 ++-- .../datasets/gnomad_v4/gnomad_v4_variants.py | 132 +++++++++++++++--- .../gnomad_v4/types/initial_variant.py | 13 +- .../gnomad_v4/types/prepare_variants_step1.py | 45 +++++- .../gnomad_v4/types/prepare_variants_step2.py | 4 +- .../gnomad_v4/types/prepare_variants_step3.py | 3 +- .../pipelines/export_to_elasticsearch.py | 12 +- .../pipelines/gnomad_v4_variants.py | 44 +++--- 8 files changed, 210 insertions(+), 68 deletions(-) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py index 494ec9a99..1d1eb37eb 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py @@ -38,8 +38,11 @@ def validate_rows(ht: hl.Table, cls: object): logger.error(transform_error(e)) raise Exception(e) except Exception as e: + logger.info(variant["exome"]) + logger.info(variant["genome"]) logger.error(e) - # raise Exception(e) + logger.error(transform_error(e)) + raise Exception(e) def ht_to_json(ht: hl.Table, field: str = "row"): @@ -59,42 +62,42 @@ def ht_to_json(ht: hl.Table, field: str = "row"): def validate_globals_input(pipeline: Pipeline): - input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] + input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["exome_variants_path"] ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) result = ht_to_json(ht, "globals")[0] # logger.info(result) structure(result, Globals) - logger.info("Validated prepare_gnomad_v4_exome_variants input globals") + logger.info("Validated prepare_gnomad_v4_variants input globals") def validate_variant_input(pipeline: Pipeline): - input_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_inputs()["input_path"] + input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["exome_variants_path"] ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) validate_rows(ht, InitialVariant) - logger.info("Validated prepare_gnomad_v4_exome_variants input variants") + logger.info("Validated prepare_gnomad_v4_variants input variants") def validate_step1_output(pipeline: Pipeline): - output_path = pipeline.get_task("prepare_gnomad_v4_exome_variants").get_output_path() + output_path = pipeline.get_task("prepare_gnomad_v4_variants").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) validate_rows(ht, Step1Variant) - logger.info("Validated prepare_gnomad_v4_exome_variants (step 1) output") + logger.info("Validated prepare_gnomad_v4_variants (step 1) output") def validate_step2_output(pipeline: Pipeline): - output_path = pipeline.get_task("annotate_gnomad_v4_exome_variants").get_output_path() + output_path = pipeline.get_task("annotate_gnomad_v4_variants").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) validate_rows(ht, Step2Variant) - logger.info("Validated annotate_gnomad_v4_exome_variants (step 2) output") + logger.info("Validated annotate_gnomad_v4_variants (step 2) output") def validate_step3_output(pipeline: Pipeline): - output_path = pipeline.get_task("annotate_gnomad_v4_exome_transcript_consequences").get_output_path() + output_path = pipeline.get_task("annotate_gnomad_v4_transcript_consequences").get_output_path() ht = hl.read_table(output_path) ht = ht.sample(0.001, 1337) validate_rows(ht, Step3Variant) - logger.info("Validated annotate_gnomad_v4_exome_transcript_consequences (step 3) output") + logger.info("Validated annotate_gnomad_v4_transcript_consequences (step 3) output") diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py index 101c563fb..acc47d954 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -15,10 +15,12 @@ def freq_index_key(subset=None, pop=None, sex=None, raw=False): return "_".join(parts) -def prepare_gnomad_v4_variants(input_path: str): +def prepare_gnomad_v4_variants_helper(input_path: str, exomes_or_genomes: str): ds = hl.read_table(input_path) g = hl.eval(ds.globals) + ds = ds.select_globals() + subsets = set(m.get("subset", None) for m in g.freq_meta) def freq(ds, *args, **kwargs): @@ -201,7 +203,24 @@ def subset_filter(subset): ), ) - ds = ds.drop("faf") + ds = ds.annotate(gnomad=ds.gnomad.annotate(fafmax=ds.fafmax)) + + ds = ds.drop("faf", "fafmax") + + ############################## + # Join FAF # + ############################## + + ds = ds.annotate( + gnomad=ds.gnomad.annotate( + joint_freq=ds.joint_freq, + joint_grpmax=ds.joint_grpmax, + joint_faf=ds.joint_faf, + joint_fafmax=ds.joint_fafmax, + ), + ) + + ds = ds.drop("joint_freq", "joint_grpmax", "joint_faf", "joint_fafmax") #################### # Age distribution # @@ -252,8 +271,8 @@ def subset_filter(subset): hl.struct(metric=metric, value=hl.float(nullify_nan(ds.info[metric]))) for metric in [ "inbreeding_coeff", - "AS_FS", "AS_MQ", + "AS_FS", "AS_MQRankSum", "AS_pab_max", "AS_QUALapprox", @@ -274,23 +293,24 @@ def subset_filter(subset): # Flags # ######### - ds = ds.annotate( - flags=hl.set( - [ - hl.or_missing(ds.region_flags.lcr, "lcr"), - hl.or_missing(ds.region_flags.segdup, "segdup"), - hl.or_missing(ds.region_flags.fail_interval_qc, "fail_interval_qc"), - hl.or_missing(ds.region_flags.outside_ukb_capture_region, "outside_ukb_capture_region"), - hl.or_missing(ds.region_flags.outside_broad_capture_region, "outside_broad_capture_region"), - hl.or_missing( - ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) - | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), - "par", - ), - hl.or_missing(ds.info.monoallelic, "monoallelic"), - ] - ).filter(hl.is_defined) - ) + flags = [ + hl.or_missing(ds.region_flags.lcr, "lcr"), + hl.or_missing(ds.region_flags.segdup, "segdup"), + hl.or_missing( + ((ds.locus.contig == "chrX") & ds.locus.in_x_par()) | ((ds.locus.contig == "chrY") & ds.locus.in_y_par()), + "par", + ), + hl.or_missing(ds.info.monoallelic, "monoallelic"), + ] + + if exomes_or_genomes == "exomes": + flags = flags + [ + hl.or_missing(ds.region_flags.fail_interval_qc, "fail_interval_qc"), + hl.or_missing(ds.region_flags.outside_ukb_capture_region, "outside_ukb_capture_region"), + hl.or_missing(ds.region_flags.outside_broad_capture_region, "outside_broad_capture_region"), + ] + + ds = ds.annotate(flags=hl.set(flags).filter(hl.is_defined)) ds = ds.drop("region_flags") @@ -299,6 +319,76 @@ def subset_filter(subset): ################ # Drop unused fields - ds = ds.drop("allele_info", "a_index", "info", "was_split") + ds = ds.drop("allele_info", "a_index", "info", "was_split", "grpmax", "vqsr_results") + + ds = ds.transmute(**ds.gnomad) + ds = ds.select(**{exomes_or_genomes: ds.row_value}) + # ds = ds.rename({"gnomad": exomes_or_genomes}) return ds + + +def prepare_gnomad_v4_variants(exome_variants_path: str, genome_variants_path: str): + exome_variants = prepare_gnomad_v4_variants_helper(exome_variants_path, "exome") + genome_variants = prepare_gnomad_v4_variants_helper(genome_variants_path, "genome") + + variants = exome_variants.join(genome_variants, "outer") + + shared_fields = [ + # "lcr", + # "nonpar", + "rsids", + # "segdup", + "vep", + "in_silico_predictors", + "variant_id", + ] + variants = variants.annotate( + **{field: hl.or_else(variants.exome[field], variants.genome[field]) for field in shared_fields} + ) + + variants = variants.annotate(exome=variants.exome.drop(*shared_fields), genome=variants.genome.drop(*shared_fields)) + + # Colocated variants + variants = variants.cache() + variants_by_locus = variants.select( + variants.variant_id, + exome_ac_raw=hl.struct(**{f: variants.exome.freq[f].ac_raw for f in variants.exome.freq.dtype.fields}), + genome_ac_raw=hl.struct( + **{f: variants.genome.freq[f].ac_raw for f in variants.genome.freq.dtype.fields}, + ), + ) + variants_by_locus = variants_by_locus.group_by("locus").aggregate( + variants=hl.agg.collect(variants_by_locus.row_value) + ) + + def subset_filter(subset): + def fn(variant): + return hl.if_else( + subset in list(variant.exome_ac_raw) and (variant.exome_ac_raw[subset] > 0), + True, + subset in list(variant.genome_ac_raw) and (variant.genome_ac_raw[subset] > 0), + ) + + return fn + + variants_by_locus = variants_by_locus.annotate( + variant_ids=hl.struct( + **{ + subset: variants_by_locus.variants.filter(subset_filter(subset)).map(lambda variant: variant.variant_id) + for subset in ["all", "non_ukb", "hgdp", "tgp"] + } + ) + ) + + variants = variants.annotate(colocated_variants=variants_by_locus[variants.locus].variant_ids) + variants = variants.annotate( + colocated_variants=hl.struct( + **{ + subset: variants.colocated_variants[subset].filter(lambda variant_id: variant_id != variants.variant_id) + for subset in ["all", "non_ukb", "hgdp", "tgp"] + } + ) + ) + + return variants diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index a4d31ca0f..3eac5f498 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -1,5 +1,5 @@ import attr -from typing import List, Set, Union +from typing import List, Set, Union, Optional @attr.define @@ -40,9 +40,14 @@ class Faf: @attr.define class FafMax: faf95_max: Union[float, None] - faf95_max_gen_anc: str + faf95_max_gen_anc: Union[str, None] faf99_max: Union[float, None] - faf99_max_gen_anc: str + faf99_max_gen_anc: Union[str, None] + + +@attr.define +class JointFafMax(FafMax): + joint_fafmax_data_type: Optional[str] @attr.define @@ -247,7 +252,7 @@ class InitialVariant: joint_freq: Union[List[Frequency], None] joint_grpmax: Union[Grpmax, None] joint_faf: Union[List[Union[Faf, None]], None] - joint_fafmax: Union[FafMax, None] + joint_fafmax: Union[JointFafMax, None] a_index: int was_split: bool rsid: Union[Set[str], None] diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py index c94da3442..ed9392478 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py @@ -3,11 +3,17 @@ from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( + Faf, + FafMax, + FafMaxBySubset, + Grpmax, GrpmaxBySubset, InSilicoPredictors, + JointFafMax, Vep, Locus, ) +from pandas.core.frame import Frequency @attr.define @@ -99,20 +105,46 @@ class AgeDistributions: hom: BinDetails +@attr.define +class ColocatedVariantsExome: + all: List[str] + non_ukb: Union[List[str], None] + + +@attr.define +class ColocatedVariantsGenome: + all: List[str] + hgdp: Union[List[str], None] + tgp: Union[List[str], None] + + +@attr.define +class ColocatedVariants: + all: List[str] + non_ukb: Union[List[str], None] + hgdp: Union[List[str], None] + tgp: Union[List[str], None] + + @attr.define class Gnomad: freq: FreqBySubset faf95: FAF faf99: FAF + + fafmax: FafMaxBySubset + joint_freq: Union[List[Frequency], None] + joint_grpmax: Union[Grpmax, None] + joint_faf: Union[List[Union[Faf, None]], None] + joint_fafmax: Union[JointFafMax, None] + age_distribution: AgeDistributions filters: set[str] quality_metrics: QualityMetrics - -@attr.define -class ColocatedVariants: - all: List[str] - non_ukb: List[str] + flags: set[str] + subsets: set[str] + colocated_variants: Union[ColocatedVariantsExome, ColocatedVariantsGenome] @attr.define @@ -125,6 +157,7 @@ class Variant: in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants - gnomad: Gnomad + exome: Gnomad + genome: Gnomad subsets: set[str] flags: set[str] diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py index 3b4ea94ec..70085f77c 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step2.py @@ -1,6 +1,6 @@ from typing import Union import attr -from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as InputVariant +from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import Variant as Step1Variant @attr.define @@ -25,6 +25,6 @@ class Coverage: @attr.define -class Variant(InputVariant): +class Variant(Step1Variant): coverage: Coverage # caids go here too diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py index c86e292d9..f09d67e4c 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py @@ -48,7 +48,8 @@ class Variant: in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants - gnomad: Gnomad + exome: Gnomad + genome: Gnomad subsets: set[str] flags: set[str] transcript_consequences: Union[List[TranscriptConsequence], None] diff --git a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py index 758f7135e..623e135ed 100644 --- a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py +++ b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py @@ -118,11 +118,9 @@ def add_liftover_document_id(ds): ############################################################################################################## # gnomAD v4 ############################################################################################################## - "gnomad_v4_exome_variants": { + "gnomad_v4_variants": { "get_table": lambda: subset_table( - add_variant_document_id( - hl.read_table(gnomad_v4_variants_pipeline.get_output("exome_variants").get_output_path()) - ) + add_variant_document_id(hl.read_table(gnomad_v4_variants_pipeline.get_output("variants").get_output_path())) ), "args": { "index": "gnomad_v4_variants", @@ -146,6 +144,12 @@ def add_liftover_document_id(ds): ), "args": {"index": "gnomad_v4_exome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, }, + "gnomad_v4_genome_coverage": { + "get_table": lambda: subset_table( + hl.read_table(gnomad_v4_coverage_pipeline.get_output("genome_coverage").get_output_path()) + ), + "args": {"index": "gnomad_v4_genome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, + }, ############################################################################################################## # gnomAD v4 CNVs ############################################################################################################## diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 6004610d3..c137ded10 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,4 +1,5 @@ import os +from datetime import datetime from loguru import logger @@ -26,6 +27,17 @@ pipeline_name = "gnomad_v4_variants" + +def generate_iso_timestamp_for_filename(): + now = datetime.utcnow() + timestamp = now.strftime("%Y%m%dT%H%M%S%Z") + return timestamp + + +output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" +output_sub_dir = "gnomad_v4_20231023T173158" + + data_environment = get_data_environment(DATA_ENV) if data_environment == DataEnvironment.mock: @@ -64,28 +76,22 @@ pipeline = Pipeline(config=config) pipeline.add_task( - name="prepare_gnomad_v4_exome_variants", + name="prepare_gnomad_v4_variants", task_function=prepare_gnomad_v4_variants, - output_path="gnomad_v4/gnomad_v4_exome_variants_base.ht", - inputs={"input_path": "variants/gnomad.exomes.sites.test.updated_101623.ht"}, + output_path=f"{output_sub_dir}/gnomad_v4_variants_base.ht", + inputs={ + "exome_variants_path": "variants/gnomad.exomes.sites.test.updated_101623.ht", + "genome_variants_path": "variants/gnomad.genomes.sites.test.updated_101923.ht", + }, ) -# pipeline.add_task( -# name="prepare_gnomad_v4_genome_variants", -# task_function=prepare_gnomad_v4_variants, -# output_path="/gnomad_v4/gnomad_v4_genome_variants_base.ht", -# inputs={ -# "input_path": "external_datasets/mock_v4_release.ht", -# }, -# ) - pipeline.add_task( - name="annotate_gnomad_v4_exome_variants", + name="annotate_gnomad_v4_variants", task_function=annotate_variants, - output_path="gnomad_v4/gnomad_v4_exome_variants_annotated_1.ht", + output_path=f"{output_sub_dir}/gnomad_v4_variants_annotated_1.ht", inputs=( { - "variants_path": pipeline.get_task("prepare_gnomad_v4_exome_variants"), + "variants_path": pipeline.get_task("prepare_gnomad_v4_variants"), "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", @@ -94,11 +100,11 @@ ) pipeline.add_task( - name="annotate_gnomad_v4_exome_transcript_consequences", + name="annotate_gnomad_v4_transcript_consequences", task_function=annotate_transcript_consequences, - output_path="gnomad_v4/gnomad_v4_variants_annotated_2.ht", + output_path=f"{output_sub_dir}/gnomad_v4_variants_annotated_2.ht", inputs={ - "variants_path": pipeline.get_task("annotate_gnomad_v4_exome_variants"), + "variants_path": pipeline.get_task("annotate_gnomad_v4_variants"), "transcripts_path": genes_pipeline.get_output("base_transcripts_grch38"), "mane_transcripts_path": genes_pipeline.get_output("mane_select_transcripts"), }, @@ -108,7 +114,7 @@ # Outputs ############################################### -pipeline.set_outputs({"exome_variants": "annotate_gnomad_v4_exome_transcript_consequences"}) +pipeline.set_outputs({"variants": "annotate_gnomad_v4_transcript_consequences"}) ############################################### # Run From 128a5b04c8024806ce5f3da165e1001efeaf53d6 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 25 Oct 2023 07:56:04 -0400 Subject: [PATCH 029/106] Add v4 elasticsearch queries --- dataset-metadata/metadata.ts | 2 +- graphql-api/src/queries/coverage-queries.ts | 188 +++---- .../src/queries/helpers/validation-helpers.ts | 2 +- .../gnomad-v4-variant-queries.ts | 486 ++++++++++++++++++ graphql-api/src/queries/variant-queries.ts | 15 + 5 files changed, 598 insertions(+), 95 deletions(-) create mode 100644 graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 456de5340..4e0202c67 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -17,8 +17,8 @@ export const datasetLabels = { gnomad_sv_r2_1_controls: 'gnomAD SVs v2.1 (controls)', gnomad_sv_r2_1_non_neuro: 'gnomAD SVs v2.1 (non-neuro)', gnomad_sv_r4: 'gnomAD SVs v4', - gnomad_r4: '', //* TODO gnomad_cnv_r4: "gnomAD CNVs v4.0", + gnomad_r4: 'gnomAD v4.0.0', } as const export type DatasetId = keyof typeof datasetLabels diff --git a/graphql-api/src/queries/coverage-queries.ts b/graphql-api/src/queries/coverage-queries.ts index 6e3ed9dba..fa0dc0e9f 100644 --- a/graphql-api/src/queries/coverage-queries.ts +++ b/graphql-api/src/queries/coverage-queries.ts @@ -6,11 +6,11 @@ import { extendRegions, mergeOverlappingRegions, totalRegionSize } from './helpe import { assertDatasetAndReferenceGenomeMatch } from './helpers/validation-helpers' const COVERAGE_INDICES = { - gnomad_cnv_r4: { + gnomad_r4: { exome: 'gnomad_v4_exome_coverage', - genome: null, + genome: 'gnomad_v4_genome_coverage', }, - gnomad_r4: { + gnomad_cnv_r4: { exome: 'gnomad_v4_exome_coverage', genome: null, }, @@ -33,70 +33,72 @@ const COVERAGE_INDICES = { // ================================================================================================ const fetchCoverage = async (esClient: any, { index, contig, regions, bucketSize }: any) => { - const response = await esClient.search({ - index, - type: '_doc', - size: 0, - body: { - query: { - bool: { - filter: [ - { term: { 'locus.contig': contig } }, - { - bool: { - should: regions.map(({ start, stop }: any) => ({ - range: { 'locus.position': { gte: start, lte: stop } }, - })), + try { + const response = await esClient.search({ + index, + type: '_doc', + size: 0, + body: { + query: { + bool: { + filter: [ + { term: { 'locus.contig': contig } }, + { + bool: { + should: regions.map(({ start, stop }: any) => ({ + range: { 'locus.position': { gte: start, lte: stop } }, + })), + }, }, - }, - ], - }, - }, - aggregations: { - coverage: { - histogram: { - field: 'locus.position', - interval: bucketSize, + ], }, - aggregations: { - mean: { avg: { field: 'mean' } }, - median: { avg: { field: 'median' } }, - over_1: { avg: { field: 'over_1' } }, - over_5: { avg: { field: 'over_5' } }, - over_10: { avg: { field: 'over_10' } }, - over_15: { avg: { field: 'over_15' } }, - over_20: { avg: { field: 'over_20' } }, - over_25: { avg: { field: 'over_25' } }, - over_30: { avg: { field: 'over_30' } }, - over_50: { avg: { field: 'over_50' } }, - over_100: { avg: { field: 'over_100' } }, + }, + aggregations: { + coverage: { + histogram: { + field: 'locus.position', + interval: bucketSize, + }, + aggregations: { + mean: { avg: { field: 'mean' } }, + median: { avg: { field: 'median' } }, + over_1: { avg: { field: 'over_1' } }, + over_5: { avg: { field: 'over_5' } }, + over_10: { avg: { field: 'over_10' } }, + over_15: { avg: { field: 'over_15' } }, + over_20: { avg: { field: 'over_20' } }, + over_25: { avg: { field: 'over_25' } }, + over_30: { avg: { field: 'over_30' } }, + over_50: { avg: { field: 'over_50' } }, + over_100: { avg: { field: 'over_100' } }, + }, }, }, }, - }, - }) - - - return response.body.aggregations.coverage.buckets.map((bucket: any) => ({ - pos: bucket.key, - mean: bucket.mean.value || 0, - median: bucket.median.value || 0, - - over_x: [ - // Round values - Math.ceil((bucket.over_1.value || 0) * 100) / 100, - Math.ceil((bucket.over_5.value || 0) * 100) / 100, - Math.ceil((bucket.over_10.value || 0) * 100) / 100, - Math.ceil((bucket.over_15.value || 0) * 100) / 100, - Math.ceil((bucket.over_20.value || 0) * 100) / 100, - Math.ceil((bucket.over_25.value || 0) * 100) / 100, - Math.ceil((bucket.over_30.value || 0) * 100) / 100, - Math.ceil((bucket.over_50.value || 0) * 100) / 100, - Math.ceil((bucket.over_100.value || 0) * 100) / 100, - ], - })) + }) + + return response.body.aggregations.coverage.buckets.map((bucket: any) => ({ + pos: bucket.key, + mean: bucket.mean.value || 0, + median: bucket.median.value || 0, + + over_x: [ + Math.ceil((bucket.over_1.value || 0) * 100) / 100, + Math.ceil((bucket.over_5.value || 0) * 100) / 100, + Math.ceil((bucket.over_10.value || 0) * 100) / 100, + Math.ceil((bucket.over_15.value || 0) * 100) / 100, + Math.ceil((bucket.over_20.value || 0) * 100) / 100, + Math.ceil((bucket.over_25.value || 0) * 100) / 100, + Math.ceil((bucket.over_30.value || 0) * 100) / 100, + Math.ceil((bucket.over_50.value || 0) * 100) / 100, + Math.ceil((bucket.over_100.value || 0) * 100) / 100, + ], + })) + } catch (error) { + console.error("Error fetching coverage:", error); + throw error; // Re-throwing the error to be handled by the caller or higher up in the call stack + } } - // ================================================================================================ // Region queries // ================================================================================================ @@ -116,11 +118,11 @@ export const fetchExomeCoverageForRegion = (esClient: any, datasetId: any, regio return exomeCoverageIndex ? fetchCoverage(esClient, { - index: exomeCoverageIndex, - contig: region.reference_genome === 'GRCh38' ? `chr${region.chrom}` : region.chrom, - regions: [{ start: region.start - 75, stop: region.stop + 75 }], - bucketSize, - }) + index: exomeCoverageIndex, + contig: region.reference_genome === 'GRCh38' ? `chr${region.chrom}` : region.chrom, + regions: [{ start: region.start - 75, stop: region.stop + 75 }], + bucketSize, + }) : [] } @@ -139,11 +141,11 @@ export const fetchGenomeCoverageForRegion = (esClient: any, datasetId: any, regi return genomeCoverageIndex ? fetchCoverage(esClient, { - index: genomeCoverageIndex, - contig: region.reference_genome === 'GRCh38' ? `chr${region.chrom}` : region.chrom, - regions: [{ start: region.start - 75, stop: region.stop + 75 }], - bucketSize, - }) + index: genomeCoverageIndex, + contig: region.reference_genome === 'GRCh38' ? `chr${region.chrom}` : region.chrom, + regions: [{ start: region.start - 75, stop: region.stop + 75 }], + bucketSize, + }) : [] } @@ -172,20 +174,20 @@ export const _fetchCoverageForGene = async (esClient: any, datasetId: any, gene: const exomeCoverage = exomeCoverageIndex ? await fetchCoverage(esClient, { - index: exomeCoverageIndex, - contig: gene.reference_genome === 'GRCh38' ? `chr${gene.chrom}` : gene.chrom, - regions: mergedExons, - bucketSize, - }) + index: exomeCoverageIndex, + contig: gene.reference_genome === 'GRCh38' ? `chr${gene.chrom}` : gene.chrom, + regions: mergedExons, + bucketSize, + }) : [] const genomeCoverage = genomeCoverageIndex ? await fetchCoverage(esClient, { - index: genomeCoverageIndex, - contig: gene.reference_genome === 'GRCh38' ? `chr${gene.chrom}` : gene.chrom, - regions: mergedExons, - bucketSize, - }) + index: genomeCoverageIndex, + contig: gene.reference_genome === 'GRCh38' ? `chr${gene.chrom}` : gene.chrom, + regions: mergedExons, + bucketSize, + }) : [] return { @@ -224,22 +226,22 @@ const _fetchCoverageForTranscript = async (esClient: any, datasetId: any, transc const exomeCoverage = exomeCoverageIndex ? await fetchCoverage(esClient, { - index: exomeCoverageIndex, - contig: - transcript.reference_genome === 'GRCh38' ? `chr${transcript.chrom}` : transcript.chrom, - regions: mergedExons, - bucketSize, - }) + index: exomeCoverageIndex, + contig: + transcript.reference_genome === 'GRCh38' ? `chr${transcript.chrom}` : transcript.chrom, + regions: mergedExons, + bucketSize, + }) : [] const genomeCoverage = genomeCoverageIndex ? await fetchCoverage(esClient, { - index: genomeCoverageIndex, - contig: - transcript.reference_genome === 'GRCh38' ? `chr${transcript.chrom}` : transcript.chrom, - regions: mergedExons, - bucketSize, - }) + index: genomeCoverageIndex, + contig: + transcript.reference_genome === 'GRCh38' ? `chr${transcript.chrom}` : transcript.chrom, + regions: mergedExons, + bucketSize, + }) : [] return { diff --git a/graphql-api/src/queries/helpers/validation-helpers.ts b/graphql-api/src/queries/helpers/validation-helpers.ts index 9a5ac7dbf..915b8d227 100644 --- a/graphql-api/src/queries/helpers/validation-helpers.ts +++ b/graphql-api/src/queries/helpers/validation-helpers.ts @@ -7,7 +7,7 @@ export const assertDatasetAndReferenceGenomeMatch = (datasetId: any, referenceGe `Dataset with id ${datasetId} does not exist` ) } - + if (DATASET_REFERENCE_GENOMES[datasetId] !== referenceGenome) { throw new UserVisibleError( // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message diff --git a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts new file mode 100644 index 000000000..e9706397b --- /dev/null +++ b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts @@ -0,0 +1,486 @@ +import { omit } from 'lodash' + +import { isRsId } from '@gnomad/identifiers' + +import { UserVisibleError } from '../../errors' + +import { fetchLocalAncestryPopulationsByVariant } from '../local-ancestry-queries' +import { fetchAllSearchResults } from '../helpers/elasticsearch-helpers' +import { mergeOverlappingRegions } from '../helpers/region-helpers' + +import { getFlagsForContext } from './shared/flags' +import { getConsequenceForContext } from './shared/transcriptConsequence' + +const GNOMAD_V4_VARIANT_INDEX = 'gnomad_v4_variants' + +// ================================================================================================ +// Count query +// ================================================================================================ + +// eslint-disable-next-line no-unused-vars +const countVariantsInRegion = async (esClient: any, region: any, _subset: any) => { + const response = await esClient.count({ + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + body: { + query: { + bool: { + filter: [ + { term: { 'locus.contig': region.chrom } }, + { + range: { + 'locus.position': { + gte: region.start, + lte: region.stop, + }, + }, + }, + ], + }, + }, + }, + }) + + return response.body.count +} + +// ================================================================================================ +// Variant query +// ================================================================================================ + +const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any) => { + const idField = isRsId(variantIdOrRsid) ? 'rsids' : 'variant_id' + const response = await esClient.search({ + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + body: { + query: { + bool: { + filter: { term: { [idField]: variantIdOrRsid } }, + }, + }, + }, + size: 1, + }) + + if (response.body.hits.total.value === 0) { + throw new UserVisibleError('Variant not found') + } + + // An rsID may match multiple variants + if (response.body.hits.total.value > 1) { + throw new UserVisibleError('Multiple variants found, query using variant ID to select one.') + } + + const variant = response.body.hits.hits[0]._source.value + + if (!(variant.genome.freq[subset] || {}).ac_raw) { + throw new UserVisibleError('Variant not found in selected subset.') + } + + const filters = variant.genome.filters || [] + + if (variant.genome.freq[subset].ac === 0 && !filters.includes('AC0')) { + filters.push('AC0') + } + + const flags = getFlagsForContext({ type: 'region' })(variant) + + let { ancestry_groups } = variant.genome.freq[subset] + + // Include HGDP and 1KG populations with gnomAD subsets + if (variant.genome.freq.hgdp.ac_raw > 0) { + ancestry_groups = ancestry_groups.concat( + variant.genome.freq.hgdp.ancestry_groups.map((pop: any) => ({ + ...pop, + id: `hgdp:${pop.id}`, + })) + ) + } + // Some 1KG samples are included in v2. Since the 1KG population frequencies are based on the full v3.1 dataset, + // they are invalid for the non-v2 subset. + if (variant.genome.freq.tgp.ac_raw > 0 && subset !== 'non_v2') { + ancestry_groups = ancestry_groups.concat( + variant.genome.freq.tgp.ancestry_groups.map((pop: any) => ({ + ...pop, + id: `1kg:${pop.id}`, + })) + ) + } + + const inSilicoPredictorsList = [] + const inSilicoPredictors = variant.in_silico_predictors + if (inSilicoPredictors.revel.revel_score != null) { + inSilicoPredictorsList.push({ + id: 'revel', + value: inSilicoPredictors.revel.revel_score.toPrecision(3), + flags: inSilicoPredictors.revel.has_duplicate ? ['has_duplicate'] : [], + }) + } + if (inSilicoPredictors.cadd.phred != null) { + inSilicoPredictorsList.push({ + id: 'cadd', + value: inSilicoPredictors.cadd.phred.toPrecision(3), + flags: inSilicoPredictors.cadd.has_duplicate ? ['has_duplicate'] : [], + }) + } + if (inSilicoPredictors.splice_ai.splice_ai_score != null) { + inSilicoPredictorsList.push({ + id: 'splice_ai', + value: `${inSilicoPredictors.splice_ai.splice_ai_score.toPrecision(3)} (${inSilicoPredictors.splice_ai.splice_consequence + })`, + flags: inSilicoPredictors.splice_ai.has_duplicate ? ['has_duplicate'] : [], + }) + } + if (inSilicoPredictors.primate_ai.primate_ai_score != null) { + inSilicoPredictorsList.push({ + id: 'primate_ai', + value: inSilicoPredictors.primate_ai.primate_ai_score.toPrecision(3), + flags: inSilicoPredictors.primate_ai.has_duplicate ? ['has_duplicate'] : [], + }) + } + + const localAncestryPopulations = + subset === 'all' + ? await fetchLocalAncestryPopulationsByVariant(esClient, 'gnomad_r3', variant.variant_id) + : { genome: null } + + return { + ...variant, + reference_genome: 'GRCh38', + chrom: variant.locus.contig.slice(3), // remove "chr" prefix + pos: variant.locus.position, + ref: variant.alleles[0], + alt: variant.alleles[1], + colocated_variants: variant.colocated_variants[subset] || [], + exome: null, + genome: { + ...variant.genome, + ...variant.genome.freq[subset], + filters, + populations: ancestry_groups, + quality_metrics: { + // TODO: An older version of the data pipeline stored only adj quality metric histograms. + // Maintain the same behavior by returning the adj version until the API schema is updated to allow + // selecting which version to return. + allele_balance: { + alt: variant.genome.quality_metrics.allele_balance.alt_adj, + }, + genotype_depth: { + alt: variant.genome.quality_metrics.genotype_depth.alt_adj, + all: variant.genome.quality_metrics.genotype_depth.all_adj, + }, + genotype_quality: { + alt: variant.genome.quality_metrics.genotype_quality.alt_adj, + all: variant.genome.quality_metrics.genotype_quality.all_adj, + }, + site_quality_metrics: variant.genome.quality_metrics.site_quality_metrics.filter((m: any) => + Number.isFinite(m.value) + ), + }, + local_ancestry_populations: localAncestryPopulations.genome, + }, + flags, + // TODO: Include RefSeq transcripts once the browser supports them. + transcript_consequences: (variant.transcript_consequences || []).filter((csq: any) => + csq.gene_id.startsWith('ENSG') + ), + in_silico_predictors: inSilicoPredictorsList, + } +} + +// ================================================================================================ +// Shape variant summary +// ================================================================================================ + +const shapeVariantSummary = (subset: any, context: any) => { + const getConsequence = getConsequenceForContext(context) + const getFlags = getFlagsForContext(context) + + return (variant: any) => { + const transcriptConsequence = getConsequence(variant) || {} + const flags = getFlags(variant) + + const filters = variant.genome.filters || [] + + if (variant.genome.freq[subset].ac === 0 && !filters.includes('AC0')) { + filters.push('AC0') + } + + return { + ...omit(variant, 'transcript_consequences', 'locus', 'alleles'), // Omit full transcript consequences list to avoid caching it + reference_genome: 'GRCh38', + chrom: variant.locus.contig.slice(3), // Remove "chr" prefix + pos: variant.locus.position, + ref: variant.alleles[0], + alt: variant.alleles[1], + exome: null, + genome: { + ...omit(variant.genome, 'freq'), // Omit freq field to avoid caching extra copy of frequency information + ...variant.genome.freq[subset], + populations: variant.genome.freq[subset].ancestry_groups.filter( + (pop: any) => !(pop.id.includes('_') || pop.id === 'XX' || pop.id === 'XY') + ), + filters, + }, + flags, + transcript_consequence: transcriptConsequence, + } + } +} + +// ================================================================================================ +// Gene query +// ================================================================================================ + +const fetchVariantsByGene = async (esClient: any, gene: any, subset: any) => { + + subset = "all" + + let exomeSubset = "all" + let genomeSubset = "all" + + if (subset === "tgp" || subset === "hgdp") { + genomeSubset = subset + } + if (subset === "non_ukb") { + exomeSubset = "non_ukb" + } + + try { + const filteredRegions = gene.exons.filter((exon: any) => exon.feature_type === 'CDS') + const sortedRegions = filteredRegions.sort((r1: any, r2: any) => r1.xstart - r2.xstart) + const padding = 75 + const paddedRegions = sortedRegions.map((r: any) => ({ + ...r, + start: r.start - padding, + stop: r.stop + padding, + xstart: r.xstart - padding, + xstop: r.xstop + padding, + })) + + const mergedRegions = mergeOverlappingRegions(paddedRegions) + + const rangeQueries = mergedRegions.map((region: any) => ({ + range: { + 'locus.position': { + gte: region.start, + lte: region.stop, + }, + }, + })) + + const hits = await fetchAllSearchResults(esClient, { + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + size: 10000, + _source: [ + `value.exome.freq.${exomeSubset}`, + `value.genome.freq.${genomeSubset}`, + 'value.exome.filters', + 'value.genome.filters', + 'value.alleles', + // 'value.caid', + 'value.locus', + 'value.flags', + 'value.rsids', + 'value.transcript_consequences', + 'value.variant_id', + ], + body: { + query: { + bool: { + filter: [{ term: { gene_id: gene.gene_id } }, { bool: { should: rangeQueries } }], + }, + }, + sort: [{ 'locus.position': { order: 'asc' } }], + }, + }) + + // console.log(hits) + // console.log(hits.map((hit: any) => hit._source.value)) + + return hits + .map((hit: any) => hit._source.value) + .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0) + .map(shapeVariantSummary(subset, { type: 'gene', geneId: gene.gene_id })) + } catch (error) { + console.error("Error fetching variants by gene:", error); + throw error; // You can re-throw the error if needed or handle it accordingly. + } +} + +// ================================================================================================ +// Region query +// ================================================================================================ + +const fetchVariantsByRegion = async (esClient: any, region: any, subset: any) => { + + let exomeSubset = "all" + let genomeSubset = "all" + + if (subset === "tgp" || subset === "hgdp") { + genomeSubset = subset + } + if (subset === "non_ukb") { + exomeSubset = "non_ukb" + } + + const hits = await fetchAllSearchResults(esClient, { + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + size: 10000, + _source: [ + `value.exome.freq.${exomeSubset}`, + `value.genome.freq.${genomeSubset}`, + 'value.exome.filters', + 'value.genome.filters', + 'value.alleles', + 'value.caid', + 'value.locus', + 'value.flags', + 'value.rsids', + 'value.transcript_consequences', + 'value.variant_id', + ], + body: { + query: { + bool: { + filter: [ + { term: { 'locus.contig': `chr${region.chrom}` } }, + { + range: { + 'locus.position': { + gte: region.start, + lte: region.stop, + }, + }, + }, + ], + }, + }, + sort: [{ 'locus.position': { order: 'asc' } }], + }, + }) + + return hits + .map((hit: any) => hit._source.value) + .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0) + .map(shapeVariantSummary(subset, { type: 'region' })) +} + +// ================================================================================================ +// Transcript query +// ================================================================================================ + +const fetchVariantsByTranscript = async (esClient: any, transcript: any, subset: any) => { + const filteredRegions = transcript.exons.filter((exon: any) => exon.feature_type === 'CDS') + const sortedRegions = filteredRegions.sort((r1: any, r2: any) => r1.xstart - r2.xstart) + const padding = 75 + const paddedRegions = sortedRegions.map((r: any) => ({ + ...r, + start: r.start - padding, + stop: r.stop + padding, + xstart: r.xstart - padding, + xstop: r.xstop + padding, + })) + + const mergedRegions = mergeOverlappingRegions(paddedRegions) + + const rangeQueries = mergedRegions.map((region: any) => ({ + range: { + 'locus.position': { + gte: region.start, + lte: region.stop, + }, + }, + })) + + const hits = await fetchAllSearchResults(esClient, { + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + size: 10000, + _source: [ + `value.genome.freq.${subset}`, + 'value.genome.filters', + 'value.alleles', + 'value.caid', + 'value.locus', + 'value.flags', + 'value.rsids', + 'value.transcript_consequences', + 'value.variant_id', + ], + body: { + query: { + bool: { + filter: [ + { term: { transcript_id: transcript.transcript_id } }, + { bool: { should: rangeQueries } }, + ], + }, + }, + sort: [{ 'locus.position': { order: 'asc' } }], + }, + }) + + return hits + .map((hit: any) => hit._source.value) + .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0) + .map( + shapeVariantSummary(subset, { type: 'transcript', transcriptId: transcript.transcript_id }) + ) +} + +// ================================================================================================ +// Search +// ================================================================================================ + +const fetchMatchingVariants = async ( + esClient: any, + { caid = null, rsid = null, variantId = null }, + subset: any +) => { + let query + if (caid) { + query = { term: { caid } } + } else if (rsid) { + query = { term: { rsids: rsid } } + } else if (variantId) { + query = { term: { variant_id: variantId } } + } else { + throw new UserVisibleError('Unsupported search') + } + + const hits = await fetchAllSearchResults(esClient, { + index: GNOMAD_V4_VARIANT_INDEX, + type: '_doc', + size: 100, + _source: [`value.genome.freq.${subset}`, 'value.variant_id'], + body: { + query: { + bool: { + filter: query, + }, + }, + }, + }) + + return hits + .map((hit: any) => hit._source.value) + .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0) + .map((variant: any) => ({ + variant_id: variant.variant_id, + })) +} + +const gnomadV3VariantQueries = { + countVariantsInRegion, + fetchVariantById, + fetchVariantsByGene, + fetchVariantsByRegion, + fetchVariantsByTranscript, + fetchMatchingVariants, +} + +export default gnomadV3VariantQueries diff --git a/graphql-api/src/queries/variant-queries.ts b/graphql-api/src/queries/variant-queries.ts index 188fac093..997a9d10e 100644 --- a/graphql-api/src/queries/variant-queries.ts +++ b/graphql-api/src/queries/variant-queries.ts @@ -1,6 +1,7 @@ import { withCache } from '../cache' import { assertDatasetAndReferenceGenomeMatch } from './helpers/validation-helpers' +import gnomadV4VariantQueries from './variant-datasets/gnomad-v4-variant-queries' import gnomadV3VariantQueries from './variant-datasets/gnomad-v3-variant-queries' import gnomadV2VariantQueries from './variant-datasets/gnomad-v2-variant-queries' import exacVariantQueries from './variant-datasets/exac-variant-queries' @@ -8,6 +9,20 @@ import exacVariantQueries from './variant-datasets/exac-variant-queries' type QueryArgs = [any, any] const datasetQueries: Record = { + gnomad_r4: { + countVariantsInRegion: (...args: QueryArgs) => + gnomadV4VariantQueries.countVariantsInRegion(...args, 'all'), + fetchVariantById: (...args: QueryArgs) => + gnomadV4VariantQueries.fetchVariantById(...args, 'all'), + fetchVariantsByGene: (...args: QueryArgs) => + gnomadV4VariantQueries.fetchVariantsByGene(...args, 'all'), + fetchVariantsByRegion: (...args: QueryArgs) => + gnomadV4VariantQueries.fetchVariantsByRegion(...args, 'all'), + fetchVariantsByTranscript: (...args: QueryArgs) => + gnomadV4VariantQueries.fetchVariantsByTranscript(...args, 'all'), + fetchMatchingVariants: (...args: QueryArgs) => + gnomadV4VariantQueries.fetchMatchingVariants(...args, 'all'), + }, gnomad_r3: { countVariantsInRegion: (...args: QueryArgs) => gnomadV3VariantQueries.countVariantsInRegion(...args, 'all'), From fa5efdf65004ea0cad59b297c1f6ef396ff0c6de Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 27 Oct 2023 13:41:39 -0400 Subject: [PATCH 030/106] Update v4 short variant pipeline --- ...omad_v4_variants_annotated_2.ht.schema.min | 226 -------- .../mane_select_transcripts.ht.schema | 0 .../gnomad_v4_variants_annotated_2.ht.schema | 351 +++++++----- .../transcripts_grch38_base.ht.schema | 0 .../gnomad_v4_variants_annotated_1.ht.schema} | 522 ++++++++++-------- .../gnomad_v4_exome_coverage.ht.schema | 0 .../gnomad_v4_genome_coverage.ht.schema | 0 .../gnomad_v4_variants_annotated_1.ht.schema} | 522 ++++++++++-------- .../gnomad_v4_variants_base.ht.schema} | 522 ++++++++++-------- .../gnomad.exomes.v4.0.sites.pcsk9.ht.schema} | 11 +- ...gnomad.genomes.v4.0.sites.pcsk9.ht.schema} | 200 +++---- .../output/gnomad_v4_variants_base.ht.schema} | 522 ++++++++++-------- .../gnomad_v4/gnomad_v4_validation.py | 29 +- .../datasets/gnomad_v4/gnomad_v4_variants.py | 29 +- .../gnomad_v4/types/initial_globals.py | 5 +- .../gnomad_v4/types/initial_variant.py | 58 +- .../gnomad_v4/types/prepare_variants_step1.py | 42 +- .../gnomad_v4/types/prepare_variants_step3.py | 10 +- .../data_pipeline/helpers/write_schemas.py | 75 +-- .../src/data_pipeline/pipelines/genes.py | 9 +- .../pipelines/gnomad_v4_variants.py | 83 ++- 21 files changed, 1657 insertions(+), 1559 deletions(-) delete mode 100644 data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_transcript_consequences => annotate_gnomad_v4_transcript_consequences}/mane_transcripts_path/mane_select_transcripts.ht.schema (100%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_transcript_consequences => annotate_gnomad_v4_transcript_consequences}/output/gnomad_v4_variants_annotated_2.ht.schema (53%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_transcript_consequences => annotate_gnomad_v4_transcript_consequences}/transcripts_path/transcripts_grch38_base.ht.schema (100%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema => annotate_gnomad_v4_transcript_consequences/variants_path/gnomad_v4_variants_annotated_1.ht.schema} (59%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_variants => annotate_gnomad_v4_variants}/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema (100%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_variants => annotate_gnomad_v4_variants}/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema (100%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema => annotate_gnomad_v4_variants/output/gnomad_v4_variants_annotated_1.ht.schema} (59%) rename data-pipeline/schemas/gnomad_v4_variants/{prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema => annotate_gnomad_v4_variants/variants_path/gnomad_v4_variants_base.ht.schema} (57%) rename data-pipeline/schemas/gnomad_v4_variants/{prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema => prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema} (98%) rename data-pipeline/schemas/gnomad_v4_variants/{prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema => prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema} (76%) rename data-pipeline/schemas/gnomad_v4_variants/{annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema => prepare_gnomad_v4_variants/output/gnomad_v4_variants_base.ht.schema} (57%) diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min deleted file mode 100644 index 2c5eb8661..000000000 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema.min +++ /dev/null @@ -1,226 +0,0 @@ -Row fields: - 'locus': locus - 'alleles': array - 'grpmax': array - 'rsids': set - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool - }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool - }, - pangolin: struct { - pangolin_score: float64 - } - } - 'variant_id': str - 'colocated_variants': struct { - all: array, - non_ukb: array - } - 'gnomad': struct { - freq: struct { - all: struct { - ac: int32, - ac_raw: int32, - an: int32, - hemizygote_count: int32, - homozygote_count: int32, - populations: array - }, - non_ukb: struct { - ac: int32, - ac_raw: int32, - an: int32, - hemizygote_count: int32, - homozygote_count: int32, - populations: array - } - }, - faf95: struct { - popmax: float64, - popmax_population: str - }, - faf99: struct { - popmax: float64, - popmax_population: str - }, - age_distribution: struct { - het: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }>, - hom: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }> - }, - filters: set, - quality_metrics: struct { - allele_balance: struct { - alt_adj: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - alt_raw: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - } - }, - genotype_depth: struct { - all_adj: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - all_raw: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - alt_adj: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - alt_raw: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - } - }, - genotype_quality: struct { - all_adj: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - all_raw: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - alt_adj: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - }, - alt_raw: struct { - bin_edges: array, - bin_freq: array, - n_smaller: int64, - n_larger: int64 - } - }, - site_quality_metrics: array - } - } - 'subsets': set - 'flags': set - 'coverage': struct { - exome: struct { - mean: float64, - median: int32, - over_1: float32, - over_5: float32, - over_10: float32, - over_15: float32, - over_20: float32, - over_25: float32, - over_30: float32, - over_50: float32, - over_100: float32 - }, - genome: struct { - mean: float64, - median: int32, - over_1: float32, - over_5: float32, - over_10: float32, - over_15: float32, - over_20: float32, - over_25: float32, - over_30: float32, - over_50: float32, - over_100: float32 - } - } - 'transcript_consequences': array, - domains: set, - gene_id: str, - gene_symbol: str, - hgvsc: str, - hgvsp: str, - is_canonical: bool, - lof_filter: str, - lof_flags: str, - lof: str, - major_consequence: str, - polyphen_prediction: str, - sift_prediction: str, - transcript_id: str, - transcript_version: str, - gene_version: str, - is_mane_select: bool, - is_mane_select_version: bool, - refseq_id: str, - refseq_version: str - }> ----------------------------------------- -Key: ['locus', 'alleles'] ----------------------------------------- diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/mane_transcripts_path/mane_select_transcripts.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema similarity index 53% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema index acec64e03..7e2919a3f 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/output/gnomad_v4_variants_annotated_2.ht.schema @@ -1,169 +1,192 @@ ---------------------------------------- Global fields: - 'freq_meta': array> - 'freq_index_dict': dict - 'freq_meta_sample_count': array - 'faf_meta': array> - 'faf_index_dict': dict - 'joint_freq_meta': array> - 'joint_freq_index_dict': dict - 'joint_freq_meta_sample_count': array - 'joint_faf_meta': array> - 'joint_faf_index_dict': dict - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'downsamplings': dict> - 'filtering_model': struct { - filter_name: str, - score_name: str, - snv_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - indel_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - snv_training_variables: array, - indel_training_variables: array - } - 'inbreeding_coeff_cutoff': float64 - 'interval_qc_parameters': struct { - per_platform: bool, - all_platforms: bool, - high_qual_cutoffs: dict>, - min_platform_size: int32 - } - 'tool_versions': struct { - cadd_version: str, - revel_version: str, - spliceai_version: str, - pangolin_version: array, - phylop_version: str, - dbsnp_version: str, - sift_version: str, - polyphen_version: str - } - 'vrs_versions': struct { - vrs_schema_version: str, - vrs_python_version: str, - seqrepo_version: str - } - 'vep_globals': struct { - vep_version: str, - vep_help: str, - vep_config: str, - gencode_version: str, - mane_select_version: str - } - 'date': str - 'version': str 'mane_transcripts_version': str ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': struct { - gnomad: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str + 'exome': struct { + colocated_variants: struct { + all: array, + non_ukb: array }, - non_ukb: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str - } - } - 'fafmax': struct { - gnomad: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + subsets: set, + flags: set, + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + } }, - non_ukb: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + faf95: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + faf99: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + fafmax: struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + }, + age_distribution: struct { + het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array } } - 'joint_freq': array - 'joint_grpmax': struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int32, - gen_anc: str - } - 'joint_faf': array - 'joint_fafmax': struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str - } - 'rsids': set - 'vqsr_results': struct { - AS_VQSLOD: float64, - AS_culprit: str, - positive_train_site: bool, - negative_train_site: bool - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32 + 'genome': struct { + colocated_variants: struct { + hgdp: array, + tgp: array, + all: array }, - revel_max: float64, - spliceai_ds_max: float32, - pangolin_largest_ds: float64, - phylop: float64, - sift_max: float64, - polyphen_max: float64 - } - 'variant_id': str - 'colocated_variants': struct { - non_ukb: array, - all: array - } - 'gnomad': struct { + subsets: set, + flags: set, freq: struct { - non_ukb: struct { + hgdp: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array + }, + tgp: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + ancestry_groups: array }, all: struct { @@ -171,13 +194,13 @@ Row fields: ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array } }, @@ -189,6 +212,12 @@ Row fields: grpmax: float64, grpmax_gen_anc: str }, + fafmax: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, age_distribution: struct { het: struct { bin_edges: array, @@ -277,8 +306,34 @@ Row fields: }> } } - 'subsets': set - 'flags': set + 'rsids': set + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } + 'variant_id': str + 'faf95_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'faf99_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'colocated_variants': struct { + all: array, + non_ukb: array, + hgdp: array, + tgp: array + } 'coverage': struct { exome: struct { mean: float64, diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/transcripts_path/transcripts_grch38_base.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/variants_path/gnomad_v4_variants_annotated_1.ht.schema similarity index 59% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/variants_path/gnomad_v4_variants_annotated_1.ht.schema index 47acd44e2..98056b309 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_transcript_consequences/variants_path/gnomad_v4_exome_variants_annotated_1.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_transcript_consequences/variants_path/gnomad_v4_variants_annotated_1.ht.schema @@ -1,253 +1,192 @@ ---------------------------------------- Global fields: - 'freq_meta': array> - 'freq_index_dict': dict - 'freq_meta_sample_count': array - 'faf_meta': array> - 'faf_index_dict': dict - 'joint_freq_meta': array> - 'joint_freq_index_dict': dict - 'joint_freq_meta_sample_count': array - 'joint_faf_meta': array> - 'joint_faf_index_dict': dict - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'downsamplings': dict> - 'filtering_model': struct { - filter_name: str, - score_name: str, - snv_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - indel_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - snv_training_variables: array, - indel_training_variables: array - } - 'inbreeding_coeff_cutoff': float64 - 'interval_qc_parameters': struct { - per_platform: bool, - all_platforms: bool, - high_qual_cutoffs: dict>, - min_platform_size: int32 - } - 'tool_versions': struct { - cadd_version: str, - revel_version: str, - spliceai_version: str, - pangolin_version: array, - phylop_version: str, - dbsnp_version: str, - sift_version: str, - polyphen_version: str - } - 'vrs_versions': struct { - vrs_schema_version: str, - vrs_python_version: str, - seqrepo_version: str - } - 'vep_globals': struct { - vep_version: str, - vep_help: str, - vep_config: str, - gencode_version: str, - mane_select_version: str - } - 'date': str - 'version': str + None ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': struct { - gnomad: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str + 'exome': struct { + colocated_variants: struct { + all: array, + non_ukb: array }, - non_ukb: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str - } - } - 'fafmax': struct { - gnomad: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + subsets: set, + flags: set, + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + } }, - non_ukb: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + faf95: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + faf99: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + fafmax: struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + }, + age_distribution: struct { + het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array } } - 'joint_freq': array - 'joint_grpmax': struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int32, - gen_anc: str - } - 'joint_faf': array - 'joint_fafmax': struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str - } - 'rsids': set - 'vep': struct { - allele_string: str, - end: int32, - id: str, - input: str, - intergenic_consequences: array, - impact: str, - variant_allele: str - }>, - most_severe_consequence: str, - motif_feature_consequences: array, - high_inf_pos: str, - impact: str, - motif_feature_id: str, - motif_name: str, - motif_pos: int32, - motif_score_change: float64, - transcription_factors: array, - strand: int32, - variant_allele: str - }>, - regulatory_feature_consequences: array, - impact: str, - regulatory_feature_id: str, - variant_allele: str - }>, - seq_region_name: str, - start: int32, - strand: int32, - transcript_consequences: array, - distance: int32, - domains: array, - exon: str, - flags: str, - gene_id: str, - gene_pheno: int32, - gene_symbol: str, - gene_symbol_source: str, - hgnc_id: str, - hgvsc: str, - hgvsp: str, - hgvs_offset: int32, - impact: str, - intron: str, - lof: str, - lof_flags: str, - lof_filter: str, - lof_info: str, - mane_select: str, - mane_plus_clinical: str, - mirna: array, - protein_end: int32, - protein_start: int32, - protein_id: str, - source: str, - strand: int32, - transcript_id: str, - tsl: int32, - uniprot_isoform: array, - variant_allele: str - }>, - variant_class: str - } - 'vqsr_results': struct { - AS_VQSLOD: float64, - AS_culprit: str, - positive_train_site: bool, - negative_train_site: bool - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32 + 'genome': struct { + colocated_variants: struct { + hgdp: array, + tgp: array, + all: array }, - revel_max: float64, - spliceai_ds_max: float32, - pangolin_largest_ds: float64, - phylop: float64, - sift_max: float64, - polyphen_max: float64 - } - 'variant_id': str - 'colocated_variants': struct { - non_ukb: array, - all: array - } - 'gnomad': struct { + subsets: set, + flags: set, freq: struct { - non_ukb: struct { + hgdp: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array + }, + tgp: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + ancestry_groups: array }, all: struct { @@ -255,13 +194,13 @@ Row fields: ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array } }, @@ -273,6 +212,12 @@ Row fields: grpmax: float64, grpmax_gen_anc: str }, + fafmax: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, age_distribution: struct { het: struct { bin_edges: array, @@ -361,8 +306,119 @@ Row fields: }> } } - 'subsets': set - 'flags': set + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + protein_end: int32, + protein_start: int32, + protein_id: str, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } + 'variant_id': str + 'faf95_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'faf99_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'colocated_variants': struct { + all: array, + non_ukb: array, + hgdp: array, + tgp: array + } 'coverage': struct { exome: struct { mean: float64, diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/exome_coverage_path/gnomad_v4_exome_coverage.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/output/gnomad_v4_variants_annotated_1.ht.schema similarity index 59% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/output/gnomad_v4_variants_annotated_1.ht.schema index 47acd44e2..98056b309 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_annotated_1.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/output/gnomad_v4_variants_annotated_1.ht.schema @@ -1,253 +1,192 @@ ---------------------------------------- Global fields: - 'freq_meta': array> - 'freq_index_dict': dict - 'freq_meta_sample_count': array - 'faf_meta': array> - 'faf_index_dict': dict - 'joint_freq_meta': array> - 'joint_freq_index_dict': dict - 'joint_freq_meta_sample_count': array - 'joint_faf_meta': array> - 'joint_faf_index_dict': dict - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'downsamplings': dict> - 'filtering_model': struct { - filter_name: str, - score_name: str, - snv_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - indel_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - snv_training_variables: array, - indel_training_variables: array - } - 'inbreeding_coeff_cutoff': float64 - 'interval_qc_parameters': struct { - per_platform: bool, - all_platforms: bool, - high_qual_cutoffs: dict>, - min_platform_size: int32 - } - 'tool_versions': struct { - cadd_version: str, - revel_version: str, - spliceai_version: str, - pangolin_version: array, - phylop_version: str, - dbsnp_version: str, - sift_version: str, - polyphen_version: str - } - 'vrs_versions': struct { - vrs_schema_version: str, - vrs_python_version: str, - seqrepo_version: str - } - 'vep_globals': struct { - vep_version: str, - vep_help: str, - vep_config: str, - gencode_version: str, - mane_select_version: str - } - 'date': str - 'version': str + None ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': struct { - gnomad: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str + 'exome': struct { + colocated_variants: struct { + all: array, + non_ukb: array }, - non_ukb: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str - } - } - 'fafmax': struct { - gnomad: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + subsets: set, + flags: set, + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + } }, - non_ukb: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + faf95: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + faf99: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + fafmax: struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + }, + age_distribution: struct { + het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array } } - 'joint_freq': array - 'joint_grpmax': struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int32, - gen_anc: str - } - 'joint_faf': array - 'joint_fafmax': struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str - } - 'rsids': set - 'vep': struct { - allele_string: str, - end: int32, - id: str, - input: str, - intergenic_consequences: array, - impact: str, - variant_allele: str - }>, - most_severe_consequence: str, - motif_feature_consequences: array, - high_inf_pos: str, - impact: str, - motif_feature_id: str, - motif_name: str, - motif_pos: int32, - motif_score_change: float64, - transcription_factors: array, - strand: int32, - variant_allele: str - }>, - regulatory_feature_consequences: array, - impact: str, - regulatory_feature_id: str, - variant_allele: str - }>, - seq_region_name: str, - start: int32, - strand: int32, - transcript_consequences: array, - distance: int32, - domains: array, - exon: str, - flags: str, - gene_id: str, - gene_pheno: int32, - gene_symbol: str, - gene_symbol_source: str, - hgnc_id: str, - hgvsc: str, - hgvsp: str, - hgvs_offset: int32, - impact: str, - intron: str, - lof: str, - lof_flags: str, - lof_filter: str, - lof_info: str, - mane_select: str, - mane_plus_clinical: str, - mirna: array, - protein_end: int32, - protein_start: int32, - protein_id: str, - source: str, - strand: int32, - transcript_id: str, - tsl: int32, - uniprot_isoform: array, - variant_allele: str - }>, - variant_class: str - } - 'vqsr_results': struct { - AS_VQSLOD: float64, - AS_culprit: str, - positive_train_site: bool, - negative_train_site: bool - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32 + 'genome': struct { + colocated_variants: struct { + hgdp: array, + tgp: array, + all: array }, - revel_max: float64, - spliceai_ds_max: float32, - pangolin_largest_ds: float64, - phylop: float64, - sift_max: float64, - polyphen_max: float64 - } - 'variant_id': str - 'colocated_variants': struct { - non_ukb: array, - all: array - } - 'gnomad': struct { + subsets: set, + flags: set, freq: struct { - non_ukb: struct { + hgdp: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array + }, + tgp: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + ancestry_groups: array }, all: struct { @@ -255,13 +194,13 @@ Row fields: ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array } }, @@ -273,6 +212,12 @@ Row fields: grpmax: float64, grpmax_gen_anc: str }, + fafmax: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, age_distribution: struct { het: struct { bin_edges: array, @@ -361,8 +306,119 @@ Row fields: }> } } - 'subsets': set - 'flags': set + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + protein_end: int32, + protein_start: int32, + protein_id: str, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } + 'variant_id': str + 'faf95_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'faf99_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'colocated_variants': struct { + all: array, + non_ukb: array, + hgdp: array, + tgp: array + } 'coverage': struct { exome: struct { mean: float64, diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/variants_path/gnomad_v4_variants_base.ht.schema similarity index 57% rename from data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/variants_path/gnomad_v4_variants_base.ht.schema index 6e124ecbc..68aab9570 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/output/gnomad_v4_exome_variants_base.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/variants_path/gnomad_v4_variants_base.ht.schema @@ -1,253 +1,192 @@ ---------------------------------------- Global fields: - 'freq_meta': array> - 'freq_index_dict': dict - 'freq_meta_sample_count': array - 'faf_meta': array> - 'faf_index_dict': dict - 'joint_freq_meta': array> - 'joint_freq_index_dict': dict - 'joint_freq_meta_sample_count': array - 'joint_faf_meta': array> - 'joint_faf_index_dict': dict - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'downsamplings': dict> - 'filtering_model': struct { - filter_name: str, - score_name: str, - snv_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - indel_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - snv_training_variables: array, - indel_training_variables: array - } - 'inbreeding_coeff_cutoff': float64 - 'interval_qc_parameters': struct { - per_platform: bool, - all_platforms: bool, - high_qual_cutoffs: dict>, - min_platform_size: int32 - } - 'tool_versions': struct { - cadd_version: str, - revel_version: str, - spliceai_version: str, - pangolin_version: array, - phylop_version: str, - dbsnp_version: str, - sift_version: str, - polyphen_version: str - } - 'vrs_versions': struct { - vrs_schema_version: str, - vrs_python_version: str, - seqrepo_version: str - } - 'vep_globals': struct { - vep_version: str, - vep_help: str, - vep_config: str, - gencode_version: str, - mane_select_version: str - } - 'date': str - 'version': str + None ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': struct { - gnomad: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str + 'exome': struct { + colocated_variants: struct { + all: array, + non_ukb: array }, - non_ukb: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str - } - } - 'fafmax': struct { - gnomad: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + subsets: set, + flags: set, + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + } }, - non_ukb: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + faf95: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + faf99: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + fafmax: struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + }, + age_distribution: struct { + het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array } } - 'joint_freq': array - 'joint_grpmax': struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int32, - gen_anc: str - } - 'joint_faf': array - 'joint_fafmax': struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str - } - 'rsids': set - 'vep': struct { - allele_string: str, - end: int32, - id: str, - input: str, - intergenic_consequences: array, - impact: str, - variant_allele: str - }>, - most_severe_consequence: str, - motif_feature_consequences: array, - high_inf_pos: str, - impact: str, - motif_feature_id: str, - motif_name: str, - motif_pos: int32, - motif_score_change: float64, - transcription_factors: array, - strand: int32, - variant_allele: str - }>, - regulatory_feature_consequences: array, - impact: str, - regulatory_feature_id: str, - variant_allele: str - }>, - seq_region_name: str, - start: int32, - strand: int32, - transcript_consequences: array, - distance: int32, - domains: array, - exon: str, - flags: str, - gene_id: str, - gene_pheno: int32, - gene_symbol: str, - gene_symbol_source: str, - hgnc_id: str, - hgvsc: str, - hgvsp: str, - hgvs_offset: int32, - impact: str, - intron: str, - lof: str, - lof_flags: str, - lof_filter: str, - lof_info: str, - mane_select: str, - mane_plus_clinical: str, - mirna: array, - protein_end: int32, - protein_start: int32, - protein_id: str, - source: str, - strand: int32, - transcript_id: str, - tsl: int32, - uniprot_isoform: array, - variant_allele: str - }>, - variant_class: str - } - 'vqsr_results': struct { - AS_VQSLOD: float64, - AS_culprit: str, - positive_train_site: bool, - negative_train_site: bool - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32 + 'genome': struct { + colocated_variants: struct { + hgdp: array, + tgp: array, + all: array }, - revel_max: float64, - spliceai_ds_max: float32, - pangolin_largest_ds: float64, - phylop: float64, - sift_max: float64, - polyphen_max: float64 - } - 'variant_id': str - 'colocated_variants': struct { - non_ukb: array, - all: array - } - 'gnomad': struct { + subsets: set, + flags: set, freq: struct { - non_ukb: struct { + hgdp: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array + }, + tgp: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + ancestry_groups: array }, all: struct { @@ -255,13 +194,13 @@ Row fields: ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array } }, @@ -273,6 +212,12 @@ Row fields: grpmax: float64, grpmax_gen_anc: str }, + fafmax: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, age_distribution: struct { het: struct { bin_edges: array, @@ -361,8 +306,119 @@ Row fields: }> } } - 'subsets': set - 'flags': set + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + protein_end: int32, + protein_start: int32, + protein_id: str, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } + 'variant_id': str + 'faf95_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'faf99_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'colocated_variants': struct { + all: array, + non_ukb: array, + hgdp: array, + tgp: array + } ---------------------------------------- Key: ['locus', 'alleles'] ---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema similarity index 98% rename from data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema index 9852ccb58..91639b91f 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/gnomad.exomes.sites.test.updated_101623.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema @@ -22,13 +22,11 @@ Global fields: score_name: str, snv_cutoff: struct { bin: int32, - min_score: float64, - bin_id: str + min_score: float64 }, indel_cutoff: struct { bin: int32, - min_score: float64, - bin_id: str + min_score: float64 }, snv_training_variables: array, indel_training_variables: array @@ -66,6 +64,7 @@ Global fields: gencode_version: str, mane_select_version: str } + 'frequency_README': str 'date': str 'version': str ---------------------------------------- @@ -133,7 +132,8 @@ Row fields: faf95_max: float64, faf95_max_gen_anc: str, faf99_max: float64, - faf99_max_gen_anc: str + faf99_max_gen_anc: str, + joint_fafmax_data_type: str } 'a_index': int32 'was_split': bool @@ -161,6 +161,7 @@ Row fields: AS_VarDP: int32, singleton: bool, transmitted_singleton: bool, + sibling_singleton: bool, omni: bool, mills: bool, monoallelic: bool, diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema similarity index 76% rename from data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema index cb85362bc..62c84ed17 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_exome_variants/input_path/mock_v4_release.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema @@ -2,71 +2,61 @@ Global fields: 'freq_meta': array> 'freq_index_dict': dict + 'freq_meta_sample_count': array 'faf_meta': array> 'faf_index_dict': dict - 'freq_sample_count': array + 'joint_freq_meta': array> + 'joint_freq_index_dict': dict + 'joint_freq_meta_sample_count': array + 'joint_faf_meta': array> + 'joint_faf_index_dict': dict + 'age_distribution': struct { + bin_edges: array, + bin_freq: array, + n_smaller: int32, + n_larger: int32 + } + 'downsamplings': array 'filtering_model': struct { - model_name: str, + filter_name: str, score_name: str, - feature_medians: dict, - variants_by_strata: dict, - features_importance: dict, - features: array, - test_results: array, - rf_snv_cutoff: struct { - bin: float64, + snv_cutoff: struct { + bin: int32, min_score: float64 }, - rf_indel_cutoff: struct { - bin: float64, + indel_cutoff: struct { + bin: int32, min_score: float64 }, - inbreeding_cutoff: float64, - model_id: str + snv_training_variables: array, + indel_training_variables: array } + 'inbreeding_coeff_cutoff': float64 'tool_versions': struct { - dbsnp_version: str, cadd_version: str, revel_version: str, - splicaai_version: str, - primateai_version: str, - pangolin_version: str, - vrs_version: str + spliceai_version: str, + pangolin_version: array, + phylop_version: str, + dbsnp_version: str, + sift_version: str, + polyphen_version: str + } + 'vrs_versions': struct { + vrs_schema_version: str, + vrs_python_version: str, + seqrepo_version: str } 'vep_globals': struct { vep_version: str, - vep_csq_header: str, vep_help: str, - vep_config: str - } - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 + vep_config: str, + gencode_version: str, + mane_select_version: str } - 'age_index_dict': dict - 'age_meta': array> - 'grpmax_index_dict': dict - 'grpmax_meta': array> - 'README': dict - 'gnomad_qc_repo': str - 'gnomad_methods_repo': str + 'frequency_README': str + 'date': str + 'version': str ---------------------------------------- Row fields: 'locus': locus @@ -77,49 +67,79 @@ Row fields: AN: int32, homozygote_count: int32 }> - 'grpmax': array + gen_anc: str + } 'faf': array + 'fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + 'joint_freq': array + 'joint_grpmax': struct { + AC: int32, + AF: float64, + AN: int32, + homozygote_count: int32, + gen_anc: str + } + 'joint_faf': array + 'joint_fafmax': struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str, + joint_fafmax_data_type: str + } 'a_index': int32 'was_split': bool 'rsid': set 'filters': set 'info': struct { - QUALapprox: int64, - SB: array, + FS: float64, MQ: float64, MQRankSum: float64, + QUALapprox: int64, + QD: float32, + ReadPosRankSum: float64, + SB: array, + SOR: float64, VarDP: int32, - AS_ReadPosRankSum: float64, - AS_pab_max: float64, - AS_QD: float32, + AS_FS: float64, AS_MQ: float64, - QD: float32, AS_MQRankSum: float64, - FS: float64, - AS_FS: float64, - ReadPosRankSum: float64, + AS_pab_max: float64, AS_QUALapprox: int64, + AS_QD: float32, + AS_ReadPosRankSum: float64, AS_SB_TABLE: array, - AS_VarDP: int32, AS_SOR: float64, - SOR: float64, + AS_VarDP: int32, singleton: bool, transmitted_singleton: bool, omni: bool, mills: bool, monoallelic: bool, + only_het: bool, AS_VQSLOD: float64, - InbreedingCoeff: float64, + inbreeding_coeff: float64, vrs: struct { VRS_Allele_IDs: array, VRS_Starts: array, @@ -200,13 +220,9 @@ Row fields: mane_select: str, mane_plus_clinical: str, mirna: array, - polyphen_prediction: str, - polyphen_score: float64, protein_end: int32, protein_start: int32, protein_id: str, - sift_prediction: str, - sift_score: float64, source: str, strand: int32, transcript_id: str, @@ -216,22 +232,21 @@ Row fields: }>, variant_class: str } - 'rf': struct { - rf_positive_label: bool, - rf_negative_label: bool, - rf_label: str, - rf_train: bool, - rf_tp_probability: float64 + 'vqsr_results': struct { + AS_VQSLOD: float64, + AS_culprit: str, + positive_train_site: bool, + negative_train_site: bool } - 'region_flag': struct { + 'region_flags': struct { + non_par: bool, lcr: bool, - segdup: bool, - non_par: bool + segdup: bool } 'allele_info': struct { - variant_type: str, allele_type: str, n_alt_alleles: int32, + variant_type: str, was_mixed: bool } 'histograms': struct { @@ -299,39 +314,32 @@ Row fields: n_larger: int64 } }, - age_hists: array, bin_freq: array, n_smaller: int64, n_larger: int64 }, - age_hist_ht: struct { + age_hist_hom: struct { bin_edges: array, bin_freq: array, n_smaller: int64, n_larger: int64 } - }> + } } 'in_silico_predictors': struct { cadd: struct { phred: float32, - raw_score: float32, - has_duplicate: bool - }, - revel: struct { - revel_score: float64, - has_duplicate: bool + raw_score: float32 }, - splice_ai: struct { - splice_ai_score: float32, - splice_consequence: str, - has_duplicate: bool - }, - pangolin: struct { - pangolin_score: float64 - } + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 } ---------------------------------------- Key: ['locus', 'alleles'] diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/output/gnomad_v4_variants_base.ht.schema similarity index 57% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/output/gnomad_v4_variants_base.ht.schema index 6e124ecbc..68aab9570 100644 --- a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_exome_variants/variants_path/gnomad_v4_exome_variants_base.ht.schema +++ b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/output/gnomad_v4_variants_base.ht.schema @@ -1,253 +1,192 @@ ---------------------------------------- Global fields: - 'freq_meta': array> - 'freq_index_dict': dict - 'freq_meta_sample_count': array - 'faf_meta': array> - 'faf_index_dict': dict - 'joint_freq_meta': array> - 'joint_freq_index_dict': dict - 'joint_freq_meta_sample_count': array - 'joint_faf_meta': array> - 'joint_faf_index_dict': dict - 'age_distribution': struct { - bin_edges: array, - bin_freq: array, - n_smaller: int32, - n_larger: int32 - } - 'downsamplings': dict> - 'filtering_model': struct { - filter_name: str, - score_name: str, - snv_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - indel_cutoff: struct { - bin: int32, - min_score: float64, - bin_id: str - }, - snv_training_variables: array, - indel_training_variables: array - } - 'inbreeding_coeff_cutoff': float64 - 'interval_qc_parameters': struct { - per_platform: bool, - all_platforms: bool, - high_qual_cutoffs: dict>, - min_platform_size: int32 - } - 'tool_versions': struct { - cadd_version: str, - revel_version: str, - spliceai_version: str, - pangolin_version: array, - phylop_version: str, - dbsnp_version: str, - sift_version: str, - polyphen_version: str - } - 'vrs_versions': struct { - vrs_schema_version: str, - vrs_python_version: str, - seqrepo_version: str - } - 'vep_globals': struct { - vep_version: str, - vep_help: str, - vep_config: str, - gencode_version: str, - mane_select_version: str - } - 'date': str - 'version': str + None ---------------------------------------- Row fields: 'locus': locus 'alleles': array - 'grpmax': struct { - gnomad: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str + 'exome': struct { + colocated_variants: struct { + all: array, + non_ukb: array }, - non_ukb: struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int64, - gen_anc: str - } - } - 'fafmax': struct { - gnomad: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + subsets: set, + flags: set, + freq: struct { + all: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + }, + non_ukb: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int64, + ancestry_groups: array + } }, - non_ukb: struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str + faf95: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + faf99: struct { + grpmax: float64, + grpmax_gen_anc: str + }, + fafmax: struct { + gnomad: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, + non_ukb: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + } + }, + age_distribution: struct { + het: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + hom: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + filters: set, + quality_metrics: struct { + allele_balance: struct { + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_depth: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + genotype_quality: struct { + all_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + all_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_adj: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + }, + alt_raw: struct { + bin_edges: array, + bin_freq: array, + n_smaller: int64, + n_larger: int64 + } + }, + site_quality_metrics: array } } - 'joint_freq': array - 'joint_grpmax': struct { - AC: int32, - AF: float64, - AN: int32, - homozygote_count: int32, - gen_anc: str - } - 'joint_faf': array - 'joint_fafmax': struct { - faf95_max: float64, - faf95_max_gen_anc: str, - faf99_max: float64, - faf99_max_gen_anc: str - } - 'rsids': set - 'vep': struct { - allele_string: str, - end: int32, - id: str, - input: str, - intergenic_consequences: array, - impact: str, - variant_allele: str - }>, - most_severe_consequence: str, - motif_feature_consequences: array, - high_inf_pos: str, - impact: str, - motif_feature_id: str, - motif_name: str, - motif_pos: int32, - motif_score_change: float64, - transcription_factors: array, - strand: int32, - variant_allele: str - }>, - regulatory_feature_consequences: array, - impact: str, - regulatory_feature_id: str, - variant_allele: str - }>, - seq_region_name: str, - start: int32, - strand: int32, - transcript_consequences: array, - distance: int32, - domains: array, - exon: str, - flags: str, - gene_id: str, - gene_pheno: int32, - gene_symbol: str, - gene_symbol_source: str, - hgnc_id: str, - hgvsc: str, - hgvsp: str, - hgvs_offset: int32, - impact: str, - intron: str, - lof: str, - lof_flags: str, - lof_filter: str, - lof_info: str, - mane_select: str, - mane_plus_clinical: str, - mirna: array, - protein_end: int32, - protein_start: int32, - protein_id: str, - source: str, - strand: int32, - transcript_id: str, - tsl: int32, - uniprot_isoform: array, - variant_allele: str - }>, - variant_class: str - } - 'vqsr_results': struct { - AS_VQSLOD: float64, - AS_culprit: str, - positive_train_site: bool, - negative_train_site: bool - } - 'in_silico_predictors': struct { - cadd: struct { - phred: float32, - raw_score: float32 + 'genome': struct { + colocated_variants: struct { + hgdp: array, + tgp: array, + all: array }, - revel_max: float64, - spliceai_ds_max: float32, - pangolin_largest_ds: float64, - phylop: float64, - sift_max: float64, - polyphen_max: float64 - } - 'variant_id': str - 'colocated_variants': struct { - non_ukb: array, - all: array - } - 'gnomad': struct { + subsets: set, + flags: set, freq: struct { - non_ukb: struct { + hgdp: struct { ac: int32, ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array + }, + tgp: struct { + ac: int32, + ac_raw: int32, + an: int32, + hemizygote_count: int32, + homozygote_count: int32, + ancestry_groups: array }, all: struct { @@ -255,13 +194,13 @@ Row fields: ac_raw: int32, an: int32, hemizygote_count: int32, - homozygote_count: int64, + homozygote_count: int32, ancestry_groups: array } }, @@ -273,6 +212,12 @@ Row fields: grpmax: float64, grpmax_gen_anc: str }, + fafmax: struct { + faf95_max: float64, + faf95_max_gen_anc: str, + faf99_max: float64, + faf99_max_gen_anc: str + }, age_distribution: struct { het: struct { bin_edges: array, @@ -361,8 +306,119 @@ Row fields: }> } } - 'subsets': set - 'flags': set + 'rsids': set + 'vep': struct { + allele_string: str, + end: int32, + id: str, + input: str, + intergenic_consequences: array, + impact: str, + variant_allele: str + }>, + most_severe_consequence: str, + motif_feature_consequences: array, + high_inf_pos: str, + impact: str, + motif_feature_id: str, + motif_name: str, + motif_pos: int32, + motif_score_change: float64, + transcription_factors: array, + strand: int32, + variant_allele: str + }>, + regulatory_feature_consequences: array, + impact: str, + regulatory_feature_id: str, + variant_allele: str + }>, + seq_region_name: str, + start: int32, + strand: int32, + transcript_consequences: array, + distance: int32, + domains: array, + exon: str, + flags: str, + gene_id: str, + gene_pheno: int32, + gene_symbol: str, + gene_symbol_source: str, + hgnc_id: str, + hgvsc: str, + hgvsp: str, + hgvs_offset: int32, + impact: str, + intron: str, + lof: str, + lof_flags: str, + lof_filter: str, + lof_info: str, + mane_select: str, + mane_plus_clinical: str, + mirna: array, + protein_end: int32, + protein_start: int32, + protein_id: str, + source: str, + strand: int32, + transcript_id: str, + tsl: int32, + uniprot_isoform: array, + variant_allele: str + }>, + variant_class: str + } + 'in_silico_predictors': struct { + cadd: struct { + phred: float32, + raw_score: float32 + }, + revel_max: float64, + spliceai_ds_max: float32, + pangolin_largest_ds: float64, + phylop: float64, + sift_max: float64, + polyphen_max: float64 + } + 'variant_id': str + 'faf95_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'faf99_joint': struct { + grpmax: float64, + grpmax_gen_anc: str + } + 'colocated_variants': struct { + all: array, + non_ukb: array, + hgdp: array, + tgp: array + } ---------------------------------------- Key: ['locus', 'alleles'] ---------------------------------------- \ No newline at end of file diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py index 1d1eb37eb..9d3f3dc28 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_validation.py @@ -24,7 +24,6 @@ def validate_rows(ht: hl.Table, cls: object): result = ht_to_json(ht) - for variant in result: if variant: try: @@ -38,8 +37,8 @@ def validate_rows(ht: hl.Table, cls: object): logger.error(transform_error(e)) raise Exception(e) except Exception as e: - logger.info(variant["exome"]) - logger.info(variant["genome"]) + # logger.info(variant["exome"]) + # logger.info(variant["genome"]) logger.error(e) logger.error(transform_error(e)) raise Exception(e) @@ -61,7 +60,7 @@ def ht_to_json(ht: hl.Table, field: str = "row"): return objs -def validate_globals_input(pipeline: Pipeline): +def validate_exome_globals_input(pipeline: Pipeline): input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["exome_variants_path"] ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) @@ -71,12 +70,30 @@ def validate_globals_input(pipeline: Pipeline): logger.info("Validated prepare_gnomad_v4_variants input globals") -def validate_variant_input(pipeline: Pipeline): +def validate_genome_globals_input(pipeline: Pipeline): + input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["genome_variants_path"] + ht = hl.read_table(input_path) + ht = ht.sample(0.001, 1337) + result = ht_to_json(ht, "globals")[0] + # logger.info(result) + structure(result, Globals) + logger.info("Validated prepare_gnomad_v4_variants input globals") + + +def validate_exome_variant_input(pipeline: Pipeline): input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["exome_variants_path"] ht = hl.read_table(input_path) ht = ht.sample(0.001, 1337) validate_rows(ht, InitialVariant) - logger.info("Validated prepare_gnomad_v4_variants input variants") + logger.info("Validated prepare_gnomad_v4_variants input exome variants") + + +def validate_genome_variant_input(pipeline: Pipeline): + input_path = pipeline.get_task("prepare_gnomad_v4_variants").get_inputs()["genome_variants_path"] + ht = hl.read_table(input_path) + ht = ht.sample(0.001, 1337) + validate_rows(ht, InitialVariant) + logger.info("Validated prepare_gnomad_v4_variants input genome variants") def validate_step1_output(pipeline: Pipeline): diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py index acc47d954..a6af7e405 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_variants.py @@ -201,26 +201,21 @@ def subset_filter(subset): ), ), ), + faf95_joint=hl.if_else( + hl.is_defined(ds.joint_fafmax.joint_fafmax_data_type), + hl.struct(grpmax=ds.joint_fafmax.faf95_max, grpmax_gen_anc=ds.joint_fafmax.faf95_max_gen_anc), + hl.struct(grpmax=hl.null(hl.tfloat), grpmax_gen_anc=hl.null(hl.tstr)), + ), + faf99_joint=hl.if_else( + hl.is_defined(ds.joint_fafmax.joint_fafmax_data_type), + hl.struct(grpmax=ds.joint_fafmax.faf95_max, grpmax_gen_anc=ds.joint_fafmax.faf95_max_gen_anc), + hl.struct(grpmax=hl.null(hl.tfloat), grpmax_gen_anc=hl.null(hl.tstr)), + ), ) ds = ds.annotate(gnomad=ds.gnomad.annotate(fafmax=ds.fafmax)) - ds = ds.drop("faf", "fafmax") - - ############################## - # Join FAF # - ############################## - - ds = ds.annotate( - gnomad=ds.gnomad.annotate( - joint_freq=ds.joint_freq, - joint_grpmax=ds.joint_grpmax, - joint_faf=ds.joint_faf, - joint_fafmax=ds.joint_fafmax, - ), - ) - - ds = ds.drop("joint_freq", "joint_grpmax", "joint_faf", "joint_fafmax") + ds = ds.drop("faf", "fafmax", "joint_freq", "joint_grpmax", "joint_faf", "joint_fafmax") #################### # Age distribution # @@ -342,6 +337,8 @@ def prepare_gnomad_v4_variants(exome_variants_path: str, genome_variants_path: s "vep", "in_silico_predictors", "variant_id", + "faf95_joint", + "faf99_joint", ] variants = variants.annotate( **{field: hl.or_else(variants.exome[field], variants.genome[field]) for field in shared_fields} diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py index 05b8e2760..da9971df9 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_globals.py @@ -1,5 +1,5 @@ import attr -from typing import List +from typing import List, Union, Any @attr.define @@ -29,7 +29,6 @@ class TestResult: class Cutoff: bin: float min_score: float - bin_id: str @attr.define @@ -116,7 +115,7 @@ class Globals: joint_freq_index_dict: List[MetaInt] joint_freq_meta_sample_count: List[int] joint_faf_meta: List[List[MetaString]] - downsamplings: List[Downsampling] + downsamplings: Any inbreeding_coeff_cutoff: float vrs_versions: VrsVersions date: str diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py index 3eac5f498..3194fd34c 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/initial_variant.py @@ -1,5 +1,5 @@ import attr -from typing import List, Set, Union, Optional +from typing import List, Set, Union, Optional, Any @attr.define @@ -25,8 +25,7 @@ class Grpmax: gen_anc: Union[str, None] = None -@attr.define -class GrpmaxBySubset: +class GrpmaxBySubsetGenomes: gnomad: Union[Grpmax, None] non_ukb: Union[Grpmax, None] @@ -41,13 +40,9 @@ class Faf: class FafMax: faf95_max: Union[float, None] faf95_max_gen_anc: Union[str, None] - faf99_max: Union[float, None] - faf99_max_gen_anc: Union[str, None] - - -@attr.define -class JointFafMax(FafMax): - joint_fafmax_data_type: Optional[str] + faf99_max: Union[float, None] = None + faf99_max_gen_anc: Optional[str] = None + joint_fafmax_data_type: Optional[str] = None @attr.define @@ -94,6 +89,7 @@ class Info: inbreeding_coeff: float vrs: Vrs only_het: bool + sibling_singleton: Optional[bool] = None @attr.define @@ -176,7 +172,14 @@ class Vep: @attr.define -class RegionFlags: +class RegionFlagsGenomes: + lcr: bool + segdup: bool + non_par: bool + + +@attr.define +class RegionFlagsExomes: lcr: bool segdup: bool non_par: bool @@ -191,7 +194,7 @@ class AlleleInfo: allele_type: str n_alt_alleles: int was_mixed: bool - has_star: bool + has_star: Optional[bool] = None @attr.define @@ -235,7 +238,7 @@ class InSilicoPredictors: cadd: CaddPredictor revel_max: Union[float, None] spliceai_ds_max: Union[float, None] - pangolin_largest_ds: float + pangolin_largest_ds: Union[float, None] phylop: float sift_max: Union[float, None] polyphen_max: Union[float, None] @@ -246,20 +249,33 @@ class InitialVariant: locus: Locus alleles: List[str] freq: List[Frequency] - grpmax: GrpmaxBySubset - faf: List[Union[Faf, None]] - fafmax: FafMaxBySubset - joint_freq: Union[List[Frequency], None] - joint_grpmax: Union[Grpmax, None] - joint_faf: Union[List[Union[Faf, None]], None] - joint_fafmax: Union[JointFafMax, None] + + # grpmax: Grpmax + # faf: List[Union[Faf, None]] + # fafmax: Optional[FafMax] + # joint_freq: List[Frequency] + # joint_grpmax: Union[Grpmax, None] + # joint_faf: Union[List[Union[Faf, None]], None] + # joint_fafmax: Union[FafMax, None] + # + + # grpmax: Any + fafmax: Any + joint_freq: Any + joint_grpmax: Any + joint_faf: Any + joint_fafmax: Any + a_index: int was_split: bool rsid: Union[Set[str], None] filters: Set[str] info: Info vep: Union[Vep, None] - region_flags: RegionFlags + region_flags: Union[RegionFlagsGenomes, RegionFlagsExomes] allele_info: AlleleInfo histograms: Histograms in_silico_predictors: InSilicoPredictors + + grpmax: Optional[Any] = None + faf: Optional[Any] = None diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py index ed9392478..fa9196b6b 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step1.py @@ -1,15 +1,12 @@ import attr -from typing import List, Set, Union +from typing import List, Set, Union, Optional, Any from data_pipeline.datasets.gnomad_v4.types.initial_variant import ( Faf, FafMax, - FafMaxBySubset, Grpmax, - GrpmaxBySubset, InSilicoPredictors, - JointFafMax, Vep, Locus, ) @@ -36,15 +33,22 @@ class Freq: @attr.define -class FreqBySubset: +class FreqBySubsetExome: all: Freq non_ukb: Freq +@attr.define +class FreqBySubsetGenome: + all: Freq + tgp: Freq + hgdp: Freq + + @attr.define class FAF: - grpmax: float - grpmax_gen_anc: str + grpmax: Optional[float] + grpmax_gen_anc: Optional[str] @attr.define @@ -128,15 +132,11 @@ class ColocatedVariants: @attr.define class Gnomad: - freq: FreqBySubset + freq: Union[FreqBySubsetExome, FreqBySubsetGenome] faf95: FAF faf99: FAF - fafmax: FafMaxBySubset - joint_freq: Union[List[Frequency], None] - joint_grpmax: Union[Grpmax, None] - joint_faf: Union[List[Union[Faf, None]], None] - joint_fafmax: Union[JointFafMax, None] + fafmax: Any age_distribution: AgeDistributions filters: set[str] @@ -144,20 +144,26 @@ class Gnomad: flags: set[str] subsets: set[str] + colocated_variants: Union[ColocatedVariantsExome, ColocatedVariantsGenome] + grpmax: Optional[Any] = None + faf: Optional[Any] = None + @attr.define class Variant: locus: Locus alleles: list[str] - grpmax: GrpmaxBySubset + # grpmax: Grpmax rsids: Union[Set[str], None] vep: Union[Vep, None] in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants - exome: Gnomad - genome: Gnomad - subsets: set[str] - flags: set[str] + exome: Optional[Gnomad] + genome: Optional[Gnomad] + faf95_joint: FAF + faf99_joint: FAF + # subsets: set[str] + # flags: set[str] diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py index f09d67e4c..5a2e7f4e8 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/types/prepare_variants_step3.py @@ -1,4 +1,4 @@ -from typing import List, Union, Set +from typing import List, Union, Set, Optional import attr from data_pipeline.datasets.gnomad_v4.types.prepare_variants_step1 import ColocatedVariants, Gnomad @@ -48,8 +48,8 @@ class Variant: in_silico_predictors: InSilicoPredictors variant_id: str colocated_variants: ColocatedVariants - exome: Gnomad - genome: Gnomad - subsets: set[str] - flags: set[str] + exome: Optional[Gnomad] + genome: Optional[Gnomad] + # subsets: set[str] + # flags: set[str] transcript_consequences: Union[List[TranscriptConsequence], None] diff --git a/data-pipeline/src/data_pipeline/helpers/write_schemas.py b/data-pipeline/src/data_pipeline/helpers/write_schemas.py index c5a254c75..065e5f965 100644 --- a/data-pipeline/src/data_pipeline/helpers/write_schemas.py +++ b/data-pipeline/src/data_pipeline/helpers/write_schemas.py @@ -1,20 +1,16 @@ import os from pathlib import Path +from typing import List import hail as hl from loguru import logger - -from data_pipeline.pipelines.gnomad_v4_variants import ( - pipeline as gnomad_v4_variant_pipeline, -) +from data_pipeline.pipeline import DownloadTask, Pipeline def make_dir(path): Path(path).mkdir(parents=True, exist_ok=True) -SCHEMA_PATH = "schemas" - -pipelines = [gnomad_v4_variant_pipeline] +DEFAULT_SCHEMA_DIR = "schemas" def schema_writer(schema_path): @@ -26,33 +22,38 @@ def describe_handler(text): return describe_handler -for pipeline in pipelines: - if pipeline.config: - pipeline_name = pipeline.config.name - task_names = pipeline.get_all_task_names() - out_dir = os.path.join(SCHEMA_PATH, pipeline_name) - - for task_name in task_names: - task = gnomad_v4_variant_pipeline.get_task(task_name) - inputs = task.get_inputs() - output_path = task.get_output_path() - - # logger.info(f"out dir {out_dir}") - logger.info(f"task_name: {task}") - logger.info(f"inputs {str(inputs)}") - logger.info(f"output_path {str(output_path)}") - - tables = { - **inputs, - "output": output_path, - } - - logger.info(tables) - - for table_name, table_path in tables.items(): - ht = hl.read_table(table_path) - schema_path = os.path.join( - SCHEMA_PATH, pipeline_name, task_name, table_name, f"{os.path.basename(table_path)}.schema" - ) - describe_handler = schema_writer(schema_path) - ht.describe(handler=describe_handler) +def write_schemas(pipelines: List[Pipeline], schema_dir: str = DEFAULT_SCHEMA_DIR, task_names: List[str] = []): + for pipeline in pipelines: + if pipeline.config: + pipeline_name = pipeline.config.name + all_task_names = pipeline.get_all_task_names() + out_dir = os.path.join(schema_dir, pipeline_name) + + for task_name in all_task_names: + if task_name in task_names: + task = pipeline.get_task(task_name) + if type(task) != DownloadTask: + inputs = task.get_inputs() + output_path = task.get_output_path() + + # logger.info(f"task_name: {task}") + # logger.info(f"inputs {str(inputs)}") + # logger.info(f"output_path {str(output_path)}") + + tables = { + **inputs, + "output": output_path, + } + + for table_name, table_path in tables.items(): + if ".ht" in table_path: + ht = hl.read_table(table_path) + schema_path = os.path.join( + schema_dir, + pipeline_name, + task_name, + table_name, + f"{os.path.basename(table_path)}.schema", + ) + describe_handler = schema_writer(schema_path) + ht.describe(handler=describe_handler) diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index 2a85abe44..08950aaf2 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -1,5 +1,4 @@ import hail as hl -from data_pipeline.config import PipelineConfig from data_pipeline.pipeline import Pipeline, run_pipeline @@ -199,6 +198,14 @@ {"path": "gs://gcp-public-data--gnomad/release/2.1.1/constraint/gnomad.v2.1.1.lof_metrics.by_transcript.ht"}, ) + +pipeline.add_task( + "prepare_gnomad_v4_constraint", + prepare_gnomad_v2_constraint, + "/constraint/gnomad_v2_constraint.ht", + {"path": "gs://gcp-public-data--gnomad/release/2.1.1/constraint/gnomad.v2.1.1.lof_metrics.by_transcript.ht"}, +) + pipeline.add_task( "prepare_heterozygous_variant_cooccurrence_counts", prepare_heterozygous_variant_cooccurrence_counts, diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index c137ded10..8f423d0f5 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,18 +1,26 @@ import os from datetime import datetime +from pathlib import Path from loguru import logger from data_pipeline.config import PipelineConfig, get_data_environment, DataEnvironment from data_pipeline.pipeline import Pipeline, PipelineMock, run_pipeline +from data_pipeline.helpers.write_schemas import write_schemas from data_pipeline.datasets.gnomad_v4.gnomad_v4_variants import ( prepare_gnomad_v4_variants, ) + +from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline +from data_pipeline.pipelines.genes import pipeline as genes_pipeline + from data_pipeline.datasets.gnomad_v4.gnomad_v4_validation import ( - validate_globals_input, - validate_variant_input, + validate_exome_globals_input, + validate_genome_globals_input, + validate_exome_variant_input, + validate_genome_variant_input, validate_step1_output, validate_step2_output, validate_step3_output, @@ -23,7 +31,7 @@ annotate_transcript_consequences, ) -DATA_ENV = os.getenv("DATA_ENV", "full") +RUN = True pipeline_name = "gnomad_v4_variants" @@ -34,44 +42,15 @@ def generate_iso_timestamp_for_filename(): return timestamp -output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" -output_sub_dir = "gnomad_v4_20231023T173158" +# output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" +output_sub_dir = "gnomad_v4_20231027T135454" +config = PipelineConfig( + name=pipeline_name, + input_root="gs://gnomad-matt-data-pipeline/2023-10-19/inputs", + output_root="gs://gnomad-matt-data-pipeline/2023-10-19/outputs", +) -data_environment = get_data_environment(DATA_ENV) - -if data_environment == DataEnvironment.mock: - coverage_pipeline = PipelineMock.create( - { - "exome_coverage": "coverage/gnomad_v4_exome_coverage.ht", - "genome_coverage": "coverage/gnomad_v4_genome_coverage.ht", - } - ) - genes_pipeline = PipelineMock.create( - { - "base_transcripts_grch38": "genes/transcripts_grch38_base.ht", - "mane_select_transcripts": "genes/mane_select_transcripts.ht", - } - ) - config = PipelineConfig( - name=pipeline_name, - input_root="data/v4_mock/inputs", - output_root="data/v4_mock/outputs", - ) -elif data_environment == DataEnvironment.full: - from data_pipeline.pipelines.gnomad_v4_coverage import pipeline as coverage_pipeline - from data_pipeline.pipelines.genes import pipeline as genes_pipeline - - config = PipelineConfig( - name=pipeline_name, - input_root="gs://gnomad-matt-data-pipeline/2023-10-19/inputs", - output_root="gs://gnomad-matt-data-pipeline/2023-10-19/outputs", - ) - -else: - raise EnvironmentError( - f"Data environment invalid. Set DATA_ENV to one of {', '.join([e.name for e in DataEnvironment])}" - ) pipeline = Pipeline(config=config) @@ -80,8 +59,8 @@ def generate_iso_timestamp_for_filename(): task_function=prepare_gnomad_v4_variants, output_path=f"{output_sub_dir}/gnomad_v4_variants_base.ht", inputs={ - "exome_variants_path": "variants/gnomad.exomes.sites.test.updated_101623.ht", - "genome_variants_path": "variants/gnomad.genomes.sites.test.updated_101923.ht", + "exome_variants_path": "variants/gnomad.exomes.v4.0.sites.pcsk9.ht", + "genome_variants_path": "variants/gnomad.genomes.v4.0.sites.pcsk9.ht", }, ) @@ -121,13 +100,27 @@ def generate_iso_timestamp_for_filename(): ############################################### if __name__ == "__main__": - run_pipeline(pipeline) + if RUN: + run_pipeline(pipeline) + + write_schemas( + [pipeline], + os.path.join("/home/msolomon", "schemas"), + task_names=[ + "prepare_gnomad_v4_variants", + "annotate_gnomad_v4_variants", + "annotate_gnomad_v4_transcript_consequences", + ], + ) + # copy locally using + # gcloud compute scp dp-m:~/schemas . --tunnel-through-iap --recurse logger.info("Validating pipeline IO formats") - # if data_environment == DataEnvironment.mock: - validate_globals_input(pipeline) - validate_variant_input(pipeline) + validate_exome_globals_input(pipeline) + validate_genome_globals_input(pipeline) + validate_exome_variant_input(pipeline) + validate_genome_variant_input(pipeline) validate_step1_output(pipeline) validate_step2_output(pipeline) validate_step3_output(pipeline) From c437a035435859d7e0e6bd025cc81d15270d6c0b Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 27 Oct 2023 13:42:49 -0400 Subject: [PATCH 031/106] Add v4 metadata --- .../datasets/gnomad-v4/ageDistribution.json | 56 +++++++++++++++++-- .../exomeSiteQualityMetricDistributions.json | 1 + .../genomeSiteQualityMetricDistributions.json | 1 + .../datasets/gnomad-v4/sampleCounts.js | 53 ++++++++++++++++++ dataset-metadata/metadata.spec.ts | 9 +++ dataset-metadata/metadata.ts | 23 +++++--- dataset-metadata/sampleCounts.ts | 13 ++++- 7 files changed, 142 insertions(+), 14 deletions(-) create mode 100644 dataset-metadata/datasets/gnomad-v4/exomeSiteQualityMetricDistributions.json create mode 100644 dataset-metadata/datasets/gnomad-v4/genomeSiteQualityMetricDistributions.json create mode 100644 dataset-metadata/datasets/gnomad-v4/sampleCounts.js diff --git a/dataset-metadata/datasets/gnomad-v4/ageDistribution.json b/dataset-metadata/datasets/gnomad-v4/ageDistribution.json index 387046bf0..7c2c6975c 100644 --- a/dataset-metadata/datasets/gnomad-v4/ageDistribution.json +++ b/dataset-metadata/datasets/gnomad-v4/ageDistribution.json @@ -1,14 +1,60 @@ { "exome": { - "bin_edges": [30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80], - "bin_freq": [3337, 3806, 46374, 60862, 71023, 83028, 108358, 83329, 6292, 2814], + "bin_edges": [ + 30.0, + 35.0, + 40.0, + 45.0, + 50.0, + 55.0, + 60.0, + 65.0, + 70.0, + 75.0, + 80.0 + ], + "bin_freq": [ + 3337, + 3806, + 46374, + 60862, + 71023, + 83028, + 108358, + 83329, + 6292, + 2814 + ], "n_smaller": 5892, "n_larger": 1950 }, "genome": { - "bin_edges": [30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0, 75.0, 80.0], - "bin_freq": [1428, 1606, 1905, 3228, 4577, 3924, 3656, 3194, 2153, 1283], + "bin_edges": [ + 30.0, + 35.0, + 40.0, + 45.0, + 50.0, + 55.0, + 60.0, + 65.0, + 70.0, + 75.0, + 80.0 + ], + "bin_freq": [ + 1332, + 1401, + 1642, + 2949, + 4283, + 3601, + 3282, + 2909, + 1955, + 1202 + ], "n_smaller": 3760, - "n_larger": 454 + "n_larger": 438 } } diff --git a/dataset-metadata/datasets/gnomad-v4/exomeSiteQualityMetricDistributions.json b/dataset-metadata/datasets/gnomad-v4/exomeSiteQualityMetricDistributions.json new file mode 100644 index 000000000..fd8160118 --- /dev/null +++ b/dataset-metadata/datasets/gnomad-v4/exomeSiteQualityMetricDistributions.json @@ -0,0 +1 @@ +[{"bin_edges":[0.0,0.6,1.2,1.7999999999999998,2.4,3.0,3.5999999999999996,4.2,4.8,5.3999999999999995,6.0,6.6,7.199999999999999,7.8,8.4,9.0,9.6,10.2,10.799999999999999,11.4,12.0,12.6,13.2,13.799999999999999,14.399999999999999,15.0,15.6,16.2,16.8,17.4,18.0,18.599999999999998,19.2,19.8,20.4,21.0,21.599999999999998,22.2,22.8,23.4,24.0,24.599999999999998,25.2,25.8,26.4,27.0,27.599999999999998,28.2,28.799999999999997,29.4,30.0],"bin_freq":[60088945,6698821,8654343,9709119,7956302,7669930,5514918,4802119,4238690,3565383,3548459,3150450,2845730,2365258,2356789,2064004,1907835,1750304,1595315,1454082,1328318,1247752,1196494,1039070,985506,982973,852734,799159,748686,704733,642878,607178,566673,531266,484734,470170,437674,409854,375546,351765,328069,314372,287415,275610,252918,239832,224159,209003,197354,181757],"n_smaller":0,"n_larger":3600122,"metric":"AS_FS"},{"bin_edges":[50.0,50.25,50.5,50.75,51.0,51.25,51.5,51.75,52.0,52.25,52.5,52.75,53.0,53.25,53.5,53.75,54.0,54.25,54.5,54.75,55.0,55.25,55.5,55.75,56.0,56.25,56.5,56.75,57.0,57.25,57.5,57.75,58.0,58.25,58.5,58.75,59.0,59.25,59.5,59.75,60.0],"bin_freq":[108479,108632,113261,157280,120959,122323,122880,131895,140600,136976,145890,155807,163488,165517,168516,179381,214161,197983,199808,222811,242602,232158,304854,256943,301105,301357,362942,346764,428202,419079,469589,529945,572726,654361,741424,849439,1064383,1349416,2069200,161822705],"n_smaller":7162928,"n_larger":0,"metric":"AS_MQ"},{"bin_edges":[-5.0,-4.833333333333333,-4.666666666666667,-4.5,-4.333333333333333,-4.166666666666667,-4.0,-3.8333333333333335,-3.666666666666667,-3.5,-3.3333333333333335,-3.166666666666667,-3.0,-2.8333333333333335,-2.666666666666667,-2.5,-2.3333333333333335,-2.166666666666667,-2.0,-1.8333333333333335,-1.666666666666667,-1.5,-1.3333333333333335,-1.166666666666667,-1.0,-0.8333333333333339,-0.666666666666667,-0.5,-0.3333333333333339,-0.16666666666666696,0.0,0.16666666666666607,0.33333333333333304,0.5,0.6666666666666661,0.833333333333333,1.0,1.166666666666666,1.333333333333333,1.5,1.666666666666666,1.833333333333333,2.0,2.166666666666666,2.333333333333333,2.5,2.666666666666666,2.833333333333333,3.0,3.166666666666666,3.333333333333332,3.5,3.666666666666666,3.833333333333332,4.0,4.166666666666666,4.333333333333332,4.5,4.666666666666666,4.833333333333332,5.0],"bin_freq":[10369,11889,11814,14531,14702,16636,18846,19809,21749,25163,30272,35466,34756,40969,45489,59332,85605,94125,153686,96791,223076,348425,252062,365839,874449,725733,471770,806899,666211,444167,158232706,896089,880511,757645,795200,829042,367994,225473,278086,156541,78204,93339,48761,41767,28820,19173,15242,11727,9797,7956,7413,6076,5028,4137,3745,3176,2722,2407,2162,1954],"n_smaller":107553,"n_larger":16768,"metric":"AS_MQRankSum"},{"bin_edges":[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0],"bin_freq":[1610065,9407134,11963485,10051910,7947835,7615192,6921365,6766151,6506789,7536737,9155280,12167737,13560650,12802646,12098706,5997729,5246373,6428346,2643429,3334775,2475132,1498178,1322444,955499,7107599,627630,731780,858744,594346,505752,304193,490340,288164,201584,737200,932950,134053,444595,144964,292994],"n_smaller":0,"n_larger":3148294,"metric":"AS_QD"},{"bin_edges":[-5.0,-4.833333333333333,-4.666666666666667,-4.5,-4.333333333333333,-4.166666666666667,-4.0,-3.8333333333333335,-3.666666666666667,-3.5,-3.3333333333333335,-3.166666666666667,-3.0,-2.8333333333333335,-2.666666666666667,-2.5,-2.3333333333333335,-2.166666666666667,-2.0,-1.8333333333333335,-1.666666666666667,-1.5,-1.3333333333333335,-1.166666666666667,-1.0,-0.8333333333333339,-0.666666666666667,-0.5,-0.3333333333333339,-0.16666666666666696,0.0,0.16666666666666607,0.33333333333333304,0.5,0.6666666666666661,0.833333333333333,1.0,1.166666666666666,1.333333333333333,1.5,1.666666666666666,1.833333333333333,2.0,2.166666666666666,2.333333333333333,2.5,2.666666666666666,2.833333333333333,3.0,3.166666666666666,3.333333333333332,3.5,3.666666666666666,3.833333333333332,4.0,4.166666666666666,4.333333333333332,4.5,4.666666666666666,4.833333333333332,5.0],"bin_freq":[4676,5376,6119,7182,8446,9559,11581,13388,16628,20474,26310,33847,43438,61687,86943,117793,209300,282201,519037,438186,980201,1792915,1462035,2233209,6783277,5595505,6453509,8793856,11144504,8932024,34830405,13706644,12014576,10061731,10733953,14056438,4861602,3205446,4382753,2289743,909177,1199733,471241,380732,176606,94817,57743,35134,20847,12326,7216,4115,2481,1563,1108,786,572,417,355,258],"n_smaller":38549,"n_larger":1366,"metric":"AS_ReadPosRankSum"},{"bin_edges":[0.0,0.1,0.2,0.30000000000000004,0.4,0.5,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0,1.1,1.2000000000000002,1.3,1.4000000000000001,1.5,1.6,1.7000000000000002,1.8,1.9000000000000001,2.0,2.1,2.2,2.3000000000000003,2.4000000000000004,2.5,2.6,2.7,2.8000000000000003,2.9000000000000004,3.0,3.1,3.2,3.3000000000000003,3.4000000000000004,3.5,3.6,3.7,3.8000000000000003,3.9000000000000004,4.0,4.1000000000000005,4.2,4.3,4.4,4.5,4.6000000000000005,4.7,4.800000000000001,4.9,5.0],"bin_freq":[37235835,16834465,16988432,14824792,13760959,12224168,23710643,9964444,7402712,5238783,4132723,3625592,2092543,1837144,1650618,1177325,1425282,787251,772531,713787,533033,448530,665777,819609,322968,300763,237318,291851,317095,170321,171701,139005,278731,111986,114802,135756,119332,84412,103980,96999,65425,98821,54589,70201,59459,43597,67563,55061,44508,51582],"n_smaller":0,"n_larger":1083965,"metric":"AS_SOR"},{"bin_edges":[0.0,0.25,0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.25,2.5,2.75,3.0,3.25,3.5,3.75,4.0,4.25,4.5,4.75,5.0,5.25,5.5,5.75,6.0,6.25,6.5,6.75,7.0,7.25,7.5,7.75,8.0,8.25,8.5,8.75,9.0,9.25,9.5,9.75,10.0],"bin_freq":[209388,5252044,12051723,19462086,22985067,24252063,27272826,23855343,16867877,10611088,6621375,4315436,2925259,1993918,1352483,915245,635250,457212,338976,254913,192576,145186,111344,89520,75422,67814,62905,58984,52092,39396,23707,8823,1215,162,45,6,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_VarDP"},{"bin_edges":[-30.0,-29.0,-28.0,-27.0,-26.0,-25.0,-24.0,-23.0,-22.0,-21.0,-20.0,-19.0,-18.0,-17.0,-16.0,-15.0,-14.0,-13.0,-12.0,-11.0,-10.0,-9.0,-8.0,-7.0,-6.0,-5.0,-4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0],"bin_freq":[45068,48618,52952,58230,62578,69673,76987,84607,95009,106657,117439,133932,156441,182708,205728,292602,306955,312715,364321,438748,523053,637663,863236,1141999,1495381,2627238,4225767,8110219,10144630,10263011,7418900,6968582,10037831,19328439,25203405,53530713,7946341,4896656,3254503,555360,9876,107,70,44,37,25,16,12,3,7,6,5,2,0,1,1,2,1,0,0],"n_smaller":1163657,"n_larger":2,"metric":"AS_VQSLOD"},{"bin_edges":[0.0,0.02,0.04,0.06,0.08,0.1,0.12,0.14,0.16,0.18,0.2,0.22,0.24,0.26,0.28,0.3,0.32,0.34,0.36,0.38,0.4,0.42,0.44,0.46,0.48,0.5,0.52,0.54,0.56,0.58,0.6,0.62,0.64,0.66,0.68,0.7000000000000001,0.72,0.74,0.76,0.78,0.8,0.8200000000000001,0.84,0.86,0.88,0.9,0.92,0.9400000000000001,0.96,0.98,1.0],"bin_freq":[2272049,1722953,398918,2290780,421974,1921533,2444286,448877,3068075,329082,679018,519794,4783263,496407,4601401,440775,482513,661243,1013345,560249,467468,491054,6124914,412242,548178,2915836,503663,830277,466404,757096,664611,1982069,624796,752520,8998677,618289,1324793,1041149,1044099,839114,1091033,1130750,905372,1201621,1187508,864622,387090,64205,1316,109168692],"n_smaller":0,"n_larger":0,"metric":"AS_pab_max"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,3478308,15872995,24473300,25948144,22295378,19343366,16359140,13362502,10447521,7879044,5847133,4328453,3162303,2278741,1639896,1210909,931134,741892,600454,492224,406848,330818,287705,240985,239913,228539,224989,212419,189292,176121,139379,101474,55856,24718,6171,562,139],"n_smaller":0,"n_larger":4,"metric":"QUALapprox"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,17819390,43521359,30463126,19817374,15587954,13850944,11252807,8549043,6253326,4498437,3245589,2349343,1681396,1184992,828683,587559,430957,328049,257235,202562,159294,123269,96626,77316,64851,56491,50548,46644,43491,40395,35215,26656,17013,8364,2249,202,18],"n_smaller":0,"n_larger":2,"metric":"AS_QUALapprox"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,706296,6667218,13168628,15659581,13092125,10611074,8901874,7649692,6567628,5401062,4187892,3057485,2077589,1288452,717477,403826,278191,219919,178885,147877,123844,101538,88888,73738,73230,69910,67939,63219,55279,50703,40658,29189,15673,6306,1498,142,38],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.00005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,265,2438,3760,3209,4904,24882,106299,217054,204895,160562,147513,176349,226307,262864,263522,176181,68035,23959,14820,12024,10332,8721,7868,6860,7317,6964,6786,5813,4618,3683,2520,1556,701,264,64,9,4],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.0001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,176,1797,2418,1856,1212,1248,7017,32157,95246,120113,96873,85747,93091,121600,151735,162928,128893,60566,20043,10234,8193,7077,6267,5348,5803,5849,5741,5060,3862,3000,1882,1100,474,166,50,4,0],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_0.0002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,163,1831,2167,1481,796,503,476,1960,11199,43359,85626,89265,75869,72346,85121,111075,128501,118994,76354,31131,11685,7904,7006,5867,6434,6369,6412,5638,4373,3255,1987,1108,442,178,50,3,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.0005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,94,1126,1195,796,378,260,177,151,300,1530,7628,30993,50288,42729,37955,39244,49318,61506,64145,51722,26424,8710,4672,3964,4210,4243,4262,3815,2883,2125,1299,639,242,83,20,3,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,83,844,1117,640,337,151,108,78,79,134,513,2785,14596,38241,35619,30468,29260,33230,40949,44794,40671,24512,8844,4072,4017,3942,3761,3455,2668,1920,1114,526,214,52,23,3,0],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,108,1162,1481,886,398,174,115,75,54,83,80,237,1052,5776,28393,43621,34716,29250,27919,32568,37174,37109,28480,13643,6324,5064,4814,4222,3131,2276,1377,669,241,80,17,0,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,88,1062,1482,816,290,117,54,42,24,37,29,37,49,220,745,6384,28578,25891,17530,14757,15397,17746,18782,17099,10569,5066,3485,2986,2243,1597,956,396,130,52,13,0,0],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.01"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,96,1337,1840,1021,289,87,52,23,19,21,26,17,31,35,73,260,1461,18835,25585,15633,12532,12029,13799,14342,13866,10414,5275,3027,2157,1595,852,407,123,35,12,1,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.02"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,138,2263,3069,1618,338,84,54,39,25,25,21,14,24,23,23,52,142,384,7503,21116,20539,15859,13543,14793,17496,17471,15172,9148,3972,2270,1244,497,148,49,14,2,0],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.05"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,114,2116,2857,1174,215,61,28,14,11,7,12,14,13,14,14,8,21,32,43,148,4230,9463,10261,9572,10366,12947,14325,12668,9030,3794,1116,389,113,31,9,0,0],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,145,3151,3538,1158,175,66,36,23,7,7,7,13,10,7,9,5,4,13,21,26,33,384,3132,6728,9231,10845,13269,14960,13853,10651,5120,1079,191,42,8,0,0],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.2"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,551,11364,10412,2284,238,114,96,52,48,15,11,7,10,8,6,6,5,6,11,6,5,18,33,511,2754,6029,9377,13282,17790,20398,18221,12262,4588,807,124,24,7],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_0.5"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,940,16547,12102,2179,286,144,103,72,36,33,16,20,19,13,13,7,10,9,7,6,3,3,7,9,16,66,716,1999,4036,7824,12480,13771,12444,7580,2142,178,11],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1536881,5765820,6889233,5495495,3993404,3452053,3053801,2395200,1599354,953759,563015,364424,253139,179828,129402,97758,76610,63687,53094,45125,38541,31201,28511,23616,24225,22739,21446,20393,18976,17881,14625,10178,5482,2333,511,50,13],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_doubleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1232170,3392919,4368001,4773950,5199993,5252348,4288850,3065870,1968596,1198297,757871,521046,370216,266585,189789,139086,107389,85611,73545,65057,57245,48544,47612,40823,44055,40621,42209,42734,40421,43149,33928,27708,14650,6660,1616,143,62],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_singleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,4228175,21477256,22167141,13583516,8127819,6380976,5623464,5169829,4592964,3730124,2774379,1906028,1185242,621624,226773,43984,4175,421,208,119,124,87,50,32,20,15,11,4,1,2,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.00005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,644,4325,4212,3539,12581,61318,200494,278000,217628,150754,139455,172415,220924,253812,249085,153510,44832,5511,454,116,84,65,55,31,36,23,9,8,0,2,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,393,3051,2452,1566,1126,2566,15420,62877,145586,153729,104029,84899,91018,118502,144548,152782,115513,45817,7868,648,114,79,63,49,53,29,27,16,4,3,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,333,2916,2090,1086,658,519,855,4370,21806,75999,129331,112935,80375,71844,81385,103565,118682,107861,65335,21224,3033,309,140,87,80,36,20,36,16,3,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,187,1791,1178,500,279,223,196,265,639,3079,15489,54140,71054,49437,38864,36893,44874,56574,59590,47067,21688,4292,445,120,103,68,33,32,23,6,1,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,154,1410,1042,432,198,108,102,135,160,284,1047,5777,28575,55920,43119,31293,27558,30111,38414,42296,38023,21293,5453,649,97,47,52,40,22,9,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,217,1929,1449,459,237,110,96,102,107,121,166,449,1989,12826,43035,54284,37439,28873,27340,31881,36235,35395,25568,10195,1819,244,65,66,41,28,5,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,179,1772,1379,407,127,76,49,39,41,51,50,55,104,317,1335,10557,34968,29617,19439,16086,16099,17884,18074,15611,8164,1924,223,64,35,19,4,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.01"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,191,2219,1668,476,126,57,26,21,26,27,26,25,37,43,130,405,2508,22446,29414,18040,14364,13210,14302,14159,12476,8087,2290,330,45,20,9,5,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.02"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,254,3535,2844,754,138,44,38,29,32,25,22,25,24,24,28,64,186,617,8967,24721,24405,18190,15361,15739,17341,15944,12318,5987,1320,142,32,21,1,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.05"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,186,3303,2409,564,82,28,12,8,9,13,10,16,14,9,18,13,16,33,69,232,4986,11922,13271,11062,10444,12477,13016,11013,7322,2381,265,25,2,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,218,4585,2924,442,72,27,13,16,10,3,13,9,10,2,9,8,11,14,22,28,51,463,3777,8998,11212,10652,12164,14005,13063,9785,4498,752,87,4,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.2"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,803,15337,7874,917,85,60,42,23,26,10,11,9,8,8,6,5,8,2,11,7,10,23,35,550,2975,6865,9597,13036,17554,20169,17918,12081,4492,783,109,24,7],"n_smaller":0,"n_larger":1,"metric":"AS_QUALapprox-binned_0.5"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1214,20285,9332,1206,177,82,54,39,26,28,16,19,19,14,12,7,12,7,7,7,2,3,7,9,18,65,716,2004,4044,7824,12483,13772,12431,7577,2140,178,11],"n_smaller":0,"n_larger":1,"metric":"AS_QUALapprox-binned_1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,7364763,14026303,4376875,2153279,2267982,2357874,2171391,1503500,720606,236810,52632,7874,1099,275,148,79,70,56,45,41,38,23,10,12,3,6,6,2,1,0,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_doubleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,6221479,7951342,3878257,4068231,5176267,5046876,3240555,1529790,553660,147380,28913,4668,904,335,188,110,105,89,52,49,38,31,15,13,10,9,1,1,0,2,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_singleton"},{"bin_edges":[-5.0E-4,-4.8E-4,-4.6E-4,-4.4E-4,-4.2E-4,-4.0E-4,-3.8E-4,-3.5999999999999997E-4,-3.4E-4,-3.1999999999999997E-4,-3.0000000000000003E-4,-2.8E-4,-2.6E-4,-2.3999999999999998E-4,-2.1999999999999998E-4,-1.9999999999999998E-4,-1.7999999999999998E-4,-1.5999999999999999E-4,-1.4E-4,-1.1999999999999999E-4,-9.999999999999999E-5,-7.999999999999999E-5,-5.9999999999999995E-5,-3.9999999999999996E-5,-1.9999999999999944E-5,0.0,2.0000000000000052E-5,3.9999999999999996E-5,6.000000000000005E-5,7.999999999999999E-5,1.0000000000000005E-4,1.1999999999999999E-4,1.4000000000000004E-4,1.600000000000001E-4,1.8000000000000004E-4,2.000000000000001E-4,2.2000000000000003E-4,2.400000000000001E-4,2.6000000000000003E-4,2.800000000000001E-4,3.0000000000000003E-4,3.200000000000001E-4,3.4E-4,3.600000000000001E-4,3.8E-4,4.000000000000001E-4,4.2E-4,4.4000000000000007E-4,4.600000000000001E-4,4.800000000000002E-4,5.0E-4],"bin_freq":[4927,5246,5895,6352,7077,7732,8725,9970,11275,13025,14981,17870,20842,25220,30970,38841,50605,65862,91220,132257,208697,363358,774000,2755671,117117482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"n_smaller":37,"n_larger":58955119,"metric":"inbreeding_coeff-under_0.0005"},{"bin_edges":[-0.25,-0.225,-0.2,-0.175,-0.15,-0.125,-0.09999999999999998,-0.07499999999999998,-0.04999999999999999,-0.024999999999999994,0.0,0.025000000000000022,0.050000000000000044,0.07500000000000001,0.10000000000000003,0.125,0.15000000000000002,0.17500000000000004,0.2,0.22500000000000003,0.25,0.275,0.30000000000000004,0.32500000000000007,0.3500000000000001,0.375,0.4,0.42500000000000004,0.45000000000000007,0.4750000000000001,0.5,0.525,0.55,0.5750000000000001,0.6000000000000001,0.625,0.65,0.675,0.7000000000000001,0.7250000000000001,0.75,0.7750000000000001,0.8,0.825,0.8500000000000001,0.875,0.9000000000000001,0.925,0.9500000000000002,0.9750000000000001,1.0],"bin_freq":[2417,2200,5542,3727,6350,7211,9443,12174,20552,193512,439894,218679,133937,95795,73711,60579,51632,44555,38563,33384,28479,24008,20459,18802,16214,14895,13870,12779,13197,12753,12142,11709,12216,12580,13031,13827,19520,14363,15428,17919,20410,26238,30000,36186,41327,43862,43246,39622,31616,632181],"n_smaller":21436,"n_larger":0,"metric":"inbreeding_coeff-over_0.0005"}] \ No newline at end of file diff --git a/dataset-metadata/datasets/gnomad-v4/genomeSiteQualityMetricDistributions.json b/dataset-metadata/datasets/gnomad-v4/genomeSiteQualityMetricDistributions.json new file mode 100644 index 000000000..edaba7dde --- /dev/null +++ b/dataset-metadata/datasets/gnomad-v4/genomeSiteQualityMetricDistributions.json @@ -0,0 +1 @@ +[{"bin_edges":[0.0,0.6,1.2,1.7999999999999998,2.4,3.0,3.5999999999999996,4.2,4.8,5.3999999999999995,6.0,6.6,7.199999999999999,7.8,8.4,9.0,9.6,10.2,10.799999999999999,11.4,12.0,12.6,13.2,13.799999999999999,14.399999999999999,15.0,15.6,16.2,16.8,17.4,18.0,18.599999999999998,19.2,19.8,20.4,21.0,21.599999999999998,22.2,22.8,23.4,24.0,24.599999999999998,25.2,25.8,26.4,27.0,27.599999999999998,28.2,28.799999999999997,29.4,30.0],"bin_freq":[222013248,66646890,72706946,40418515,41917314,38779321,29045211,23168056,21668034,17776812,14761189,13378482,10748607,9568573,8237780,7349797,6095132,5348372,4629736,4084065,3588828,3127103,2779961,2405614,2193682,1963438,1703651,1558263,1351614,1169078,1159983,1006348,928129,842650,748340,728799,669531,615645,579697,504264,495876,477458,446307,416622,392041,371327,379323,355928,327284,310016],"n_smaller":0,"n_larger":19754134,"metric":"AS_FS"},{"bin_edges":[50.0,50.25,50.5,50.75,51.0,51.25,51.5,51.75,52.0,52.25,52.5,52.75,53.0,53.25,53.5,53.75,54.0,54.25,54.5,54.75,55.0,55.25,55.5,55.75,56.0,56.25,56.5,56.75,57.0,57.25,57.5,57.75,58.0,58.25,58.5,58.75,59.0,59.25,59.5,59.75,60.0],"bin_freq":[540268,553572,567382,593182,599858,617230,633847,655241,677120,698596,722933,748908,780363,809688,843567,880419,932063,972826,1026339,1084583,1160795,1236743,1344825,1433751,1580290,1725909,1929007,2148371,2446994,2807160,3280319,3876827,4668373,5716744,7162262,9246980,12440584,17632735,28189028,590897042],"n_smaller":36290208,"n_larger":7183388,"metric":"AS_MQ"},{"bin_edges":[-5.0,-4.833333333333333,-4.666666666666667,-4.5,-4.333333333333333,-4.166666666666667,-4.0,-3.8333333333333335,-3.666666666666667,-3.5,-3.3333333333333335,-3.166666666666667,-3.0,-2.8333333333333335,-2.666666666666667,-2.5,-2.3333333333333335,-2.166666666666667,-2.0,-1.8333333333333335,-1.666666666666667,-1.5,-1.3333333333333335,-1.166666666666667,-1.0,-0.8333333333333339,-0.666666666666667,-0.5,-0.3333333333333339,-0.16666666666666696,0.0,0.16666666666666607,0.33333333333333304,0.5,0.6666666666666661,0.833333333333333,1.0,1.166666666666666,1.333333333333333,1.5,1.666666666666666,1.833333333333333,2.0,2.166666666666666,2.333333333333333,2.5,2.666666666666666,2.833333333333333,3.0,3.166666666666666,3.333333333333332,3.5,3.666666666666666,3.833333333333332,4.0,4.166666666666666,4.333333333333332,4.5,4.666666666666666,4.833333333333332,5.0],"bin_freq":[15975,22976,35842,51994,70323,85126,115613,135656,187682,203230,345147,371699,528989,782859,736550,1561148,2903744,2198058,2768147,4478341,5545223,7518760,10348613,13612945,17976945,29695524,33425281,46261701,61809621,99675989,108806961,67040986,53712116,41307737,43593027,24304894,19090980,14577320,10392673,7586845,5250997,3407110,2384162,1479013,944479,601112,375554,240018,164420,115222,84022,66465,51581,42856,34993,29157,23358,19074,15077,11699],"n_smaller":51588,"n_larger":42101,"metric":"AS_MQRankSum"},{"bin_edges":[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0],"bin_freq":[3024335,27319720,22414900,13984999,10315739,9496412,10353893,12057493,15954802,23035753,34809705,53967531,88687920,134470558,92775833,54488159,35590430,25840453,19437862,14850432,9893493,6725537,4870309,3631180,2889767,2259323,1859895,1711143,1470557,1404940,1422214,1462505,1620816,1582932,1583810,696209,603929,597020,543287,571558],"n_smaller":0,"n_larger":9058967,"metric":"AS_QD"},{"bin_edges":[-5.0,-4.833333333333333,-4.666666666666667,-4.5,-4.333333333333333,-4.166666666666667,-4.0,-3.8333333333333335,-3.666666666666667,-3.5,-3.3333333333333335,-3.166666666666667,-3.0,-2.8333333333333335,-2.666666666666667,-2.5,-2.3333333333333335,-2.166666666666667,-2.0,-1.8333333333333335,-1.666666666666667,-1.5,-1.3333333333333335,-1.166666666666667,-1.0,-0.8333333333333339,-0.666666666666667,-0.5,-0.3333333333333339,-0.16666666666666696,0.0,0.16666666666666607,0.33333333333333304,0.5,0.6666666666666661,0.833333333333333,1.0,1.166666666666666,1.333333333333333,1.5,1.666666666666666,1.833333333333333,2.0,2.166666666666666,2.333333333333333,2.5,2.666666666666666,2.833333333333333,3.0,3.166666666666666,3.333333333333332,3.5,3.666666666666666,3.833333333333332,4.0,4.166666666666666,4.333333333333332,4.5,4.666666666666666,4.833333333333332,5.0],"bin_freq":[16677,21630,28836,39156,51450,60966,86629,107507,150019,191793,265375,391622,432312,739892,851196,1074307,2070606,2289281,2695620,4874731,5241353,6774101,8597485,10467560,13042295,24489158,21942994,29240712,37000998,46516007,67530449,86805700,88926822,61826626,63041412,38525702,31355619,24838069,18778007,14386196,10592774,7329509,5429320,3550063,2335978,1507535,929872,552951,324057,180187,94792,50903,25552,13727,7646,4512,2777,1846,1293,1009],"n_smaller":73137,"n_larger":7633,"metric":"AS_ReadPosRankSum"},{"bin_edges":[0.0,0.1,0.2,0.30000000000000004,0.4,0.5,0.6000000000000001,0.7000000000000001,0.8,0.9,1.0,1.1,1.2000000000000002,1.3,1.4000000000000001,1.5,1.6,1.7000000000000002,1.8,1.9000000000000001,2.0,2.1,2.2,2.3000000000000003,2.4000000000000004,2.5,2.6,2.7,2.8000000000000003,2.9000000000000004,3.0,3.1,3.2,3.3000000000000003,3.4000000000000004,3.5,3.6,3.7,3.8000000000000003,3.9000000000000004,4.0,4.1000000000000005,4.2,4.3,4.4,4.5,4.6000000000000005,4.7,4.800000000000001,4.9,5.0],"bin_freq":[3942010,7203865,13434345,25088790,43662196,75371425,144259860,123409022,75641045,50133219,35677797,26502813,19237559,14138737,12311455,9665012,7111158,5842750,5045037,4398453,3373721,2285690,3761750,1872472,1876094,1878197,1375900,1578833,1883761,981612,1206936,828914,2161251,707358,925792,1266407,1076788,748279,952484,1233304,641002,1336671,574519,791002,908514,511496,1052267,748390,745886,861345],"n_smaller":0,"n_larger":17113137,"metric":"AS_SOR"},{"bin_edges":[0.0,0.25,0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.25,2.5,2.75,3.0,3.25,3.5,3.75,4.0,4.25,4.5,4.75,5.0,5.25,5.5,5.75,6.0,6.25,6.5,6.75,7.0,7.25,7.5,7.75,8.0,8.25,8.5,8.75,9.0,9.25,9.5,9.75,10.0],"bin_freq":[334743,1430033,1698096,4436590,20289433,112425510,150928813,112909698,103031630,74758751,49469501,32586335,21894715,15182926,11017688,8366238,6691383,5673210,4950746,4239259,3424557,2638501,2072308,1878281,1988642,2233636,2663035,69515,32773,10564,2343,735,588,385,111,18,0,0,0,0],"n_smaller":5030,"n_larger":0,"metric":"AS_VarDP"},{"bin_edges":[-30.0,-29.0,-28.0,-27.0,-26.0,-25.0,-24.0,-23.0,-22.0,-21.0,-20.0,-19.0,-18.0,-17.0,-16.0,-15.0,-14.0,-13.0,-12.0,-11.0,-10.0,-9.0,-8.0,-7.0,-6.0,-5.0,-4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0],"bin_freq":[276077,284502,295666,311111,328550,345383,369835,392276,423939,465723,529401,662798,912975,1176460,1273316,1326548,1416689,1526092,1665875,1898670,2199775,2440939,2863956,3678522,6402360,13410216,19959078,29727841,35423960,32292022,39790623,38007320,36960663,49859412,162615695,163546791,15236669,3314620,1526947,1735667,2051000,2615200,3730937,5423858,7614823,17828104,10833832,2905134,3416804,4510512,4416352,6595348,5181299,5553,0,0,0,0,0,0],"n_smaller":5332596,"n_larger":0,"metric":"AS_VQSLOD"},{"bin_edges":[0.0,0.02,0.04,0.06,0.08,0.1,0.12,0.14,0.16,0.18,0.2,0.22,0.24,0.26,0.28,0.3,0.32,0.34,0.36,0.38,0.4,0.42,0.44,0.46,0.48,0.5,0.52,0.54,0.56,0.58,0.6,0.62,0.64,0.66,0.68,0.7000000000000001,0.72,0.74,0.76,0.78,0.8,0.8200000000000001,0.84,0.86,0.88,0.9,0.92,0.9400000000000001,0.96,0.98,1.0],"bin_freq":[27067186,12072874,5429052,8734777,5587445,6706435,5952156,4698549,8149992,3971945,6644831,5281836,4118137,5013772,8626050,4492445,5559474,5444350,7723870,5110884,5750922,4509458,11700603,4030191,6926440,5818289,5816796,8842841,4765763,8372256,7736291,9301266,6350178,8077488,8579850,9138339,14894790,10612290,6942505,2538513,5532752,13995478,18911784,30844285,8061253,576137,214878,1591,157,378431617],"n_smaller":0,"n_larger":0,"metric":"AS_pab_max"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,4476481,11162269,21437242,60018849,105938968,94835144,92440989,84379747,65021343,46281045,32288285,22761065,16521621,12474064,9822003,8083397,6993061,6328866,5805153,5260425,4747761,4333915,4286349,4806263,5809849,6656545,6546770,5454915,3496107,816986,34893,8496,3642,1493,1316,507,351],"n_smaller":0,"n_larger":145,"metric":"QUALapprox"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,11838093,23584611,33799994,81784784,133011426,102180678,88916811,76119656,55170378,38022850,26090675,18191410,13081551,9768947,7598762,6160618,5216471,4571980,4042550,3489785,2895760,2323489,1874388,1637556,1586045,1618940,1597913,1503988,1282589,355713,10828,4117,1565,551,332,243,192],"n_smaller":0,"n_larger":81,"metric":"AS_QUALapprox"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,179164,833674,1688992,2508995,3199685,5589374,16000575,28587152,32899159,20847544,7022816,2347357,1257302,826377,607636,484857,419825,385249,360571,333595,315595,309847,341033,438229,596328,729487,712697,553300,287607,55422,3185,615,314,119,116,36,25],"n_smaller":0,"n_larger":7,"metric":"QUALapprox-binned_0.00005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,4055,22674,73679,282740,768838,1239503,1345395,1455642,3903076,11449736,13263952,4815885,1101626,521427,345335,270967,237215,221285,210527,204222,202802,214040,248479,311860,385086,419742,374665,268497,128143,17811,1023,322,132,62,69,14,15],"n_smaller":0,"n_larger":5,"metric":"QUALapprox-binned_0.0001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1259,7609,18404,39147,111455,393725,825484,973601,879915,1187792,4315757,9004666,4290697,756827,317192,224369,191807,180368,174278,171498,174439,183294,207826,253834,307340,334937,297500,215242,96294,11067,689,238,94,36,44,16,10],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_0.0002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,576,3672,9170,18631,34063,67871,208133,561405,863849,852385,780171,1707435,6030450,6218890,1559457,303025,207244,191564,183264,179473,182258,191151,215192,262472,318402,349389,313302,232563,103070,10502,641,226,107,53,47,15,11],"n_smaller":0,"n_larger":7,"metric":"QUALapprox-binned_0.0005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,156,1128,3037,6113,10602,17819,30134,58497,171756,390716,488648,401495,374637,1304592,4291189,1857698,193686,118896,111740,107981,109390,113808,128103,158132,194176,212855,198100,150308,65643,6198,353,139,73,34,26,14,6],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,64,641,1611,3273,5569,9085,14374,22857,39409,94230,236547,351616,319496,261250,479109,2887893,2418815,224948,96308,90271,89566,92644,105228,131867,165676,188454,179841,133692,59162,5223,309,108,58,24,31,8,4],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_0.002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,60,417,1146,2181,3769,5888,9179,13851,21146,34017,66491,157348,274312,308587,271597,303962,1689526,3326124,1317343,130658,104822,106092,120527,151011,194414,224577,212295,161392,75012,6448,321,106,70,25,22,9,7],"n_smaller":0,"n_larger":2,"metric":"QUALapprox-binned_0.005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,22,196,501,929,1484,2291,3611,5107,7515,10731,16409,27354,55541,109429,155071,161672,150677,244415,1913678,1852539,163282,73617,81965,101650,131186,152434,144396,113856,55443,4367,237,59,27,17,21,4,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.01"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,16,118,307,560,852,1268,1948,2710,4202,5632,8206,12392,19536,36867,68021,100362,121287,119097,148696,918492,1947158,355624,75379,91441,118185,137580,131530,109422,55627,4231,185,59,26,10,8,5,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.02"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,14,68,202,363,567,883,1286,1851,2699,3673,5113,7307,10905,18046,31320,52762,75857,102920,119883,133878,317894,1504418,1219836,200852,130974,150170,148861,134804,70840,4743,226,65,28,15,11,4,3],"n_smaller":0,"n_larger":1,"metric":"QUALapprox-binned_0.05"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,7,46,99,135,264,359,578,737,1065,1357,1721,2460,3588,5543,9015,15358,24736,32742,45227,63210,78924,95722,296326,1107455,479470,90911,92398,90824,49075,3119,146,50,28,9,6,5,1],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,3,27,55,129,164,214,347,434,636,746,972,1241,1486,2397,3743,6271,10583,16519,21765,30576,43592,64443,84039,141996,855707,956225,124834,83266,46360,3113,149,46,41,8,4,4,3],"n_smaller":0,"n_larger":0,"metric":"QUALapprox-binned_0.2"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,8,23,58,112,152,209,294,374,428,524,618,829,959,1214,1707,2287,3578,5435,8782,13160,20693,32707,53394,89001,150246,564860,1428257,951887,104748,12480,3311,729,266,144,82,38,15],"n_smaller":0,"n_larger":3,"metric":"QUALapprox-binned_0.5"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1,18,67,98,139,198,224,232,210,251,259,312,358,368,416,508,628,816,1068,1526,2195,3536,5411,9059,17777,39740,88072,588499,1233732,349142,7452,3344,1280,389,250,204,183],"n_smaller":0,"n_larger":78,"metric":"QUALapprox-binned_1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,773654,1947255,2391230,3265678,8002715,23089671,26706231,21240781,11430272,4388631,1974578,1194319,830284,623617,500946,421205,373477,346055,325769,307545,302102,307673,352031,441300,564469,641667,592756,420465,221565,54797,3339,524,216,126,114,25,14],"n_smaller":0,"n_larger":9,"metric":"QUALapprox-binned_doubleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,3517422,8344703,17248684,53889765,93798650,64416786,47293196,31454516,14796006,7013080,4106027,2729049,1950444,1478633,1180249,990201,874120,812433,766254,721801,693049,685299,751580,916104,1200413,1463517,1507266,1246898,843786,268323,13327,1866,882,422,465,106,52],"n_smaller":0,"n_larger":31,"metric":"QUALapprox-binned_singleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,650870,2403733,3800898,4427339,4346841,6711989,19095423,31681300,33316432,18442335,4642811,855314,244880,80498,20701,2306,126,40,14,4,2,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.00005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,21055,112380,324561,928707,1775426,2027566,1710725,1796804,4758109,12730844,13328270,4065492,567548,127413,31028,3987,317,121,74,44,37,12,10,1,2,12,0,1,0,0,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,7042,37191,83794,171874,410156,986291,1423933,1301857,1111717,1578960,5043320,9424782,4010586,472071,72391,10590,888,290,166,147,201,193,149,82,33,34,6,4,1,2,0,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,3778,19184,41984,76700,130021,239973,553715,1038224,1232808,1093669,1111934,2220641,6568940,6312044,1397061,106815,9761,1207,305,215,201,142,183,239,202,111,40,21,14,2,1,1,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.0005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,1209,6169,13280,23196,36541,56756,89794,158598,352245,587906,630289,574532,626829,1612443,4521464,1858340,115201,10194,1641,284,121,110,102,116,159,150,84,97,22,2,3,1,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.001"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,661,3327,6883,11389,17428,25809,37612,56971,91907,185639,354461,459813,451111,457414,723949,3120671,2493253,192564,14812,2511,341,106,112,91,83,140,107,64,21,8,4,0,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.002"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,489,2120,4411,7111,10331,14955,20969,29759,42493,66639,118645,233629,367694,429817,457409,570314,1970584,3508674,1360011,70570,6326,967,190,101,56,117,218,98,34,19,2,2,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.005"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,173,815,1521,2373,3566,5166,6865,9418,12826,17969,26779,42928,80993,150094,214562,247386,294553,429496,2081017,1948111,156126,7671,732,137,81,74,97,132,38,22,9,3,0,1,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.01"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,78,403,786,1265,1711,2569,3537,4608,6392,8634,11939,17244,27638,50110,92653,141892,179741,212190,293250,1073042,2063785,386093,16251,621,185,96,95,126,64,26,13,3,0,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.02"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,55,228,436,746,1113,1565,2175,2777,3746,4941,6765,9519,14088,22446,38708,69013,106142,148123,193119,252238,463752,1642613,1301057,161416,5657,350,148,178,146,49,27,4,2,0,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.05"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,22,91,189,317,423,578,808,992,1266,1572,2089,2889,4228,6493,10436,17415,29024,43426,60988,88847,123743,157028,366210,1170046,485670,17043,484,158,137,66,21,5,5,4,3,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,10,54,114,202,247,314,395,542,701,836,1076,1258,1678,2671,4153,6894,11431,18108,25957,37172,55373,86921,118401,185981,899157,972234,68413,1343,275,129,59,20,12,7,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_0.2"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,13,34,82,150,188,252,328,370,445,569,629,832,1015,1274,1797,2450,3732,5781,9170,14101,22627,37229,64733,108643,175088,586230,1438140,912194,52839,8262,3181,712,251,141,79,39,9],"n_smaller":0,"n_larger":3,"metric":"AS_QUALapprox-binned_0.5"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,3,20,75,97,157,198,224,226,203,252,271,312,350,372,423,516,643,805,1093,1566,2216,3580,5521,9487,19186,41957,89834,589400,1228873,347014,7439,3343,1280,389,250,204,183],"n_smaller":0,"n_larger":78,"metric":"AS_QUALapprox-binned_1"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,2475787,4963954,4337075,4781835,10350752,28210417,28559100,19448166,8275679,1978655,434896,138522,53636,19929,5225,672,239,275,252,262,300,264,289,238,215,171,99,71,43,37,29,10,4,7,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_doubleton"},{"bin_edges":[1.0,1.225,1.45,1.675,1.9,2.125,2.35,2.575,2.8,3.025,3.25,3.475,3.7,3.9250000000000003,4.15,4.375,4.6,4.825,5.05,5.275,5.5,5.7250000000000005,5.95,6.175,6.4,6.625,6.8500000000000005,7.075,7.3,7.525,7.75,7.9750000000000005,8.2,8.425,8.65,8.875,9.1,9.325000000000001,9.55,9.775,10.0],"bin_freq":[0,0,0,8676848,16034908,25183905,71351483,115926525,63896280,37411208,20589044,5963409,1323430,376501,143703,60337,23858,6802,1357,836,686,681,671,609,560,448,357,271,216,148,101,82,75,40,13,11,2,0,0,0],"n_smaller":0,"n_larger":0,"metric":"AS_QUALapprox-binned_singleton"},{"bin_edges":[-5.0E-4,-4.8E-4,-4.6E-4,-4.4E-4,-4.2E-4,-4.0E-4,-3.8E-4,-3.5999999999999997E-4,-3.4E-4,-3.1999999999999997E-4,-3.0000000000000003E-4,-2.8E-4,-2.6E-4,-2.3999999999999998E-4,-2.1999999999999998E-4,-1.9999999999999998E-4,-1.7999999999999998E-4,-1.5999999999999999E-4,-1.4E-4,-1.1999999999999999E-4,-9.999999999999999E-5,-7.999999999999999E-5,-5.9999999999999995E-5,-3.9999999999999996E-5,-1.9999999999999944E-5,0.0,2.0000000000000052E-5,3.9999999999999996E-5,6.000000000000005E-5,7.999999999999999E-5,1.0000000000000005E-4,1.1999999999999999E-4,1.4000000000000004E-4,1.600000000000001E-4,1.8000000000000004E-4,2.000000000000001E-4,2.2000000000000003E-4,2.400000000000001E-4,2.6000000000000003E-4,2.800000000000001E-4,3.0000000000000003E-4,3.200000000000001E-4,3.4E-4,3.600000000000001E-4,3.8E-4,4.000000000000001E-4,4.2E-4,4.4000000000000007E-4,4.600000000000001E-4,4.800000000000002E-4,5.0E-4],"bin_freq":[563619,614018,675347,804180,777774,836142,914998,1008268,1124412,1234984,1386124,1583733,1788441,2053121,2434927,2848879,3439618,4251953,5513342,7274922,10301353,16207885,29103519,73659551,515575745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"n_smaller":3751,"n_larger":18201626,"metric":"inbreeding_coeff-under_0.0005"},{"bin_edges":[-0.25,-0.225,-0.2,-0.175,-0.15,-0.125,-0.09999999999999998,-0.07499999999999998,-0.04999999999999999,-0.024999999999999994,0.0,0.025000000000000022,0.050000000000000044,0.07500000000000001,0.10000000000000003,0.125,0.15000000000000002,0.17500000000000004,0.2,0.22500000000000003,0.25,0.275,0.30000000000000004,0.32500000000000007,0.3500000000000001,0.375,0.4,0.42500000000000004,0.45000000000000007,0.4750000000000001,0.5,0.525,0.55,0.5750000000000001,0.6000000000000001,0.625,0.65,0.675,0.7000000000000001,0.7250000000000001,0.75,0.7750000000000001,0.8,0.825,0.8500000000000001,0.875,0.9000000000000001,0.925,0.9500000000000002,0.9750000000000001,1.0],"bin_freq":[32647,38321,47415,56835,72523,93803,127548,191751,365260,15146529,18661919,7464681,3471212,1966981,1256166,864812,640204,496960,389078,328853,268952,240817,208395,192926,171863,165787,136417,133206,121154,128839,98798,99615,94793,87948,79723,73936,87494,65567,61975,64132,52428,60693,43245,44435,45176,38006,33960,28458,22176,93791],"n_smaller":392893,"n_larger":0,"metric":"inbreeding_coeff-over_0.0005"}] \ No newline at end of file diff --git a/dataset-metadata/datasets/gnomad-v4/sampleCounts.js b/dataset-metadata/datasets/gnomad-v4/sampleCounts.js new file mode 100644 index 000000000..1860d8280 --- /dev/null +++ b/dataset-metadata/datasets/gnomad-v4/sampleCounts.js @@ -0,0 +1,53 @@ +const sampleCounts = { + genomes: { + afr: 20805, + ami: 456, + amr: 7657, + asj: 1736, + eas: 2598, + fin: 5316, + mid: 147, + nfe: 34025, + remaining: 1058, + sas: 2417, + XX: 38942, + XY: 37273, + }, + genomesTotal: 76215, + total: 76215, + exomes: { + afr: 16740, + amr: 22362, + asj: 13068, + eas: 19850, + fin: 26710, + mid: 2884, + nfe: 556006, + remaining: 30198, + sas: 43129, + XX: 367323, + XY: 363624, + }, + exomesTotal: 730947, + total: 730947, + subsets: { + non_ukb: { + exomes: { + afr: 8847, + amr: 21870, + asj: 10492, + eas: 18035, + fin: 26572, + mid: 2074, + nfe: 175054, + remaining: 16549, + sas: 34899, + XX: 143125, + XY: 171267, + }, + exomesTotal: 314392, + total: 314392, + }, + }, +} +module.exports = sampleCounts diff --git a/dataset-metadata/metadata.spec.ts b/dataset-metadata/metadata.spec.ts index ee0c2c48f..a1b96fe1b 100644 --- a/dataset-metadata/metadata.spec.ts +++ b/dataset-metadata/metadata.spec.ts @@ -30,6 +30,7 @@ describe.each([ ['gnomad_sv_r2_1', false], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_r4', false], ] as [DatasetId, boolean][])('isSubset(%s)', (datasetId, expectedResult) => { const verb = expectedResult ? 'is' : 'is not' test(`${datasetId} ${verb} a subset`, () => expect(isSubset(datasetId)).toEqual(expectedResult)) @@ -51,6 +52,7 @@ describe.each([ ['gnomad_sv_r2_1', 'gnomAD SVs v2.1'], ['gnomad_sv_r2_1_controls', 'gnomAD SVs v2.1 (controls)'], ['gnomad_sv_r2_1_non_neuro', 'gnomAD SVs v2.1 (non-neuro)'], + ['gnomad_r4', 'gnomAD v4.0.0'], ] as [DatasetId, string][])('labelForDataset(%s)', (datasetId, expectedResult) => { test(`Label for ${datasetId} is "${expectedResult}"`, () => expect(labelForDataset(datasetId)).toEqual(expectedResult)) @@ -72,6 +74,7 @@ describe.each([ ['gnomad_sv_r2_1', false], ['gnomad_sv_r2_1_controls', false], ['gnomad_sv_r2_1_non_neuro', false], + ['gnomad_r4', true], // This will change ] as [DatasetId, boolean][])('hasShortVariants(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} short variants`, () => @@ -94,6 +97,7 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_r4', false], // This will change ] as [DatasetId, boolean][])('hasStructuralVariants(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} structural variants`, () => @@ -116,6 +120,7 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_r4', false], // This will change ] as [DatasetId, boolean][])('hasConstraints(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} constraints`, () => @@ -130,6 +135,7 @@ describe.each([ ['gnomad_r2_1_non_neuro', 'GRCh37'], ['gnomad_r2_1_non_topmed', 'GRCh37'], ['gnomad_r3', 'GRCh38'], + ['gnomad_r4', 'GRCh38'], ['gnomad_r3_controls_and_biobanks', 'GRCh38'], ['gnomad_r3_non_cancer', 'GRCh38'], ['gnomad_r3_non_neuro', 'GRCh38'], @@ -138,6 +144,7 @@ describe.each([ ['gnomad_sv_r2_1', 'GRCh37'], ['gnomad_sv_r2_1_controls', 'GRCh37'], ['gnomad_sv_r2_1_non_neuro', 'GRCh37'], + ['gnomad_r4', 'GRCh38'], ] as [DatasetId, ReferenceGenome][])('referenceGenome(%s)', (datasetId, expectedResult) => { test(`${datasetId} uses reference genome ${expectedResult}`, () => expect(referenceGenome(datasetId)).toEqual(expectedResult)) @@ -159,6 +166,7 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_r4', true], ] as [DatasetId, boolean][])('genesHaveExomeCoverage(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} exome coverage`, () => @@ -181,6 +189,7 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_r4', true], ] as [DatasetId, boolean][])('transcriptsHaveExomeCoverage(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} exome coverage`, () => diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 4e0202c67..b453f72f3 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -44,6 +44,10 @@ const extractReadsDatasetId = (datasetId: DatasetId) => { } const extractCoverageDatasetId = (datasetId: DatasetId): DatasetId => { + if (datasetId.startsWith('gnomad_r4')) { + return 'gnomad_r4' + } + // Coverage is not broken down by subset for gnomAD 3.1 // Map all subset datasets to the main dataset. if (datasetId.startsWith('gnomad_r3')) { @@ -145,6 +149,7 @@ type DatasetMetadata = { usesGrch38: boolean isV2: boolean isV3: boolean + isV4: boolean isExac: boolean isSVs: boolean isV4SVs: boolean @@ -188,14 +193,12 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ hasCopyNumberVariants: copyNumberVariantDatasetIds.includes(datasetId), hasCopyNumberVariantCoverage: datasetId.startsWith('gnomad_cnv'), hasVariantCoocurrence: datasetId.startsWith('gnomad') && datasetId.includes('r2'), - hasConstraints: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', + hasConstraints: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), hasNonCodingConstraints: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', hasExome: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', genesHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', transcriptsHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', - isV4CNVs: datasetId === 'gnomad_cnv_r4', - referenceGenome: - datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_cnv_r4' ||datasetId === 'gnomad_sv_r4' || datasetId.startsWith('gnomad_r4') ? 'GRCh38' : 'GRCh37', + referenceGenome: (datasetId.startsWith('gnomad_r3') || datasetId.startsWith('gnomad_r4') || datasetId === 'gnomad_sv_r4' || datasetId === "gnomad_cnv_r4") ? 'GRCh38' : 'GRCh37', genesHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), regionsHaveExomeCoverage: !datasetId.startsWith('gnomad_sv') && !datasetId.startsWith('gnomad_r3'), @@ -203,12 +206,14 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ regionsHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), isLiftoverSource: datasetId.startsWith('gnomad_r2_1'), isLiftoverTarget: datasetId.startsWith('gnomad_r3'), - usesGrch37: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', - usesGrch38: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', + usesGrch37: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), + usesGrch38: datasetId.startsWith('gnomad_r3') || datasetId.startsWith('gnomad_r4') || datasetId === 'gnomad_sv_r4', isV2: datasetId.startsWith('gnomad_r2'), isV3: datasetId.startsWith('gnomad_r3'), + isV4: datasetId.startsWith('gnomad_r4'), isSVs: datasetId.startsWith('gnomad_sv'), isCNVs: datasetId.startsWith('gnomad_cnv'), + isV4CNVs: datasetId === 'gnomad_cnv_r4', isExac: datasetId === 'exac', hasV2Genome: datasetId.startsWith('gnomad_r2'), metricsIncludeLowQualityGenotypes: datasetId.startsWith('gnomad_r2') || datasetId === 'exac', @@ -261,7 +266,7 @@ export const hasExome = (datsetId: DatasetId) => getMetadata(datsetId, 'hasExome export const genesHaveExomeCoverage = (datsetId: DatasetId) => getMetadata(datsetId, 'genesHaveExomeCoverage') - export const genesHaveGenomeCoverage = (datsetId: DatasetId) => +export const genesHaveGenomeCoverage = (datsetId: DatasetId) => getMetadata(datsetId, 'genesHaveGenomeCoverage') export const transcriptsHaveExomeCoverage = (datsetId: DatasetId) => @@ -279,7 +284,7 @@ export const hasStructuralVariants = (datasetId: DatasetId) => getMetadata(datasetId, 'hasStructuralVariants') export const hasCopyNumberVariants = (datasetId: DatasetId) => -getMetadata(datasetId, 'hasCopyNumberVariants') + getMetadata(datasetId, 'hasCopyNumberVariants') export const hasLocalAncestryPopulations = (datasetId: DatasetId) => getMetadata(datasetId, 'hasLocalAncestryPopulations') @@ -300,6 +305,8 @@ export const isV2 = (datasetId: DatasetId) => getMetadata(datasetId, 'isV2') export const isV3 = (datasetId: DatasetId) => getMetadata(datasetId, 'isV3') +export const isV4 = (datasetId: DatasetId) => getMetadata(datasetId, 'isV4') + export const isExac = (datasetId: DatasetId) => getMetadata(datasetId, 'isExac') export const isSVs = (datasetId: DatasetId) => getMetadata(datasetId, 'isSVs') diff --git a/dataset-metadata/sampleCounts.ts b/dataset-metadata/sampleCounts.ts index a9e487757..cafa0c0d0 100644 --- a/dataset-metadata/sampleCounts.ts +++ b/dataset-metadata/sampleCounts.ts @@ -1,4 +1,5 @@ const exacSampleCounts = require('./datasets/exac/sampleCounts') + const { subsets: gnomadV2SubsetSampleCounts, ...gnomadV2SampleCounts @@ -13,6 +14,11 @@ const { } = require('./datasets/gnomad-sv-v2/sampleCounts') const gnomadCnvV4SubsetSampleCounts = require('./datasets/gnomad-cnv-v4/sampleCounts') +const { + subsets: gnomadV4SubsetSampleCounts, + ...gnomadV4SampleCounts +} = require('./datasets/gnomad-v4/sampleCounts') + const sampleCounts = [ { exac: exacSampleCounts }, { gnomad_r2_1: gnomadV2SampleCounts }, @@ -28,7 +34,12 @@ const sampleCounts = [ [`gnomad_sv_r2_1_${subset}`]: gnomadSvV2SubsetSampleCounts[subset], })), { gnomad_sv_r4: { total: 63046 } }, - { gnomad_cnv_r4: gnomadCnvV4SubsetSampleCounts }, + { gnomad_cnv_r4: gnomadCnvV4SubsetSampleCounts }, // TODO: should not be called "subset" + { gnomad_r4: gnomadV4SubsetSampleCounts }, + ...Object.keys(gnomadV4SubsetSampleCounts).map((subset) => ({ + [`gnomad_v4_${subset}`]: gnomadV4SubsetSampleCounts[subset], + })), ].reduce(Object.assign, {}) + export default sampleCounts From c91fe78617b8e995070a4aea476dc81b890e405a Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 27 Oct 2023 13:47:16 -0400 Subject: [PATCH 032/106] Add graphql queries and types for gnomad v4 --- graphql-api/src/graphql/types/variant.graphql | 2 + .../gnomad-v4-variant-queries.ts | 149 ++++++++++++------ graphql-api/src/queries/variant-queries.ts | 13 +- 3 files changed, 112 insertions(+), 52 deletions(-) diff --git a/graphql-api/src/graphql/types/variant.graphql b/graphql-api/src/graphql/types/variant.graphql index df15a0128..97a39c078 100644 --- a/graphql-api/src/graphql/types/variant.graphql +++ b/graphql-api/src/graphql/types/variant.graphql @@ -243,6 +243,8 @@ type VariantDetails { flags: [String!] transcript_consequences: [TranscriptConsequence!] in_silico_predictors: [VariantInSilicoPredictor!] + faf95_joint: VariantFilteringAlleleFrequency + faf99_joint: VariantFilteringAlleleFrequency non_coding_constraint: NonCodingConstraintRegion diff --git a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts index e9706397b..44b398fa8 100644 --- a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts +++ b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts @@ -52,7 +52,6 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any const idField = isRsId(variantIdOrRsid) ? 'rsids' : 'variant_id' const response = await esClient.search({ index: GNOMAD_V4_VARIANT_INDEX, - type: '_doc', body: { query: { bool: { @@ -74,7 +73,11 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any const variant = response.body.hits.hits[0]._source.value - if (!(variant.genome.freq[subset] || {}).ac_raw) { + const hasExomeVariant = variant.exome.freq[subset].ac_raw + const hasGenomeVariant = variant.genome.freq[subset].ac_raw + const hasJointFafData = variant.faf95_joint && variant.faf99_joint + + if (!(variant.genome.freq[subset] || {}).ac_raw && !(variant.exome.freq[subset] || {}).ac_raw) { throw new UserVisibleError('Variant not found in selected subset.') } @@ -86,11 +89,11 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any const flags = getFlagsForContext({ type: 'region' })(variant) - let { ancestry_groups } = variant.genome.freq[subset] + let { ancestry_groups: genome_ancestry_groups } = variant.genome.freq[subset] // Include HGDP and 1KG populations with gnomAD subsets if (variant.genome.freq.hgdp.ac_raw > 0) { - ancestry_groups = ancestry_groups.concat( + genome_ancestry_groups = genome_ancestry_groups.concat( variant.genome.freq.hgdp.ancestry_groups.map((pop: any) => ({ ...pop, id: `hgdp:${pop.id}`, @@ -100,7 +103,7 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any // Some 1KG samples are included in v2. Since the 1KG population frequencies are based on the full v3.1 dataset, // they are invalid for the non-v2 subset. if (variant.genome.freq.tgp.ac_raw > 0 && subset !== 'non_v2') { - ancestry_groups = ancestry_groups.concat( + genome_ancestry_groups = genome_ancestry_groups.concat( variant.genome.freq.tgp.ancestry_groups.map((pop: any) => ({ ...pop, id: `1kg:${pop.id}`, @@ -108,37 +111,25 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any ) } - const inSilicoPredictorsList = [] - const inSilicoPredictors = variant.in_silico_predictors - if (inSilicoPredictors.revel.revel_score != null) { - inSilicoPredictorsList.push({ - id: 'revel', - value: inSilicoPredictors.revel.revel_score.toPrecision(3), - flags: inSilicoPredictors.revel.has_duplicate ? ['has_duplicate'] : [], - }) - } - if (inSilicoPredictors.cadd.phred != null) { - inSilicoPredictorsList.push({ - id: 'cadd', - value: inSilicoPredictors.cadd.phred.toPrecision(3), - flags: inSilicoPredictors.cadd.has_duplicate ? ['has_duplicate'] : [], - }) - } - if (inSilicoPredictors.splice_ai.splice_ai_score != null) { - inSilicoPredictorsList.push({ - id: 'splice_ai', - value: `${inSilicoPredictors.splice_ai.splice_ai_score.toPrecision(3)} (${inSilicoPredictors.splice_ai.splice_consequence - })`, - flags: inSilicoPredictors.splice_ai.has_duplicate ? ['has_duplicate'] : [], - }) - } - if (inSilicoPredictors.primate_ai.primate_ai_score != null) { - inSilicoPredictorsList.push({ - id: 'primate_ai', - value: inSilicoPredictors.primate_ai.primate_ai_score.toPrecision(3), - flags: inSilicoPredictors.primate_ai.has_duplicate ? ['has_duplicate'] : [], - }) - } + const inSilicoPredictorIds = ["revel_max", "spliceai_ds_max", "pangolin_largest_ds", "phylop", "sift_max", "polyphen_max"] + + const renamePredictorMapping = { "revel_max": "revel", "spliceai_ds_max": "splice_ai", "pangolin_largest_ds": "pangolin", "sift_max": "sift", "polyphen_max": "polyphen" } + + + const inSilicoPredictorsList = inSilicoPredictorIds.map(id => { + if (variant.in_silico_predictors[id]) { + let name: string = id + if (id in renamePredictorMapping) { + // @ts-ignore + name = renamePredictorMapping[id] + } + if (id == "cadd") { + return { id: name, value: variant.in_silico_predictors.cadd.phred, flags: [] } + } + return { id: name, value: variant.in_silico_predictors[id].toPrecision(3), flags: [] } + } + }).filter(item => item) + const localAncestryPopulations = subset === 'all' @@ -153,12 +144,52 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any ref: variant.alleles[0], alt: variant.alleles[1], colocated_variants: variant.colocated_variants[subset] || [], - exome: null, - genome: { + faf95_joint: hasJointFafData && { + popmax_population: variant.faf95_joint.grpmax_gen_anc, + popmax: variant.faf95_joint.grpmax + }, + faf99_joint: hasJointFafData && { + popmax_population: variant.faf99_joint.grpmax_gen_anc, + popmax: variant.faf99_joint.grpmax + }, + exome: hasExomeVariant && { + ...variant.exome, + ...variant.exome.freq[subset], + filters, + populations: variant.exome.freq[subset].ancestry_groups, + faf95: hasExomeVariant && variant.exome.faf95 && { + popmax_population: variant.exome.faf95.grpmax_gen_anc, + popmax: variant.exome.faf95.grpmax + }, + quality_metrics: { + // TODO: An older version of the data pipeline stored only adj quality metric histograms. + // Maintain the same behavior by returning the adj version until the API schema is updated to allow + // selecting which version to return. + allele_balance: { + alt: variant.exome.quality_metrics.allele_balance.alt_adj, + }, + genotype_depth: { + alt: variant.exome.quality_metrics.genotype_depth.alt_adj, + all: variant.exome.quality_metrics.genotype_depth.all_adj, + }, + genotype_quality: { + alt: variant.exome.quality_metrics.genotype_quality.alt_adj, + all: variant.exome.quality_metrics.genotype_quality.all_adj, + }, + site_quality_metrics: variant.exome.quality_metrics.site_quality_metrics.filter((m: any) => + Number.isFinite(m.value) + ), + }, + }, + genome: hasGenomeVariant && { ...variant.genome, ...variant.genome.freq[subset], filters, - populations: ancestry_groups, + populations: genome_ancestry_groups, + faf95: hasGenomeVariant && variant.genome.faf95 && { + popmax_population: variant.genome.faf95.grpmax_gen_anc, + popmax: variant.genome.faf95.grpmax + }, quality_metrics: { // TODO: An older version of the data pipeline stored only adj quality metric histograms. // Maintain the same behavior by returning the adj version until the API schema is updated to allow @@ -207,6 +238,15 @@ const shapeVariantSummary = (subset: any, context: any) => { filters.push('AC0') } + // console.log(variant.exome, variant.genome) + + const hasExomeVariant = variant.exome.freq[subset].ac_raw + const hasGenomeVariant = variant.genome.freq[subset].ac_raw + + // console.log(hasGenomeVariant, variant.exome.freq.all) + // + const hasJointFafData = variant.faf95_joint && variant.faf99_joint + return { ...omit(variant, 'transcript_consequences', 'locus', 'alleles'), // Omit full transcript consequences list to avoid caching it reference_genome: 'GRCh38', @@ -214,17 +254,32 @@ const shapeVariantSummary = (subset: any, context: any) => { pos: variant.locus.position, ref: variant.alleles[0], alt: variant.alleles[1], - exome: null, - genome: { + exome: hasExomeVariant ? { + ...omit(variant.exome, 'freq'), // Omit freq field to avoid caching extra copy of frequency information + ...variant.exome.freq[subset], + populations: variant.exome.freq[subset].ancestry_groups.filter( + (pop: any) => !(pop.id.includes('_') || pop.id === 'XX' || pop.id === 'XY') + ), + filters, + } : null, + genome: hasGenomeVariant ? { ...omit(variant.genome, 'freq'), // Omit freq field to avoid caching extra copy of frequency information ...variant.genome.freq[subset], populations: variant.genome.freq[subset].ancestry_groups.filter( (pop: any) => !(pop.id.includes('_') || pop.id === 'XX' || pop.id === 'XY') ), filters, - }, + } : null, flags, transcript_consequence: transcriptConsequence, + faf95_joint: hasJointFafData && { + popmax_population: variant.faf95_joint.grpmax_gen_anc, + popmax: variant.faf95_joint.grpmax + }, + faf99_joint: hasJointFafData && { + popmax_population: variant.faf99_joint.grpmax_gen_anc, + popmax: variant.faf99_joint.grpmax + }, } } } @@ -297,13 +352,13 @@ const fetchVariantsByGene = async (esClient: any, gene: any, subset: any) => { }, }) - // console.log(hits) - // console.log(hits.map((hit: any) => hit._source.value)) - - return hits + const shapedHits = hits .map((hit: any) => hit._source.value) - .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0) + .filter((variant: any) => variant.genome.freq[subset].ac_raw > 0 || variant.exome.freq[subset].ac_raw > 0) .map(shapeVariantSummary(subset, { type: 'gene', geneId: gene.gene_id })) + + return shapedHits + } catch (error) { console.error("Error fetching variants by gene:", error); throw error; // You can re-throw the error if needed or handle it accordingly. diff --git a/graphql-api/src/queries/variant-queries.ts b/graphql-api/src/queries/variant-queries.ts index 997a9d10e..eafa58b45 100644 --- a/graphql-api/src/queries/variant-queries.ts +++ b/graphql-api/src/queries/variant-queries.ts @@ -113,11 +113,14 @@ const _fetchVariantsByGene = (esClient: any, datasetId: DatasetId, gene: any) => return query(esClient, gene) } -export const fetchVariantsByGene = withCache( - _fetchVariantsByGene, - (_: any, datasetId: DatasetId, gene: any) => `variants:${datasetId}:gene:${gene.gene_id}`, - { expiration: 604800 } -) +// export const fetchVariantsByGene = withCache( +// _fetchVariantsByGene, +// (_: any, datasetId: DatasetId, gene: any) => `variants:${datasetId}:gene:${gene.gene_id}`, +// { expiration: 604800 } +// ) + + +export const fetchVariantsByGene = _fetchVariantsByGene // FIXME export const fetchVariantsByRegion = (esClient: any, datasetId: DatasetId, region: any) => { assertDatasetAndReferenceGenomeMatch(datasetId, region.reference_genome) From e04ff5c38c2c8e42df96d2de79e30ef6eaa3b5e8 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Fri, 27 Oct 2023 13:50:06 -0400 Subject: [PATCH 033/106] Add v4 to browser, gene page and variant pages working --- browser/package.json | 3 + .../src/ConstraintTable/ConstraintTable.tsx | 6 +- browser/src/CoverageTrack.tsx | 24 +- .../__snapshots__/GenePage.spec.tsx.snap | 1435 +++ ...riantCooccurrenceCountsTable.spec.tsx.snap | 8 - .../MitochondrialVariantPage.spec.tsx.snap | 8061 +++++++++++++++++ ...chondrialRegionCoverageTrack.spec.tsx.snap | 2 +- .../__snapshots__/RegionPage.spec.tsx.snap | 38 +- .../RegionPageContainer.spec.tsx.snap | 2 +- browser/src/Searchbox.tsx | 6 +- ...drialTranscriptCoverageTrack.spec.tsx.snap | 2 +- .../TranscriptPage.spec.tsx.snap | 169 +- .../TranscriptPageContainer.spec.tsx.snap | 1247 +++ .../src/VariantPage/GnomadAgeDistribution.tsx | 38 +- .../VariantPage/VariantInSilicoPredictors.tsx | 20 +- .../VariantPage/VariantOccurrenceTable.tsx | 11 +- browser/src/VariantPage/VariantPage.tsx | 20 +- .../VariantPage/VariantSiteQualityMetrics.tsx | 282 +- .../DatasetSelector.spec.tsx.snap | 534 ++ 19 files changed, 11568 insertions(+), 340 deletions(-) diff --git a/browser/package.json b/browser/package.json index d07ff1517..2e1ef116c 100644 --- a/browser/package.json +++ b/browser/package.json @@ -59,5 +59,8 @@ "jest-styled-components": "^6.0.0", "ts-migrate": "^0.1.30", "typescript": "^4.7.4" + }, + "volta": { + "node": "14.21.3" } } diff --git a/browser/src/ConstraintTable/ConstraintTable.tsx b/browser/src/ConstraintTable/ConstraintTable.tsx index 16aa12838..e32a7db7b 100644 --- a/browser/src/ConstraintTable/ConstraintTable.tsx +++ b/browser/src/ConstraintTable/ConstraintTable.tsx @@ -43,8 +43,8 @@ const transcriptDetails = ( transcriptId = geneOrTranscript.canonical_transcript_id const canonicalTranscript = transcriptId ? geneOrTranscript.transcripts.find( - (transcript) => transcript.transcript_id === transcriptId - ) + (transcript) => transcript.transcript_id === transcriptId + ) : null transcriptVersion = canonicalTranscript ? canonicalTranscript.transcript_version : null transcriptDescription = 'Ensembl canonical' @@ -59,7 +59,7 @@ const transcriptDetails = ( const ConstraintTable = ({ datasetId, geneOrTranscript }: Props) => { if (!hasConstraints(datasetId)) { - return

Constraint not yet available for gnomAD v3.

+ return

Constraint not yet available for {datasetId}.

} const { transcriptId, transcriptVersion, transcriptDescription } = diff --git a/browser/src/CoverageTrack.tsx b/browser/src/CoverageTrack.tsx index b36ee9f64..0dabff2ca 100644 --- a/browser/src/CoverageTrack.tsx +++ b/browser/src/CoverageTrack.tsx @@ -201,19 +201,19 @@ class CoverageTrack extends Component { ) return totalBases < 100 ? this.renderBars({ - isPositionDefined, - scaleCoverageMetric, - scalePosition, - totalBases, - width, - }) + isPositionDefined, + scaleCoverageMetric, + scalePosition, + totalBases, + width, + }) : this.renderArea({ - isPositionDefined, - scaleCoverageMetric, - scalePosition, - totalBases, - width, - }) + isPositionDefined, + scaleCoverageMetric, + scalePosition, + totalBases, + width, + }) } render() { diff --git a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap index 87605d810..dd5366304 100644 --- a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap +++ b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap @@ -28329,3 +28329,1438 @@ exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`] `; + +exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`] = ` +
+
+
+
+

+ FAKEGENE + + +

+
+
+ + Dataset + + + + + +
+
+
+
+
+
+
+ Genome build +
+
+ GRCh37 + / + hg19 +
+
+
+
+ Ensembl gene ID +
+
+ dummy_gene-1 + . + 5.6.7.8 +
+
+
+
+ Symbol in GENCODE v19 +
+
+
+
+
+ Ensembl canonical transcript + +
+
+ + transcript-999 + . + 12.34.5 + +
+
+
+
+ Region +
+
+ + 13 + : + 123 + - + 321 + +
+
+
+
+ External resources +
+
+ + Ensembl + + , + + + UCSC Browser + + , + + +
+
+
+
+
+
+
+ Constraint + +
+
+ Variant co-occurrence + +
+
+

+ Constraint not available for this + gene +

+
+
+
+ Viewing full + gene + . + + +
+
+
+
+
+
    + + +
+
+
+
+
+ Per-base mean depth of coverage +
+
+
+
+ + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + + + +
+
+
+
+
+ Include: +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+ + Positive strand +
+
+
+
+ + + +
+
+
+
+
+
+

+ ClinVar variants +

+
+

+ No ClinVar variants found in this gene. +

+
+

+ gnomAD variants +

+

+ No gnomAD variants found. +

+
+
+
+
+`; diff --git a/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap b/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap index adb4b2029..ca9e26ca4 100644 --- a/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap +++ b/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap @@ -2058,14 +2058,6 @@ exports[`VariantCoocurrenceCountsTable with non v2 dataset "gnomad_r4" has no un `; -exports[`VariantCoocurrenceCountsTable with non v2 dataset "gnomad_sv_r4" has no unexpected changes and renders as placeholder text 1`] = ` - -

- Variant co-occurrence is only available for gnomAD v2. -

-
-`; - exports[`VariantCoocurrenceCountsTable with v2 dataset "gnomad_r2_1" has no unexpected changes and renders as a table 1`] = `
diff --git a/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap b/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap index ecba5bae7..dd306e064 100644 --- a/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap +++ b/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap @@ -65740,6 +65740,8067 @@ exports[`MitochondrialVariantPage with dataset gnomad_r4 has no unexpected chang
`; +exports[`MitochondrialVariantPage with dataset gnomad_r4 has no unexpected changes 1`] = ` +
+
+
+

+ Single nucleotide variant + : + + M-123-A-C + (GRCh38) + +

+
+
+ + Dataset + + + + + +
+
+
+
+
+
+
+ + Filters + +
+
+ + Pass + +
+
+
+
+ + Allele Number + +
+
+ 0 +
+
+
+
+ + Homoplasmic AC + +
+
+ 0 +
+
+
+
+ + Homoplasmic AF + +
+
+ 0 +
+
+
+
+ + Heteroplasmic AC + +
+
+ 0 +
+
+
+
+ + Heteroplasmic AF + +
+
+ 0 +
+
+
+
+ + Max Observed Heteroplasmy + +
+
+ 0.1000 +
+
+
+
+ + Excluded Allele Count + +
+
+
+
+
+ + Haplogroup Defining + +
+
+ No +
+
+
+
+
+

+ External Resources +

+ +

+ Feedback +

+ + Report an issue with this variant + +
+
+
+

+ Population Frequencies +

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ Total + + + 0 + + + + 0 + + + 0.000 + + + 0 + + + 0.000 +
+
+
+

+ Haplogroup Frequencies + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ Total + + + 0 + + + + 0 + + + 0.000 + + + 0 + + + 0.000 +
+ +
+
+
+
+
+

+ Heteroplasmy Distribution +

+
+
+
+ + + + + + + Heteroplasmy level + + + + + + + + + + + 0 + + + + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + Individuals + + + + + + + + + + + + + + +
+
+
+
+

+ Age Distribution + +

+
+
+
    +
  • + + + + + Variant carriers + +
  • +
  • + + + + + + + + + + + + + + All individuals + +
  • +
+
+
+ + + + + + + + < 30 + + + + + + + + + + 30-35 + + + + + + + + + + 35-40 + + + + + + + + + + 40-45 + + + + + + + + + + 45-50 + + + + + + + + + + 50-55 + + + + + + + + + + 55-60 + + + + + + + + + + 60-65 + + + + + + + + + + 65-70 + + + + + + + + + + 70-75 + + + + + + + + + + 75-80 + + + + + + + + + + > 80 + + + + + + + + + Age + + + + + + + + + + + 0 + + + + + + + + + + 20 + + + + + + + + + + 40 + + + + + + + + + + 60 + + + + + + + + + + 80 + + + + + + + + + + 100 + + + + + + + + + + 120 + + + + + + + + + + 140 + + + + + + + + + + 160 + + + + + + + + + + 180 + + + + + + + + + + 200 + + + + + + + + + Variant carriers + + + + + + + + + + + 0 + + + + + + + + + + 500 + + + + + + + + + + 1.00K + + + + + + + + + + 1.50K + + + + + + + + + + 2.00K + + + + + + + + + + 2.50K + + + + + + + + + + 3.00K + + + + + + + + + + 3.50K + + + + + + + + + All individuals + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+
+
+
+
+
+
+
+

+ Annotations +

+
    +
+
+
+
+

+ Genotype Quality Metrics +

+
+
+
    +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
    +
  • + + + + + Variant carriers + +
  • +
  • + + + + + + + + + + + + + + All individuals + +
  • +
+
+
+ + + + + + + + > 0.5 + + + + + + + + + Depth + + + + + + + + + + + 0 + + + + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + Variant carriers + + + + + + + + + + + 0 + + + + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + All individuals + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+ + + + + + + Heteroplasmy level + + + + + + + + + + + 0 + + + + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + Individuals failing filter + + + + + + + + + + + + + + +
+
+ +
+

+ Note: This plot may include low-quality genotypes that were excluded from allele counts in the tables above. + + + More information. + +

+
+
+
+
+
+
+

+ Site Quality Metrics +

+
+
+
    +
  • + +
  • +
  • + +
  • +
+
+
+
+
+
+
+ + + + + + + + + 0 + + + + + + + + + + 200 + + + + + + + + + + 400 + + + + + + + + + + 600 + + + + + + + + + + 800 + + + + + + + + + + 1000 + + + + + + + + + + 1200 + + + + + + + + + + 1400 + + + + + + + + + + 1600 + + + + + + + + + + 1800 + + + + + + + + + + 2000 + + + + + + + + + + 2200 + + + + + + + + + + 2400 + + + + + + + + + + 2600 + + + + + + + + + + 2800 + + + + + + + + + + 3000 + + + + + + + + + + 3200 + + + + + + + + + + 3400 + + + + + + + + + + 3600 + + + + + + + + + + 3800 + + + + + + + + + + 4000 + + + + + + + + + Mean Depth + + + + + + + + + + + 0 + + + + + + + + + + 500 + + + + + + + + + + 1.00K + + + + + + + + + + 1.50K + + + + + + + + + + 2.00K + + + + + + + + + + 2.50K + + + + + + + + + + 3.00K + + + + + + + + + + 3.50K + + + + + + + + + + 4.00K + + + + + + + + + + 4.50K + + + + + + + + + + 5.00K + + + + + + + + + Variants + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + + + + + + + + + + + +
+ Metric + + Value +
+ Mean Depth + + 0 +
+
+
+
+
+
+
+

+ Read Data +

+

+ Read data is not yet available for mitochondrial variants. +

+
+
+`; + exports[`MitochondrialVariantPage with dataset gnomad_sv_r2_1 has no unexpected changes 1`] = `
{ if (selectedDataset) { + if (selectedDataset.startsWith('gnomad_r4')) { + return 'gnomad_r4' + } if (selectedDataset.startsWith('gnomad_r3')) { return 'gnomad_r3' } @@ -82,11 +85,12 @@ export default withRouter((props: any) => { onChange={(e: any) => { setSearchDataset(e.target.value) if (innerSearchbox.current) { - ;(innerSearchbox.current as any).updateResults() + ; (innerSearchbox.current as any).updateResults() } }} > + diff --git a/browser/src/TranscriptPage/__snapshots__/MitochondrialTranscriptCoverageTrack.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/MitochondrialTranscriptCoverageTrack.spec.tsx.snap index 5eaf4cd3c..27efaedc6 100644 --- a/browser/src/TranscriptPage/__snapshots__/MitochondrialTranscriptCoverageTrack.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/MitochondrialTranscriptCoverageTrack.spec.tsx.snap @@ -301,7 +301,7 @@ query MitochondrialCoverageInTranscript($transcriptId: String!, $datasetId: Data variables={ { "datasetId": "gnomad_r4", - "referenceGenome": "GRCh38", + "referenceGenome": "GRCh37", "transcriptId": "dummy-transcript", } } diff --git a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap index 4d9434a6e..06a3a007a 100644 --- a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap @@ -10321,7 +10321,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = onClick={[Function]} onKeyDown={[Function]} > - + gnomAD v4.0.0
  • gnomAD v3.1.2
    76,156 samples
    @@ -10386,7 +10386,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v3.1.2 (non-cancer)
    74,023 samples
    @@ -10403,7 +10403,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v3.1.2 (non-neuro)
    67,442 samples
    @@ -10420,7 +10420,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v3.1.2 (non-v2)
    57,344 samples
    @@ -10437,7 +10437,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v3.1.2 (non-TOPMed)
    40,433 samples
    @@ -10454,7 +10454,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v3.1.2 (controls/biobanks)
    16,465 samples
    @@ -10478,7 +10478,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v2.1.1
    141,456 samples
    @@ -10495,7 +10495,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v2.1.1 (non-TOPMed)
    135,743 samples
    @@ -10512,7 +10512,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v2.1.1 (non-cancer)
    134,187 samples
    @@ -10529,7 +10529,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v2.1.1 (non-neuro)
    114,704 samples
    @@ -10546,7 +10546,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > gnomAD v2.1.1 (controls)
    60,146 samples
    @@ -10563,7 +10563,7 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] = > ExAC v1.0
    60,706 samples
    @@ -10572,149 +10572,6 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] =
  • -
  • - - gnomAD CNVs v4.0 - -
  • -
  • - - - - - - -
  • + +
    + +
    +
    +
    +
    +
    + Genome build +
    +
    + GRCh37 + / + hg19 +
    +
    +
    +
    + Ensembl ID +
    +
    + dummy_transcript + . + 12.34.5 +
    +
    + +
    +
    + Region +
    +
    + + 13 + : + 123 + - + 321 + +
    +
    +
    +
    + External resources +
    +
    + + Ensembl + + , + + + UCSC Browser + +
    +
    +
    +
    +
    +

    + Constraint + +

    +

    + Constraint not available for this + transcript +

    +
    +
    + + Viewing full + transcript + . + + +
    +
    +
    +
    +
    +
      + + +
    +
    +
    +
    +
    + Per-base mean depth of coverage +
    +
    +
    +
    + + + + + + + + 10 + + + + + + + + + + 20 + + + + + + + + + + 30 + + + + + + + + + + 40 + + + + + + + + + + 50 + + + + + + + + + + 60 + + + + + + + + + + 70 + + + + + + + + + + 80 + + + + + + + + + + 90 + + + + + + + + + + 100 + + + + + + + + + + + +
    +
    +
    +
    +
    + Include: +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    +
    +
    +

    + ClinVar variants +

    +
    +

    + No ClinVar variants found in this transcript. +

    +
    +

    + gnomAD variants +

    +

    + No gnomAD variants found. +

    +
    +
    +
    + +`; + exports[`TranscriptPageContainer with dataset gnomad_sv_r2_1 has no unexpected changes 1`] = `null`; exports[`TranscriptPageContainer with dataset gnomad_sv_r2_1_controls has no unexpected changes 1`] = `null`; diff --git a/browser/src/VariantPage/GnomadAgeDistribution.tsx b/browser/src/VariantPage/GnomadAgeDistribution.tsx index 73885b44d..b8ea12410 100644 --- a/browser/src/VariantPage/GnomadAgeDistribution.tsx +++ b/browser/src/VariantPage/GnomadAgeDistribution.tsx @@ -7,10 +7,13 @@ import { Checkbox, Select } from '@gnomad/ui' import gnomadV2AgeDistribution from '@gnomad/dataset-metadata/datasets/gnomad-v2/ageDistribution.json' import gnomadV3AgeDistribution from '@gnomad/dataset-metadata/datasets/gnomad-v3/ageDistribution.json' +import gnomadV4AgeDistribution from '@gnomad/dataset-metadata/datasets/gnomad-v4/ageDistribution.json' + import { DatasetId, isV2, isV3, + isV4, showAllIndividualsInAgeDistributionByDefault, } from '@gnomad/dataset-metadata/metadata' @@ -49,31 +52,31 @@ const prepareVariantData = ({ [ exomeData ? (includeHeterozygotes ? exomeData.het.n_smaller : 0) + - (includeHomozygotes ? exomeData.hom.n_smaller : 0) + (includeHomozygotes ? exomeData.hom.n_smaller : 0) : 0, genomeData ? (includeHeterozygotes ? genomeData.het.n_smaller : 0) + - (includeHomozygotes ? genomeData.hom.n_smaller : 0) + (includeHomozygotes ? genomeData.hom.n_smaller : 0) : 0, ], ...[...Array(nBins)].map((_, i) => [ exomeData ? (includeHeterozygotes ? exomeData.het.bin_freq[i] : 0) + - (includeHomozygotes ? exomeData.hom.bin_freq[i] : 0) + (includeHomozygotes ? exomeData.hom.bin_freq[i] : 0) : 0, genomeData ? (includeHeterozygotes ? genomeData.het.bin_freq[i] : 0) + - (includeHomozygotes ? genomeData.hom.bin_freq[i] : 0) + (includeHomozygotes ? genomeData.hom.bin_freq[i] : 0) : 0, ]), [ exomeData ? (includeHeterozygotes ? exomeData.het.n_larger : 0) + - (includeHomozygotes ? exomeData.hom.n_larger : 0) + (includeHomozygotes ? exomeData.hom.n_larger : 0) : 0, genomeData ? (includeHeterozygotes ? genomeData.het.n_larger : 0) + - (includeHomozygotes ? genomeData.hom.n_larger : 0) + (includeHomozygotes ? genomeData.hom.n_larger : 0) : 0, ], ] @@ -81,7 +84,9 @@ const prepareVariantData = ({ const prepareOverallData = ({ datasetId, includeExomes, includeGenomes }: any) => { let overallAgeDistribution = null - if (isV3(datasetId)) { + if (isV4(datasetId)) { + overallAgeDistribution = gnomadV4AgeDistribution + } else if (isV3(datasetId)) { overallAgeDistribution = gnomadV3AgeDistribution } else if (isV2(datasetId)) { overallAgeDistribution = gnomadV2AgeDistribution @@ -211,9 +216,8 @@ const GnomadAgeDistribution = ({ datasetId, variant }: GnomadAgeDistributionProp carriersDescription = 'homozygous ' } - tooltipText = `${nVariantCarriers.toLocaleString()} ${carriersDescription}variant carrier${ - nVariantCarriers !== 1 ? 's' : '' - }` + tooltipText = `${nVariantCarriers.toLocaleString()} ${carriersDescription}variant carrier${nVariantCarriers !== 1 ? 's' : '' + }` } const nTotalIndividuals = @@ -223,16 +227,14 @@ const GnomadAgeDistribution = ({ datasetId, variant }: GnomadAgeDistributionProp tooltipText += ' and ' } - tooltipText += `${nTotalIndividuals.toLocaleString()} total individual${ - nTotalIndividuals ? 's' : '' - }` + tooltipText += `${nTotalIndividuals.toLocaleString()} total individual${nTotalIndividuals ? 's' : '' + }` } - tooltipText += ` ${ - showVariantCarriers !== showAllIndividuals && nVariantCarriers + nTotalIndividuals === 1 - ? 'is' - : 'are' - } in the ${bin} age range` + tooltipText += ` ${showVariantCarriers !== showAllIndividuals && nVariantCarriers + nTotalIndividuals === 1 + ? 'is' + : 'are' + } in the ${bin} age range` return tooltipText }} /> diff --git a/browser/src/VariantPage/VariantInSilicoPredictors.tsx b/browser/src/VariantPage/VariantInSilicoPredictors.tsx index caa98cef2..017ed31b3 100644 --- a/browser/src/VariantPage/VariantInSilicoPredictors.tsx +++ b/browser/src/VariantPage/VariantInSilicoPredictors.tsx @@ -2,12 +2,17 @@ import React from 'react' import styled from 'styled-components' import { Badge, List, ListItem } from '@gnomad/ui' +import { DatasetId, isV4 } from '@gnomad/dataset-metadata/metadata' const PREDICTORS = { cadd: { label: 'CADD', warningThreshold: 10, dangerThreshold: 20 }, revel: { label: 'REVEL', warningThreshold: 0.5, dangerThreshold: 0.75 }, primate_ai: { label: 'PrimateAI', warningThreshold: 0.5, dangerThreshold: 0.7 }, splice_ai: { label: 'SpliceAI', warningThreshold: 0.5, dangerThreshold: 0.8 }, + pangolin: { label: "Pangolin" }, + sift: { label: "SIFT" }, + polyphen: { label: "PolyPhen" }, + phylop: { label: "phyloP" }, } const FLAG_DESCRIPTIONS = { @@ -43,27 +48,30 @@ type Props = { flags: string[] }[] } + datasetId: DatasetId } -const VariantInSilicoPredictors = ({ variant }: Props) => { +const VariantInSilicoPredictors = ({ variant, datasetId }: Props) => { return (
    -

    + {!isV4(datasetId) &&

    Transcript-specific predictors SIFT and Polyphen are listed with Variant Effect Predictor annotations. -

    +

    } {/* @ts-expect-error TS(2745) FIXME: This JSX tag's 'children' prop expects type 'never... Remove this comment to see the full error message */} - {variant.in_silico_predictors.map(({ id, value, flags }) => { + {variant.in_silico_predictors && variant.in_silico_predictors.map(({ id, value, flags }) => { // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message const predictor = PREDICTORS[id] let color = null const parsedValue = parseFloat(value) if (!Number.isNaN(parsedValue)) { - if (parsedValue >= predictor.dangerThreshold) { + if (!predictor.dangerThreshold || !predictor.warningThreshold) { + color = 'grey' + } else if (predictor && predictor.dangerThreshold && parsedValue >= predictor.dangerThreshold) { color = '#FF583F' - } else if (parsedValue >= predictor.warningThreshold) { + } else if (predictor && predictor.warningThreshold && parsedValue >= predictor.warningThreshold) { color = '#F0C94D' } else { color = 'green' diff --git a/browser/src/VariantPage/VariantOccurrenceTable.tsx b/browser/src/VariantPage/VariantOccurrenceTable.tsx index de91f27cc..7bb914bf4 100644 --- a/browser/src/VariantPage/VariantOccurrenceTable.tsx +++ b/browser/src/VariantPage/VariantOccurrenceTable.tsx @@ -196,6 +196,8 @@ export const GnomadVariantOccurrenceTable = ({ }: GnomadVariantOccurrenceTableProps) => { const showTotal = showExomes && showGenomes + console.log(variant.faf95_joint) + const isPresentInExome = Boolean(variant.exome) const isPresentInGenome = Boolean(variant.genome) @@ -242,6 +244,9 @@ export const GnomadVariantOccurrenceTable = ({ exomeMaxAN = datasetSampleCounts.exomesTotal * 2 genomeMaxAN = datasetSampleCounts.genomesTotal * 2 } + + + const hasLowAlleleNumberInExomes = isPresentInExome && variant.exome.an < exomeMaxAN / 2 const hasLowAlleleNumberInGenomes = isPresentInGenome && variant.genome.an < genomeMaxAN / 2 @@ -249,11 +254,11 @@ export const GnomadVariantOccurrenceTable = ({ // See https://gnomad.broadinstitute.org/help/why-are-some-variants-depleted-for-homozygotes-out-of-hardy-weinberg-equilibrium const exomeHighAlleleBalanceSamples = isPresentInExome ? variant.exome.quality_metrics.allele_balance.alt.bin_freq[18] + - variant.exome.quality_metrics.allele_balance.alt.bin_freq[19] + variant.exome.quality_metrics.allele_balance.alt.bin_freq[19] : 0 const genomeHighAlleleBalanceSamples = isPresentInGenome ? variant.genome.quality_metrics.allele_balance.alt.bin_freq[18] + - variant.genome.quality_metrics.allele_balance.alt.bin_freq[19] + variant.genome.quality_metrics.allele_balance.alt.bin_freq[19] : 0 const totalHighAlleleBalanceSamples = exomeHighAlleleBalanceSamples + genomeHighAlleleBalanceSamples @@ -359,7 +364,7 @@ export const GnomadVariantOccurrenceTable = ({ {showGenomes && ( {isPresentInGenome && } )} - {showTotal && } + {showTotal && variant.faf95_joint && } {variant.chrom !== 'Y' && ( diff --git a/browser/src/VariantPage/VariantPage.tsx b/browser/src/VariantPage/VariantPage.tsx index 71e638055..ff0203137 100644 --- a/browser/src/VariantPage/VariantPage.tsx +++ b/browser/src/VariantPage/VariantPage.tsx @@ -256,10 +256,12 @@ export type Coverage = { over_100: number | null } + export type Variant = { variant_id: string reference_genome: ReferenceGenome colocated_variants: string[] | null + faf95_joint: Faf95 chrom: string pos: number ref: string @@ -383,7 +385,7 @@ export const VariantPageContent = ({ datasetId, variant }: VariantPageContentPro

    In Silico Predictors

    {/* @ts-expect-error TS(2322) FIXME: Type '{ variant_id: string; chrom: string; flags: ... Remove this comment to see the full error message */} - +
    )} {hasNonCodingConstraints(datasetId) && ( @@ -451,6 +453,10 @@ query ${operationName}($variantId: String!, $datasetId: DatasetId!, $referenceGe alt caid colocated_variants + faf95_joint { + popmax + popmax_population + } coverage { exome { mean @@ -790,12 +796,12 @@ const VariantPage = ({ datasetId, variantId }: VariantPageProps) => { {graphQLErrors && graphQLErrors.length ? Array.from( - new Set( - graphQLErrors - .filter((e: any) => !e.message.includes('ClinVar')) - .map((e: any) => e.message) - ) - ).join(', ') + new Set( + graphQLErrors + .filter((e: any) => !e.message.includes('ClinVar')) + .map((e: any) => e.message) + ) + ).join(', ') : 'Unable to load variant'} ) diff --git a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx index 1f9a00656..508847398 100644 --- a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx +++ b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx @@ -11,7 +11,10 @@ import exacSiteQualityMetricDistributions from '@gnomad/dataset-metadata/dataset import gnomadV2SiteQualityMetricDistributions from '@gnomad/dataset-metadata/datasets/gnomad-v2/siteQualityMetricDistributions.json' import gnomadV3SiteQualityMetricDistributions from '@gnomad/dataset-metadata/datasets/gnomad-v3/siteQualityMetricDistributions.json' -import { DatasetId, isV2, isV3, isExac } from '@gnomad/dataset-metadata/metadata' +import gnomadV4ExomeSiteQualityMetricDistributions from '@gnomad/dataset-metadata/datasets/gnomad-v4/exomeSiteQualityMetricDistributions.json' +import gnomadV4GenomeSiteQualityMetricDistributions from '@gnomad/dataset-metadata/datasets/gnomad-v4/genomeSiteQualityMetricDistributions.json' + +import { DatasetId, isV2, isV3, isV4, isExac } from '@gnomad/dataset-metadata/metadata' import Legend from '../Legend' import ControlSection from './ControlSection' import { Variant, SequencingType } from './VariantPage' @@ -54,28 +57,43 @@ const getSiteQualityMetricDescription = (datasetId: any) => { // ================================================================================================ // Data munging // ================================================================================================ +// +// + +interface MetricDistribution { + bin_edges: number[] + bin_freq: number[] + n_smaller: number + n_larger: number + metric: string +} -const prepareDataGnomadV3 = ({ metric, genome }: { metric: string; genome: SequencingType }) => { +interface SequencingTypeMetrics { binEdges: number[], binValues: number[], metricValue: number, description: string } + + +const getMetricDataForSequencingType = ({ metric, genomeOrExome, metricDistributions }: { metric: string; genomeOrExome: SequencingType, metricDistributions: MetricDistribution[] }): SequencingTypeMetrics => { let key: any let description - const genomeMetric = genome.quality_metrics.site_quality_metrics.find( + const genomeOrExomeMetric = genomeOrExome.quality_metrics.site_quality_metrics.find( (m: any) => m.metric === metric ) - const genomeMetricValue = genomeMetric && genomeMetric.value + const metricValue = genomeOrExomeMetric && genomeOrExomeMetric.value - const { ac, an } = genome + if (!metricValue) { + throw Error("Could not determine metric value") + } + + const { ac, an } = genomeOrExome if (metric === 'SiteQuality' || metric === 'AS_QUALapprox') { if (ac === 1) { key = `${metric === 'SiteQuality' ? 'QUALapprox' : metric}-binned_singleton` - description = `${ - metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' - } approximation for all singleton variants.` + description = `${metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' + } approximation for all singleton variants.` } else if (ac === 2) { key = `${metric === 'SiteQuality' ? 'QUALapprox' : metric}-binned_doubleton` - description = `${ - metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' - } approximation for all doubleton variants.` + description = `${metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' + } approximation for all doubleton variants.` } else { const afBins = [ { min: 0, max: 0.00005, key: '0.00005' }, @@ -97,25 +115,23 @@ const prepareDataGnomadV3 = ({ metric, genome }: { metric: string; genome: Seque const afBin = afBins.find((bin: any) => bin.min <= af && af < bin.max) // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. if (afBin.max === Infinity) { - description = `${ - metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' - } approximation for all variants with AF >= ${ + description = `${metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' + } approximation for all variants with AF >= ${ // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. afBin.min - }.` + }.` } else - description = `${ - metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' - } approximation for all variants with ${ + description = `${metric === 'SiteQuality' ? 'Site quality' : 'Allele-specific variant qual' + } approximation for all variants with ${ // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. afBin.min - } <= AF ${ + } <= AF ${ // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. afBin.max === 1 ? '<=' : '<' - } ${ + } ${ // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. afBin.max - }.` + }.` // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. key = `${metric === 'SiteQuality' ? 'QUALapprox' : metric}-binned_${afBin.key}` } @@ -136,22 +152,65 @@ const prepareDataGnomadV3 = ({ metric, genome }: { metric: string; genome: Seque if (baseDescription) { description = `Allele-specific ${baseDescription .charAt(0) - .toLowerCase()}${baseDescription.slice(1)}` + .toLowerCase()}${baseDescription.slice(1)}` as string } } else { - // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message - description = qualityMetricDescriptions[metric] + // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message + description = qualityMetricDescriptions[metric] as string } } - const histogram = gnomadV3SiteQualityMetricDistributions.find((m: any) => m.metric === key) - // @ts-expect-error - const binEdges = histogram.bin_edges + if (!description) { + throw new Error("Could not determine description") + } + + const histogram = metricDistributions.find((m: any) => m.metric === key) + + if (histogram) { + + const binEdges = histogram.bin_edges + + const binValues = [histogram.n_smaller, ...histogram.bin_freq, histogram.n_larger] - // @ts-expect-error - const genomeBinValues = [histogram.n_smaller, ...histogram.bin_freq, histogram.n_larger] + return { binEdges, binValues, metricValue, description } + + } else { + throw new Error(`Metric ${key} could not be found`) + } - return { binEdges, genomeBinValues, genomeMetricValue, description } +} + +const prepareDataGnomadV4 = ({ metric, variant }: { metric: string; variant: Variant }) => { + let exomeMetrics: SequencingTypeMetrics | undefined + let genomeMetrics: SequencingTypeMetrics | undefined + let binEdges: number[] | undefined + let description: string | undefined + + if (variant.exome) { + exomeMetrics = getMetricDataForSequencingType({ metric, genomeOrExome: variant.exome, metricDistributions: gnomadV4ExomeSiteQualityMetricDistributions }) + binEdges = exomeMetrics.binEdges + description = exomeMetrics.description + + } + + if (variant.genome) { + genomeMetrics = getMetricDataForSequencingType({ metric, genomeOrExome: variant.genome, metricDistributions: gnomadV4GenomeSiteQualityMetricDistributions }) + binEdges = genomeMetrics.binEdges + description = genomeMetrics.description + } + + return { + binEdges, + description, + exomeBinValues: exomeMetrics && exomeMetrics.binValues, + genomeBinValues: genomeMetrics && genomeMetrics.binValues, + exomeMetricValue: exomeMetrics && exomeMetrics.metricValue, + genomeMetricValue: genomeMetrics && genomeMetrics.metricValue, + } +} + +const prepareDataGnomadV3 = ({ metric, genome }: { metric: string; genome: SequencingType }) => { + return getMetricDataForSequencingType({ metric, genomeOrExome: genome, metricDistributions: gnomadV3SiteQualityMetricDistributions }) } const prepareDataGnomadV2 = ({ metric, variant }: any) => { @@ -196,9 +255,8 @@ const prepareDataGnomadV2 = ({ metric, variant }: any) => { (bin: any) => bin.min_af <= af && (af < bin.max_af || (af === 1 && af <= bin.max_af)) ) afBinHistogram = afBin.histogram - afBinLabel = `${sequencingType} variants with ${afBin.min_af} <= AF ${ - afBin.max_af === 1 ? '<=' : '<' - } ${afBin.max_af}` + afBinLabel = `${sequencingType} variants with ${afBin.min_af} <= AF ${afBin.max_af === 1 ? '<=' : '<' + } ${afBin.max_af}` } return { histogram: afBinHistogram, label: afBinLabel } } @@ -231,10 +289,10 @@ const prepareDataGnomadV2 = ({ metric, variant }: any) => { : null genomeBinValues = genomeBin ? [ - genomeBin.histogram.n_smaller, - ...genomeBin.histogram.bin_freq, - genomeBin.histogram.n_larger, - ] + genomeBin.histogram.n_smaller, + ...genomeBin.histogram.bin_freq, + genomeBin.histogram.n_larger, + ] : null if (variant.exome && variant.genome) { @@ -244,7 +302,7 @@ const prepareDataGnomadV2 = ({ metric, variant }: any) => { description = `This is the site quality distribution for all ${ // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. (exomeBin || genomeBin).label - }.` + }.` } } else { // @ts-expect-error @@ -317,7 +375,7 @@ const prepareDataExac = ({ metric, variant }: any) => { // @ts-expect-error afBin.min_af // @ts-expect-error - } <= AF ${afBin.max_af === 1 ? '<=' : '<'} ${afBin.max_af}.` + } <= AF ${afBin.max_af === 1 ? '<=' : '<'} ${afBin.max_af}.` } binEdges = histogram.bin_edges.map((edge: any) => Math.log10(edge)) } else { @@ -329,7 +387,7 @@ const prepareDataExac = ({ metric, variant }: any) => { metric === 'DP' ? histogram.bin_edges.map((edge: any) => Math.log10(edge)) : // @ts-expect-error - histogram.binEdges + histogram.binEdges // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message description = qualityMetricDescriptions[metric] } @@ -348,6 +406,11 @@ const prepareData = ({ metric: string variant: Variant }) => { + + if (isV4(datasetId)) { + return prepareDataGnomadV4({ metric, variant }) + } + if (isV3(datasetId)) { return prepareDataGnomadV3({ metric, genome: variant.genome! }) } @@ -364,6 +427,23 @@ const prepareData = ({ } const getAvailableMetrics = (datasetId: any) => { + if (isV4(datasetId)) { + return [ + 'SiteQuality', + 'InbreedingCoeff', + 'AS_FS', + 'AS_MQ', + 'AS_MQRankSum', + 'AS_pab_max', + 'AS_QUALapprox', + 'AS_QD', + 'AS_ReadPosRankSum', + 'AS_SOR', + 'AS_VarDP', + 'AS_VQSLOD', + ] + } + if (isV3(datasetId)) { return [ 'SiteQuality', @@ -560,11 +640,11 @@ const SiteQualityMetricsHistogram = ({ const primaryYScale = primaryYDomain ? // @ts-expect-error TS(2345) FIXME: Argument of type '(string | number)[]' is not assi... Remove this comment to see the full error message - scaleLinear().domain(primaryYDomain).range([plotHeight, 0]) + scaleLinear().domain(primaryYDomain).range([plotHeight, 0]) : null const secondaryYScale = secondaryYDomain ? // @ts-expect-error TS(2345) FIXME: Argument of type '(string | number)[]' is not assi... Remove this comment to see the full error message - scaleLinear().domain(secondaryYDomain).range([plotHeight, 0]) + scaleLinear().domain(secondaryYDomain).range([plotHeight, 0]) : null const halfBandWidth = bandWidth / 2 @@ -572,49 +652,49 @@ const SiteQualityMetricsHistogram = ({ const renderBars = exomeBinValues && genomeBinValues ? (binIndex: any) => { - // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. - const primaryY = primaryYScale(primaryValues[binIndex]) - // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. - const secondaryY = secondaryYScale(secondaryValues[binIndex]) - return ( - - - - - ) - } - : (binIndex: any) => { - // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. - const y = primaryYScale(primaryValues[binIndex]) - return ( + // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. + const primaryY = primaryYScale(primaryValues[binIndex]) + // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. + const secondaryY = secondaryYScale(secondaryValues[binIndex]) + return ( + - ) - } + + + ) + } + : (binIndex: any) => { + // @ts-expect-error TS(2531) FIXME: Object is possibly 'null'. + const y = primaryYScale(primaryValues[binIndex]) + return ( + + ) + } const getMetricValueX = (metricValue: any) => { const scaledValue = isLogScale ? Math.log10(metricValue) : metricValue @@ -882,19 +962,15 @@ const VariantSiteQualityMetricsDistribution = ({ let values if (variant.exome && variant.genome) { - values = `${ - exomeMetricValue === null ? '–' : formatMetricValue(exomeMetricValue, selectedMetric) - } (exome samples), ${ - genomeMetricValue === null ? '–' : formatMetricValue(genomeMetricValue, selectedMetric) - } (genome samples)` + values = `${exomeMetricValue === null ? '–' : formatMetricValue(exomeMetricValue, selectedMetric) + } (exome samples), ${genomeMetricValue === null ? '–' : formatMetricValue(genomeMetricValue, selectedMetric) + } (genome samples)` } else if (variant.exome) { - values = `${ - exomeMetricValue === null ? '–' : formatMetricValue(exomeMetricValue, selectedMetric) - } (exome samples)` + values = `${exomeMetricValue === null ? '–' : formatMetricValue(exomeMetricValue, selectedMetric) + } (exome samples)` } else { - values = `${ - genomeMetricValue === null ? '–' : formatMetricValue(genomeMetricValue, selectedMetric) - } (genome samples)` + values = `${genomeMetricValue === null ? '–' : formatMetricValue(genomeMetricValue, selectedMetric) + } (genome samples)` } return ( @@ -1019,21 +1095,21 @@ const VariantSiteQualityMetricsTable = ({ const exomeMetricValues: Record | null = variant.exome ? variant.exome.quality_metrics.site_quality_metrics.reduce( - (acc, m) => ({ - ...acc, - [m.metric]: m.value, - }), - {} - ) + (acc, m) => ({ + ...acc, + [m.metric]: m.value, + }), + {} + ) : null const genomeMetricValues: Record | null = variant.genome ? variant.genome.quality_metrics.site_quality_metrics.reduce( - (acc, m) => ({ - ...acc, - [m.metric]: m.value, - }), - {} - ) + (acc, m) => ({ + ...acc, + [m.metric]: m.value, + }), + {} + ) : null const availableMetrics = getAvailableMetrics(datasetId) diff --git a/browser/src/__snapshots__/DatasetSelector.spec.tsx.snap b/browser/src/__snapshots__/DatasetSelector.spec.tsx.snap index b03610583..066b18b12 100644 --- a/browser/src/__snapshots__/DatasetSelector.spec.tsx.snap +++ b/browser/src/__snapshots__/DatasetSelector.spec.tsx.snap @@ -16100,6 +16100,540 @@ exports[`DataSelector with "gnomad_r4" dataset selected has no unexpected change `; +exports[`DataSelector with "gnomad_r4" dataset selected has no unexpected changes 1`] = ` +.c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 0; + border: 1px solid #6c757d; + border-radius: 0.5em; + margin: 0; + list-style-type: none; +} + +.c3 { + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + box-sizing: border-box; + height: 100%; + padding: 0.375em 0.25em; + color: #000; + outline: none; + -webkit-text-decoration: none; + text-decoration: none; +} + +.c3:visited { + color: #000; +} + +.c3:focus { + box-shadow: 0 0 0 0.2em rgba(66,139,202,0.5); +} + +.c1 { + position: relative; + display: inline-block; +} + +.c1 .c2 { + background: #cbd3da; +} + +.c1:first-child .c2 { + padding-left: 0.75em; + border-top-left-radius: 0.5em; + border-bottom-left-radius: 0.5em; +} + +.c1:last-child .c2 { + padding-right: 0.75em; + border-top-right-radius: 0.5em; + border-bottom-right-radius: 0.5em; +} + +.c9 { + position: relative; + display: inline-block; +} + +.c9 .c2 { + background: none; +} + +.c9:first-child .c2 { + padding-left: 0.75em; + border-top-left-radius: 0.5em; + border-bottom-left-radius: 0.5em; +} + +.c9:last-child .c2 { + padding-right: 0.75em; + border-top-right-radius: 0.5em; + border-bottom-right-radius: 0.5em; +} + +.c4 img { + position: relative; + top: 0.11em; + width: 0.9em; + height: 0.9em; +} + +.c5 { + position: absolute; + z-index: 1; + right: 0; + display: none; + width: 220px; + padding: 0.5em 0; + border: 1px solid #6c757d; + margin: 0; + background: #f8f9fa; + list-style-type: none; +} + +.c7 { + display: inline-block; + box-sizing: border-box; + width: 100%; + padding: 0.25em 0.5em; + color: #000; + -webkit-text-decoration: none; + text-decoration: none; +} + +.c7:visited { + color: #000; +} + +.c7:active, +.c7:focus, +.c7:hover { + background: rgba(66,139,202,0.25); +} + +.c7:focus { + outline: 2px solid #428bca; +} + +.c8 { + margin-top: 0.125em; + margin-left: 5px; + font-size: 0.8em; + opacity: 0.6; +} + +.c6 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + margin-left: 2px; + font-weight: bold; +} + +@media (max-width:1200px) { + .c5 { + right: auto; + left: -100px; + } +} + +@media (max-width:900px) { + .c5 { + left: -150px; + } +} + + +`; + exports[`DataSelector with "gnomad_sv_r2_1" dataset selected has no unexpected changes 1`] = ` .c0 { display: -webkit-box; From 573770ddc4ede53404eea0e76149c109032d470e Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 10:41:51 -0400 Subject: [PATCH 034/106] Configure starting selectedMetric based on dataset type --- browser/src/CoverageTrack.tsx | 6 ++++-- browser/src/GenePage/GeneCoverageTrack.tsx | 1 + browser/src/RegionPage/RegionCoverageTrack.tsx | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/browser/src/CoverageTrack.tsx b/browser/src/CoverageTrack.tsx index 0dabff2ca..c0f24861b 100644 --- a/browser/src/CoverageTrack.tsx +++ b/browser/src/CoverageTrack.tsx @@ -7,6 +7,7 @@ import { AxisLeft } from '@vx/axis' // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module '@gno... Remove this comment to see the full error message import { Track } from '@gnomad/region-viewer' import { Button, Select } from '@gnomad/ui' +import { DatasetId, isV4 } from '@gnomad/dataset-metadata/metadata' const TopPanel = styled.div` display: flex; @@ -88,6 +89,7 @@ type OwnCoverageTrackProps = { filenameForExport?: (...args: any[]) => any height?: number maxCoverage?: number + datasetId: DatasetId, } type CoverageTrackState = any @@ -105,7 +107,7 @@ class CoverageTrack extends Component { plotElement: any state = { - selectedMetric: 'over_30', + selectedMetric: isV4(this.props.datasetId) ? "over_30" : "mean", } plotRef = (el: any) => { @@ -157,7 +159,7 @@ class CoverageTrack extends Component { } renderBars({ isPositionDefined, scaleCoverageMetric, scalePosition, totalBases, width }: any) { - const { datasets, height } = this.props + const { datasets, height, datasetId } = this.props const { selectedMetric } = this.state const barWidth = width / totalBases - 1 diff --git a/browser/src/GenePage/GeneCoverageTrack.tsx b/browser/src/GenePage/GeneCoverageTrack.tsx index 718eb7d9f..b152abe81 100644 --- a/browser/src/GenePage/GeneCoverageTrack.tsx +++ b/browser/src/GenePage/GeneCoverageTrack.tsx @@ -97,6 +97,7 @@ const GeneCoverageTrack = ({ datasets={coverageConfig} filenameForExport={() => `${geneId}_coverage`} height={190} + datasetId={datasetId} /> ) }} diff --git a/browser/src/RegionPage/RegionCoverageTrack.tsx b/browser/src/RegionPage/RegionCoverageTrack.tsx index 3462bad85..0cacdea7b 100644 --- a/browser/src/RegionPage/RegionCoverageTrack.tsx +++ b/browser/src/RegionPage/RegionCoverageTrack.tsx @@ -102,9 +102,10 @@ const RegionCoverageTrack = ({ // @ts-expect-error TS(2769) FIXME: No overload matches this call. `${chrom}-${start}-${stop}_coverage`} + datasets={coverageConfig} height={200} + datasetId={datasetId} /> ) }} From 226ea58cc2795f6f380b739b7282d0063a082daa Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 10:42:56 -0400 Subject: [PATCH 035/106] Make v4 the default search dataset --- browser/src/Searchbox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/src/Searchbox.tsx b/browser/src/Searchbox.tsx index a080e720e..24075a77d 100644 --- a/browser/src/Searchbox.tsx +++ b/browser/src/Searchbox.tsx @@ -48,7 +48,7 @@ const getDefaultSearchDataset = (selectedDataset: any) => { return 'gnomad_cnv_r4' } } - return 'gnomad_r2_1' + return 'gnomad_r4' } export default withRouter((props: any) => { From 0011603b84a4f94fe9fa15fa4385eba6365de3c1 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 10:43:37 -0400 Subject: [PATCH 036/106] Set v3 coverage as the v4 genome coverage index --- graphql-api/src/queries/coverage-queries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql-api/src/queries/coverage-queries.ts b/graphql-api/src/queries/coverage-queries.ts index fa0dc0e9f..2e69071d1 100644 --- a/graphql-api/src/queries/coverage-queries.ts +++ b/graphql-api/src/queries/coverage-queries.ts @@ -8,7 +8,7 @@ import { assertDatasetAndReferenceGenomeMatch } from './helpers/validation-helpe const COVERAGE_INDICES = { gnomad_r4: { exome: 'gnomad_v4_exome_coverage', - genome: 'gnomad_v4_genome_coverage', + genome: 'gnomad_v3_genome_coverage', }, gnomad_cnv_r4: { exome: 'gnomad_v4_exome_coverage', From cd5bea2e19cd62176872e4e66d4790317f3b8efb Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 10:44:47 -0400 Subject: [PATCH 037/106] Update pipeline tables to current state --- .../pipelines/export_to_elasticsearch.py | 16 +++++------ .../pipelines/gnomad_v4_coverage.py | 27 ++++++++++--------- .../pipelines/gnomad_v4_variants.py | 17 +++++++----- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py index 623e135ed..709a788a0 100644 --- a/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py +++ b/data-pipeline/src/data_pipeline/pipelines/export_to_elasticsearch.py @@ -134,7 +134,7 @@ def add_liftover_document_id(ds): "transcript_consequences.transcript_id", ], "id_field": "document_id", - "num_shards": 2, + "num_shards": 48, "block_size": 1_000, }, }, @@ -142,14 +142,14 @@ def add_liftover_document_id(ds): "get_table": lambda: subset_table( hl.read_table(gnomad_v4_coverage_pipeline.get_output("exome_coverage").get_output_path()) ), - "args": {"index": "gnomad_v4_exome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, - }, - "gnomad_v4_genome_coverage": { - "get_table": lambda: subset_table( - hl.read_table(gnomad_v4_coverage_pipeline.get_output("genome_coverage").get_output_path()) - ), - "args": {"index": "gnomad_v4_genome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, + "args": {"index": "gnomad_v4_exome_coverage", "id_field": "xpos", "num_shards": 48, "block_size": 10_000}, }, + # "gnomad_v4_genome_coverage": { + # "get_table": lambda: subset_table( + # hl.read_table(gnomad_v4_coverage_pipeline.get_output("genome_coverage").get_output_path()) + # ), + # "args": {"index": "gnomad_v4_genome_coverage", "id_field": "xpos", "num_shards": 2, "block_size": 10_000}, + # }, ############################################################################################################## # gnomAD v4 CNVs ############################################################################################################## diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py index 2a88eeb52..569917838 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_coverage.py @@ -2,29 +2,30 @@ from data_pipeline.data_types.coverage import prepare_coverage +output_sub_dir = "gnomad_v4_20231027T203139" pipeline = Pipeline() pipeline.add_task( name="prepare_gnomad_v4_exome_coverage", task_function=prepare_coverage, - output_path="/gnomad_v4/gnomad_v4_exome_coverage.ht", + output_path=f"/{output_sub_dir}/gnomad_v4_exome_coverage.ht", inputs={ "coverage_path": "gs://gnomad-v4-coverage-testing/release/4.0/ht/exomes/gnomad.exomes.v4.0.coverage.ht", }, - params={"filter_intervals": ["chr1:55039447-55064852"]}, + # params={"filter_intervals": ["chr1:55039447-55064852"]}, ) -pipeline.add_task( - name="prepare_gnomad_v4_genome_coverage", - task_function=prepare_coverage, - output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", - # Using v3 coverage as mock for now - inputs={ - "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", - }, - params={"filter_intervals": ["chr1:55039447-55064852"]}, -) +# pipeline.add_task( +# name="prepare_gnomad_v4_genome_coverage", +# task_function=prepare_coverage, +# output_path="/gnomad_v4/gnomad_v4_genome_coverage.ht", +# # Using v3 coverage as mock for now +# inputs={ +# "coverage_path": "gs://gcp-public-data--gnomad/release/3.0.1/coverage/genomes/gnomad.genomes.r3.0.1.coverage.ht", +# }, +# # params={"filter_intervals": ["chr1:55039447-55064852"]}, +# ) ############################################### # Outputs @@ -33,7 +34,7 @@ pipeline.set_outputs( { "exome_coverage": "prepare_gnomad_v4_exome_coverage", - "genome_coverage": "prepare_gnomad_v4_genome_coverage", + # "genome_coverage": "prepare_gnomad_v4_genome_coverage", } ) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index 8f423d0f5..fb0a5b1c9 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -43,12 +43,13 @@ def generate_iso_timestamp_for_filename(): # output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" -output_sub_dir = "gnomad_v4_20231027T135454" +# output_sub_dir = "gnomad_v4_20231027T135454" +output_sub_dir = "gnomad_v4_20231027T203139" config = PipelineConfig( name=pipeline_name, - input_root="gs://gnomad-matt-data-pipeline/2023-10-19/inputs", - output_root="gs://gnomad-matt-data-pipeline/2023-10-19/outputs", + input_root="gs://gnomad-v4-data-pipeline/input", + output_root="gs://gnomad-v4-data-pipeline/output", ) @@ -59,8 +60,10 @@ def generate_iso_timestamp_for_filename(): task_function=prepare_gnomad_v4_variants, output_path=f"{output_sub_dir}/gnomad_v4_variants_base.ht", inputs={ - "exome_variants_path": "variants/gnomad.exomes.v4.0.sites.pcsk9.ht", - "genome_variants_path": "variants/gnomad.genomes.v4.0.sites.pcsk9.ht", + # "exome_variants_path": "gs://gnomad-matt-data-pipeline/2023-10-19/inputs/variants/gnomad.exomes.v4.0.sites.pcsk9.ht", + # "genome_variants_path": "gs://gnomad-matt-data-pipeline/2023-10-19/inputs/variants/gnomad.genomes.v4.0.sites.pcsk9.ht", + "exome_variants_path": "gs://gnomad-matt-data-pipeline/exomes-2023-10-27/gnomad.exomes.v4.0.sites.ht", + "genome_variants_path": "gs://gnomad-matt-data-pipeline/genomes-2023-10-27/gnomad.genomes.v4.0.sites.ht", }, ) @@ -71,8 +74,8 @@ def generate_iso_timestamp_for_filename(): inputs=( { "variants_path": pipeline.get_task("prepare_gnomad_v4_variants"), - "exome_coverage_path": coverage_pipeline.get_output("exome_coverage"), - "genome_coverage_path": coverage_pipeline.get_output("genome_coverage"), + "exome_coverage_path": "gs://gnomad-matt-data-pipeline/gnomad_v4_coverage_test_2023-10-12-1142/gnomad_v4_exome_coverage.ht", + "genome_coverage_path": "gs://gnomad-browser-data-pipeline/output/gnomad_v3/gnomad_v3_genome_coverage.ht", # "caids_path": "gs://gnomad-browser-data-pipeline/caids/gnomad_v4_caids.ht", } ), From ad77f5e24d3702c3e5a82723a421346f50b03231 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 10:45:13 -0400 Subject: [PATCH 038/106] Add new in silico predictor thresholds --- .../VariantPage/VariantInSilicoPredictors.tsx | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/browser/src/VariantPage/VariantInSilicoPredictors.tsx b/browser/src/VariantPage/VariantInSilicoPredictors.tsx index 017ed31b3..2e238501b 100644 --- a/browser/src/VariantPage/VariantInSilicoPredictors.tsx +++ b/browser/src/VariantPage/VariantInSilicoPredictors.tsx @@ -9,10 +9,6 @@ const PREDICTORS = { revel: { label: 'REVEL', warningThreshold: 0.5, dangerThreshold: 0.75 }, primate_ai: { label: 'PrimateAI', warningThreshold: 0.5, dangerThreshold: 0.7 }, splice_ai: { label: 'SpliceAI', warningThreshold: 0.5, dangerThreshold: 0.8 }, - pangolin: { label: "Pangolin" }, - sift: { label: "SIFT" }, - polyphen: { label: "PolyPhen" }, - phylop: { label: "phyloP" }, } const FLAG_DESCRIPTIONS = { @@ -22,6 +18,21 @@ const FLAG_DESCRIPTIONS = { splice_ai: { has_duplicate: 'This variant has multiple SpliceAI scores' }, } +const PREDICTORS_V4 = { + cadd_phred: { label: 'CADD', warningThreshold: 25.3, dangerThreshold: 28.1 }, + revel: { label: 'REVEL', warningThreshold: 0.644, dangerThreshold: 0.773 }, + splice_ai: { label: 'SpliceAI', warningThreshold: 0.2, dangerThreshold: 0.5 }, + pangolin: { label: 'Pangolin', warningThreshold: 0.2, dangerThreshold: 0.5 }, + phylop: { label: 'phyloP', warningThreshold: 7.367, dangerThreshold: 9.741 }, + sift: { label: 'SIFT (max)', warningThreshold: 0.001, dangerThreshold: 0 }, + polyphen: { label: 'PolyPhen (max)', warningThreshold: 0.978, dangerThreshold: 0.999 }, +} + +const FLAG_DESCRIPTIONS_V4 = { + // polyphen: "We prioritized max scores for MANE Select or canonical transcripts if a prediction score was available for multiple transcripts." + // sift: "We prioritized max scores for MANE Select or canonical transcripts if a prediction score was available for multiple transcripts." +} + const Marker = styled.span` display: inline-block; width: 10px; @@ -52,6 +63,9 @@ type Props = { } const VariantInSilicoPredictors = ({ variant, datasetId }: Props) => { + const predictors = isV4(datasetId) ? PREDICTORS_V4 : PREDICTORS + const flag_descriptions = isV4(datasetId) ? FLAG_DESCRIPTIONS_V4 : FLAG_DESCRIPTIONS + return (
    {!isV4(datasetId) &&

    @@ -62,7 +76,7 @@ const VariantInSilicoPredictors = ({ variant, datasetId }: Props) => { {variant.in_silico_predictors && variant.in_silico_predictors.map(({ id, value, flags }) => { // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message - const predictor = PREDICTORS[id] + const predictor = predictors[id] let color = null const parsedValue = parseFloat(value) @@ -88,7 +102,7 @@ const VariantInSilicoPredictors = ({ variant, datasetId }: Props) => {

    Note{' '} {/* @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message */} - {flags.map((flag) => FLAG_DESCRIPTIONS[id][flag] || flag).join(', ')} + {flags.map((flag) => flag_descriptions[id][flag] || flag).join(', ')}

    )} @@ -102,7 +116,7 @@ const VariantInSilicoPredictors = ({ variant, datasetId }: Props) => {

    Note{' '} {/* @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message */} - {flags.map((flag) => FLAG_DESCRIPTIONS[id][flag] || flag).join(', ')} + {flags.map((flag) => flag_descriptions[id][flag] || flag).join(', ')}

    )} From a34c27f222dab3a9aa1e26f7b03e4a8ed3280d32 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 11:15:50 -0400 Subject: [PATCH 039/106] Add AC0 filter to exome variants, get transcript query working --- .../gnomad-v4-variant-queries.ts | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts index 44b398fa8..5cf6d57fd 100644 --- a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts +++ b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts @@ -87,6 +87,10 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any filters.push('AC0') } + if (variant.exome.freq[subset].ac === 0 && !filters.includes('AC0')) { + filters.push('AC0') + } + const flags = getFlagsForContext({ type: 'region' })(variant) let { ancestry_groups: genome_ancestry_groups } = variant.genome.freq[subset] @@ -234,17 +238,18 @@ const shapeVariantSummary = (subset: any, context: any) => { const filters = variant.genome.filters || [] + const hasExomeVariant = variant.exome.freq[subset].ac_raw + const hasGenomeVariant = variant.genome.freq[subset].ac_raw + + if (variant.genome.freq[subset].ac === 0 && !filters.includes('AC0')) { filters.push('AC0') } - // console.log(variant.exome, variant.genome) - - const hasExomeVariant = variant.exome.freq[subset].ac_raw - const hasGenomeVariant = variant.genome.freq[subset].ac_raw + if (variant.exome.freq[subset].ac === 0 && !filters.includes('AC0')) { + filters.push('AC0') + } - // console.log(hasGenomeVariant, variant.exome.freq.all) - // const hasJointFafData = variant.faf95_joint && variant.faf99_joint return { @@ -391,7 +396,7 @@ const fetchVariantsByRegion = async (esClient: any, region: any, subset: any) => 'value.exome.filters', 'value.genome.filters', 'value.alleles', - 'value.caid', + // 'value.caid', 'value.locus', 'value.flags', 'value.rsids', @@ -429,6 +434,18 @@ const fetchVariantsByRegion = async (esClient: any, region: any, subset: any) => // ================================================================================================ const fetchVariantsByTranscript = async (esClient: any, transcript: any, subset: any) => { + + subset = "all" + + let exomeSubset = "all" + let genomeSubset = "all" + + if (subset === "tgp" || subset === "hgdp") { + genomeSubset = subset + } + if (subset === "non_ukb") { + exomeSubset = "non_ukb" + } const filteredRegions = transcript.exons.filter((exon: any) => exon.feature_type === 'CDS') const sortedRegions = filteredRegions.sort((r1: any, r2: any) => r1.xstart - r2.xstart) const padding = 75 @@ -456,10 +473,13 @@ const fetchVariantsByTranscript = async (esClient: any, transcript: any, subset: type: '_doc', size: 10000, _source: [ - `value.genome.freq.${subset}`, + `value.exome.freq.${exomeSubset}`, + `value.genome.freq.${genomeSubset}`, + 'value.exome.filters', + 'value.genome.filters', 'value.genome.filters', 'value.alleles', - 'value.caid', + // 'value.caid', 'value.locus', 'value.flags', 'value.rsids', From de45b897af7adf30e6c068c5904954f0616475d9 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 11:16:24 -0400 Subject: [PATCH 040/106] Add datasetId prop to TranscriptCoverageTrack --- browser/src/TranscriptPage/TranscriptCoverageTrack.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/src/TranscriptPage/TranscriptCoverageTrack.tsx b/browser/src/TranscriptPage/TranscriptCoverageTrack.tsx index 0a0b96dab..f920bf1c8 100644 --- a/browser/src/TranscriptPage/TranscriptCoverageTrack.tsx +++ b/browser/src/TranscriptPage/TranscriptCoverageTrack.tsx @@ -99,6 +99,7 @@ const TranscriptCoverageTrack = ({ datasets={coverageConfig} filenameForExport={() => `${transcriptId}_coverage`} height={190} + datasetId={datasetId} /> ) }} From ac849daf27efac532475f7d8a3be4219869c9273 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 11:23:02 -0400 Subject: [PATCH 041/106] Make v4 the default dataset in the router --- browser/src/Routes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/src/Routes.tsx b/browser/src/Routes.tsx index a82e7b813..a75d11b8d 100644 --- a/browser/src/Routes.tsx +++ b/browser/src/Routes.tsx @@ -35,7 +35,7 @@ const VariantCooccurrencePage = lazy( const PageNotFoundPage = lazy(() => import('./PageNotFoundPage')) const SearchRedirectPage = lazy(() => import('./SearchRedirectPage')) -const defaultDataset = 'gnomad_r2_1' +const defaultDataset = 'gnomad_r4' const Routes = () => { // ================================================================================== From 6553d88a6bc1ca26aa04f430e7aef68cc456f82c Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 16:46:47 -0400 Subject: [PATCH 042/106] Add v4 read data --- browser/src/ReadData/ReadData.tsx | 145 ++++++++++-------- deploy/dockerfiles/reads/reads.nginx.conf | 18 +++ .../reads/base/reads.deployment.yaml | 2 +- .../reference-data/prepare_readviz_disk_v4.sh | 61 ++++++++ reads/src/datasets.js | 12 ++ 5 files changed, 175 insertions(+), 63 deletions(-) create mode 100644 reads/reference-data/prepare_readviz_disk_v4.sh diff --git a/browser/src/ReadData/ReadData.tsx b/browser/src/ReadData/ReadData.tsx index 691aa725e..d57e561b4 100644 --- a/browser/src/ReadData/ReadData.tsx +++ b/browser/src/ReadData/ReadData.tsx @@ -10,6 +10,7 @@ import { hasNonCodingReadData, readsDatasetId as getReadsDatasetId, readsIncludeLowQualityGenotypes, + isV4, } from '@gnomad/dataset-metadata/metadata' import { BaseQuery } from '../Query' import StatusMessage from '../StatusMessage' @@ -246,16 +247,16 @@ class ReadData extends Component { loadAllTracks() { const { tracksAvailable, tracksLoaded } = this.state - ;['exome', 'genome'].forEach((exomeOrGenome) => { - ;['het', 'hom', 'hemi'].forEach((category) => { - const tracksAvailableForCategory = tracksAvailable[exomeOrGenome][category] - const tracksLoadedForCategory = tracksLoaded[exomeOrGenome][category] + ;['exome', 'genome'].forEach((exomeOrGenome) => { + ;['het', 'hom', 'hemi'].forEach((category) => { + const tracksAvailableForCategory = tracksAvailable[exomeOrGenome][category] + const tracksLoadedForCategory = tracksLoaded[exomeOrGenome][category] - for (let i = tracksLoadedForCategory; i < tracksAvailableForCategory; i += 1) { - this.loadNextTrack(exomeOrGenome, category) - } + for (let i = tracksLoadedForCategory; i < tracksAvailableForCategory; i += 1) { + this.loadNextTrack(exomeOrGenome, category) + } + }) }) - }) } renderLoadMoreButton(exomeOrGenome: any, category: any) { @@ -288,42 +289,62 @@ class ReadData extends Component { const locus = `${chrom}:${start}-${stop}` - const browserConfig = + let browserConfig = referenceGenome === 'GRCh37' ? { - locus, - reference: { - fastaURL: '/reads/reference/Homo_sapiens_assembly19.fasta', - id: 'hg19', - indexURL: '/reads/reference/Homo_sapiens_assembly19.fasta.fai', + locus, + reference: { + fastaURL: '/reads/reference/Homo_sapiens_assembly19.fasta', + id: 'hg19', + indexURL: '/reads/reference/Homo_sapiens_assembly19.fasta.fai', + }, + tracks: [ + { + displayMode: 'SQUISHED', + indexURL: '/reads/reference/gencode.v19.bed.gz.tbi', + name: 'GENCODE v19', + removable: false, + url: '/reads/reference/gencode.v19.bed.gz', }, - tracks: [ - { - displayMode: 'SQUISHED', - indexURL: '/reads/reference/gencode.v19.bed.gz.tbi', - name: 'GENCODE v19', - removable: false, - url: '/reads/reference/gencode.v19.bed.gz', - }, - ], - } + ], + } : { - locus, - reference: { - fastaURL: '/reads/reference/Homo_sapiens_assembly38.fasta', - id: 'hg38', - indexURL: '/reads/reference/Homo_sapiens_assembly38.fasta.fai', + locus, + reference: { + fastaURL: '/reads/reference/Homo_sapiens_assembly38.fasta', + id: 'hg38', + indexURL: '/reads/reference/Homo_sapiens_assembly38.fasta.fai', + }, + tracks: [ + { + displayMode: 'SQUISHED', + indexURL: '/reads/reference/gencode.v35.bed.gz.tbi', + name: 'GENCODE v35', + removable: false, + url: '/reads/reference/gencode.v35.bed.gz', }, - tracks: [ - { - displayMode: 'SQUISHED', - indexURL: '/reads/reference/gencode.v35.bed.gz.tbi', - name: 'GENCODE v35', - removable: false, - url: '/reads/reference/gencode.v35.bed.gz', - }, - ], - } + ], + } + + if (isV4(datasetId)) { + browserConfig = { + locus, + reference: { + fastaURL: '/reads/reference/Homo_sapiens_assembly38.fasta', + id: 'hg38', + indexURL: '/reads/reference/Homo_sapiens_assembly38.fasta.fai', + }, + tracks: [ + { + displayMode: 'SQUISHED', + indexURL: '/reads/reference/gencode.v39.annotation.bed.bgz.tbi', + name: 'GENCODE v39', + removable: false, + url: '/reads/reference/gencode.v39.annotation.bed.bgz', + }, + ], + } + } return (
    @@ -406,18 +427,18 @@ class ReadData extends Component { const interleaveReads = (allVariantReads: any) => { let reads: any = [] - ;['het', 'hom', 'hemi'].forEach((category) => { - const allReadsInCategory = allVariantReads.map((variantReads: any) => - variantReads.filter((read: any) => read.category === category) - ) - while (allReadsInCategory.some((variantReads: any) => variantReads.length)) { - reads = reads.concat( - allReadsInCategory - .map((variantReads: any) => variantReads.shift()) - .filter((read: any) => read !== undefined) + ;['het', 'hom', 'hemi'].forEach((category) => { + const allReadsInCategory = allVariantReads.map((variantReads: any) => + variantReads.filter((read: any) => read.category === category) ) - } - }) + while (allReadsInCategory.some((variantReads: any) => variantReads.length)) { + reads = reads.concat( + allReadsInCategory + .map((variantReads: any) => variantReads.shift()) + .filter((read: any) => read !== undefined) + ) + } + }) return reads } @@ -437,11 +458,11 @@ const ReadDataContainer = ({ datasetId, variantIds }: ReadDataContainerProps) => const query = ` query ReadData { ${variantIds - .map( - ( - variantId, - i - ) => `variant_${i}: variantReads(dataset: ${readsDatasetId}, variantId: "${variantId}") { + .map( + ( + variantId, + i + ) => `variant_${i}: variantReads(dataset: ${readsDatasetId}, variantId: "${variantId}") { exome { bamPath category @@ -455,8 +476,8 @@ const ReadDataContainer = ({ datasetId, variantIds }: ReadDataContainerProps) => readGroup } }` - ) - .join('\n')} + ) + .join('\n')} } ` @@ -493,9 +514,9 @@ const ReadDataContainer = ({ datasetId, variantIds }: ReadDataContainerProps) => positionDifference > 80 ? [minPosition, maxPosition] : [ - minPosition - Math.ceil((80 - positionDifference) / 2), - maxPosition + Math.floor((80 - positionDifference) / 2), - ] + minPosition - Math.ceil((80 - positionDifference) / 2), + maxPosition + Math.floor((80 - positionDifference) / 2), + ] // Concatenate reads from all variants const exomeReads = interleaveReads( @@ -510,7 +531,7 @@ const ReadDataContainer = ({ datasetId, variantIds }: ReadDataContainerProps) => label: `${variantIds.length > 1 ? `${variantId} ` : ''}${category} [exome] #${ // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message categoryCount[category] - }`, + }`, } }) }) @@ -528,7 +549,7 @@ const ReadDataContainer = ({ datasetId, variantIds }: ReadDataContainerProps) => label: `${variantIds.length > 1 ? `${variantId} ` : ''}${category} [genome] #${ // @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message categoryCount[category] - }`, + }`, } }) }) diff --git a/deploy/dockerfiles/reads/reads.nginx.conf b/deploy/dockerfiles/reads/reads.nginx.conf index e567d04d1..eeaeb93d5 100644 --- a/deploy/dockerfiles/reads/reads.nginx.conf +++ b/deploy/dockerfiles/reads/reads.nginx.conf @@ -109,6 +109,13 @@ server { add_header Cache-Control "public, max-age=604800, immutable"; } + location ~ ^/reads/reference/(.+\.bed.bgz(\.tbi)?)$ { + alias /readviz/reference/$1; + + expires 1w; + add_header Cache-Control "public, max-age=604800, immutable"; + } + location ~ ^/reads/reference/(.+\.fasta(\.fai)?)$ { alias /readviz/reference/$1; @@ -116,6 +123,17 @@ server { add_header Cache-Control "public, max-age=604800, immutable"; } + ####################### + # gnomAD v4 read data # + ####################### + + location ~ ^/reads/gnomad_r4/exomes/(.+\.(bam|bai))$ { + alias /readviz/datasets/gnomad_r4/$1; + + expires 1w; + add_header Cache-Control "public, max-age=604800, immutable"; + } + ####################### # gnomAD v3 read data # ####################### diff --git a/deploy/manifests/reads/base/reads.deployment.yaml b/deploy/manifests/reads/base/reads.deployment.yaml index b8c0844e0..f533e08a6 100644 --- a/deploy/manifests/reads/base/reads.deployment.yaml +++ b/deploy/manifests/reads/base/reads.deployment.yaml @@ -79,5 +79,5 @@ spec: - name: readviz gcePersistentDisk: fsType: ext4 - pdName: readviz-data-2022-01-20-new + pdName: readviz-data-v4-2023-10-28 readOnly: true diff --git a/reads/reference-data/prepare_readviz_disk_v4.sh b/reads/reference-data/prepare_readviz_disk_v4.sh new file mode 100644 index 000000000..fce494415 --- /dev/null +++ b/reads/reference-data/prepare_readviz_disk_v4.sh @@ -0,0 +1,61 @@ +#!/bin/sh -eu + +# Specific steps for updating disk for gnomAD v4 reads + +curl -o gencode.v39.annotation.gtf.gz ftp://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_39/gencode.v39.annotation.gtf.gz + +gunzip gencode.v39.annotation.gtf.gz + +python gtf2bed.py gencode.v39.annotation.gtf gencode.v39.annotation.bed.bgz + +/Users/msolomon/.local/bin/htslib/bin/tabix gencode.v39.annotation.bed.bgz + +gcloud compute instances create v4-readviz-update \ + --machine-type e2-standard-8 \ + --zone us-east1-c + +# BW said new reads ~700GB +gcloud compute disks create readviz-data-v4-2023-10-28 \ + --size=6550GB \ + --source-snapshot=readviz-data-2023-10-28-snapshot \ + --type=pd-balanced \ + --zone us-east1-c + +gcloud compute instances attach-disk v4-readviz-update \ + --disk readviz-data-v4-2023-10-28 \ + --device-name reads-disk \ + --zone us-east1-c + +# - SSH into the compute instance. + +sudo mkdir -p /mnt/disks/reads + +sudo mount -o discard,defaults /dev/disk/by-id/google-reads-disk /mnt/disks/reads + +sudo resize2fs /dev/disk/by-id/google-reads-disk + +# On my machine, copy gencode files to VM + +gcloud compute scp gencode.v39.annotation.bed.bgz v4-readviz-update:~/ + +gcloud compute scp gencode.v39.annotation.bed.bgz.tbi v4-readviz-update:~/ + +# On VM, move them to reference folder +sudo mv ~/gencode* /mnt/disks/reads/reference/ + +# on VM, make new dataset directory copy mini bams + dbs +sudo mkdir /mnt/disks/reads/datasets/gnomad_r4 + +gsutil -m cp -r "gs://gnomad-readviz/v4.0/combined_deidentified_bamout/all*db" /mnt/disks/reads/datasets/gnomad_r4/ + +gsutil -m cp -r "gs://gnomad-readviz/v4.0/combined_deidentified_bamout/*.ba*" /mnt/disks/reads/datasets/gnomad_r4/ + +# Clean up + +sudo umount /mnt/disks/reads + +gcloud compute instances detach-disk v4-readviz-update \ + --disk readviz-data-v4-2023-10-28 \ + --zone us-east1-c + +gcloud compute instances delete v4-readviz-update --zone us-east1-c diff --git a/reads/src/datasets.js b/reads/src/datasets.js index 9306a24f8..cc0e11f8e 100644 --- a/reads/src/datasets.js +++ b/reads/src/datasets.js @@ -1,4 +1,16 @@ const variantDatasets = { + gnomad_r4: { + exomes: { + readsDirectory: '/readviz/datasets/gnomad_r4', + publicPath: '/reads/gnomad_r4/exomes', + // meta: 's42811_gs50_gn857', + }, + genomes: { + readsDirectory: '/readviz/datasets/gnomad_r3_1', + publicPath: '/reads/gnomad_r3/genomes', + meta: 's42811_gs50_gn857', + }, + }, gnomad_r3: { genomes: { readsDirectory: '/readviz/datasets/gnomad_r3_1', From 32d712bdce916700501a5bd132b3f9ad290a60bf Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 16:58:14 -0400 Subject: [PATCH 043/106] Update read dockerfiles for building on Mx macs --- deploy/dockerfiles/reads/reads-api.dockerfile | 2 +- deploy/dockerfiles/reads/reads-server.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/dockerfiles/reads/reads-api.dockerfile b/deploy/dockerfiles/reads/reads-api.dockerfile index 1e1d3d0dd..3207fd0ce 100644 --- a/deploy/dockerfiles/reads/reads-api.dockerfile +++ b/deploy/dockerfiles/reads/reads-api.dockerfile @@ -1,4 +1,4 @@ -FROM node:14.15.2-alpine +FROM --platform=linux/amd64 node:14.15.2-alpine RUN mkdir /app && chown node:node /app diff --git a/deploy/dockerfiles/reads/reads-server.dockerfile b/deploy/dockerfiles/reads/reads-server.dockerfile index ff07141d5..90962268a 100644 --- a/deploy/dockerfiles/reads/reads-server.dockerfile +++ b/deploy/dockerfiles/reads/reads-server.dockerfile @@ -1,4 +1,4 @@ -FROM nginx:stable-alpine +FROM --platform=linux/amd64 nginx:stable-alpine COPY deploy/dockerfiles/reads/reads.nginx.conf /etc/nginx/reads.nginx.conf.template From ae8256a081b30432e16e9864392fcffb91ed7ba9 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sat, 28 Oct 2023 17:15:45 -0400 Subject: [PATCH 044/106] Update homepage examples --- browser/src/HomePage.tsx | 44 ++++++++-------------------------------- 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/browser/src/HomePage.tsx b/browser/src/HomePage.tsx index 329b948ca..8d46269fe 100644 --- a/browser/src/HomePage.tsx +++ b/browser/src/HomePage.tsx @@ -79,9 +79,8 @@ export default () => (

    - Please note that gnomAD v2.1.1 and v3.1.2 have substantially different but overlapping sample - compositions and are on different genome builds. For more information, see{' '} - + Please note that the gnomAD v3 genomes are now part of gnomAD v4. + For more information, see{' '} "Should I switch to the latest version of gnomAD?"

    @@ -105,12 +104,12 @@ export default () => ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - gnomAD v3.1.2 variant:{' '} + Variant:{' '} 1-55051215-G-GA @@ -118,7 +117,7 @@ export default () => ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - gnomAD v3 mitochondrial variant:{' '} + Mitochondrial variant:{' '} ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - gnomAD v3{' '} {/* @ts-expect-error TS(2786) FIXME: 'ExternalLink' cannot be used as a JSX component. */} - - short tandem repeat + + Short tandem repeat {' '} locus:{' '} ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - gnomAD v2.1.1 variant:{' '} - - 1-55516888-G-GA - - - {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - - gnomAD v2 structural variant:{' '} - - DUP_2_5708 - - - {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - - Variant co-occurrence:{' '} + Variant co-occurrence (gnomAD v2):{' '} Date: Sat, 28 Oct 2023 17:23:12 -0400 Subject: [PATCH 045/106] Add v4 to dataset selector dropdown --- browser/src/DatasetSelector.tsx | 12 ++++++++++++ dataset-metadata/datasets/gnomad-v4/sampleCounts.js | 3 +-- dataset-metadata/sampleCounts.ts | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/browser/src/DatasetSelector.tsx b/browser/src/DatasetSelector.tsx index b28e4263f..1b052ecd6 100644 --- a/browser/src/DatasetSelector.tsx +++ b/browser/src/DatasetSelector.tsx @@ -440,6 +440,7 @@ const DatasetSelector = withRouter(({ datasetOptions, history, selectedDataset } includeGnomad2Subsets = true, includeGnomad3 = true, includeGnomad3Subsets = true, + includeGnomad4 = true, includeCopyNumberVariants = true, } = datasetOptions @@ -469,6 +470,17 @@ const DatasetSelector = withRouter(({ datasetOptions, history, selectedDataset } }, ] + if (includeGnomad4) { + // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. + shortVariantDatasets[1].children.push({ + id: 'gnomad_r4', + label: labelForDataset('gnomad_r4'), + url: datasetLink('gnomad_r4'), + description: `${sampleCounts.gnomad_r4.total.toLocaleString()} samples`, + childReferenceGenome: referenceGenome('gnomad_r4'), + }) + } + if (includeGnomad3) { // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. shortVariantDatasets[1].children.push({ diff --git a/dataset-metadata/datasets/gnomad-v4/sampleCounts.js b/dataset-metadata/datasets/gnomad-v4/sampleCounts.js index 1860d8280..973c14a5a 100644 --- a/dataset-metadata/datasets/gnomad-v4/sampleCounts.js +++ b/dataset-metadata/datasets/gnomad-v4/sampleCounts.js @@ -14,7 +14,6 @@ const sampleCounts = { XY: 37273, }, genomesTotal: 76215, - total: 76215, exomes: { afr: 16740, amr: 22362, @@ -29,7 +28,6 @@ const sampleCounts = { XY: 363624, }, exomesTotal: 730947, - total: 730947, subsets: { non_ukb: { exomes: { @@ -49,5 +47,6 @@ const sampleCounts = { total: 314392, }, }, + total: 807162, } module.exports = sampleCounts diff --git a/dataset-metadata/sampleCounts.ts b/dataset-metadata/sampleCounts.ts index cafa0c0d0..135100293 100644 --- a/dataset-metadata/sampleCounts.ts +++ b/dataset-metadata/sampleCounts.ts @@ -35,7 +35,7 @@ const sampleCounts = [ })), { gnomad_sv_r4: { total: 63046 } }, { gnomad_cnv_r4: gnomadCnvV4SubsetSampleCounts }, // TODO: should not be called "subset" - { gnomad_r4: gnomadV4SubsetSampleCounts }, + { gnomad_r4: gnomadV4SampleCounts }, ...Object.keys(gnomadV4SubsetSampleCounts).map((subset) => ({ [`gnomad_v4_${subset}`]: gnomadV4SubsetSampleCounts[subset], })), From 7b441eefeb22df119a88c94ff920c2aa0d1c70a0 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 07:35:42 -0400 Subject: [PATCH 046/106] Add redis deployment instructions to readme --- deploy/docs/Deployment.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deploy/docs/Deployment.md b/deploy/docs/Deployment.md index 26161a50a..eaa5d81e3 100644 --- a/deploy/docs/Deployment.md +++ b/deploy/docs/Deployment.md @@ -57,6 +57,9 @@ To create an Elasticsearch cluster, run `./deployctl elasticsearch apply`. After creating the cluster, store the password in a secret so that Dataproc jobs can access it. +## Deploy Redis + +Run kubectl apply -k . in the deploy/manifests/redis folder ## Before creating a deployment From 9785ba174136571d6c9b2fcefbd1b8b458a0f9a4 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 07:36:28 -0400 Subject: [PATCH 047/106] Add meta prefix to reads dataset config --- reads/src/datasets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reads/src/datasets.js b/reads/src/datasets.js index cc0e11f8e..71e19877a 100644 --- a/reads/src/datasets.js +++ b/reads/src/datasets.js @@ -3,7 +3,7 @@ const variantDatasets = { exomes: { readsDirectory: '/readviz/datasets/gnomad_r4', publicPath: '/reads/gnomad_r4/exomes', - // meta: 's42811_gs50_gn857', + meta: 's800_gs800_gn910', }, genomes: { readsDirectory: '/readviz/datasets/gnomad_r3_1', From 42247562404a15f511e7428f91e13a2d68161c8d Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 08:39:32 -0400 Subject: [PATCH 048/106] Fix v3 variant metrics --- .../VariantPage/VariantSiteQualityMetrics.tsx | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx index 508847398..583e2bcd2 100644 --- a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx +++ b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx @@ -210,7 +210,14 @@ const prepareDataGnomadV4 = ({ metric, variant }: { metric: string; variant: Var } const prepareDataGnomadV3 = ({ metric, genome }: { metric: string; genome: SequencingType }) => { - return getMetricDataForSequencingType({ metric, genomeOrExome: genome, metricDistributions: gnomadV3SiteQualityMetricDistributions }) + const genomeMetrics = getMetricDataForSequencingType({ metric, genomeOrExome: genome, metricDistributions: gnomadV3SiteQualityMetricDistributions }) + + return { + binEdges: genomeMetrics.binEdges, + description: genomeMetrics.description, + genomeBinValues: genomeMetrics && genomeMetrics.binValues, + genomeMetricValue: genomeMetrics && genomeMetrics.metricValue, + } } const prepareDataGnomadV2 = ({ metric, variant }: any) => { @@ -526,6 +533,9 @@ const yTickFormat = (n: any) => { } const formatMetricValue = (value: any, metric: any) => { + if (!value) { + return "-" + } if ( metric === 'SiteQuality' || metric === 'AS_QUALapprox' || @@ -571,6 +581,9 @@ const SiteQualityMetricsHistogram = ({ height, width, }: SiteQualityMetricsHistogramProps) => { + + console.log(exomeMetricValue, genomeMetricValue) + const isLogScale = metric === 'SiteQuality' || metric === 'AS_QUALapprox' || metric === 'DP' const primaryValues = exomeBinValues || genomeBinValues @@ -1125,25 +1138,27 @@ const VariantSiteQualityMetricsTable = ({ - {availableMetrics.map((metric) => ( - - {renderMetric(metric, datasetId)} - {isVariantInExomes && ( - - {exomeMetricValues![metric] != null - ? formatMetricValue(exomeMetricValues![metric], metric) - : '–'} - - )} - {isVariantInGenomes && ( - - {genomeMetricValues![metric] != null - ? formatMetricValue(genomeMetricValues![metric], metric) - : '–'} - - )} - - ))} + {availableMetrics.map((metric) => { + return ( + + {renderMetric(metric, datasetId)} + {exomeMetricValues && metric in exomeMetricValues && isVariantInExomes && ( + + {exomeMetricValues![metric] != null + ? formatMetricValue(exomeMetricValues![metric], metric) + : '–'} + + )} + {metric in genomeMetricValues! && isVariantInGenomes && ( + + {genomeMetricValues && ![metric] != null + ? formatMetricValue(genomeMetricValues![metric], metric) + : '–'} + + )} + + ) + })} ) From 80067105f419c26ed93195610da56f2045fc7be4 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 10:30:03 -0400 Subject: [PATCH 049/106] Add HGDP table support for both v3 and v4 pop labels --- .../src/VariantPage/HGDPPopulationsTable.tsx | 125 +++++++++++++++++- .../VariantPopulationFrequencies.tsx | 3 +- dataset-metadata/metadata.ts | 1 + 3 files changed, 123 insertions(+), 6 deletions(-) diff --git a/browser/src/VariantPage/HGDPPopulationsTable.tsx b/browser/src/VariantPage/HGDPPopulationsTable.tsx index d2768626e..fd06e1444 100644 --- a/browser/src/VariantPage/HGDPPopulationsTable.tsx +++ b/browser/src/VariantPage/HGDPPopulationsTable.tsx @@ -3,8 +3,9 @@ import React from 'react' import { Badge } from '@gnomad/ui' import { PopulationsTable } from './PopulationsTable' +import { DatasetId, isV3 } from '@gnomad/dataset-metadata/metadata' -const HGDP_POPULATION_GROUPS = { +const HGDP_POPULATION_GROUPS_V4 = { African: ['bantukenya', 'bantusouthafrica', 'biaka', 'mandenka', 'mbuti', 'san', 'yoruba'], 'East Asian': [ 'cambodian', @@ -43,7 +44,7 @@ const HGDP_POPULATION_GROUPS = { 'Oceanian': ['bougainville', 'papuanhighlands', 'papuansepik'], } -const HGDP_POPULATION_NAMES = { +const HGDP_POPULATION_NAMES_V4 = { adygei: 'Adygei', balochi: 'Balochi', bantukenya: 'Bantu (Kenya)', @@ -100,7 +101,96 @@ const HGDP_POPULATION_NAMES = { yoruba: 'Yoruba', } -const addPopulationNames = (populations: any) => { +const HGDP_POPULATION_GROUPS_V3 = { + African: ['bantukenya', 'bantusafrica', 'mandenka', 'yoruba'], + 'East Asian': [ + 'cambodian', + 'dai', + 'daur', + 'han', + 'hezhen', + 'japanese', + 'lahu', + 'miaozu', + 'mongola', + 'naxi', + 'oroqen', + 'she', + 'tu', + 'tujia', + 'uygur', + 'xibo', + 'yakut', + 'yizu', + ], + European: ['adygei', 'basque', 'french', 'italian', 'orcadian', 'russian', 'sardinian', 'tuscan'], + 'Middle Eastern': ['bedouin', 'druze', 'mozabite', 'palestinian'], + 'Native American': ['colombian', 'karitiana', 'maya', 'pima', 'surui'], + 'Central/South Asian': [ + 'balochi', + 'brahui', + 'burusho', + 'hazara', + 'kalash', + 'makrani', + 'pathan', + 'sindhi', + ], +} + +const HGDP_POPULATION_NAMES_V3 = { + adygei: 'Adygei', + balochi: 'Balochi', + bantukenya: 'Bantu (Kenya)', + bantusafrica: 'Bantu (South Africa)', + basque: 'Basque', + bedouin: 'Bedouin', + brahui: 'Brahui', + burusho: 'Burusho', + cambodian: 'Cambodian', + colombian: 'Colombian', + dai: 'Dai', + daur: 'Daur', + druze: 'Druze', + french: 'French', + han: 'Han', + hazara: 'Hazara', + hezhen: 'Hezhen', + italian: 'Italian', + japanese: 'Japanese', + kalash: 'Kalash', + karitiana: 'Karitiana', + lahu: 'Lahu', + makrani: 'Makrani', + mandenka: 'Mandenka', + maya: 'Maya', + miaozu: 'Miaozu', + mongola: 'Mongola', + mozabite: 'Mozabite', + naxi: 'Naxi', + orcadian: 'Orcadian', + oroqen: 'Oroqen', + palestinian: 'Palestinian', + pathan: 'Pathan', + pima: 'Pima', + russian: 'Russian', + sardinian: 'Sardinian', + she: 'She', + sindhi: 'Sindhi', + surui: 'Surui', + tu: 'Tu', + tujia: 'Tujia', + tuscan: 'Tuscan', + uygur: 'Uygur', + xibo: 'Xibo', + yakut: 'Yakut', + yizu: 'Yizu', + yoruba: 'Yoruba', +} + +const addPopulationNames = (populations: any, datasetId: DatasetId) => { + const HGDP_POPULATION_NAMES = isV3(datasetId) ? HGDP_POPULATION_NAMES_V3 : HGDP_POPULATION_NAMES_V4 + return populations.map((pop: any) => { let name if (pop.id === 'XX' || pop.id.endsWith('_XX')) { @@ -115,7 +205,26 @@ const addPopulationNames = (populations: any) => { }) } -const groupPopulations = (populations: any) => { + +function compareArrays(arr1: string[], arr2: string[]) { + const uniqueArr1 = new Set(arr1); + const uniqueArr2 = new Set(arr2); + + let areSame = true; + + for (let item of uniqueArr1) { + if (!uniqueArr2.has(item)) { + console.error(`Element "${item}" is in the first array but not in the second array.`); + areSame = false; + } + } + + if (!areSame) { + throw new Error("Population definitions don't match") + } +} + +const groupPopulations = (populations: any, datasetId: DatasetId) => { const populationsById = populations.reduce( // @ts-expect-error TS(7006) FIXME: Parameter 'acc' implicitly has an 'any' type. (acc, pop) => ({ @@ -125,9 +234,13 @@ const groupPopulations = (populations: any) => { {} ) + const HGDP_POPULATION_GROUPS = isV3(datasetId) ? HGDP_POPULATION_GROUPS_V3 : HGDP_POPULATION_GROUPS_V4 + // TODO: Improve this const groupedPopulations = [] Object.keys(HGDP_POPULATION_GROUPS).forEach((group) => { + // @ts-ignore + compareArrays(HGDP_POPULATION_GROUPS[group], Object.keys(populationsById)) groupedPopulations.push({ id: group, name: group, @@ -209,6 +322,7 @@ type OwnHGDPPopulationsTableProps = { }[] showHemizygotes?: boolean showHomozygotes?: boolean + datasetId: DatasetId } // @ts-expect-error TS(2456) FIXME: Type alias 'HGDPPopulationsTableProps' circularly ... Remove this comment to see the full error message @@ -220,8 +334,9 @@ const HGDPPopulationsTable = ({ populations, showHemizygotes, showHomozygotes, + datasetId }: HGDPPopulationsTableProps) => { - const renderedPopulations = groupPopulations(addPopulationNames(populations)) + const renderedPopulations = groupPopulations(addPopulationNames(populations, datasetId), datasetId) return (
    diff --git a/browser/src/VariantPage/VariantPopulationFrequencies.tsx b/browser/src/VariantPage/VariantPopulationFrequencies.tsx index e0317ab12..a8190e7d1 100644 --- a/browser/src/VariantPage/VariantPopulationFrequencies.tsx +++ b/browser/src/VariantPage/VariantPopulationFrequencies.tsx @@ -33,7 +33,7 @@ const VariantPopulationFrequencies = ({ datasetId, variant }: Props) => { .filter((pop) => pop.id.startsWith('1kg:')) .map((pop) => ({ ...pop, id: pop.id.slice(4) })) // Remove 1kg: prefix - const localAncestryPopulations = genome.local_ancestry_populations + const localAncestryPopulations = genome.local_ancestry_populations || [] return ( // @ts-expect-error TS(2741) FIXME: Property 'onChange' is missing in type '{ tabs: { ... Remove this comment to see the full error message @@ -66,6 +66,7 @@ const VariantPopulationFrequencies = ({ datasetId, variant }: Props) => { ) diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index b453f72f3..54baba49e 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -204,6 +204,7 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ !datasetId.startsWith('gnomad_sv') && !datasetId.startsWith('gnomad_r3'), hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', regionsHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), + hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4' || datasetId.startsWith('gnomad_r4'), isLiftoverSource: datasetId.startsWith('gnomad_r2_1'), isLiftoverTarget: datasetId.startsWith('gnomad_r3'), usesGrch37: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), From f4c4374fda083819cee34caa9b77865f3f2b61f7 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 10:30:59 -0400 Subject: [PATCH 050/106] Remove console logs --- browser/src/VariantPage/VariantOccurrenceTable.tsx | 2 -- browser/src/VariantPage/VariantSiteQualityMetrics.tsx | 2 -- 2 files changed, 4 deletions(-) diff --git a/browser/src/VariantPage/VariantOccurrenceTable.tsx b/browser/src/VariantPage/VariantOccurrenceTable.tsx index 7bb914bf4..a085479a4 100644 --- a/browser/src/VariantPage/VariantOccurrenceTable.tsx +++ b/browser/src/VariantPage/VariantOccurrenceTable.tsx @@ -196,8 +196,6 @@ export const GnomadVariantOccurrenceTable = ({ }: GnomadVariantOccurrenceTableProps) => { const showTotal = showExomes && showGenomes - console.log(variant.faf95_joint) - const isPresentInExome = Boolean(variant.exome) const isPresentInGenome = Boolean(variant.genome) diff --git a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx index 583e2bcd2..2eca1dbfe 100644 --- a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx +++ b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx @@ -582,8 +582,6 @@ const SiteQualityMetricsHistogram = ({ width, }: SiteQualityMetricsHistogramProps) => { - console.log(exomeMetricValue, genomeMetricValue) - const isLogScale = metric === 'SiteQuality' || metric === 'AS_QUALapprox' || metric === 'DP' const primaryValues = exomeBinValues || genomeBinValues From 99e87c19f46c0fa68785b97096c3eeca6ac45f35 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 17:47:32 -0400 Subject: [PATCH 051/106] Add v4 gene constraint --- .../gnomad_v4/gnomad_v4_constraint.py | 44 ++++++ .../src/data_pipeline/helpers/timestamp.py | 7 + .../src/data_pipeline/pipelines/genes.py | 144 +++++++++++------- .../pipelines/gnomad_v4_variants.py | 12 +- dataset-metadata/metadata.ts | 2 +- .../graphql/resolvers/transcript-fields.ts | 1 - 6 files changed, 147 insertions(+), 63 deletions(-) create mode 100644 data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py create mode 100644 data-pipeline/src/data_pipeline/helpers/timestamp.py diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py new file mode 100644 index 000000000..2d21eb4b6 --- /dev/null +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py @@ -0,0 +1,44 @@ +import hail as hl + + +def prepare_gnomad_v4_constraint(path): + ds = hl.read_table(path) + + # Don't need the information in globals for the browser + ds = ds.select_globals() + + # Select relevant fields + ds = ds.select( + # ID + transcript_id=ds.transcript, + gene_id=ds.gene, + # Expected + exp_lof=ds.lof.exp, + exp_mis=ds.mis.exp, + exp_syn=ds.syn.exp, + # Observed + obs_lof=ds.lof.obs, + obs_mis=ds.mis.obs, + obs_syn=ds.syn.obs, + # Observed/Expected + oe_lof=ds.lof.oe, + oe_lof_lower=ds.lof.oe_ci.lower, + oe_lof_upper=ds.lof.oe_ci.upper, + oe_mis=ds.mis.oe, + oe_mis_lower=ds.mis.oe_ci.lower, + oe_mis_upper=ds.mis.oe_ci.upper, + oe_syn=ds.syn.oe, + oe_syn_lower=ds.syn.oe_ci.lower, + oe_syn_upper=ds.syn.oe_ci.upper, + # Z + lof_z=ds.lof.z_score, + mis_z=ds.mis.z_score, + syn_z=ds.syn.z_score, + # Other + pli=ds.lof.pLI, + flags=ds.constraint_flags, + ) + + ds = ds.key_by("transcript_id") + + return ds diff --git a/data-pipeline/src/data_pipeline/helpers/timestamp.py b/data-pipeline/src/data_pipeline/helpers/timestamp.py new file mode 100644 index 000000000..d40608b58 --- /dev/null +++ b/data-pipeline/src/data_pipeline/helpers/timestamp.py @@ -0,0 +1,7 @@ +from datetime import datetime + + +def generate_iso_timestamp_for_filename(): + now = datetime.utcnow() + timestamp = now.strftime("%Y%m%dT%H%M%S%Z") + return timestamp diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index 08950aaf2..aa65a3660 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -29,6 +29,8 @@ ) from data_pipeline.data_types.gene import reject_par_y_genes +from data_pipeline.datasets.gnomad_v4.gnomad_v4_constraint import prepare_gnomad_v4_constraint + pipeline = Pipeline( # PipelineConfig( # name="genes", @@ -37,6 +39,18 @@ # ) ) # TODO: FIXME +# use_new_timestamp = True + +external_sources_subdir = "external_sources_20231029T172613" +genes_subdir = "genes_new" +constraint_subdir = "constraint" + +# if use_new_timestamp: +# timestamp = generate_iso_timestamp_for_filename() +# external_sources_subdir = f"external_sources_{timestamp}" +# genes_subdir = f"genes_{timestamp}" +# constraint_subdir = f"constraint_{timestamp}" + ############################################### # Import GENCODE and HGNC files ############################################### @@ -45,11 +59,11 @@ GENCODE_V39_URL = "ftp://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_39/gencode.v39.annotation.gtf.gz" pipeline.add_download_task( - "download_gencode_v19_gtf", GENCODE_V19_URL, "/external_sources/" + GENCODE_V19_URL.split("/")[-1] + "download_gencode_v19_gtf", GENCODE_V19_URL, f"/{external_sources_subdir}/" + GENCODE_V19_URL.split("/")[-1] ) pipeline.add_download_task( - "download_gencode_v39_gtf", GENCODE_V39_URL, "/external_sources/" + GENCODE_V39_URL.split("/")[-1] + "download_gencode_v39_gtf", GENCODE_V39_URL, f"/{external_sources_subdir}/" + GENCODE_V39_URL.split("/")[-1] ) HGNC_COLUMNS = [ @@ -68,13 +82,13 @@ pipeline.add_download_task( "download_hgnc", f"https://www.genenames.org/cgi-bin/download/custom?{'&'.join('col=' + column for column in HGNC_COLUMNS)}&status=Approved&hgnc_dbtag=on&order_by=gd_app_sym_sort&format=text&submit=submit", # noqa - "/external_sources/hgnc.tsv", + f"/{external_sources_subdir}/hgnc.tsv", ) pipeline.add_task( "prepare_grch37_genes", prepare_genes, - "/genes/genes_grch37_base.ht", + f"/{genes_subdir}/genes_grch37_base.ht", {"gencode_path": pipeline.get_task("download_gencode_v19_gtf"), "hgnc_path": pipeline.get_task("download_hgnc")}, {"reference_genome": "GRCh37"}, ) @@ -82,7 +96,7 @@ pipeline.add_task( "prepare_grch38_genes", prepare_genes, - "/genes/genes_grch38_base.ht", + f"/{genes_subdir}/genes_grch38_base.ht", {"gencode_path": pipeline.get_task("download_gencode_v39_gtf"), "hgnc_path": pipeline.get_task("download_hgnc")}, {"reference_genome": "GRCh38"}, ) @@ -103,13 +117,13 @@ pipeline.add_download_task( "download_mane_transcripts", MANE_TRANSCRIPTS_URL, - "/external_sources/" + MANE_TRANSCRIPTS_URL.split("/")[-1], + f"/{external_sources_subdir}/" + MANE_TRANSCRIPTS_URL.split("/")[-1], ) pipeline.add_task( "import_mane_select_transcripts", import_mane_select_transcripts, - "/genes/mane_select_transcripts.ht", + f"/{genes_subdir}/mane_select_transcripts.ht", {"path": pipeline.get_task("download_mane_transcripts")}, ) @@ -120,7 +134,7 @@ pipeline.add_task( "get_grch37_canonical_transcripts", get_canonical_transcripts, - "/genes/canonical_transcripts_grch37.ht", + f"/{genes_subdir}/canonical_transcripts_grch37.ht", { "exomes": "gs://gcp-public-data--gnomad/release/2.1.1/ht/exomes/gnomad.exomes.r2.1.1.sites.ht", "genomes": "gs://gcp-public-data--gnomad/release/2.1.1/ht/genomes/gnomad.genomes.r2.1.1.sites.ht", @@ -130,8 +144,11 @@ pipeline.add_task( "get_grch38_canonical_transcripts", get_canonical_transcripts, - "/genes/canonical_transcripts_grch38.ht", - {"genomes": "gs://gcp-public-data--gnomad/release/3.1.1/ht/genomes/gnomad.genomes.v3.1.1.sites.ht"}, + f"/{genes_subdir}/canonical_transcripts_grch38.ht", + { + "exomes": "gs://gnomad-matt-data-pipeline/exomes-2023-10-27/gnomad.exomes.v4.0.sites.ht", + "genomes": "gs://gnomad-matt-data-pipeline/genomes-2023-10-27/gnomad.genomes.v4.0.sites.ht", + }, ) ############################################### @@ -141,25 +158,25 @@ pipeline.add_download_task( "download_gtex_v7_tpm_data", "https://storage.googleapis.com/gtex_analysis_v7/rna_seq_data/GTEx_Analysis_2016-01-15_v7_RSEMv1.2.22_transcript_tpm.txt.gz", - "/external_sources/gtex/v7/GTEx_Analysis_2016-01-15_v7_RSEMv1.2.22_transcript_tpm.txt.gz", + f"/{external_sources_subdir}/gtex/v7/GTEx_Analysis_2016-01-15_v7_RSEMv1.2.22_transcript_tpm.txt.gz", ) pipeline.add_download_task( "download_gtex_v7_sample_attributes", "https://storage.googleapis.com/gtex_analysis_v7/annotations/GTEx_v7_Annotations_SampleAttributesDS.txt", - "/external_sources/gtex/v7/GTEx_v7_Annotations_SampleAttributesDS.txt", + f"/{external_sources_subdir}/gtex/v7/GTEx_v7_Annotations_SampleAttributesDS.txt", ) -pipeline.add_task( - "prepare_gtex_v7_expression_data", - prepare_gtex_expression_data, - "/gtex/gtex_v7_tissue_expression.ht", - { - "transcript_tpms_path": pipeline.get_task("download_gtex_v7_tpm_data"), - "sample_annotations_path": pipeline.get_task("download_gtex_v7_sample_attributes"), - }, - {"tmp_path": "/tmp"}, -) +# pipeline.add_task( +# "prepare_gtex_v7_expression_data", +# prepare_gtex_expression_data, +# "/gtex/gtex_v7_tissue_expression.ht", +# { +# "transcript_tpms_path": pipeline.get_task("download_gtex_v7_tpm_data"), +# "sample_annotations_path": pipeline.get_task("download_gtex_v7_sample_attributes"), +# }, +# {"tmp_path": "/tmp"}, +# ) pipeline.add_task( "prepare_pext", @@ -178,7 +195,7 @@ pipeline.add_task( "prepare_exac_constraint", prepare_exac_constraint, - "/constraint/exac_constraint.ht", + f"/{constraint_subdir}/exac_constraint.ht", { "path": "gs://gcp-public-data--gnomad/legacy/exac_browser/forweb_cleaned_exac_r03_march16_z_data_pLI_CNV-final.txt.gz" }, @@ -187,43 +204,43 @@ pipeline.add_task( "prepare_exac_regional_missense_constraint", prepare_exac_regional_missense_constraint, - "/constraint/exac_regional_missense_constraint.ht", + f"/{constraint_subdir}/exac_regional_missense_constraint.ht", {"path": "gs://gcp-public-data--gnomad/legacy/exac_browser/regional_missense_constraint.tsv"}, ) pipeline.add_task( "prepare_gnomad_v2_constraint", prepare_gnomad_v2_constraint, - "/constraint/gnomad_v2_constraint.ht", + f"/{constraint_subdir}/gnomad_v2_constraint.ht", {"path": "gs://gcp-public-data--gnomad/release/2.1.1/constraint/gnomad.v2.1.1.lof_metrics.by_transcript.ht"}, ) pipeline.add_task( "prepare_gnomad_v4_constraint", - prepare_gnomad_v2_constraint, - "/constraint/gnomad_v2_constraint.ht", - {"path": "gs://gcp-public-data--gnomad/release/2.1.1/constraint/gnomad.v2.1.1.lof_metrics.by_transcript.ht"}, + prepare_gnomad_v4_constraint, + f"/{constraint_subdir}/gnomad_v4_constraint.ht", + {"path": "gs://gnomad-matt-data-pipeline/constraint_inputs/2023-10-27/gnomad.v4.0.constraint_metrics.ht"}, ) pipeline.add_task( "prepare_heterozygous_variant_cooccurrence_counts", prepare_heterozygous_variant_cooccurrence_counts, - "/genes/heterozygous_variant_cooccurrence_counts.ht", + f"/{genes_subdir}/heterozygous_variant_cooccurrence_counts.ht", ) pipeline.add_task( "prepare_homozygous_variant_cooccurrence_counts", prepare_homozygous_variant_cooccurrence_counts, - "/genes/homozygous_variant_cooccurrence_counts.ht", + f"/{genes_subdir}/homozygous_variant_cooccurrence_counts.ht", ) pipeline.add_task( "prepare_gnomad_v2_regional_missense_constraint", prepare_gnomad_v2_regional_missense_constraint, - "/constraint/gnomad_v2_regional_missense_constraint.ht", + f"/{constraint_subdir}/gnomad_v2_regional_missense_constraint.ht", # TODO: before merging - update to a more permanent location for this data - {"path": "gs://gnomad-rgrant-data-pipeline/output/constraint/20230926_rmc_demo"}, + {"path": "gs://gnomad-matt-data-pipeline/constraint_inputs/2023-10-27/20230926_rmc_demo.ht"}, ) ############################################### @@ -233,7 +250,7 @@ pipeline.add_task( "annotate_grch37_genes_step_1", annotate_table, - "/genes/genes_grch37_annotated_1.ht", + f"/{genes_subdir}/genes_grch37_annotated_1.ht", { "table_path": pipeline.get_task("prepare_grch37_genes"), "canonical_transcript": pipeline.get_task("get_grch37_canonical_transcripts"), @@ -244,10 +261,11 @@ pipeline.add_task( "annotate_grch37_genes_step_2", annotate_gene_transcripts_with_tissue_expression, - "/genes/genes_grch37_annotated_2.ht", + f"/{genes_subdir}/genes_grch37_annotated_2.ht", { "table_path": pipeline.get_task("annotate_grch37_genes_step_1"), - "gtex_tissue_expression_path": pipeline.get_task("prepare_gtex_v7_expression_data"), + # "gtex_tissue_expression_path": pipeline.get_task("prepare_gtex_v7_expression_data"), + "gtex_tissue_expression_path": "gs://gnomad-matt-data-pipeline/2023-10-19/outputs/gtex/gtex_v7_tissue_expression.ht", }, ) @@ -270,14 +288,14 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch37_genes_step_3", annotate_with_preferred_transcript, - "/genes/genes_grch37_annotated_3.ht", + f"/{genes_subdir}/genes_grch37_annotated_3.ht", {"table_path": pipeline.get_task("annotate_grch37_genes_step_2")}, ) pipeline.add_task( "annotate_grch37_genes_step_4", annotate_table, - "/genes/genes_grch37_annotated_4.ht", + f"/{genes_subdir}/genes_grch37_annotated_4.ht", { "table_path": pipeline.get_task("annotate_grch37_genes_step_3"), "exac_constraint": pipeline.get_task("prepare_exac_constraint"), @@ -291,7 +309,7 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch37_genes_step_5", annotate_table_with_variant_cooccurrence_counts, - "/genes/genes_grch37_annotated_5.ht", + f"/{genes_subdir}/genes_grch37_annotated_5.ht", { "genes_path": pipeline.get_task("annotate_grch37_genes_step_4"), "heterozygous_variant_cooccurrence_counts_path": pipeline.get_task( @@ -306,7 +324,7 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch38_genes_step_1", annotate_table, - "/genes/genes_grch38_annotated_1.ht", + f"/{genes_subdir}/genes_grch38_annotated_1.ht", { "table_path": pipeline.get_task("prepare_grch38_genes"), "canonical_transcript": pipeline.get_task("get_grch38_canonical_transcripts"), @@ -317,7 +335,7 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch38_genes_step_2", annotate_gene_transcripts_with_refseq_id, - "/genes/genes_grch38_annotated_2.ht", + f"/{genes_subdir}/genes_grch38_annotated_2.ht", { "table_path": pipeline.get_task("annotate_grch38_genes_step_1"), "mane_select_transcripts_path": pipeline.get_task("import_mane_select_transcripts"), @@ -327,16 +345,28 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch38_genes_step_3", annotate_with_preferred_transcript, - "/genes/genes_grch38_annotated_3.ht", + f"/{genes_subdir}/genes_grch38_annotated_3.ht", {"table_path": pipeline.get_task("annotate_grch38_genes_step_2")}, ) + pipeline.add_task( "annotate_grch38_genes_step_4", + annotate_table, + f"/{genes_subdir}/genes_grch38_annotated_4.ht", + { + "table_path": pipeline.get_task("annotate_grch38_genes_step_3"), + "gnomad_constraint": pipeline.get_task("prepare_gnomad_v4_constraint"), + }, + {"join_on": "preferred_transcript_id"}, +) + +pipeline.add_task( + "annotate_grch38_genes_step_5", annotate_table_with_variant_cooccurrence_counts, - "/genes/genes_grch38_annotated_4.ht", + f"/{genes_subdir}/genes_grch38_annotated_5.ht", { - "genes_path": pipeline.get_task("annotate_grch38_genes_step_3"), + "genes_path": pipeline.get_task("annotate_grch38_genes_step_4"), "heterozygous_variant_cooccurrence_counts_path": pipeline.get_task( "prepare_heterozygous_variant_cooccurrence_counts" ), @@ -347,11 +377,11 @@ def annotate_with_preferred_transcript(table_path): ) pipeline.add_task( - "annotate_grch38_genes_step_5", + "annotate_grch38_genes_step_6", reject_par_y_genes, - "/genes/genes_grch38_annotated_5.ht", + f"/{genes_subdir}/genes_grch38_annotated_6.ht", { - "genes_path": pipeline.get_task("annotate_grch38_genes_step_4"), + "genes_path": pipeline.get_task("annotate_grch38_genes_step_5"), }, ) @@ -362,15 +392,15 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "extract_grch37_transcripts", extract_transcripts, - "/genes/transcripts_grch37_base.ht", + f"/{genes_subdir}/transcripts_grch37_base.ht", {"genes_path": pipeline.get_task("annotate_grch37_genes_step_4")}, ) pipeline.add_task( "extract_grch38_transcripts", extract_transcripts, - "/genes/transcripts_grch38_base.ht", - {"genes_path": pipeline.get_task("annotate_grch38_genes_step_3")}, + f"/{genes_subdir}/transcripts_grch38_base.ht", + {"genes_path": pipeline.get_task("annotate_grch38_genes_step_6")}, ) ############################################### @@ -380,7 +410,7 @@ def annotate_with_preferred_transcript(table_path): pipeline.add_task( "annotate_grch37_transcripts", annotate_table, - "/genes/transcripts_grch37_annotated_1.ht", + f"/{genes_subdir}/transcripts_grch37_annotated_1.ht", { "table_path": pipeline.get_task("extract_grch37_transcripts"), "exac_constraint": pipeline.get_task("prepare_exac_constraint"), @@ -388,6 +418,16 @@ def annotate_with_preferred_transcript(table_path): }, ) +pipeline.add_task( + "annotate_grch38_transcripts", + annotate_table, + f"/{genes_subdir}/transcripts_grch38_annotated_1.ht", + { + "table_path": pipeline.get_task("extract_grch38_transcripts"), + "gnomad_constraint": pipeline.get_task("prepare_gnomad_v4_constraint"), + }, +) + ############################################### # Outputs ############################################### @@ -395,11 +435,11 @@ def annotate_with_preferred_transcript(table_path): pipeline.set_outputs( { "genes_grch37": "annotate_grch37_genes_step_5", - "genes_grch38": "annotate_grch38_genes_step_5", + "genes_grch38": "annotate_grch38_genes_step_6", "base_transcripts_grch37": "extract_grch37_transcripts", "base_transcripts_grch38": "extract_grch38_transcripts", "transcripts_grch37": "annotate_grch37_transcripts", - "transcripts_grch38": "extract_grch38_transcripts", + "transcripts_grch38": "annotate_grch38_transcripts", "mane_select_transcripts": "import_mane_select_transcripts", } ) diff --git a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py index fb0a5b1c9..6e034a841 100644 --- a/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py +++ b/data-pipeline/src/data_pipeline/pipelines/gnomad_v4_variants.py @@ -1,6 +1,6 @@ import os -from datetime import datetime from pathlib import Path +from data_pipeline.helpers.timestamp import generate_iso_timestamp_for_filename from loguru import logger @@ -36,15 +36,9 @@ pipeline_name = "gnomad_v4_variants" -def generate_iso_timestamp_for_filename(): - now = datetime.utcnow() - timestamp = now.strftime("%Y%m%dT%H%M%S%Z") - return timestamp - - -# output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" +output_sub_dir = f"gnomad_v4_{generate_iso_timestamp_for_filename()}" # output_sub_dir = "gnomad_v4_20231027T135454" -output_sub_dir = "gnomad_v4_20231027T203139" +# output_sub_dir = "gnomad_v4_20231027T203139" config = PipelineConfig( name=pipeline_name, diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 54baba49e..f9b261736 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -193,7 +193,7 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ hasCopyNumberVariants: copyNumberVariantDatasetIds.includes(datasetId), hasCopyNumberVariantCoverage: datasetId.startsWith('gnomad_cnv'), hasVariantCoocurrence: datasetId.startsWith('gnomad') && datasetId.includes('r2'), - hasConstraints: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), + hasConstraints: datasetId.startsWith('gnomad_r4') || datasetId.startsWith('gnomad_r2') || datasetId === "exac", hasNonCodingConstraints: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', hasExome: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', genesHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', diff --git a/graphql-api/src/graphql/resolvers/transcript-fields.ts b/graphql-api/src/graphql/resolvers/transcript-fields.ts index 1edc44b75..f42f84624 100644 --- a/graphql-api/src/graphql/resolvers/transcript-fields.ts +++ b/graphql-api/src/graphql/resolvers/transcript-fields.ts @@ -21,7 +21,6 @@ const resolvers = { 'gtex_tissue_expression', 'GTEx tissue expression' ), - gnomad_constraint: GRCh37TranscriptFieldResolver('gnomad_constraint', 'gnomAD v2 constraint'), exac_constraint: GRCh37TranscriptFieldResolver('exac_constraint', 'ExAC constraint'), }, } From 1b010797a9c5ba993c3aed447a52573ff6c29fe5 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 20:11:01 -0400 Subject: [PATCH 052/106] Check for null in site quality metrics component --- browser/src/VariantPage/VariantSiteQualityMetrics.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx index 2eca1dbfe..0aae32774 100644 --- a/browser/src/VariantPage/VariantSiteQualityMetrics.tsx +++ b/browser/src/VariantPage/VariantSiteQualityMetrics.tsx @@ -1147,7 +1147,7 @@ const VariantSiteQualityMetricsTable = ({ : '–'} )} - {metric in genomeMetricValues! && isVariantInGenomes && ( + {genomeMetricValues && metric in genomeMetricValues && isVariantInGenomes && ( {genomeMetricValues && ![metric] != null ? formatMetricValue(genomeMetricValues![metric], metric) From 8c1ebc5719793c41837f67afd0f7e79e44a83202 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 20:11:36 -0400 Subject: [PATCH 053/106] Update liftover to v4 --- browser/src/VariantPage/VariantLiftover.tsx | 4 ++-- data-pipeline/src/data_pipeline/pipelines/liftover.py | 8 ++++---- dataset-metadata/metadata.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/browser/src/VariantPage/VariantLiftover.tsx b/browser/src/VariantPage/VariantLiftover.tsx index a83829e3b..099cbad9b 100644 --- a/browser/src/VariantPage/VariantLiftover.tsx +++ b/browser/src/VariantPage/VariantLiftover.tsx @@ -29,7 +29,7 @@ const VariantLiftover = ({ variant }: Props) => { const liftoverTargetReferenceGenome = variant.reference_genome === 'GRCh37' ? 'GRCh38' : 'GRCh37' const liftoverTargetDataset = - variant.reference_genome === 'GRCh37' ? 'gnomad_r3' : 'gnomad_r2_1' + variant.reference_genome === 'GRCh37' ? 'gnomad_r4' : 'gnomad_r2_1' // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. const isPlural = variant.liftover.length > 1 @@ -81,7 +81,7 @@ const VariantLiftover = ({ variant }: Props) => { const liftoverSourceReferenceGenome = variant.reference_genome === 'GRCh37' ? 'GRCh38' : 'GRCh37' const liftoverSourceDataset = - variant.reference_genome === 'GRCh37' ? 'gnomad_r3' : 'gnomad_r2_1' + variant.reference_genome === 'GRCh37' ? 'gnomad_r4' : 'gnomad_r2_1' // @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'. const isPlural = variant.liftover_sources.length > 1 diff --git a/data-pipeline/src/data_pipeline/pipelines/liftover.py b/data-pipeline/src/data_pipeline/pipelines/liftover.py index 721110db6..e420e510b 100644 --- a/data-pipeline/src/data_pipeline/pipelines/liftover.py +++ b/data-pipeline/src/data_pipeline/pipelines/liftover.py @@ -13,7 +13,7 @@ def prepare_gnomad_v2_liftover( - gnomad_v2_liftover_exomes_path, gnomad_v2_liftover_genomes_path, gnomad_v3_variants_path + gnomad_v2_liftover_exomes_path, gnomad_v2_liftover_genomes_path, gnomad_v4_variants_path ): exome_liftover = hl.read_table(gnomad_v2_liftover_exomes_path) exome_liftover = exome_liftover.select( @@ -50,11 +50,11 @@ def prepare_gnomad_v2_liftover( datasets=hl.set(["gnomad_r2_1"]), ) - gnomad_v3_variants = hl.read_table(gnomad_v3_variants_path) + gnomad_v3_variants = hl.read_table(gnomad_v4_variants_path) ds = ds.annotate( datasets=hl.if_else( hl.is_defined(gnomad_v3_variants[ds.liftover.locus, ds.liftover.alleles]), - ds.datasets.add("gnomad_r3"), + ds.datasets.add("gnomad_r4"), ds.datasets, ) ) @@ -69,7 +69,7 @@ def prepare_gnomad_v2_liftover( { "gnomad_v2_liftover_exomes_path": "gs://gcp-public-data--gnomad/release/2.1.1/liftover_grch38/ht/exomes/gnomad.exomes.r2.1.1.sites.liftover_grch38.ht", "gnomad_v2_liftover_genomes_path": "gs://gcp-public-data--gnomad/release/2.1.1/liftover_grch38/ht/genomes/gnomad.genomes.r2.1.1.sites.liftover_grch38.ht", - "gnomad_v3_variants_path": "gs://gcp-public-data--gnomad/release/3.1.1/ht/genomes/gnomad.genomes.v3.1.1.sites.ht", + "gnomad_v4_variants_path": "gs://gnomad-v4-data-pipeline/output/gnomad_v4_20231027T203139/gnomad_v4_variants_annotated_2.ht", }, ) diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index f9b261736..255fe4845 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -206,7 +206,7 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ regionsHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4' || datasetId.startsWith('gnomad_r4'), isLiftoverSource: datasetId.startsWith('gnomad_r2_1'), - isLiftoverTarget: datasetId.startsWith('gnomad_r3'), + isLiftoverTarget: datasetId.startsWith('gnomad_r4'), usesGrch37: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), usesGrch38: datasetId.startsWith('gnomad_r3') || datasetId.startsWith('gnomad_r4') || datasetId === 'gnomad_sv_r4', isV2: datasetId.startsWith('gnomad_r2'), From ed8e58bdcf6bdda4f14783f67e385b58216a35e2 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 20:12:30 -0400 Subject: [PATCH 054/106] Fix constraint annotation issue --- .../datasets/gnomad_v4/gnomad_v4_constraint.py | 2 ++ data-pipeline/src/data_pipeline/pipelines/genes.py | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py index 2d21eb4b6..0c9d9f828 100644 --- a/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py +++ b/data-pipeline/src/data_pipeline/datasets/gnomad_v4/gnomad_v4_constraint.py @@ -39,6 +39,8 @@ def prepare_gnomad_v4_constraint(path): flags=ds.constraint_flags, ) + ds = ds.filter(ds.transcript.contains("ENST")) + ds = ds.key_by("transcript_id") return ds diff --git a/data-pipeline/src/data_pipeline/pipelines/genes.py b/data-pipeline/src/data_pipeline/pipelines/genes.py index aa65a3660..a2c1f175e 100644 --- a/data-pipeline/src/data_pipeline/pipelines/genes.py +++ b/data-pipeline/src/data_pipeline/pipelines/genes.py @@ -350,15 +350,20 @@ def annotate_with_preferred_transcript(table_path): ) +def annotate_with_constraint(genes_path, constraint_path): + genes = hl.read_table(genes_path) + constraint = hl.read_table(constraint_path) + return genes.annotate(gnomad_constraint=constraint[genes.preferred_transcript_id]) + + pipeline.add_task( "annotate_grch38_genes_step_4", - annotate_table, + annotate_with_constraint, f"/{genes_subdir}/genes_grch38_annotated_4.ht", { - "table_path": pipeline.get_task("annotate_grch38_genes_step_3"), - "gnomad_constraint": pipeline.get_task("prepare_gnomad_v4_constraint"), + "genes_path": pipeline.get_task("annotate_grch38_genes_step_3"), + "constraint_path": pipeline.get_task("prepare_gnomad_v4_constraint"), }, - {"join_on": "preferred_transcript_id"}, ) pipeline.add_task( From f1b29b6dffa016dd7ffe08be199e7594d4ec5199 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 20:41:16 -0400 Subject: [PATCH 055/106] Fix weird runtime bugs --- browser/src/VariantPage/VariantPopulationFrequencies.tsx | 2 +- browser/src/VariantPage/VariantTranscriptConsequences.tsx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/browser/src/VariantPage/VariantPopulationFrequencies.tsx b/browser/src/VariantPage/VariantPopulationFrequencies.tsx index a8190e7d1..56fb7a3a9 100644 --- a/browser/src/VariantPage/VariantPopulationFrequencies.tsx +++ b/browser/src/VariantPage/VariantPopulationFrequencies.tsx @@ -21,7 +21,7 @@ type Props = { } const VariantPopulationFrequencies = ({ datasetId, variant }: Props) => { - if (hasLocalAncestryPopulations(datasetId)) { + if (hasLocalAncestryPopulations(datasetId) && variant.genome) { const genome = variant.genome! const gnomadPopulations = genome.populations.filter( (pop) => !(pop.id.startsWith('hgdp:') || pop.id.startsWith('1kg:')) diff --git a/browser/src/VariantPage/VariantTranscriptConsequences.tsx b/browser/src/VariantPage/VariantTranscriptConsequences.tsx index 03edd5c2f..a3c81821c 100644 --- a/browser/src/VariantPage/VariantTranscriptConsequences.tsx +++ b/browser/src/VariantPage/VariantTranscriptConsequences.tsx @@ -13,7 +13,10 @@ type Props = { } const VariantTranscriptConsequences = ({ variant }: Props) => { - const { transcript_consequences: transcriptConsequences } = variant + let { transcript_consequences: transcriptConsequences } = variant + if (!transcriptConsequences) { + transcriptConsequences = [] + } const numTranscripts = transcriptConsequences.length const geneIds = Array.from(new Set(transcriptConsequences.map((csq) => csq.gene_id))) const numGenes = geneIds.length From 23111ce8fee595310b42d93164168b6291d60c8f Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Sun, 29 Oct 2023 21:02:00 -0400 Subject: [PATCH 056/106] Fix home page examples --- browser/src/HomePage.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/browser/src/HomePage.tsx b/browser/src/HomePage.tsx index 8d46269fe..f467aa16b 100644 --- a/browser/src/HomePage.tsx +++ b/browser/src/HomePage.tsx @@ -116,6 +116,19 @@ export default () => ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} + + Structural variant region:{' '} + + 19-11078371-11144910 + + + {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} Mitochondrial variant:{' '} ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} {/* @ts-expect-error TS(2786) FIXME: 'ExternalLink' cannot be used as a JSX component. */} - + Short tandem repeat {' '} locus:{' '} From 5b19ea46c7cf0ca4b0b8ea1e9991d1ee30d61217 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 07:01:54 -0400 Subject: [PATCH 057/106] Combine variant page populations properly --- browser/src/VariantPage/VariantPopulationFrequencies.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/browser/src/VariantPage/VariantPopulationFrequencies.tsx b/browser/src/VariantPage/VariantPopulationFrequencies.tsx index 56fb7a3a9..985268ac6 100644 --- a/browser/src/VariantPage/VariantPopulationFrequencies.tsx +++ b/browser/src/VariantPage/VariantPopulationFrequencies.tsx @@ -23,9 +23,12 @@ type Props = { const VariantPopulationFrequencies = ({ datasetId, variant }: Props) => { if (hasLocalAncestryPopulations(datasetId) && variant.genome) { const genome = variant.genome! - const gnomadPopulations = genome.populations.filter( + const genomePopulations = genome.populations.filter( (pop) => !(pop.id.startsWith('hgdp:') || pop.id.startsWith('1kg:')) ) + const exomePopulations = variant.exome ? variant.exome.populations.filter( + (pop) => !(pop.id.startsWith('hgdp:') || pop.id.startsWith('1kg:')) + ) : [] const hgdpPopulations = genome.populations .filter((pop) => pop.id.startsWith('hgdp:')) .map((pop) => ({ ...pop, id: pop.id.slice(5) })) // Remove hgdp: prefix @@ -46,8 +49,8 @@ const VariantPopulationFrequencies = ({ datasetId, variant }: Props) => { From 3654c002b31f9e00dc4b7e1c6504a345aa7fe3da Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 07:17:07 -0400 Subject: [PATCH 058/106] Handle constraint flags with no description --- .../ConstraintTable/GnomadConstraintTable.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/browser/src/ConstraintTable/GnomadConstraintTable.tsx b/browser/src/ConstraintTable/GnomadConstraintTable.tsx index f454a959b..199dcd2cb 100644 --- a/browser/src/ConstraintTable/GnomadConstraintTable.tsx +++ b/browser/src/ConstraintTable/GnomadConstraintTable.tsx @@ -246,12 +246,19 @@ const GnomadConstraintTable = ({ constraint }: GnomadConstraintTableProps) => { {constraintFlags.length > 0 && ( - {constraintFlags.map((flag) => ( -

    - {/* @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message */} - Note {CONSTRAINT_FLAG_DESCRIPTIONS[flag]} + {constraintFlags.map((flag) => { + let flagDescription + if (flag in CONSTRAINT_FLAG_DESCRIPTIONS) { + {/* @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message */ } + flagDescription = CONSTRAINT_FLAG_DESCRIPTIONS[flag] + } else { + flagDescription = Gene constraint flag: {flag} + } + return

    + Note {flagDescription}

    - ))} + + })}

    Date: Mon, 30 Oct 2023 08:17:58 -0400 Subject: [PATCH 059/106] All transcript_version as optional TranscriptConsequence field for variants --- graphql-api/src/graphql/types/variant.graphql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql-api/src/graphql/types/variant.graphql b/graphql-api/src/graphql/types/variant.graphql index 97a39c078..e46540d3a 100644 --- a/graphql-api/src/graphql/types/variant.graphql +++ b/graphql-api/src/graphql/types/variant.graphql @@ -79,7 +79,7 @@ type TranscriptConsequence { refseq_version: String sift_prediction: String transcript_id: String! - transcript_version: String! + transcript_version: String # Deprecated - replaced by is_canonical canonical: Boolean From 335077497d7a87156857d1e413920776bab0ac97 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 08:34:48 -0400 Subject: [PATCH 060/106] Capitalize remaining population --- dataset-metadata/gnomadPopulations.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/dataset-metadata/gnomadPopulations.ts b/dataset-metadata/gnomadPopulations.ts index fd772cc78..dc0858bbc 100644 --- a/dataset-metadata/gnomadPopulations.ts +++ b/dataset-metadata/gnomadPopulations.ts @@ -12,6 +12,7 @@ export const GNOMAD_POPULATION_NAMES = { fin: 'European (Finnish)', oth: 'Remaining individuals', sas: 'South Asian', + remaining: 'Remaining', // EAS subpopulations eas_jpn: 'Japanese', From 77443f19399c980ba5752a5167291a58044d6c6d Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 08:45:27 -0400 Subject: [PATCH 061/106] Enable local ancestry for v4 --- browser/src/VariantPage/VariantPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/browser/src/VariantPage/VariantPage.tsx b/browser/src/VariantPage/VariantPage.tsx index ff0203137..cc7a78845 100644 --- a/browser/src/VariantPage/VariantPage.tsx +++ b/browser/src/VariantPage/VariantPage.tsx @@ -17,6 +17,7 @@ import { usesGrch38, isV3, isV3Subset, + isV4, isExac, } from '@gnomad/dataset-metadata/metadata' import Delayed from '../Delayed' @@ -346,8 +347,7 @@ export const VariantPageContent = ({ datasetId, variant }: VariantPageContentPro }} >

    - NEW Local ancestry is now available for gnomAD v3. - Select the “Local Ancestry” tab below to view data. See our blog post on{' '} + Note Local ancestry data is available for this variant by selecting the tab below. See our blog post on{' '} {/* @ts-expect-error TS(2786) FIXME: 'ExternalLink' cannot be used as a JSX component. */} local ancestry inference for Latino/Admixed American samples in gnomAD @@ -767,7 +767,7 @@ const VariantPage = ({ datasetId, variantId }: VariantPageProps) => { query={variantQuery} variables={{ datasetId, - includeLocalAncestry: isV3(datasetId) && !isV3Subset(datasetId), + includeLocalAncestry: (isV3(datasetId) && !isV3Subset(datasetId)) || (isV4(datasetId)), includeLiftoverAsSource: isLiftoverSource(datasetId), includeLiftoverAsTarget: isLiftoverTarget(datasetId), referenceGenome: referenceGenome(datasetId), From 42c56af1ae5052e927e4cbfcced82e6580a5e0fe Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 09:25:16 -0400 Subject: [PATCH 062/106] Add RMC example to home page --- browser/src/HomePage.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/browser/src/HomePage.tsx b/browser/src/HomePage.tsx index f467aa16b..e6639c63d 100644 --- a/browser/src/HomePage.tsx +++ b/browser/src/HomePage.tsx @@ -160,7 +160,20 @@ export default () => ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} - Variant co-occurrence (gnomAD v2):{' '} + Regional missense constraint (gnomAD v2, GRCh37):{' '} + GRIN2A + + {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} + + Variant co-occurrence (gnomAD v2, GRCh37):{' '} Date: Mon, 30 Oct 2023 09:29:20 -0400 Subject: [PATCH 063/106] Handle missing transcript_version on variant page --- browser/src/VariantPage/TranscriptConsequenceList.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/browser/src/VariantPage/TranscriptConsequenceList.tsx b/browser/src/VariantPage/TranscriptConsequenceList.tsx index 02e0e591c..317d3344f 100644 --- a/browser/src/VariantPage/TranscriptConsequenceList.tsx +++ b/browser/src/VariantPage/TranscriptConsequenceList.tsx @@ -91,6 +91,8 @@ class ConsequencesInGene extends Component csq.transcript_version ? `${csq.transcript_id}.${csq.transcript_version}` : csq.transcript_id + return ( // @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message @@ -98,7 +100,7 @@ class ConsequencesInGene extends Component - {csq.transcript_id}.{csq.transcript_version} + {qualifiedTranscriptId(csq)} @@ -131,7 +133,7 @@ class ConsequencesInGene extends Component - {csq.transcript_id}.{csq.transcript_version} + {qualifiedTranscriptId(csq)} From 3dc06037b4a7ad694661028a085a074b50bff797 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 09:52:47 -0400 Subject: [PATCH 064/106] Add empty array default to exome local_ancestry_populations in API --- .../src/queries/variant-datasets/gnomad-v4-variant-queries.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts index 5cf6d57fd..7553abcaa 100644 --- a/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts +++ b/graphql-api/src/queries/variant-datasets/gnomad-v4-variant-queries.ts @@ -184,6 +184,7 @@ const fetchVariantById = async (esClient: any, variantIdOrRsid: any, subset: any Number.isFinite(m.value) ), }, + local_ancestry_populations: [] }, genome: hasGenomeVariant && { ...variant.genome, From 6c8cc0996192e541953fb87ea988f6e91190b3ca Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 09:59:47 -0400 Subject: [PATCH 065/106] Make v4 the default short variant for v4 SVs --- dataset-metadata/metadata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 255fe4845..95490010e 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -102,7 +102,7 @@ const extractShortVariantDatasetId = (datasetId: DatasetId): DatasetId => { return 'gnomad_r2_1' } - return 'gnomad_r3' + return 'gnomad_r4' } const extractStructuralVariantDatasetId = (datasetId: DatasetId): DatasetId => { From f3cd8f47a49af4117dff0e1707b430e85a228d93 Mon Sep 17 00:00:00 2001 From: sjahl <636687+sjahl@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:45:11 -0400 Subject: [PATCH 066/106] use Always pull policy to help development --- deploy/manifests/browser/base/api.deployment.yaml | 1 + deploy/manifests/browser/base/browser.deployment.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/deploy/manifests/browser/base/api.deployment.yaml b/deploy/manifests/browser/base/api.deployment.yaml index a7434b743..4ec3a457f 100644 --- a/deploy/manifests/browser/base/api.deployment.yaml +++ b/deploy/manifests/browser/base/api.deployment.yaml @@ -18,6 +18,7 @@ spec: containers: - name: app image: gnomad-api + imagePullPolicy: Always env: - name: PORT value: '8000' diff --git a/deploy/manifests/browser/base/browser.deployment.yaml b/deploy/manifests/browser/base/browser.deployment.yaml index 9eb77132b..2917787ab 100644 --- a/deploy/manifests/browser/base/browser.deployment.yaml +++ b/deploy/manifests/browser/base/browser.deployment.yaml @@ -22,6 +22,7 @@ spec: containers: - name: web image: gnomad-browser + imagePullPolicy: Always env: - name: API_URL value: http://$(API_SERVICE) From 3bccd321b3c6b6bc6f48db8c7d01b0daacc40361 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 11:31:18 -0400 Subject: [PATCH 067/106] Add forum link to navbar --- browser/src/NavBar.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/browser/src/NavBar.tsx b/browser/src/NavBar.tsx index 5b49e18d5..a07c636f3 100644 --- a/browser/src/NavBar.tsx +++ b/browser/src/NavBar.tsx @@ -136,6 +136,11 @@ const NavBar = () => { Downloads +

  • + + Forum + +
  • Contact From 93172fdb11568883e4b69cd985b4ed8afe18f246 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 15:05:53 -0400 Subject: [PATCH 068/106] Add CNV example --- browser/src/HomePage.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/browser/src/HomePage.tsx b/browser/src/HomePage.tsx index e6639c63d..8977926a5 100644 --- a/browser/src/HomePage.tsx +++ b/browser/src/HomePage.tsx @@ -129,6 +129,19 @@ export default () => ( {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} + + Copy number variant region:{' '} + + 19-11078371-11144910 + + + {/* @ts-expect-error TS(2746) FIXME: This JSX tag's 'children' prop expects a single ch... Remove this comment to see the full error message */} Mitochondrial variant:{' '} Date: Mon, 30 Oct 2023 15:06:27 -0400 Subject: [PATCH 069/106] SVs/CNVs should have constraint --- dataset-metadata/metadata.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 95490010e..37a992a7f 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -16,7 +16,7 @@ export const datasetLabels = { gnomad_sv_r2_1: 'gnomAD SVs v2.1', gnomad_sv_r2_1_controls: 'gnomAD SVs v2.1 (controls)', gnomad_sv_r2_1_non_neuro: 'gnomAD SVs v2.1 (non-neuro)', - gnomad_sv_r4: 'gnomAD SVs v4', + gnomad_sv_r4: 'gnomAD SVs v4.0', gnomad_cnv_r4: "gnomAD CNVs v4.0", gnomad_r4: 'gnomAD v4.0.0', } as const @@ -193,7 +193,7 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ hasCopyNumberVariants: copyNumberVariantDatasetIds.includes(datasetId), hasCopyNumberVariantCoverage: datasetId.startsWith('gnomad_cnv'), hasVariantCoocurrence: datasetId.startsWith('gnomad') && datasetId.includes('r2'), - hasConstraints: datasetId.startsWith('gnomad_r4') || datasetId.startsWith('gnomad_r2') || datasetId === "exac", + hasConstraints: datasetId.includes('r4') || datasetId.startsWith('gnomad_r2') || datasetId === "exac", hasNonCodingConstraints: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', hasExome: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', genesHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', @@ -202,7 +202,6 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ genesHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), regionsHaveExomeCoverage: !datasetId.startsWith('gnomad_sv') && !datasetId.startsWith('gnomad_r3'), - hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', regionsHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4' || datasetId.startsWith('gnomad_r4'), isLiftoverSource: datasetId.startsWith('gnomad_r2_1'), From 3e54edda37e7c85eba3313b1504ae546e381ab97 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Mon, 30 Oct 2023 15:07:43 -0400 Subject: [PATCH 070/106] Make ES timeout 60 temporarily --- graphql-api/src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql-api/src/config.ts b/graphql-api/src/config.ts index 44a46003a..03335b457 100644 --- a/graphql-api/src/config.ts +++ b/graphql-api/src/config.ts @@ -25,7 +25,7 @@ const config: Record = { ELASTICSEARCH_USERNAME: env.ELASTICSEARCH_USERNAME, ELASTICSEARCH_PASSWORD: env.ELASTICSEARCH_PASSWORD, ELASTICSEARCH_QUEUE_TIMEOUT: JSON.parse(env.ELASTICSEARCH_QUEUE_TIMEOUT || '30') * 1000, - ELASTICSEARCH_REQUEST_TIMEOUT: JSON.parse(env.ELASTICSEARCH_REQUEST_TIMEOUT || '30') * 1000, + ELASTICSEARCH_REQUEST_TIMEOUT: JSON.parse(env.ELASTICSEARCH_REQUEST_TIMEOUT || '60') * 1000, // Cache CACHE_REDIS_URL: env.CACHE_REDIS_URL, CACHE_REQUEST_TIMEOUT: JSON.parse(env.CACHE_REQUEST_TIMEOUT || '15') * 1000, From 38ff7b30f016c309ce91b84234219f7a39745c7e Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 31 Oct 2023 08:44:54 -0400 Subject: [PATCH 071/106] Make metadata tests pass --- dataset-metadata/metadata.spec.ts | 17 ++++++++++++++--- dataset-metadata/metadata.ts | 9 +++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/dataset-metadata/metadata.spec.ts b/dataset-metadata/metadata.spec.ts index a1b96fe1b..4bcc20312 100644 --- a/dataset-metadata/metadata.spec.ts +++ b/dataset-metadata/metadata.spec.ts @@ -53,6 +53,7 @@ describe.each([ ['gnomad_sv_r2_1_controls', 'gnomAD SVs v2.1 (controls)'], ['gnomad_sv_r2_1_non_neuro', 'gnomAD SVs v2.1 (non-neuro)'], ['gnomad_r4', 'gnomAD v4.0.0'], + ['gnomad_cnv_r4', 'gnomAD CNVs v4.0'], ] as [DatasetId, string][])('labelForDataset(%s)', (datasetId, expectedResult) => { test(`Label for ${datasetId} is "${expectedResult}"`, () => expect(labelForDataset(datasetId)).toEqual(expectedResult)) @@ -74,7 +75,8 @@ describe.each([ ['gnomad_sv_r2_1', false], ['gnomad_sv_r2_1_controls', false], ['gnomad_sv_r2_1_non_neuro', false], - ['gnomad_r4', true], // This will change + ['gnomad_cnv_r4', false], + ['gnomad_r4', true], ] as [DatasetId, boolean][])('hasShortVariants(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} short variants`, () => @@ -97,7 +99,8 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], - ['gnomad_r4', false], // This will change + ['gnomad_cnv_r4', false], + ['gnomad_r4', false], ] as [DatasetId, boolean][])('hasStructuralVariants(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} structural variants`, () => @@ -120,7 +123,9 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], - ['gnomad_r4', false], // This will change + ['gnomad_sv_r4', true], + ['gnomad_cnv_r4', true], + ['gnomad_r4', true], ] as [DatasetId, boolean][])('hasConstraints(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} constraints`, () => @@ -144,6 +149,8 @@ describe.each([ ['gnomad_sv_r2_1', 'GRCh37'], ['gnomad_sv_r2_1_controls', 'GRCh37'], ['gnomad_sv_r2_1_non_neuro', 'GRCh37'], + ['gnomad_sv_r4', 'GRCh38'], + ['gnomad_cnv_r4', 'GRCh38'], ['gnomad_r4', 'GRCh38'], ] as [DatasetId, ReferenceGenome][])('referenceGenome(%s)', (datasetId, expectedResult) => { test(`${datasetId} uses reference genome ${expectedResult}`, () => @@ -166,6 +173,8 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_sv_r4', false], + ['gnomad_cnv_r4', true], ['gnomad_r4', true], ] as [DatasetId, boolean][])('genesHaveExomeCoverage(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' @@ -189,6 +198,8 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], + ['gnomad_sv_r4', false], + ['gnomad_cnv_r4', true], ['gnomad_r4', true], ] as [DatasetId, boolean][])('transcriptsHaveExomeCoverage(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index 37a992a7f..a2ac25d54 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -188,12 +188,16 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ isSubset: !fullDatasetIds.includes(datasetId), isV3Subset: !fullDatasetIds.includes(datasetId) && datasetId.startsWith('gnomad_r3'), isV4SVs: datasetId === 'gnomad_sv_r4', - hasShortVariants: !structuralVariantDatasetIds.includes(datasetId), + hasShortVariants: !structuralVariantDatasetIds.includes(datasetId) && !copyNumberVariantDatasetIds.includes(datasetId), hasStructuralVariants: structuralVariantDatasetIds.includes(datasetId), hasCopyNumberVariants: copyNumberVariantDatasetIds.includes(datasetId), hasCopyNumberVariantCoverage: datasetId.startsWith('gnomad_cnv'), hasVariantCoocurrence: datasetId.startsWith('gnomad') && datasetId.includes('r2'), - hasConstraints: datasetId.includes('r4') || datasetId.startsWith('gnomad_r2') || datasetId === "exac", + hasConstraints: datasetId.includes('r4') || + datasetId.startsWith("gnomad_sv_r4") || + datasetId.startsWith('gnomad_r2') || + datasetId.startsWith('gnomad_sv_r2') || + datasetId === "exac", hasNonCodingConstraints: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', hasExome: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', genesHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', @@ -366,3 +370,4 @@ export const copyNumberVariantDatasetId = (datasetId: DatasetId) => export const hasCopyNumberVariantCoverage = (datasetId: DatasetId) => getMetadata(datasetId, 'hasCopyNumberVariantCoverage') + From 1e231bff497f3dbc31cd2884e0738e1c21086d9e Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 31 Oct 2023 09:32:13 -0400 Subject: [PATCH 072/106] Rename schemas to enable diff for incoming schema --- ...ome_coverage.ht.schema => gnomad_v3_genome_coverage.ht.schema} | 0 ...0.sites.pcsk9.ht.schema => gnomad.exomes.v4.0.sites.ht.schema} | 0 ....sites.pcsk9.ht.schema => gnomad.genomes.v4.0.sites.ht.schema} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/{gnomad_v4_genome_coverage.ht.schema => gnomad_v3_genome_coverage.ht.schema} (100%) rename data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/{gnomad.exomes.v4.0.sites.pcsk9.ht.schema => gnomad.exomes.v4.0.sites.ht.schema} (100%) rename data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/{gnomad.genomes.v4.0.sites.pcsk9.ht.schema => gnomad.genomes.v4.0.sites.ht.schema} (100%) diff --git a/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v3_genome_coverage.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v4_genome_coverage.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/annotate_gnomad_v4_variants/genome_coverage_path/gnomad_v3_genome_coverage.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.pcsk9.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/exome_variants_path/gnomad.exomes.v4.0.sites.ht.schema diff --git a/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema b/data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.ht.schema similarity index 100% rename from data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.pcsk9.ht.schema rename to data-pipeline/schemas/gnomad_v4_variants/prepare_gnomad_v4_variants/genome_variants_path/gnomad.genomes.v4.0.sites.ht.schema From c1a65daae9c1a6e31e0a9a4ad6acc4e5411bbc33 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Tue, 31 Oct 2023 09:04:05 -0400 Subject: [PATCH 073/106] Update component snapshots --- .../src/ConstraintTable/ConstraintTable.tsx | 4 +- .../ConstraintTable.spec.tsx.snap | 905 +- .../CopyNumberVariantPage.spec.tsx.snap | 4 +- .../__snapshots__/GenePage.spec.tsx.snap | 2263 ++--- ...riantCooccurrenceCountsTable.spec.tsx.snap | 8 + .../MitochondrialVariantPage.spec.tsx.snap | 8999 ++--------------- ...chondrialRegionCoverageTrack.spec.tsx.snap | 2 +- .../__snapshots__/RegionPage.spec.tsx.snap | 38 +- .../RegionPageContainer.spec.tsx.snap | 2 +- .../__snapshots__/StatsPage.spec.tsx.snap | 132 +- .../StructuralVariantPage.spec.tsx.snap | 48 +- ...drialTranscriptCoverageTrack.spec.tsx.snap | 2 +- .../TranscriptPage.spec.tsx.snap | 540 +- .../TranscriptPageContainer.spec.tsx.snap | 1851 +--- .../__snapshots__/VariantPage.spec.tsx.snap | 383 +- .../DatasetSelector.spec.tsx.snap | 1330 +-- .../src/__snapshots__/HomePage.spec.tsx.snap | 64 +- .../src/__snapshots__/NavBar.spec.tsx.snap | 16 +- .../src/__snapshots__/Searchbox.spec.tsx.snap | 109 +- .../help/__snapshots__/HelpPage.spec.tsx.snap | 132 +- 20 files changed, 4201 insertions(+), 12631 deletions(-) diff --git a/browser/src/ConstraintTable/ConstraintTable.tsx b/browser/src/ConstraintTable/ConstraintTable.tsx index e32a7db7b..b7da4c0f2 100644 --- a/browser/src/ConstraintTable/ConstraintTable.tsx +++ b/browser/src/ConstraintTable/ConstraintTable.tsx @@ -1,6 +1,6 @@ import React from 'react' -import { DatasetId, hasConstraints } from '@gnomad/dataset-metadata/metadata' +import { DatasetId, hasConstraints, labelForDataset } from '@gnomad/dataset-metadata/metadata' import { Gene } from '../GenePage/GenePage' import { Transcript } from '../TranscriptPage/TranscriptPage' @@ -59,7 +59,7 @@ const transcriptDetails = ( const ConstraintTable = ({ datasetId, geneOrTranscript }: Props) => { if (!hasConstraints(datasetId)) { - return

    Constraint not yet available for {datasetId}.

    + return

    Constraint not yet available for {labelForDataset(datasetId)}.

    } const { transcriptId, transcriptVersion, transcriptDescription } = diff --git a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap index 3fe6ed064..64276b13b 100644 --- a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap +++ b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap @@ -4726,217 +4726,289 @@ exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a m exports[`ConstraintTable with "gnomad_r3" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and gene with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and transcript with available constraint has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; @@ -8065,38 +8137,779 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for gnomAD v3. -

    +[ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Category + + + Expected SNVs + + + + Observed SNVs + + + Constraint metrics + +
    + Synonymous + + + 0.2 + + + + Z = + + + 0.46 + +
    + + o/e = + + 0.91 + + + ( + + 0.8 + + - + + + 0.95 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + Missense + + + 0.3 + + + + Z = + + + 0.57 + +
    + + o/e = + + 0.89 + + + ( + + 0.8 + + - + + + 0.99 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + pLoF + + + 0.1 + + + + pLI = + + 0.68 + +
    + + o/e = + + 0.79 + + + ( + + 0.6 + + - + + + 0.9 + + ) + +
    + + + 0 + + + + + + 1 + + +
    +
    , +

    + Constraint metrics based on + Ensembl canonical + transcript ( + + transcript-999 + . + 12.34.5 + + ). +

    , +] `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for gnomAD v3. -

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Category + + + Expected SNVs + + + + Observed SNVs + + + Constraint metrics + +
    + Synonymous + + + 0.2 + + + + Z = + + + 0.46 + +
    + + o/e = + + 0.91 + + + ( + + 0.8 + + - + + + 0.95 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + Missense + + + 0.3 + + + + Z = + + + 0.57 + +
    + + o/e = + + 0.89 + + + ( + + 0.8 + + - + + + 0.99 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + pLoF + + + 0.1 + + + + pLI = + + 0.68 + +
    + + o/e = + + 0.79 + + + ( + + 0.6 + + - + + + 0.9 + + ) + +
    + + + 0 + + + + + + 1 + + +
    +
    `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not available for this + gene

    `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint not available for this + transcript

    `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint is not available for mitochondrial + + genes

    `; exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint not yet available for gnomAD v3. + Constraint is not available for mitochondrial + + transcripts

    `; diff --git a/browser/src/CopyNumberVariantPage/__snapshots__/CopyNumberVariantPage.spec.tsx.snap b/browser/src/CopyNumberVariantPage/__snapshots__/CopyNumberVariantPage.spec.tsx.snap index fc03b5a14..c87c98bb8 100644 --- a/browser/src/CopyNumberVariantPage/__snapshots__/CopyNumberVariantPage.spec.tsx.snap +++ b/browser/src/CopyNumberVariantPage/__snapshots__/CopyNumberVariantPage.spec.tsx.snap @@ -85,7 +85,7 @@ exports[`CopyNumberVariantPage with dataset gnomad_cnv_r4 with variant of type D onClick={[Function]} onKeyDown={[Function]} > - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -537,7 +537,7 @@ exports[`CopyNumberVariantPage with dataset gnomad_cnv_r4 with variant of type D onClick={[Function]} onKeyDown={[Function]} > - gnomAD SVs v4 + gnomAD SVs v4.0
    diff --git a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap index dd5366304..429532f29 100644 --- a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap +++ b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap @@ -82,6 +82,23 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -741,7 +758,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
  • - 0.1 + 10 @@ -946,7 +963,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.2 + 20 @@ -986,7 +1003,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.3 + 30 @@ -1026,7 +1043,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.4 + 40 @@ -1066,7 +1083,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.5 + 50 @@ -1106,7 +1123,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.6 + 60 @@ -1146,7 +1163,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.7 + 70 @@ -1186,7 +1203,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.8 + 80 @@ -1226,7 +1243,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 0.9 + 90 @@ -1266,7 +1283,7 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`] dy="0em" x={-8} > - 1.0 + 100 @@ -1535,6 +1552,23 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -2183,7 +2217,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
  • - 0.1 + 10 @@ -2388,7 +2422,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.2 + 20 @@ -2428,7 +2462,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.3 + 30 @@ -2468,7 +2502,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.4 + 40 @@ -2508,7 +2542,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.5 + 50 @@ -2548,7 +2582,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.6 + 60 @@ -2588,7 +2622,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.7 + 70 @@ -2628,7 +2662,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.8 + 80 @@ -2668,7 +2702,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 0.9 + 90 @@ -2708,7 +2742,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1" has no unexpected changes 1`] dy="0em" x={-8} > - 1.0 + 100 @@ -2977,6 +3011,23 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -3625,7 +3676,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
  • - 0.1 + 10 @@ -3830,7 +3881,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.2 + 20 @@ -3870,7 +3921,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.3 + 30 @@ -3910,7 +3961,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.4 + 40 @@ -3950,7 +4001,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.5 + 50 @@ -3990,7 +4041,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.6 + 60 @@ -4030,7 +4081,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.7 + 70 @@ -4070,7 +4121,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.8 + 80 @@ -4110,7 +4161,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 0.9 + 90 @@ -4150,7 +4201,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_controls" has no unexpected ch dy="0em" x={-8} > - 1.0 + 100 @@ -4419,6 +4470,23 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -5067,7 +5135,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
  • - 0.1 + 10 @@ -5272,7 +5340,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.2 + 20 @@ -5312,7 +5380,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.3 + 30 @@ -5352,7 +5420,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.4 + 40 @@ -5392,7 +5460,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.5 + 50 @@ -5432,7 +5500,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.6 + 60 @@ -5472,7 +5540,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.7 + 70 @@ -5512,7 +5580,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.8 + 80 @@ -5552,7 +5620,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 0.9 + 90 @@ -5592,7 +5660,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r2_1_non_neuro" has no unexpected c dy="0em" x={-8} > - 1.0 + 100 @@ -5819,12 +5887,12 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = - gnomAD v3.1.2 + gnomAD v4.0.0
  • GRCh38
  • +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -6465,7 +6550,8 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] =

    - Constraint not yet available for gnomAD v3. + Constraint not available for this + gene

    @@ -6508,7 +6594,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -6713,7 +6799,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.2 + 20 @@ -6753,7 +6839,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.3 + 30 @@ -6793,7 +6879,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.4 + 40 @@ -6833,7 +6919,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.5 + 50 @@ -6873,7 +6959,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.6 + 60 @@ -6913,7 +6999,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.7 + 70 @@ -6953,7 +7039,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.8 + 80 @@ -6993,7 +7079,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 0.9 + 90 @@ -7033,7 +7119,7 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] = dy="0em" x={-8} > - 1.0 + 100 @@ -7302,6 +7388,23 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -7961,7 +8064,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -8166,7 +8269,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.2 + 20 @@ -8206,7 +8309,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.3 + 30 @@ -8246,7 +8349,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.4 + 40 @@ -8286,7 +8389,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.5 + 50 @@ -8326,7 +8429,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.6 + 60 @@ -8366,7 +8469,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.7 + 70 @@ -8406,7 +8509,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.8 + 80 @@ -8446,7 +8549,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 0.9 + 90 @@ -8486,7 +8589,7 @@ exports[`GenePage with non-SV dataset "exac" has no unexpected changes 1`] = ` dy="0em" x={-8} > - 1.0 + 100 @@ -8778,6 +8881,23 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -9437,7 +9557,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -9642,7 +9762,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.2 + 20 @@ -9682,7 +9802,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.3 + 30 @@ -9722,7 +9842,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.4 + 40 @@ -9762,7 +9882,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.5 + 50 @@ -9802,7 +9922,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.6 + 60 @@ -9842,7 +9962,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.7 + 70 @@ -9882,7 +10002,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.8 + 80 @@ -9922,7 +10042,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 0.9 + 90 @@ -9962,7 +10082,7 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes dy="0em" x={-8} > - 1.0 + 100 @@ -10231,6 +10351,23 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -10890,7 +11027,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -11095,7 +11232,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.2 + 20 @@ -11135,7 +11272,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.3 + 30 @@ -11175,7 +11312,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.4 + 40 @@ -11215,7 +11352,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.5 + 50 @@ -11255,7 +11392,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.6 + 60 @@ -11295,7 +11432,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.7 + 70 @@ -11335,7 +11472,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.8 + 80 @@ -11375,7 +11512,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 0.9 + 90 @@ -11415,7 +11552,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1" has no unexpected changes 1` dy="0em" x={-8} > - 1.0 + 100 @@ -11802,6 +11939,23 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -12461,7 +12615,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -12666,7 +12820,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.2 + 20 @@ -12706,7 +12860,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.3 + 30 @@ -12746,7 +12900,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.4 + 40 @@ -12786,7 +12940,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.5 + 50 @@ -12826,7 +12980,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.6 + 60 @@ -12866,7 +13020,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.7 + 70 @@ -12906,7 +13060,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.8 + 80 @@ -12946,7 +13100,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 0.9 + 90 @@ -12986,7 +13140,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_controls" has no unexpected c dy="0em" x={-8} > - 1.0 + 100 @@ -13373,6 +13527,23 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -14032,7 +14203,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -14237,7 +14408,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.2 + 20 @@ -14277,7 +14448,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.3 + 30 @@ -14317,7 +14488,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.4 + 40 @@ -14357,7 +14528,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.5 + 50 @@ -14397,7 +14568,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.6 + 60 @@ -14437,7 +14608,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.7 + 70 @@ -14477,7 +14648,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.8 + 80 @@ -14517,7 +14688,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 0.9 + 90 @@ -14557,7 +14728,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_cancer" has no unexpected dy="0em" x={-8} > - 1.0 + 100 @@ -14944,6 +15115,23 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -15603,7 +15791,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -15808,7 +15996,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.2 + 20 @@ -15848,7 +16036,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.3 + 30 @@ -15888,7 +16076,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.4 + 40 @@ -15928,7 +16116,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.5 + 50 @@ -15968,7 +16156,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.6 + 60 @@ -16008,7 +16196,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.7 + 70 @@ -16048,7 +16236,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.8 + 80 @@ -16088,7 +16276,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 0.9 + 90 @@ -16128,7 +16316,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_neuro" has no unexpected dy="0em" x={-8} > - 1.0 + 100 @@ -16515,6 +16703,23 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -17174,7 +17379,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -17379,7 +17584,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.2 + 20 @@ -17419,7 +17624,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.3 + 30 @@ -17459,7 +17664,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.4 + 40 @@ -17499,7 +17704,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.5 + 50 @@ -17539,7 +17744,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.6 + 60 @@ -17579,7 +17784,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.7 + 70 @@ -17619,7 +17824,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.8 + 80 @@ -17659,7 +17864,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 0.9 + 90 @@ -17699,7 +17904,7 @@ exports[`GenePage with non-SV dataset "gnomad_r2_1_non_topmed" has no unexpected dy="0em" x={-8} > - 1.0 + 100 @@ -18086,6 +18291,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -18690,7 +18912,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`]

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 + .

    @@ -18744,7 +18968,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -18949,7 +19173,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.2 + 20 @@ -18989,7 +19213,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.3 + 30 @@ -19029,7 +19253,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.4 + 40 @@ -19069,7 +19293,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.5 + 50 @@ -19109,7 +19333,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.6 + 60 @@ -19149,7 +19373,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.7 + 70 @@ -19189,7 +19413,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.8 + 80 @@ -19229,7 +19453,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 0.9 + 90 @@ -19269,7 +19493,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`] dy="0em" x={-8} > - 1.0 + 100 @@ -19561,6 +19785,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -20165,7 +20406,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + .

    @@ -20219,7 +20462,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -20424,7 +20667,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.2 + 20 @@ -20464,7 +20707,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.3 + 30 @@ -20504,7 +20747,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.4 + 40 @@ -20544,7 +20787,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.5 + 50 @@ -20584,7 +20827,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.6 + 60 @@ -20624,7 +20867,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.7 + 70 @@ -20664,7 +20907,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.8 + 80 @@ -20704,7 +20947,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 0.9 + 90 @@ -20744,7 +20987,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u dy="0em" x={-8} > - 1.0 + 100 @@ -21036,6 +21279,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -21640,7 +21900,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + .

    @@ -21694,7 +21956,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -21899,7 +22161,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.2 + 20 @@ -21939,7 +22201,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.3 + 30 @@ -21979,7 +22241,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.4 + 40 @@ -22019,7 +22281,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.5 + 50 @@ -22059,7 +22321,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.6 + 60 @@ -22099,7 +22361,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.7 + 70 @@ -22139,7 +22401,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.8 + 80 @@ -22179,7 +22441,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 0.9 + 90 @@ -22219,7 +22481,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c dy="0em" x={-8} > - 1.0 + 100 @@ -22511,6 +22773,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -23115,7 +23394,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + .

    @@ -23169,7 +23450,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -23374,7 +23655,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.2 + 20 @@ -23414,7 +23695,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.3 + 30 @@ -23454,7 +23735,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.4 + 40 @@ -23494,7 +23775,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.5 + 50 @@ -23534,7 +23815,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.6 + 60 @@ -23574,7 +23855,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.7 + 70 @@ -23614,7 +23895,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.8 + 80 @@ -23654,7 +23935,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 0.9 + 90 @@ -23694,7 +23975,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch dy="0em" x={-8} > - 1.0 + 100 @@ -23986,6 +24267,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -24590,7 +24888,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + .

    @@ -24644,7 +24944,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -24849,7 +25149,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.2 + 20 @@ -24889,7 +25189,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.3 + 30 @@ -24929,7 +25229,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.4 + 40 @@ -24969,7 +25269,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.5 + 50 @@ -25009,7 +25309,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.6 + 60 @@ -25049,7 +25349,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.7 + 70 @@ -25089,7 +25389,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.8 + 80 @@ -25129,7 +25429,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 0.9 + 90 @@ -25169,7 +25469,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c dy="0em" x={-8} > - 1.0 + 100 @@ -25461,6 +25761,23 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -26065,7 +26382,9 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang

    - Constraint not yet available for gnomAD v3. + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    @@ -26119,7 +26438,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang className="Select-sc-1lkyg9e-0 ivadCR" id="coverage-metric" onChange={[Function]} - value="over_30" + value="mean" > - Fraction of individuals with coverage over 30 + Per-base mean depth of coverage
    - 0.1 + 10 @@ -26324,7 +26643,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.2 + 20 @@ -26364,7 +26683,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.3 + 30 @@ -26404,7 +26723,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.4 + 40 @@ -26444,7 +26763,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.5 + 50 @@ -26484,7 +26803,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.6 + 60 @@ -26524,7 +26843,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.7 + 70 @@ -26564,7 +26883,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.8 + 80 @@ -26604,7 +26923,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 0.9 + 90 @@ -26644,7 +26963,7 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang dy="0em" x={-8} > - 1.0 + 100 @@ -26899,7 +27218,7 @@ exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`] onClick={[Function]} onKeyDown={[Function]} > - + gnomAD v4.0.0
  • GRCh38 +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -28329,1438 +28665,3 @@ exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`]
    `; - -exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`] = ` -
    -
    -
    -
    -

    - FAKEGENE - - -

    -
    -
    - - Dataset - - - - - -
    -
    -
    -
    -
    -
    -
    - Genome build -
    -
    - GRCh37 - / - hg19 -
    -
    -
    -
    - Ensembl gene ID -
    -
    - dummy_gene-1 - . - 5.6.7.8 -
    -
    -
    -
    - Symbol in GENCODE v19 -
    -
    -
    -
    -
    - Ensembl canonical transcript - -
    -
    - - transcript-999 - . - 12.34.5 - -
    -
    -
    -
    - Region -
    -
    - - 13 - : - 123 - - - 321 - -
    -
    -
    -
    - External resources -
    -
    - - Ensembl - - , - - - UCSC Browser - - , - - -
    -
    -
    -
    -
    -
    -
    - Constraint - -
    -
    - Variant co-occurrence - -
    -
    -

    - Constraint not available for this - gene -

    -
    -
    -
    - Viewing full - gene - . - - -
    -
    -
    -
    -
    -
      - - -
    -
    -
    -
    -
    - Per-base mean depth of coverage -
    -
    -
    -
    - - - - - - - - 10 - - - - - - - - - - 20 - - - - - - - - - - 30 - - - - - - - - - - 40 - - - - - - - - - - 50 - - - - - - - - - - 60 - - - - - - - - - - 70 - - - - - - - - - - 80 - - - - - - - - - - 90 - - - - - - - - - - 100 - - - - - - - - - - - -
    -
    -
    -
    -
    - Include: -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
    -
    - - Positive strand -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -

    - ClinVar variants -

    -
    -

    - No ClinVar variants found in this gene. -

    -
    -

    - gnomAD variants -

    -

    - No gnomAD variants found. -

    -
    -
    -
    -
    -`; diff --git a/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap b/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap index ca9e26ca4..adb4b2029 100644 --- a/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap +++ b/browser/src/GenePage/__snapshots__/VariantCooccurrenceCountsTable.spec.tsx.snap @@ -2058,6 +2058,14 @@ exports[`VariantCoocurrenceCountsTable with non v2 dataset "gnomad_r4" has no un `; +exports[`VariantCoocurrenceCountsTable with non v2 dataset "gnomad_sv_r4" has no unexpected changes and renders as placeholder text 1`] = ` + +

    + Variant co-occurrence is only available for gnomAD v2. +

    +
    +`; + exports[`VariantCoocurrenceCountsTable with v2 dataset "gnomad_r2_1" has no unexpected changes and renders as a table 1`] = `
    diff --git a/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap b/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap index dd306e064..c58a1833f 100644 --- a/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap +++ b/browser/src/MitochondrialVariantPage/__snapshots__/MitochondrialVariantPage.spec.tsx.snap @@ -103,8297 +103,20 @@ exports[`MitochondrialVariantPage with dataset gnomad_cnv_r4 has no unexpected c
  • - gnomAD v3.1.2 -
    - 76,156 samples -
    -
    -
  • - - - -
  • - - gnomAD CNVs v4.0 - -
  • -
  • - - - - - - -
  • - - - - - - -
    -
    -
    -
    -
    - - Filters - -
    -
    - - Pass - -
    -
    -
    -
    - - Allele Number - -
    -
    - 0 -
    -
    -
    -
    - - Homoplasmic AC - -
    -
    - 0 -
    -
    -
    -
    - - Homoplasmic AF - -
    -
    - 0 -
    -
    -
    -
    - - Heteroplasmic AC - -
    -
    - 0 -
    -
    -
    -
    - - Heteroplasmic AF - -
    -
    - 0 -
    -
    -
    -
    - - Max Observed Heteroplasmy - -
    -
    - 0.1000 -
    -
    -
    -
    - - Excluded Allele Count - -
    -
    -
    -
    -
    - - Haplogroup Defining - -
    -
    - No -
    -
    -
    -
    -
    -

    - External Resources -

    - -

    - Feedback -

    - - Report an issue with this variant - -
    -
    -
    -

    - Genetic Ancestry Group Frequencies -

    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    - Total - - - 0 - - - - 0 - - - 0.000 - - - 0 - - - 0.000 -
    -
    -
    -

    - Haplogroup Frequencies - -

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    - Total - - - 0 - - - - 0 - - - 0.000 - - - 0 - - - 0.000 -
    - -
    -
    -
    -
    -
    -

    - Heteroplasmy Distribution -

    -
    -
    -
    - - - - - - - Heteroplasmy level - - - - - - - - - - - 0 - - - - - - - - - - 10 - - - - - - - - - - 20 - - - - - - - - - - 30 - - - - - - - - - - 40 - - - - - - - - - - 50 - - - - - - - - - - 60 - - - - - - - - - - 70 - - - - - - - - - - 80 - - - - - - - - - - 90 - - - - - - - - - - 100 - - - - - - - - - Individuals - - - - - - - - - - - - - - -
    -
    -
    -
    -

    - Age Distribution - -

    -
    -
    -
      -
    • - - - - - Variant carriers - -
    • -
    • - - - - - - - - - - - - - - All individuals - -
    • -
    -
    -
    - - - - - - - - < 30 - - - - - - - - - - 30-35 - - - - - - - - - - 35-40 - - - - - - - - - - 40-45 - - - - - - - - - - 45-50 - - - - - - - - - - 50-55 - - - - - - - - - - 55-60 - - - - - - - - - - 60-65 - - - - - - - - - - 65-70 - - - - - - - - - - 70-75 - - - - - - - - - - 75-80 - - - - - - - - - - > 80 - - - - - - - - - Age - - - - - - - - - - - 0 - - - - - - - - - - 20 - - - - - - - - - - 40 - - - - - - - - - - 60 - - - - - - - - - - 80 - - - - - - - - - - 100 - - - - - - - - - - 120 - - - - - - - - - - 140 - - - - - - - - - - 160 - - - - - - - - - - 180 - - - - - - - - - - 200 - - - - - - - - - Variant carriers - - - - - - - - - - - 0 - - - - - - - - - - 500 - - - - - - - - - - 1.00K - - - - - - - - - - 1.50K - - - - - - - - - - 2.00K - - - - - - - - - - 2.50K - - - - - - - - - - 3.00K - - - - - - - - - - 3.50K - - - - - - - - - All individuals - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -

    - Annotations -

    -
      -
    -
    -
    -
    -

    - Genotype Quality Metrics -

    -
    -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
      -
    • - - - - - Variant carriers - -
    • -
    • - - - - - - - - - - - - - - All individuals - -
    • -
    -
    -
    - - - - - - - - > 0.5 - - - - - - - - - Depth - - - - - - - - - - - 0 - - - - - - - - - - 10 - - - - - - - - - - 20 - - - - - - - - - - 30 - - - - - - - - - - 40 - - - - - - - - - - 50 - - - - - - - - - - 60 - - - - - - - - - - 70 - - - - - - - - - - 80 - - - - - - - - - - 90 - - - - - - - - - - 100 - - - - - - - - - Variant carriers - - - - - - - - - - - 0 - - - - - - - - - - 10 - - - - - - - - - - 20 - - - - - - - - - - 30 - - - - - - - - - - 40 - - - - - - - - - - 50 - - - - - - - - - - 60 - - - - - - - - - - 70 - - - - - - - - - - 80 - - - - - - - - - - 90 - - - - - - - - - - 100 - - - - - - - - - All individuals - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    -
    - - - - - - - Heteroplasmy level - - - - - - - - - - - 0 - - - - - - - - - - 10 - - - - - - - - - - 20 - - - - - - - - - - 30 - - - - - - - - - - 40 - - - - - - - - - - 50 - - - - - - - - - - 60 - - - - - - - - - - 70 - - - - - - - - - - 80 - - - - - - - - - - 90 - - - - - - - - - - 100 - - - - - - - - - Individuals failing filter - - - - - - - - - - - - - - -
    -
    - -
    -

    - Note: This plot may include low-quality genotypes that were excluded from allele counts in the tables above. - - - More information. - -

    -
    -
    -
    -
    -
    -
    -

    - Site Quality Metrics -

    -
    -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 0 - - - - - - - - - - 200 - - - - - - - - - - 400 - - - - - - - - - - 600 - - - - - - - - - - 800 - - - - - - - - - - 1000 - - - - - - - - - - 1200 - - - - - - - - - - 1400 - - - - - - - - - - 1600 - - - - - - - - - - 1800 - - - - - - - - - - 2000 - - - - - - - - - - 2200 - - - - - - - - - - 2400 - - - - - - - - - - 2600 - - - - - - - - - - 2800 - - - - - - - - - - 3000 - - - - - - - - - - 3200 - - - - - - - - - - 3400 - - - - - - - - - - 3600 - - - - - - - - - - 3800 - - - - - - - - - - 4000 - - - - - - - - - Mean Depth - - - - - - - - - - - 0 - - - - - - - - - - 500 - - - - - - - - - - 1.00K - - - - - - - - - - 1.50K - - - - - - - - - - 2.00K - - - - - - - - - - 2.50K - - - - - - - - - - 3.00K - - - - - - - - - - 3.50K - - - - - - - - - - 4.00K - - - - - - - - - - 4.50K - - - - - - - - - - 5.00K - - - - - - - - - Variants - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    - - - - - - - - - - - - - -
    - Metric - - Value -
    - Mean Depth - - 0 -
    -
    -
    -
    -
    -
    -
    -

    - Read Data -

    -

    - Read data is not yet available for mitochondrial variants. -

    -
    - -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r2_1 has no unexpected changes 1`] = ` -
    - Mitochondrial variants are not available in - gnomAD v2.1.1 -
    -
    - - Search for this variant in gnomAD v3 - -
    -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r2_1_controls has no unexpected changes 1`] = ` -
    - Mitochondrial variants are not available in - gnomAD v2.1.1 (controls) -
    -
    - - Search for this variant in gnomAD v3 - -
    -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_cancer has no unexpected changes 1`] = ` -
    - Mitochondrial variants are not available in - gnomAD v2.1.1 (non-cancer) -
    -
    - - Search for this variant in gnomAD v3 - -
    -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_neuro has no unexpected changes 1`] = ` -
    - Mitochondrial variants are not available in - gnomAD v2.1.1 (non-neuro) -
    -
    - - Search for this variant in gnomAD v3 - -
    -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_topmed has no unexpected changes 1`] = ` -
    - Mitochondrial variants are not available in - gnomAD v2.1.1 (non-TOPMed) -
    -
    - - Search for this variant in gnomAD v3 - -
    -`; - -exports[`MitochondrialVariantPage with dataset gnomad_r3 has no unexpected changes 1`] = ` -
    -
    -
    -

    - Single nucleotide variant - : - - M-123-A-C - (GRCh38) - -

    -
    -
    - - Dataset - -
    + +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -11269,10 +2992,10 @@ exports[`MitochondrialVariantPage with dataset gnomad_r3 has no unexpected chang > `; -exports[`MitochondrialVariantPage with dataset gnomad_r3_controls_and_biobanks has no unexpected changes 1`] = ` +exports[`MitochondrialVariantPage with dataset gnomad_r2_1 has no unexpected changes 1`] = ` + +`; + +exports[`MitochondrialVariantPage with dataset gnomad_r2_1_controls has no unexpected changes 1`] = ` +
    + Mitochondrial variants are not available in + gnomAD v2.1.1 (controls) +
    +
    + + Search for this variant in gnomAD v3 + +
    +`; + +exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_cancer has no unexpected changes 1`] = ` +
    + Mitochondrial variants are not available in + gnomAD v2.1.1 (non-cancer) +
    +
    + + Search for this variant in gnomAD v3 + +
    +`; + +exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_neuro has no unexpected changes 1`] = ` +
    + Mitochondrial variants are not available in + gnomAD v2.1.1 (non-neuro) +
    +
    + + Search for this variant in gnomAD v3 + +
    +`; + +exports[`MitochondrialVariantPage with dataset gnomad_r2_1_non_topmed has no unexpected changes 1`] = ` +
    + Mitochondrial variants are not available in + gnomAD v2.1.1 (non-TOPMed) +
    +
    + + Search for this variant in gnomAD v3 + +
    +`; + +exports[`MitochondrialVariantPage with dataset gnomad_r3 has no unexpected changes 1`] = `
    @@ -16556,12 +8369,12 @@ exports[`MitochondrialVariantPage with dataset gnomad_r3_controls_and_biobanks h - gnomAD v3.1.2 (controls/biobanks) + gnomAD v3.1.2
  • GRCh38
  • +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • GRCh38
  • +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • GRCh38 +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • GRCh38 +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • GRCh38 +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
  • GRCh38 +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • - gnomAD SVs v4 + gnomAD SVs v4.0
    @@ -60493,10 +52408,10 @@ exports[`MitochondrialVariantPage with dataset gnomad_r4 has no unexpected chang > GRCh38
    +
  • + + gnomAD v4.0.0 +
    + 807,162 samples +
    +
    +
  • gnomAD v3.1.2
    76,156 samples
    @@ -65842,6 +57774,149 @@ exports[`MitochondrialVariantPage with dataset gnomad_r4 has no unexpected chang
  • +
  • + + gnomAD CNVs v4.0 + +
  • +
  • + + + + + + +
  • @@ -858,7 +858,7 @@ const VariantPage = ({ datasetId, variantId }: VariantPageProps) => { onClick={() => { location.href = `/gene/${gene.ensembleId}?dataset=${datasetId}` }} - style={{ margin: '0 1em 0 -0.33em' }} + style={{ margin: '0 1em 0 1em' }} > Gene page diff --git a/browser/src/VariantPage/__snapshots__/VariantPage.spec.tsx.snap b/browser/src/VariantPage/__snapshots__/VariantPage.spec.tsx.snap index e808440ce..f5f8f1dde 100644 --- a/browser/src/VariantPage/__snapshots__/VariantPage.spec.tsx.snap +++ b/browser/src/VariantPage/__snapshots__/VariantPage.spec.tsx.snap @@ -75,7 +75,7 @@ exports[`VariantPage with dataset "gnomad_r3" has no unexpected changes 1`] = ` onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -8904,7 +8904,7 @@ exports[`VariantPage with dataset "gnomad_r3_controls_and_biobanks" has no unexp onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -17736,7 +17736,7 @@ exports[`VariantPage with dataset "gnomad_r3_non_cancer" has no unexpected chang onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -26568,7 +26568,7 @@ exports[`VariantPage with dataset "gnomad_r3_non_neuro" has no unexpected change onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -35400,7 +35400,7 @@ exports[`VariantPage with dataset "gnomad_r3_non_topmed" has no unexpected chang onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -44232,7 +44232,7 @@ exports[`VariantPage with dataset "gnomad_r3_non_v2" has no unexpected changes 1 onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -53064,7 +53064,7 @@ exports[`VariantPage with dataset exac has no unexpected changes 1`] = ` onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -60202,7 +60202,7 @@ exports[`VariantPage with dataset gnomad_r2_1 has no unexpected changes 1`] = ` onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -69226,7 +69226,7 @@ exports[`VariantPage with dataset gnomad_r2_1_controls has no unexpected changes onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -78250,7 +78250,7 @@ exports[`VariantPage with dataset gnomad_r2_1_non_cancer has no unexpected chang onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -87274,7 +87274,7 @@ exports[`VariantPage with dataset gnomad_r2_1_non_neuro has no unexpected change onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" @@ -96298,7 +96298,7 @@ exports[`VariantPage with dataset gnomad_r2_1_non_topmed has no unexpected chang onClick={[Function]} style={ { - "margin": "0 1em 0 -0.33em", + "margin": "0 1em 0 1em", } } type="button" From cb9700bfbfca04679f99b806a1529d43bae4d202 Mon Sep 17 00:00:00 2001 From: Riley Grant Date: Tue, 31 Oct 2023 22:38:25 -0500 Subject: [PATCH 102/106] Remove v4 from hasConstraint metadata --- .../ConstraintTable.spec.tsx.snap | 5135 +++++------------ .../__snapshots__/GenePage.spec.tsx.snap | 20 +- .../TranscriptPage.spec.tsx.snap | 15 +- .../TranscriptPageContainer.spec.tsx.snap | 10 +- dataset-metadata/metadata.spec.ts | 8 +- dataset-metadata/metadata.ts | 35 +- 6 files changed, 1530 insertions(+), 3693 deletions(-) diff --git a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap index 64276b13b..3145e5f43 100644 --- a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap +++ b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap @@ -31,6 +31,54 @@ exports[`ConstraintTable with "exac" dataset selected with a mitochondrial trans `; exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD CNVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r2_1" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [
    `; -exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -799,7 +847,7 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondr

    `; -exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -807,8 +855,11 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondr

    `; -exports[`ConstraintTable with "gnomad_r2_1" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [ +

    + Constraint is based on the full gnomAD dataset, not the selected subset. +

    ,
    -
    - - - - - - - - - - - - + + +
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - + Constraint is based on the full gnomAD dataset, not the selected subset. +

    , +
    + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + - - - - - - - - - -
    - 0.2 - - - - - Z = - - + - 0.46 - -
    - + Expected SNVs + +
    - o/e = - 0.91 + Observed SNVs - - ( + + Constraint metrics + +
    + Synonymous + - 0.8 + 0.2 - - + + + Z = - 0.95 + 0.46 - ) - - - - - 0 - - - - - + - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - + 0.91 + + + ( + + 0.8 + + - + + + 0.95 + + ) + +
    + + + 0 + + + + + + 1 + + +
    - o/e = + Missense + - 0.89 + 0.3 + + + Z = - ( - 0.8 + 0.57 - - - +
    + + o/e = + + 0.89 + + + ( + + 0.8 + + - + + + 0.99 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + pLoF + - 0.99 + 0.1 - ) - - - - + + + pLI = + - 0 - - - - - +
    + - 1 -
    - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 + o/e = + + 0.79 + + + ( + + 0.6 + + - + + + 0.9 + + ) - ) - -
    - - - 0 - - - - - + + - 1 - - -
    -
    + + 0 + + + + + + 1 + + +
    +
    , +] `; -exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -1576,7 +1632,7 @@ exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondria

    `; -exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -1584,7 +1640,7 @@ exports[`ConstraintTable with "gnomad_r2_1" dataset selected with a mitochondria

    `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -1972,7 +2028,7 @@ exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected and gene w ] `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -2339,21 +2395,21 @@ exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected and transc ] `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -2361,7 +2417,7 @@ exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mit

    `; -exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -2369,7 +2425,7 @@ exports[`ConstraintTable with "gnomad_r2_1_controls" dataset selected with a mit

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -2757,7 +2813,7 @@ exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and gene ] `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -3124,21 +3180,21 @@ exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected and tran ] `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -3146,7 +3202,7 @@ exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a m

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -3154,7 +3210,7 @@ exports[`ConstraintTable with "gnomad_r2_1_non_cancer" dataset selected with a m

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -3542,7 +3598,7 @@ exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and gene ] `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -3909,21 +3965,21 @@ exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected and trans ] `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -3931,7 +3987,7 @@ exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mi

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -3939,2638 +3995,344 @@ exports[`ConstraintTable with "gnomad_r2_1_non_neuro" dataset selected with a mi

    `; -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -[ -

    - Constraint is based on the full gnomAD dataset, not the selected subset. -

    , -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    , -

    - Constraint metrics based on - Ensembl canonical - transcript ( - - transcript-999 - . - 12.34.5 - - ). -

    , -] -`; - -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -[ -

    - Constraint is based on the full gnomAD dataset, not the selected subset. -

    , -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    , -] -`; - -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not available for this - gene -

    -`; - -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not available for this - transcript -

    -`; - -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint is not available for mitochondrial - - genes -

    -`; - -exports[`ConstraintTable with "gnomad_r2_1_non_topmed" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint is not available for mitochondrial - - transcripts -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (controls/biobanks) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-cancer) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-neuro) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-TOPMed) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint not yet available for - gnomAD v3.1.2 (non-v2) - . -

    -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -[ -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    , -

    - Constraint metrics based on - Ensembl canonical - transcript ( - - transcript-999 - . - 12.34.5 - - ). -

    , -] -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` -

    - Constraint not available for this - gene -

    -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` -

    - Constraint not available for this - transcript -

    -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` -

    - Constraint is not available for mitochondrial - - genes -

    -`; - -exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` -

    - Constraint is not available for mitochondrial - - transcripts -

    -`; - -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected and gene with available constraint has no unexpected changes 1`] = ` -[ -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    , -

    - Constraint metrics based on - Ensembl canonical - transcript ( - - transcript-999 - . - 12.34.5 - - ). -

    , -] -`; - -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - - 0.57 - -
    - - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    +exports[`ConstraintTable with "gnomad_r3" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (controls/biobanks) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-cancer) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-neuro) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-TOPMed) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + . +

    +`; + +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + . +

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal gene has no unexpected changes 1`] = `

    - Constraint not available for this - gene + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    - Constraint is not available for mitochondrial - - genes + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    - Constraint is not available for mitochondrial - - transcripts + Constraint not yet available for + gnomAD v3.1.2 (non-v2) + .

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r4" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD v4.0.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [ -

    - Constraint is based on the full gnomAD dataset, not the selected subset. -

    ,
    1 - - - - - - - - - - - -
    - pLoF - - - 0.1 - - - - pLI = - - 0.68 - -
    - - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) - -
    - - - 0 - - - - - - 1 - - -
    -
    , -

    - Constraint metrics based on - Ensembl canonical - transcript ( - - transcript-999 - . - 12.34.5 - - ). -

    , -] -`; - -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` -[ -

    - Constraint is based on the full gnomAD dataset, not the selected subset. -

    , -
    - - - - - - - - - - - -
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - + + +
    - Synonymous + pLoF - 0.2 + 0.1 - Z = - + pLI = - 0.46 + 0.68
    - 0.91 + 0.79 ( @@ -7046,16 +4629,16 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and tra onMouseEnter={[Function]} onMouseLeave={[Function]} > - 0.8 + 0.6 - - 0.95 + 0.9 ) @@ -7083,14 +4666,14 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and tra
    +
    +
    , +

    + Constraint metrics based on + Ensembl canonical + transcript ( + + transcript-999 + . + 12.34.5 + + ). +

    , +] +`; + +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +
    + + + + + - + + + + + + + + - + + + + + + - + - - - + + + + - - - - -
    + Category + + - Missense - + Expected SNVs + + + + + Observed SNVs + + + Constraint metrics + +
    + Synonymous + + + 0.2 + + + + Z = + + + 0.46 + +
    + + o/e = - 0.3 + 0.91 -
    - - Z = + ( - 0.57 + 0.8 -
    + - + + 0.95 + + ) + +
    + + + 0 + + + + + + 1 + + +
    + Missense + + + 0.3 + + + + Z = + + + 0.57 + +
    + + o/e = + + 0.89 + + + ( + + 0.8 + + - + + - o/e = - - 0.89 - - - ( - - 0.8 - - - - - - 0.99 - - ) + 0.99 -
    - + + + - - 0 - - - - - - 1 - - -
    + + + + + 1 + + + +
    + pLoF + + - pLoF - - + 0.1 + + + + pLI = + + 0.68 + +
    + + o/e = - 0.1 + 0.79 -
    - - pLI = + + ( - 0.68 + 0.6 -
    + - + - o/e = - - 0.79 - - - ( - - 0.6 - - - - - - 0.9 - - ) + 0.9 -
    - - - 0 - - - - - - 1 - - -
    -
    , -] + ) +
    + + + + + 0 + + + + + + 1 + + + + + + + `; -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -7343,7 +5100,7 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -7351,7 +5108,7 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -7739,7 +5496,7 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected and ge ] `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` [

    Constraint is based on the full gnomAD dataset, not the selected subset. @@ -8106,21 +5863,21 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected and tr ] `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -8128,7 +5885,7 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a

    `; -exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_controls" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -8136,8 +5893,11 @@ exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a

    `; -exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected and gene with available constraint has no unexpected changes 1`] = ` [ +

    + Constraint is based on the full gnomAD dataset, not the selected subset. +

    ,
    -
    - - - - - - - - - - - - - - - - - - - + + +
    - Category - - - Expected SNVs - - - - Observed SNVs - - - Constraint metrics - -
    - Synonymous - - - 0.2 - - - - Z = - - - 0.46 - -
    - - o/e = - - 0.91 - - - ( - - 0.8 - - - - - - 0.95 - - ) - -
    - - - 0 - - - - - - 1 - - -
    - Missense - - - 0.3 - - - - Z = - - + Constraint is based on the full gnomAD dataset, not the selected subset. +

    , +
    + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + - - - -
    - 0.57 - -
    - +
    - o/e = - 0.89 + Expected SNVs - - ( + - 0.8 + Observed SNVs - - + + Constraint metrics + +
    + Synonymous + + + 0.2 + + + + Z = - 0.99 + 0.46 - ) - - - - + - 0 - - - - - + 0.91 + + + ( + + 0.8 + + - + + + 0.95 + + ) + + + - 1 - - -
    - pLoF - - - 0.1 - - - - pLI = - + 0 + + + + + + 1 + + +
    - 0.68 - -
    - +
    + + 0.3 + + + + Z = + + + 0.57 + +
    + + o/e = + + 0.89 + + + ( + + 0.8 + + - + + + 0.99 + + ) + +
    + + + 0 + + + + + + 1 + + +
    - o/e = + pLoF + - 0.79 + 0.1 - - ( + + + pLI = - 0.6 + 0.68 - - - +
    - 0.9 + o/e = + + 0.79 + + + ( + + 0.6 + + - + + + 0.9 + + ) - ) - -
    - - - 0 - - - - - + + - 1 - - -
    -
    + + 0 + + + + + + 1 + + +
    +
    , +] `; -exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a minimal gene has no unexpected changes 1`] = `

    Constraint not available for this gene

    `; -exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a minimal transcript has no unexpected changes 1`] = `

    Constraint not available for this transcript

    `; -exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a mitochondrial gene has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -8905,7 +6670,7 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondri

    `; -exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +exports[`ConstraintTable with "gnomad_sv_r2_1_non_neuro" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = `

    Constraint is not available for mitochondrial @@ -8913,6 +6678,54 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondri

    `; +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and gene with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and transcript with available constraint has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial gene has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + +exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondrial transcript has no unexpected changes 1`] = ` +

    + Constraint not yet available for + gnomAD SVs v4.0 + . +

    +`; + exports[`ConstraintTable with exac dataset and gene with available constraints has no unexpected changes 1`] = ` [

    - Constraint not available for this - gene + Constraint not yet available for + gnomAD CNVs v4.0 + .

    @@ -6550,8 +6551,9 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] =

    - Constraint not available for this - gene + Constraint not yet available for + gnomAD SVs v4.0 + .

    @@ -9502,8 +9504,9 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes

    - Constraint not available for this - gene + Constraint not yet available for + gnomAD CNVs v4.0 + .

    @@ -27876,8 +27879,9 @@ exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`]

    - Constraint not available for this - gene + Constraint not yet available for + gnomAD v4.0.0 + .

    diff --git a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap index 656e36ebc..85f7de013 100644 --- a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap @@ -1431,8 +1431,9 @@ exports[`TranscriptPage with dataset "gnomad_cnv_r4" has no unexpected changes 1

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD CNVs v4.0 + .

    @@ -11133,8 +11134,9 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] =

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD v4.0.0 + .

    @@ -14365,8 +14367,9 @@ exports[`TranscriptPage with dataset "gnomad_sv_r4" has no unexpected changes 1`

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD SVs v4.0 + .

    diff --git a/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap index 169e67e04..c873fa549 100644 --- a/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap @@ -2030,8 +2030,9 @@ exports[`TranscriptPageContainer with dataset gnomad_cnv_r4 has no unexpected ch

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD CNVs v4.0 + .

    @@ -18920,8 +18921,9 @@ exports[`TranscriptPageContainer with dataset gnomad_r4 has no unexpected change

    - Constraint not available for this - transcript + Constraint not yet available for + gnomAD v4.0.0 + .

    diff --git a/dataset-metadata/metadata.spec.ts b/dataset-metadata/metadata.spec.ts index 4bcc20312..38c5c1b8f 100644 --- a/dataset-metadata/metadata.spec.ts +++ b/dataset-metadata/metadata.spec.ts @@ -123,9 +123,9 @@ describe.each([ ['gnomad_sv_r2_1', true], ['gnomad_sv_r2_1_controls', true], ['gnomad_sv_r2_1_non_neuro', true], - ['gnomad_sv_r4', true], - ['gnomad_cnv_r4', true], - ['gnomad_r4', true], + ['gnomad_sv_r4', false], + ['gnomad_cnv_r4', false], + ['gnomad_r4', false], ] as [DatasetId, boolean][])('hasConstraints(%s)', (datasetId, expectedResult) => { const verbPhrase = expectedResult ? 'has' : 'does not have' test(`${datasetId} ${verbPhrase} constraints`, () => @@ -225,7 +225,7 @@ const expectedCoverageDatasetIds: Record = { gnomad_sv_r2_1_non_neuro: 'gnomad_r2_1', gnomad_sv_r4: 'gnomad_r3', gnomad_r4: 'gnomad_r4', - gnomad_cnv_r4: 'gnomad_r4' + gnomad_cnv_r4: 'gnomad_r4', } describe.each(allDatasetIds)('coverageDataset for dataset %s', (datasetId: DatasetId) => { diff --git a/dataset-metadata/metadata.ts b/dataset-metadata/metadata.ts index a2ac25d54..0e037f183 100644 --- a/dataset-metadata/metadata.ts +++ b/dataset-metadata/metadata.ts @@ -17,7 +17,7 @@ export const datasetLabels = { gnomad_sv_r2_1_controls: 'gnomAD SVs v2.1 (controls)', gnomad_sv_r2_1_non_neuro: 'gnomAD SVs v2.1 (non-neuro)', gnomad_sv_r4: 'gnomAD SVs v4.0', - gnomad_cnv_r4: "gnomAD CNVs v4.0", + gnomad_cnv_r4: 'gnomAD CNVs v4.0', gnomad_r4: 'gnomAD v4.0.0', } as const export type DatasetId = keyof typeof datasetLabels @@ -188,30 +188,46 @@ const metadataForDataset = (datasetId: DatasetId): DatasetMetadata => ({ isSubset: !fullDatasetIds.includes(datasetId), isV3Subset: !fullDatasetIds.includes(datasetId) && datasetId.startsWith('gnomad_r3'), isV4SVs: datasetId === 'gnomad_sv_r4', - hasShortVariants: !structuralVariantDatasetIds.includes(datasetId) && !copyNumberVariantDatasetIds.includes(datasetId), + hasShortVariants: + !structuralVariantDatasetIds.includes(datasetId) && + !copyNumberVariantDatasetIds.includes(datasetId), hasStructuralVariants: structuralVariantDatasetIds.includes(datasetId), hasCopyNumberVariants: copyNumberVariantDatasetIds.includes(datasetId), hasCopyNumberVariantCoverage: datasetId.startsWith('gnomad_cnv'), hasVariantCoocurrence: datasetId.startsWith('gnomad') && datasetId.includes('r2'), - hasConstraints: datasetId.includes('r4') || - datasetId.startsWith("gnomad_sv_r4") || + hasConstraints: datasetId.startsWith('gnomad_r2') || datasetId.startsWith('gnomad_sv_r2') || - datasetId === "exac", + datasetId === 'exac', hasNonCodingConstraints: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4', hasExome: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', genesHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', transcriptsHaveExomeCoverage: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4', - referenceGenome: (datasetId.startsWith('gnomad_r3') || datasetId.startsWith('gnomad_r4') || datasetId === 'gnomad_sv_r4' || datasetId === "gnomad_cnv_r4") ? 'GRCh38' : 'GRCh37', + referenceGenome: + datasetId.startsWith('gnomad_r3') || + datasetId.startsWith('gnomad_r4') || + datasetId === 'gnomad_sv_r4' || + datasetId === 'gnomad_cnv_r4' + ? 'GRCh38' + : 'GRCh37', genesHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), regionsHaveExomeCoverage: !datasetId.startsWith('gnomad_sv') && !datasetId.startsWith('gnomad_r3'), regionsHaveGenomeCoverage: !datasetId.startsWith('gnomad_cnv'), - hasLocalAncestryPopulations: datasetId.startsWith('gnomad_r3') || datasetId === 'gnomad_sv_r4' || datasetId.startsWith('gnomad_r4'), + hasLocalAncestryPopulations: + datasetId.startsWith('gnomad_r3') || + datasetId === 'gnomad_sv_r4' || + datasetId.startsWith('gnomad_r4'), isLiftoverSource: datasetId.startsWith('gnomad_r2_1'), isLiftoverTarget: datasetId.startsWith('gnomad_r4'), - usesGrch37: !datasetId.startsWith('gnomad_r3') && datasetId !== 'gnomad_sv_r4' && !datasetId.startsWith('gnomad_r4'), - usesGrch38: datasetId.startsWith('gnomad_r3') || datasetId.startsWith('gnomad_r4') || datasetId === 'gnomad_sv_r4', + usesGrch37: + !datasetId.startsWith('gnomad_r3') && + datasetId !== 'gnomad_sv_r4' && + !datasetId.startsWith('gnomad_r4'), + usesGrch38: + datasetId.startsWith('gnomad_r3') || + datasetId.startsWith('gnomad_r4') || + datasetId === 'gnomad_sv_r4', isV2: datasetId.startsWith('gnomad_r2'), isV3: datasetId.startsWith('gnomad_r3'), isV4: datasetId.startsWith('gnomad_r4'), @@ -370,4 +386,3 @@ export const copyNumberVariantDatasetId = (datasetId: DatasetId) => export const hasCopyNumberVariantCoverage = (datasetId: DatasetId) => getMetadata(datasetId, 'hasCopyNumberVariantCoverage') - From 04290733fac248914a05bcb0425a4e4b92422cef Mon Sep 17 00:00:00 2001 From: Riley Grant Date: Tue, 31 Oct 2023 23:04:46 -0500 Subject: [PATCH 103/106] Remove references to v4 constraint from Help page --- ...-expected-number-of-variants-determined.md | 2 +- ...the-fields-included-in-constraint-files.md | 2 +- ...-for-this-gene-or-annotated-with-a-note.md | 18 ++--- ...-constraint-table-than-on-the-gene-page.md | 2 +- ...not-yet-in-v4-and-where-can-i-find-them.md | 3 +- browser/help/topics/constraint.md | 77 +++++++------------ .../help/__snapshots__/HelpPage.spec.tsx.snap | 27 ++++--- 7 files changed, 55 insertions(+), 76 deletions(-) diff --git a/browser/help/faq/constraint/how-was-the-expected-number-of-variants-determined.md b/browser/help/faq/constraint/how-was-the-expected-number-of-variants-determined.md index cbf3603dd..54b689b89 100644 --- a/browser/help/faq/constraint/how-was-the-expected-number-of-variants-determined.md +++ b/browser/help/faq/constraint/how-was-the-expected-number-of-variants-determined.md @@ -2,4 +2,4 @@ question: 'How was the expected number of variants determined?' --- -We used a mutational model that accounts for local sequence context, CpG methylation, and sequencing depth to predict the number of expected single nucleotide variants per functional class per gene. More details can be found in the help section on [gene constraint](/help/constraint) and in [Karczewski _et al._ Nature 2020](https://doi.org/10.1038/s41586-020-2308-7). Note that the expected variant counts for bases with a median depth <1 were removed from the totals. In v4, we applied our mutational model only to sites with a median depth in the exomes ≥30. +We used a mutational model that accounts for local sequence context, CpG methylation, and sequencing depth to predict the number of expected single nucleotide variants per functional class per gene. More details can be found in the help section on [gene constraint](/help/constraint) and in [Karczewski _et al._ Nature 2020](https://doi.org/10.1038/s41586-020-2308-7). Note that the expected variant counts for bases with a median depth <1 were removed from the totals. diff --git a/browser/help/faq/constraint/what-are-the-fields-included-in-constraint-files.md b/browser/help/faq/constraint/what-are-the-fields-included-in-constraint-files.md index 77ac32766..f797370e0 100644 --- a/browser/help/faq/constraint/what-are-the-fields-included-in-constraint-files.md +++ b/browser/help/faq/constraint/what-are-the-fields-included-in-constraint-files.md @@ -2,4 +2,4 @@ question: 'What are the fields included in constraint files?' --- -Descriptions of the fields in these files can be found in the [README file](/downloads#v4-variants) supplied with the download. +Descriptions of the fields in these files can be found in the Supplementary Dataset 11 section on pages 74-77 of the [Supplementary Information](https://www.nature.com/articles/s41586-020-2308-7#Sec12) of [_The mutational constraint spectrum quantified from variation in 141,456 humans._ Nature 581, 434–443 (2020)](https://doi.org/10.1038/s41586-020-2308-7). diff --git a/browser/help/faq/constraint/why-are-constraint-metrics-missing-for-this-gene-or-annotated-with-a-note.md b/browser/help/faq/constraint/why-are-constraint-metrics-missing-for-this-gene-or-annotated-with-a-note.md index 95243432d..ed3b1b57b 100644 --- a/browser/help/faq/constraint/why-are-constraint-metrics-missing-for-this-gene-or-annotated-with-a-note.md +++ b/browser/help/faq/constraint/why-are-constraint-metrics-missing-for-this-gene-or-annotated-with-a-note.md @@ -2,16 +2,14 @@ question: 'Why are constraint metrics missing for this gene or annotated with a note?' --- -Genes that were outliers in certain assessments will not have constraint metrics or will be flagged with a note warning of various error modes. Please note that these assessments were applied to the canonical transcripts of the genes. If a gene was not annotated as a protein-coding gene in GENCODE v19, we did not calculate constraint. The following list describes the reason names given in the constraint_flag column of the [constraint files](/downloads#v4-constraint): +Genes that were outliers in certain assessments will not have constraint metrics or will be flagged with a note warning of various error modes. Please note that these assessments were applied to the canonical transcripts of the genes. If a gene was not annotated as a protein-coding gene in GENCODE v19, we did not calculate constraint. The following list describes the reason names given in the constraint_flag column of the [constraint files](/downloads#v2-constraint): -- `no_variants`: Zero observed synonymous, missense, pLoF variants -- `no_exp_lof`: Zero expected pLoF variants -- `outlier_lof`: Number of pLoF variants is significantly different than expectation -- `no_exp_mis`: Zero expected missense variants -- `outlier_mis`: Number of missense variants is significantly different than expectation -- `no_exp_syn`: Zero expected synonymous variants -- `outlier_syn`: Number of synonymous variants is significantly different than expectation +- no_variants: Zero observed synonymous, missense, pLoF variants +- no_exp_lof: Zero expected pLoF variants +- lof_too_many: More pLoF variants than expected +- no_exp_mis: Zero expected missense variants +- mis_too_many: More missense variants than expected +- no_exp_syn: Zero expected synonymous variants +- syn_outlier: More or fewer synonymous variants than expected Possible reasons that one might observe the deviations listed above include mismapped reads due to homologous regions or poor quality sequencing data. - -Currently, constraint scores are only available for autosomes. We will release scores for chromosomes X in the near future. diff --git a/browser/help/faq/constraint/why-are-there-fewer-variants-in-the-constraint-table-than-on-the-gene-page.md b/browser/help/faq/constraint/why-are-there-fewer-variants-in-the-constraint-table-than-on-the-gene-page.md index d837f77f3..bbe90b096 100644 --- a/browser/help/faq/constraint/why-are-there-fewer-variants-in-the-constraint-table-than-on-the-gene-page.md +++ b/browser/help/faq/constraint/why-are-there-fewer-variants-in-the-constraint-table-than-on-the-gene-page.md @@ -2,4 +2,4 @@ question: 'Why are there fewer variants in the constraint table than displayed on the gene page?' --- -We only included single nucleotide variants that were found in the MANE Select (v3 and v4 on GRCh38) or canonical (ExAC and v2 on GRCh37/hg19) transcript of the gene. On the gene page, variants found in all transcripts are displayed. Additionally, both observed and expected variant counts were removed for sites with a median depth < 30. +We only included single nucleotide variants that were found in the canonical (ExAC and v2 on GRCh37/hg19) transcript of the gene. On the gene page, variants found in all transcripts are displayed. diff --git a/browser/help/faq/general/what-features-are-not-yet-in-v4-and-where-can-i-find-them.md b/browser/help/faq/general/what-features-are-not-yet-in-v4-and-where-can-i-find-them.md index 93e2b734a..46938b40f 100644 --- a/browser/help/faq/general/what-features-are-not-yet-in-v4-and-where-can-i-find-them.md +++ b/browser/help/faq/general/what-features-are-not-yet-in-v4-and-where-can-i-find-them.md @@ -2,7 +2,7 @@ question: 'What features are not yet in v4 and where can I find them?' --- -The v4.0 release is a minimum viable product (MVP) release, which allows us to get the most critical piece of the gnomAD database, high quality aggregate allele frequencies and updated constraint metrics, to our users as soon as possible. It also means that a few of the existing features found in v2 or v3 are not yet included in v4 but **will be coming soon**. +The v4.0 release is a minimum viable product (MVP) release, which allows us to get the most critical piece of the gnomAD database, high quality aggregate allele frequencies, to our users as soon as possible. It also means that a few of the existing features found in v2 or v3 are not yet included in v4 but **will be coming soon**. Below is a list of all features not included in the v4 MVP and where to find them in our past datasets until we are able to add them to v4: @@ -10,6 +10,7 @@ Below is a list of all features not included in the v4 MVP and where to find the | Non MVP feature | Past versions with this data | | ----------------------------------------------- | ----------------------------------------------------- | +| Gene constraint | v2 gene page | | Pext score | v2 gene page | | Sub-genetic ancestry groups (prevously subpops) | v2 variant page | | Multi Nucleotide (MNV) calls | v2 variant table and variant page | diff --git a/browser/help/topics/constraint.md b/browser/help/topics/constraint.md index 575f4bced..04fc7e8e8 100644 --- a/browser/help/topics/constraint.md +++ b/browser/help/topics/constraint.md @@ -3,69 +3,50 @@ id: constraint title: 'Gene constraint' --- -Genetic constraint is a measure of the amount that a genomic region is under negative selection. Knowing how much a gene is constrained (e.g., intolerant to mutational changes) can help prioritize variants that are more likely to have a deleterious functional impact. In order to measure a gene’s intolerance to variation, we developed a mutational model that predicts the number of variants expected to be seen in the gnomAD dataset for a given transcript based on local sequence context and CpG methylation levels. We then compare those per-transcript expectations to the observed amount of variation, and consider transcripts that are significantly depleted of their expected variation to be constrained against, or intolerant of, such variation. As detailed below, we have developed three gene-level constraint metrics. **We recommend using the `LOEUF` (loss-of-function observed / expected upper bound fraction) score displayed in the constraint table**, though we also display the probability of being loss-of-function intolerant (`pLI`) score and z-score for all genes, when available. +With gnomAD, we have shifted from using the _probability of being loss-of-function intolerant_ (`pLI`) score developed with ExAC and now recommend using the _observed / expected_ score. For this reason, the constraint table displayed on the browser (unless the ExAC data is selected) now also shows the _observed / expected_ (`oe`) metric. It is very important to note that the scale of `oe` is very different from that of `pLI`; in particular low `oe` values are indicative of strong intolerance. In addition, while `pLI` incorporated the uncertainty around low counts (i.e a gene with low expected count could not have a high `pLI`), `oe` does not. Therefore, the `oe` metric comes with a 90% CI. It is important to consider the confidence interval when using `oe`. +The change from `pLI` to `oe` was motivated mainly by its easier interpretation and its continuity across the spectrum of selection. As an example, let’s take a gene with a `pLI` of 0.8: this means that this gene cannot be categorized as a highly likely haploinsufficient gene based on our data. However, it is unclear whether this value was obtained because of sample size or because there were too many loss-of-function (LoF) variants observed in the gene. In addition, if the cause was the latter, `pLI` doesn’t tell much about the overall selection against loss-of-function in this gene. On the other hand, a gene with an LoF `oe` of 0.4 can clearly be interpreted as a gene where only 40% of the expected loss-of-function variants were observed and therefore is likely under selection against LoF variants. In addition, the 90% CI allows us to clearly distinguish cases where there is a lot of uncertainty about the constraint for that gene due to sample size. +Since `pLI` > 0.9 is widely used in research and clinical interpretation of Mendelian cases, we suggest using the upper bound of the `oe` confidence interval < 0.35 if a hard threshold is needed. Note that we also provide `pLI` values computed with gnomAD. +Since `pLI` > 0.9 is widely used in research and clinical interpretation of Mendelian cases, we suggest using the upper bound of the `oe` confidence interval (which we term the "loss-of-function observed/expected upper bound fraction" or "LOEUF") < 0.35 if a hard threshold is needed. Note that we also provide `pLI` values computed with gnomAD. -The sections below will review: +The sections below give an explanation of both the _observed / expected_ and the _probability of being loss-of-function intolerant_ scores. -- [Methods](/help/constraint#methods) -- [Details on each of the scores](/help/constraint#scores) - - [LOEUF: loss-of-function observed / expected upper bound fraction](/help/constraint#loeuf) - - [pLI: probability of being loss-of-function intolerant](/help/constraint#pli) - - [Z score](/help/constraint#z-score) -- [An explanation of “What is the difference between the LOEUF and pLI score?](/help/constraint#loeuf-vs-pli)” +### Observed / expected (`oe`) -More details on these methods can be found in the supplement of [Lek _et al._ Nature 2016](https://www.nature.com/articles/nature19057) and [Karczewski _et al._ Nature 2020](https://www.nature.com/articles/s41586-020-2308-7). - -### Methods - -#### Transcripts included in the analyses - -We used the MANE select transcripts of protein-coding genes as defined by GENCODE v39. - -We excluded 165 transcripts that had zero observed variants when removing exons with a median depth < 1 as well as 31,991 transcripts that had either (1) far too many synonymous and missense variants as determined by a Z score (p < 10-4 and 10-3, respectively) or (2) far too few synonymous and missense variants as determined by a Z score (p < 10-4 and 10-3, respectively). When all outliers were removed, there were 13,313 transcripts left for analyses. - -#### Observed variant count - -The observed variant count is the number of unique single nucleotide variants in the transcript with minor allele frequency (MAF) < 0.1% and median depth in the exome samples ≥ 30. Variants with MAFs over 0.1% were not included; the rationale behind this choice is that, for pLoF variants, the total number of false positives far outweighs the number of true common variants. - -#### Expected variant count - -We calculate the expected number of variants for all bases with median depth ≥ 30 in our exome samples using a mutational model that corrects for local sequence context and CpG methylation levels. Previously, we used this same mutational model, but corrected for depth; more details on the previous approach can be found in section 4.1 of the supplement in [Karczewski _et al._ Nature 2020](https://www.nature.com/articles/s41586-020-2308-7). - -#### pLoF Variant types - -For pLoF counts, only nonsense, splice donor and acceptor site variants caused by single nucleotide changes and called as high confidence by [LOFTEE](https://gnomad.broadinstitute.org/help/vep#loftee) were counted. This is because the mutation model does not account for insertions and deletions that underlie frameshift variants. - -### Scores - -#### Observed / expected (`oe`) and the Loss-of-function Observed / expected upper bound fraction (`LOEUF`) score - -We have calculated the ratio of the observed / expected (`oe`) number of loss-of-function variants for all bases of sufficient depth in the MANE Select (v4 on GRCh38) or canonical (ExAC and v2 on GRCh37) and other non-Select/canonical transcript for each gene. The expected counts are based on a mutational model that takes sequence context and methylation into account. +The constraint score shown in gnomAD is the ratio of the observed / expected (`oe`) number of loss-of-function variants in that gene. The expected counts are based on a mutational model that takes sequence context, coverage and methylation into account. #### Interpretation -Observed/expected (`oe`) is a continuous measure of how tolerant a gene is to a certain class of variation (e.g. loss-of-function). When a gene has a low `oe` value, it is under stronger selection for that class of variation than a gene with a higher value. Because counts depend on gene size and sample size, the precision of the `oe` values varies a lot from one gene to the next. Therefore in addition to the `oe` value, we also display the 90% confidence interval (CI) for each of the `oe` values. +Observed/expected (`oe`) is a continuous measure of how tolerant a gene is to a certain class of variation (e.g. loss-of-function). When a gene has a low `oe` value, it is under stronger selection for that class of variation than a gene with a higher value. Because counts depend on gene size and sample size, the precision of the `oe` values varies a lot from one gene to the next. Therefore in addition to the `oe` value, we also display the 90% confidence interval (CI) for each of the `oe` values. When evaluating how constrained a gene is, it is essential to take the 90% CI into consideration. +Although `oe` is a continuous value, we understand that it can be useful to use a threshold for certain applications. In particular, for the interpretation of Mendelian diseases cases, we suggest using the upper bound of the `oe` CI < 0.35 as a threshold if needed. Again, ideally `oe` should be used as a continuous value rather than a cutoff and evaluating the `oe` 90% CI is a must. -When evaluating how constrained a gene is, it is essential to take the 90% CI into consideration. In particular, we suggest using the upper bound of that CI, which is also known as the `LOEUF` (“loss-of-function observed/expected upper bound fraction”) score. `LOEUF` is therefore a conservative estimate of the observed/expected ratio, based on the upper bound of a Poisson-derived confidence interval around the ratio. Low `LOEUF` scores indicate strong selection against predicted loss-of-function (pLoF) variation in a given gene, while high `LOEUF` scores suggest a relatively higher tolerance to inactivation. +### Probability of being loss-of-function intolerant (`pLI`) -One advantage of `oe` and `LOEUF` compared to `pLI` are that they are more direct measures of biological significance, and can be easily used as continuous values. For example, a doubling of `oe` from 0.2 to 0.4 conveys that 20% vs 40% of the expected number of variants has been observed in gnomAD. By contrast, a doubling of the `pLI` score (e.g., 0.45 to 0.9) is less immediately interpretable as `pLI` is fairly dichotomous with nearly all genes having scores < 0.1 or > 0.9. Intermediate `pLI` scores (0.1-0.9) are typically an indication that the gene was too small to be confidently categorized. +#### Overall interpretation -Although `oe` and `LOEUF` are continuous values, we understand that it can be useful to use a threshold for certain applications. In particular, for the interpretation of Mendelian disease cases, we suggest using a `LOEUF` score < 0.6 as a threshold if needed. Again, ideally `oe` and `LOEUF` should be used as a continuous values rather than a cutoff. +We developed metrics to measure a transcript's intolerance to variation by predicting the number of variants expected to be seen in the gnomAD dataset and comparing those expectations to the observed amount of variation. Transcripts that are significantly depleted of their expected variation are considered constrained, or intolerant, of such variation. +More specifically, for synonymous and missense variation, we created a signed Z score of the deviation of observed counts from the expected number. Positive Z scores indicate increased constraint (intolerance to variation) and therefore that the transcript had fewer variants than expected. Negative Z scores were given to transcripts that had more variants than expected. +For protein-truncating variation, we assume that there are three classes of genes with respect to tolerance loss of gene function: null (where loss of both copies of the gene is tolerated), recessive (where loss of a single copy of the gene is tolerated, but not loss of both copies), and haploinsufficient (where loss of a single copy of the gene is not tolerated). We used the observed and expected variant counts to determine the probability that a given transcript is extremely intolerant of loss-of-function variation (e.g. falls into the third category). The closer pLI is to one, the more intolerant of protein-truncating variants the transcript appears to be. We consider pLI ≥ 0.9 as an extremely intolerant set of transcripts. +More details can be found in the supplement of [Lek et al Nature 2016](https://www.nature.com/articles/nature19057). -As mentioned above, `oe` and `LOEUF` are dependent on sample size and we note that these values are slightly higher in v4 compared to v2 for all genes. The major impact of this is that any `LOEUF` thresholds used on v2 will not give an equivalent number of genes when applied to v4. This rise in `oe` is anticipated, particularly as we are now able to sample variants with a much lower population allele frequency than before (e.g., 1 in ~125,000 individuals vs 1 in ~730,000 individuals). +#### Transcripts included in the analyses -#### Probability of being loss-of-function intolerant (`pLI`) +We used the canonical transcripts of protein-coding genes as defined by GENCODE v19. We removed transcripts that lacked a methionine at the start of the coding sequence, a stop codon at the end of coding sequence, or were indivisible by three, which left 19,621 transcripts. Additionally, we excluded 795 transcripts that had zero observed variants when removing exons with a median depth < 1 as well as 251 transcripts that had either (1) far too many synonymous and missense variants as determined by a Z score (p < 10-4 and 10-3, respectively) or (2) far too few synonymous and missense variants as determined by a Z score (p < 10-4 and 10-3, respectively). When all outliers were removed, there were 18,225 transcripts left for analyses. -`pLI` is based on the underlying premise that we can assign genes to three natural categories with respect to sensitivity to loss-of-function variation: null (tolerant; where loss-of-function variation – heterozygous or homozygous - is completely tolerated by natural selection), recessive (where heterozygous variants are tolerated but homozygous ones are not), and haploinsufficient (where heterozygous loss-of-function variants are not tolerated). In order to create these metrics, we assumed that tolerant genes would have the expected amount of loss-of-function variation and then took the empirical observed/expected rate of loss-of-function variation for recessive disease genes (0.706) and severe haploinsufficient genes (0.207) to represent the average outcome of the homozygous and heterozygous intolerant scenarios, respectively. We then used an expectation-maximization (EM) algorithm to assign each transcript a probability of belonging to each category. `pLI` is the probability of belonging to the haploinsufficient class of genes. We have updated the empirical observed/expected rate of loss-of-function variants from previous releases. More details on the original formulation of pLI can be found in section 4.4 of the supplement in [Lek _et al._ Nature 2016](https://www.nature.com/articles/nature19057). +#### Observed variant count -#### Synonymous and missense (Z scores) +The observed variant count is the number of unique single nucleotide variants in the transcript with 123 or fewer alternative alleles (minor allele frequency < 0.1%). Variants in exons with a median depth < 1 were removed from the total counts. + +#### Expected variant count -For synonymous and missense variation, we created a signed Z score of the deviation of observed counts from the expected number. Positive Z scores indicate increased constraint (intolerance to variation) and therefore that the transcript had fewer variants than expected. Negative Z scores were given to transcripts that had more variants than expected. +We used a depth corrected probability of mutation for each gene to predict the expected variant counts. More details can be found in section 4.1 of the supplement in [Lek et al Nature 2016](https://www.nature.com/articles/nature19057). Expected variants in exons with a median depth < 1 were removed from the total counts. -To generate Z scores, we used a previously described, but slightly modified, sequence-context based mutational model to predict the number of expected rare (minor allele frequency < 0.1%) variants per transcript at well covered sites. We then calculated the chi-squared value for the deviation of observation from expectation for each mutational class (synonymous and missense). The square root of these values was taken and multiplied by -1 if the number of observed variants was greater than expectation or 1 if observed counts were smaller than expected. The synonymous Z scores were then corrected by dividing each score by the standard deviation of all synonymous Z scores in between -5 and 5. For the missense Z scores, we took all Z scores between -5 and 0 and created a mirrored distribution. The missense Z scores were then corrected by dividing each score by the standard deviation of these mirror distributions. +#### Synonymous and missense Z scores -For more information, see [Samocha _et al._ Nature Genetics 2014](https://www.nature.com/articles/ng.3050) and [Lek _et al._ Nature 2016](https://www.nature.com/articles/nature19057). +Higher (more positive) Z scores indicate that the transcript is more intolerant of variation (more constrained). +To generate Z scores, we used a previously described, but slightly modified, sequence-context based mutational model to predict the number of expected rare (minor allele frequency < 0.1%) variants per transcript. We then calculated the chi-squared value for the deviation of observation from expectation for each mutational class (synonymous and missense). The square root of these values was taken and multiplied by -1 if the number of observed variants was greater than expectation or 1 if observed counts were smaller than expected. The synonymous Z scores were then corrected by dividing each score by the standard deviation of all synonymous Z scores in between -5 and 5. For the missense Z scores, we took all Z scores between -5 and 0 and created a mirrored distribution. The missense Z scores were then corrected by dividing each score by the standard deviation of these mirror distributions. +For more information, see [Samocha et al Nature Genetics 2014](https://www.nature.com/articles/ng.3050) and [Lek et al Nature 2016](https://www.nature.com/articles/nature19057). -#### What is the difference between the oe/LOEUF and pLI score? +#### pLI (probability of being loss-of-function intolerant) -It is very important to note that `oe` (and thereby `LOEUF`) score is very different from that of `pLI`; in particular low `oe` values are indicative of strong intolerance, whereas high `pLI` scores indicate intolerance. In addition, while `pLI` incorporated the uncertainty around low counts (i.e a gene with low expected count, due to small size or low coverage, could not have a high `pLI`), `oe` does not. Therefore, the `oe` metric comes with a 90% CI. It is important to consider the confidence interval when using `oe`. The change from `pLI` to `oe` was motivated mainly by its easier interpretation and its continuity across the spectrum of selection. As an example, let’s take a gene with a `pLI` of 0.8: this means that this gene cannot be categorized as a highly likely haploinsufficient gene based on our data. However, it is unclear whether this value was obtained because of small sample or gene size or because there were too many loss-of-function (LoF) variants observed in the gene. In addition, if the cause was the latter, `pLI` doesn’t tell much about the overall selection against loss-of-function in this gene. On the other hand, a gene with an LoF `oe` of 0.4 can clearly be interpreted as a gene where only 40% of the expected loss-of-function variants were observed and therefore is likely under selection against LoF variants. In addition, the 90% CI allows us to clearly distinguish cases where there is a lot of uncertainty about the constraint for that gene due to sample size. Since `pLI` > 0.9 is widely used in research and clinical interpretation of Mendelian cases, we suggest using the upper bound of the `oe` confidence interval (which we term the "loss-of-function observed/expected upper bound fraction" or "`LOEUF`") < 0.6 if a hard threshold is needed. +pLI scores closer to one indicate more intolerance to protein-truncating variation. For a set of transcripts intolerant of protein-truncating variation, we suggest pLI ≥ 0.9. +pLI is based on the underlying premise that we could assign genes to three natural categories with respect to sensitivity to protein-truncating variation: null (where protein-truncating variation – heterozygous or homozygous - is completely tolerated by natural selection), recessive (where heterozygous variants are tolerated but homozygous ones are not), and haploinsufficient (where heterozygous protein-truncating variants are not tolerated). In order to create this metrics, we assumed that tolerant (null) genes would have the expected amount of protein-truncating variation and then took the empirical observed/expected rate of protein-truncating variation for recessive disease genes (0.463) and severe haploinsufficient genes (0.089) to represent the average outcome of the homozygous and heterozygous intolerant scenarios, respectively. We then used an expectation-maximization (EM) algorithm to assign each transcript a probability of belonging to each category. pLI is the probability of belonging to the haploinsufficient class of genes. More details can be found in section 4.4 of the supplement in [Lek et al Nature 2016](https://www.nature.com/articles/nature19057). diff --git a/browser/src/help/__snapshots__/HelpPage.spec.tsx.snap b/browser/src/help/__snapshots__/HelpPage.spec.tsx.snap index 254263ac6..b1d54d525 100644 --- a/browser/src/help/__snapshots__/HelpPage.spec.tsx.snap +++ b/browser/src/help/__snapshots__/HelpPage.spec.tsx.snap @@ -1135,7 +1135,7 @@ The gnomAD v2.1 data set contained data from 125,748 exomes and 15,708 whole gen question: 'What features are not yet in v4 and where can I find them?' --- -The v4.0 release is a minimum viable product (MVP) release, which allows us to get the most critical piece of the gnomAD database, high quality aggregate allele frequencies and updated constraint metrics, to our users as soon as possible. It also means that a few of the existing features found in v2 or v3 are not yet included in v4 but **will be coming soon**. +The v4.0 release is a minimum viable product (MVP) release, which allows us to get the most critical piece of the gnomAD database, high quality aggregate allele frequencies, to our users as soon as possible. It also means that a few of the existing features found in v2 or v3 are not yet included in v4 but **will be coming soon**. Below is a list of all features not included in the v4 MVP and where to find them in our past datasets until we are able to add them to v4: @@ -1143,6 +1143,7 @@ Below is a list of all features not included in the v4 MVP and where to find the | Non MVP feature | Past versions with this data | | ----------------------------------------------- | ----------------------------------------------------- | +| Gene constraint | v2 gene page | | Pext score | v2 gene page | | Sub-genetic ancestry groups (prevously subpops) | v2 variant page | | Multi Nucleotide (MNV) calls | v2 variant table and variant page | @@ -1488,7 +1489,7 @@ question: 'How do you pronounce gnomAD?' question: 'How was the expected number of variants determined?' --- -We used a mutational model that accounts for local sequence context, CpG methylation, and sequencing depth to predict the number of expected single nucleotide variants per functional class per gene. More details can be found in the help section on [gene constraint](/help/constraint) and in [Karczewski _et al._ Nature 2020](https://doi.org/10.1038/s41586-020-2308-7). Note that the expected variant counts for bases with a median depth <1 were removed from the totals. In v4, we applied our mutational model only to sites with a median depth in the exomes ≥30. +We used a mutational model that accounts for local sequence context, CpG methylation, and sequencing depth to predict the number of expected single nucleotide variants per functional class per gene. More details can be found in the help section on [gene constraint](/help/constraint) and in [Karczewski _et al._ Nature 2020](https://doi.org/10.1038/s41586-020-2308-7). Note that the expected variant counts for bases with a median depth <1 were removed from the totals. ", } } @@ -1542,7 +1543,7 @@ Please review our [gene constraint](/help/constraint#methods) help text to learn question: 'Why are there fewer variants in the constraint table than displayed on the gene page?' --- -We only included single nucleotide variants that were found in the MANE Select (v3 and v4 on GRCh38) or canonical (ExAC and v2 on GRCh37/hg19) transcript of the gene. On the gene page, variants found in all transcripts are displayed. Additionally, both observed and expected variant counts were removed for sites with a median depth < 30. +We only included single nucleotide variants that were found in the canonical (ExAC and v2 on GRCh37/hg19) transcript of the gene. On the gene page, variants found in all transcripts are displayed. ", } } @@ -1596,19 +1597,17 @@ Nonsense, splice acceptor, and splice donor variants caused by single nucleotide question: 'Why are constraint metrics missing for this gene or annotated with a note?' --- -Genes that were outliers in certain assessments will not have constraint metrics or will be flagged with a note warning of various error modes. Please note that these assessments were applied to the canonical transcripts of the genes. If a gene was not annotated as a protein-coding gene in GENCODE v19, we did not calculate constraint. The following list describes the reason names given in the constraint_flag column of the [constraint files](/downloads#v4-constraint): +Genes that were outliers in certain assessments will not have constraint metrics or will be flagged with a note warning of various error modes. Please note that these assessments were applied to the canonical transcripts of the genes. If a gene was not annotated as a protein-coding gene in GENCODE v19, we did not calculate constraint. The following list describes the reason names given in the constraint_flag column of the [constraint files](/downloads#v2-constraint): -- \`no_variants\`: Zero observed synonymous, missense, pLoF variants -- \`no_exp_lof\`: Zero expected pLoF variants -- \`outlier_lof\`: Number of pLoF variants is significantly different than expectation -- \`no_exp_mis\`: Zero expected missense variants -- \`outlier_mis\`: Number of missense variants is significantly different than expectation -- \`no_exp_syn\`: Zero expected synonymous variants -- \`outlier_syn\`: Number of synonymous variants is significantly different than expectation +- no_variants: Zero observed synonymous, missense, pLoF variants +- no_exp_lof: Zero expected pLoF variants +- lof_too_many: More pLoF variants than expected +- no_exp_mis: Zero expected missense variants +- mis_too_many: More missense variants than expected +- no_exp_syn: Zero expected synonymous variants +- syn_outlier: More or fewer synonymous variants than expected Possible reasons that one might observe the deviations listed above include mismapped reads due to homologous regions or poor quality sequencing data. - -Currently, constraint scores are only available for autosomes. We will release scores for chromosomes X in the near future. ", } } @@ -1691,7 +1690,7 @@ LOEUF is pronounced like its French-inspired name "l'œuf". Another accepted pro question: 'What are the fields included in constraint files?' --- -Descriptions of the fields in these files can be found in the [README file](/downloads#v4-variants) supplied with the download. +Descriptions of the fields in these files can be found in the Supplementary Dataset 11 section on pages 74-77 of the [Supplementary Information](https://www.nature.com/articles/s41586-020-2308-7#Sec12) of [_The mutational constraint spectrum quantified from variation in 141,456 humans._ Nature 581, 434–443 (2020)](https://doi.org/10.1038/s41586-020-2308-7). ", } } From 6084fdf2c71eebfeac447f3485c19815dcfe50d7 Mon Sep 17 00:00:00 2001 From: Matthew Solomonson Date: Wed, 1 Nov 2023 05:44:03 -0400 Subject: [PATCH 104/106] Add link to v2 if constraint is missing --- .../ConstraintTable/ConstraintTable.spec.tsx | 28 +- .../src/ConstraintTable/ConstraintTable.tsx | 25 +- .../ConstraintTable.spec.tsx.snap | 648 ++++++++++++++++-- .../__snapshots__/GenePage.spec.tsx.snap | 120 +++- .../TranscriptPage.spec.tsx.snap | 108 ++- .../TranscriptPageContainer.spec.tsx.snap | 96 ++- 6 files changed, 931 insertions(+), 94 deletions(-) diff --git a/browser/src/ConstraintTable/ConstraintTable.spec.tsx b/browser/src/ConstraintTable/ConstraintTable.spec.tsx index c5d3bf386..2dace16e5 100644 --- a/browser/src/ConstraintTable/ConstraintTable.spec.tsx +++ b/browser/src/ConstraintTable/ConstraintTable.spec.tsx @@ -46,7 +46,9 @@ forAllDatasets('ConstraintTable with "%s" dataset selected', (datasetId) => { describe('with a minimal gene', () => { test('has no unexpected changes', () => { const tree = renderer.create( - + withDummyRouter( + + ) ) expect(tree).toMatchSnapshot() }) @@ -55,7 +57,9 @@ forAllDatasets('ConstraintTable with "%s" dataset selected', (datasetId) => { describe('with a minimal transcript', () => { test('has no unexpected changes', () => { const tree = renderer.create( - + withDummyRouter( + + ) ) expect(tree).toMatchSnapshot() }) @@ -64,10 +68,12 @@ forAllDatasets('ConstraintTable with "%s" dataset selected', (datasetId) => { describe('with a mitochondrial gene', () => { test('has no unexpected changes', () => { const tree = renderer.create( - + withDummyRouter( + + ) ) expect(tree).toMatchSnapshot() }) @@ -76,10 +82,12 @@ forAllDatasets('ConstraintTable with "%s" dataset selected', (datasetId) => { describe('with a mitochondrial transcript', () => { test('has no unexpected changes', () => { const tree = renderer.create( - + withDummyRouter( + + ) ) expect(tree).toMatchSnapshot() }) diff --git a/browser/src/ConstraintTable/ConstraintTable.tsx b/browser/src/ConstraintTable/ConstraintTable.tsx index 659665ef6..ab90ff58b 100644 --- a/browser/src/ConstraintTable/ConstraintTable.tsx +++ b/browser/src/ConstraintTable/ConstraintTable.tsx @@ -1,5 +1,7 @@ import React from 'react' +import queryString from 'query-string' + import { DatasetId, hasConstraints, labelForDataset } from '@gnomad/dataset-metadata/metadata' import { Gene } from '../GenePage/GenePage' import { Transcript } from '../TranscriptPage/TranscriptPage' @@ -43,8 +45,8 @@ const transcriptDetails = ( transcriptId = geneOrTranscript.canonical_transcript_id const canonicalTranscript = transcriptId ? geneOrTranscript.transcripts.find( - (transcript) => transcript.transcript_id === transcriptId - ) + (transcript) => transcript.transcript_id === transcriptId + ) : null transcriptVersion = canonicalTranscript ? canonicalTranscript.transcript_version : null transcriptDescription = 'Ensembl canonical' @@ -58,8 +60,25 @@ const transcriptDetails = ( } const ConstraintTable = ({ datasetId, geneOrTranscript }: Props) => { + + const geneId = isGene(geneOrTranscript) ? geneOrTranscript.gene_id : geneOrTranscript.gene.gene_id + + const constraintLink = + {labelForDataset("gnomad_r2_1")} + + if (!hasConstraints(datasetId)) { - return

    Constraint not yet available for {labelForDataset(datasetId)}.

    + return

    Constraint not yet available for {labelForDataset(datasetId)}. Refer to {constraintLink} for now.

    } const { transcriptId, transcriptVersion, transcriptDescription } = diff --git a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap index 3145e5f43..3b881f698 100644 --- a/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap +++ b/browser/src/ConstraintTable/__snapshots__/ConstraintTable.spec.tsx.snap @@ -34,7 +34,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected and gene with ava

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -42,7 +52,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected and transcript wi

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -50,7 +70,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal ge

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -58,7 +88,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a minimal tr

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -66,7 +106,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondr

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -74,7 +124,17 @@ exports[`ConstraintTable with "gnomad_cnv_r4" dataset selected with a mitochondr

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -3999,7 +4059,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected and gene with availab

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4007,7 +4077,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected and transcript with a

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4015,7 +4095,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal gene h

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4023,7 +4113,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected with a minimal transc

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4031,7 +4131,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4039,7 +4149,17 @@ exports[`ConstraintTable with "gnomad_r3" dataset selected with a mitochondrial

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4047,7 +4167,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4055,7 +4185,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4063,7 +4203,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4071,7 +4221,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4079,7 +4239,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4087,7 +4257,17 @@ exports[`ConstraintTable with "gnomad_r3_controls_and_biobanks" dataset selected

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4095,7 +4275,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and gene w

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4103,7 +4293,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected and transc

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4111,7 +4311,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a min

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4119,7 +4329,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a min

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4127,7 +4347,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mit

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4135,7 +4365,17 @@ exports[`ConstraintTable with "gnomad_r3_non_cancer" dataset selected with a mit

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4143,7 +4383,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and gene wi

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4151,7 +4401,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected and transcr

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4159,7 +4419,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mini

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4167,7 +4437,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mini

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4175,7 +4455,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mito

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4183,7 +4473,17 @@ exports[`ConstraintTable with "gnomad_r3_non_neuro" dataset selected with a mito

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4191,7 +4491,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and gene w

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4199,7 +4509,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected and transc

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4207,7 +4527,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a min

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4215,7 +4545,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a min

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4223,7 +4563,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mit

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4231,7 +4581,17 @@ exports[`ConstraintTable with "gnomad_r3_non_topmed" dataset selected with a mit

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4239,7 +4599,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and gene with

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4247,7 +4617,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected and transcript

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4255,7 +4635,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4263,7 +4653,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a minimal

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4271,7 +4671,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitocho

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4279,7 +4689,17 @@ exports[`ConstraintTable with "gnomad_r3_non_v2" dataset selected with a mitocho

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4287,7 +4707,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected and gene with availab

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4295,7 +4725,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected and transcript with a

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4303,7 +4743,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal gene h

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4311,7 +4761,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected with a minimal transc

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4319,7 +4779,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -4327,7 +4797,17 @@ exports[`ConstraintTable with "gnomad_r4" dataset selected with a mitochondrial

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6682,7 +7162,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and gene with avai

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6690,7 +7180,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected and transcript wit

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6698,7 +7198,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal gen

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6706,7 +7216,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a minimal tra

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6714,7 +7234,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondri

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; @@ -6722,7 +7252,17 @@ exports[`ConstraintTable with "gnomad_sv_r4" dataset selected with a mitochondri

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    `; diff --git a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap index 4138b295c..7f91ce67a 100644 --- a/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap +++ b/browser/src/GenePage/__snapshots__/GenePage.spec.tsx.snap @@ -705,7 +705,17 @@ exports[`GenePage with CNV dataset "gnomad_cnv_r4" has no unexpected changes 1`]

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -6553,7 +6563,17 @@ exports[`GenePage with SV dataset "gnomad_sv_r4" has no unexpected changes 1`] =

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -9506,7 +9526,17 @@ exports[`GenePage with non-SV dataset "gnomad_cnv_r4" has no unexpected changes

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -18917,7 +18947,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3" has no unexpected changes 1`]

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -20411,7 +20451,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3_controls_and_biobanks" has no u

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -21905,7 +21955,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_cancer" has no unexpected c

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -23399,7 +23459,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_neuro" has no unexpected ch

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -24893,7 +24963,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_topmed" has no unexpected c

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -26387,7 +26467,17 @@ exports[`GenePage with non-SV dataset "gnomad_r3_non_v2" has no unexpected chang

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -27881,7 +27971,17 @@ exports[`GenePage with non-SV dataset "gnomad_r4" has no unexpected changes 1`]

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    diff --git a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap index 85f7de013..f3d6b644a 100644 --- a/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/TranscriptPage.spec.tsx.snap @@ -1433,7 +1433,17 @@ exports[`TranscriptPage with dataset "gnomad_cnv_r4" has no unexpected changes 1

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -6282,7 +6292,17 @@ exports[`TranscriptPage with dataset "gnomad_r3" has no unexpected changes 1`] =

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -7091,7 +7111,17 @@ exports[`TranscriptPage with dataset "gnomad_r3_controls_and_biobanks" has no un

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -7900,7 +7930,17 @@ exports[`TranscriptPage with dataset "gnomad_r3_non_cancer" has no unexpected ch

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -8709,7 +8749,17 @@ exports[`TranscriptPage with dataset "gnomad_r3_non_neuro" has no unexpected cha

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -9518,7 +9568,17 @@ exports[`TranscriptPage with dataset "gnomad_r3_non_topmed" has no unexpected ch

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -10327,7 +10387,17 @@ exports[`TranscriptPage with dataset "gnomad_r3_non_v2" has no unexpected change

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -11136,7 +11206,17 @@ exports[`TranscriptPage with dataset "gnomad_r4" has no unexpected changes 1`] =

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -14369,7 +14449,17 @@ exports[`TranscriptPage with dataset "gnomad_sv_r4" has no unexpected changes 1`

    Constraint not yet available for gnomAD SVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    diff --git a/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap b/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap index c873fa549..2b6c48439 100644 --- a/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap +++ b/browser/src/TranscriptPage/__snapshots__/TranscriptPageContainer.spec.tsx.snap @@ -2032,7 +2032,17 @@ exports[`TranscriptPageContainer with dataset gnomad_cnv_r4 has no unexpected ch

    Constraint not yet available for gnomAD CNVs v4.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -10475,7 +10485,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3 has no unexpected change

    Constraint not yet available for gnomAD v3.1.2 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -11883,7 +11903,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3_controls_and_biobanks ha

    Constraint not yet available for gnomAD v3.1.2 (controls/biobanks) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -13291,7 +13321,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3_non_cancer has no unexpe

    Constraint not yet available for gnomAD v3.1.2 (non-cancer) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -14699,7 +14739,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3_non_neuro has no unexpec

    Constraint not yet available for gnomAD v3.1.2 (non-neuro) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -16107,7 +16157,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3_non_topmed has no unexpe

    Constraint not yet available for gnomAD v3.1.2 (non-TOPMed) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -17515,7 +17575,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r3_non_v2 has no unexpected

    Constraint not yet available for gnomAD v3.1.2 (non-v2) - . + . Refer to + + gnomAD v2.1.1 + + for now.

    @@ -18923,7 +18993,17 @@ exports[`TranscriptPageContainer with dataset gnomad_r4 has no unexpected change

    Constraint not yet available for gnomAD v4.0.0 - . + . Refer to + + gnomAD v2.1.1 + + for now.

    From 84605c69aac6849ec31bf4eeb196cf45610346df Mon Sep 17 00:00:00 2001 From: sjahl <636687+sjahl@users.noreply.github.com> Date: Wed, 1 Nov 2023 09:31:01 -0400 Subject: [PATCH 105/106] switch to a readwritemany volume for cache --- deploy/manifests/browser/base/browser.deployment.yaml | 4 ++-- deploy/manifests/browser/base/browser.pvc.yaml | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 deploy/manifests/browser/base/browser.pvc.yaml diff --git a/deploy/manifests/browser/base/browser.deployment.yaml b/deploy/manifests/browser/base/browser.deployment.yaml index 2917787ab..c2c05d2f7 100644 --- a/deploy/manifests/browser/base/browser.deployment.yaml +++ b/deploy/manifests/browser/base/browser.deployment.yaml @@ -17,8 +17,8 @@ spec: spec: volumes: - name: nginx-cache - emptyDir: - sizeLimit: 20Gi + persistentVolumeClaim: + claimName: browsercache containers: - name: web image: gnomad-browser diff --git a/deploy/manifests/browser/base/browser.pvc.yaml b/deploy/manifests/browser/base/browser.pvc.yaml new file mode 100644 index 000000000..ee4739068 --- /dev/null +++ b/deploy/manifests/browser/base/browser.pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: browsercache +spec: + resources: + requests: + storage: 100Gi + accessModes: + - ReadWriteMany + storageClassName: premium-rwo From 4d411a2efd5f893b62c97ca3da2b8cfcb71564f7 Mon Sep 17 00:00:00 2001 From: sjahl <636687+sjahl@users.noreply.github.com> Date: Wed, 1 Nov 2023 09:37:56 -0400 Subject: [PATCH 106/106] bump rate limits for cache warming --- deploy/manifests/browser/base/api.deployment.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/manifests/browser/base/api.deployment.yaml b/deploy/manifests/browser/base/api.deployment.yaml index 3f483d778..b050cc938 100644 --- a/deploy/manifests/browser/base/api.deployment.yaml +++ b/deploy/manifests/browser/base/api.deployment.yaml @@ -44,16 +44,16 @@ spec: key: ips # Global rate limiting - name: MAX_CONCURRENT_ES_REQUESTS - value: '10' - - name: MAX_QUEUED_ES_REQUESTS value: '100' + - name: MAX_QUEUED_ES_REQUESTS + value: '1000' # Individual rate limiting - name: MAX_REQUESTS_PER_MINUTE - value: '30' + value: '300' - name: MAX_QUERY_COST - value: '25' + value: '2500' - name: MAX_QUERY_COST_PER_MINUTE - value: '300' + value: '30000' ports: - name: http containerPort: 8000