gwaslab 3.6.7__py3-none-any.whl → 3.6.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

gwaslab/g_Sumstats.py CHANGED
@@ -102,7 +102,7 @@ from gwaslab.viz.viz_plot_mqqplot import mqqplot
102
102
  from gwaslab.viz.viz_plot_trumpetplot import plottrumpet
103
103
  from gwaslab.viz.viz_plot_compare_af import plotdaf
104
104
  from gwaslab.viz.viz_plot_credible_sets import _plot_cs
105
-
105
+ from gwaslab.viz.viz_plot_associations import _plot_associations
106
106
  from gwaslab.io.io_read_pipcs import _read_pipcs
107
107
  from gwaslab.io.io_load_ld import tofinemapping_using_ld
108
108
  from gwaslab.io.io_preformat_input import preformat
@@ -811,6 +811,9 @@ class Sumstats():
811
811
  self.associations = associations_full
812
812
 
813
813
  return associations_summary
814
+ def plot_associations(self,**kwargs):
815
+
816
+ _plot_associations(self.associations, **kwargs)
814
817
 
815
818
  def check_cis(self, gls=False, **kwargs):
816
819
  if "SNPID" in self.data.columns:
gwaslab/g_version.py CHANGED
@@ -17,8 +17,8 @@ def _get_version():
17
17
  def gwaslab_info():
18
18
  # version meta information
19
19
  dic={
20
- "version":"3.6.7",
21
- "release_date":"20250827"
20
+ "version":"3.6.9",
21
+ "release_date":"20251012"
22
22
  }
23
23
  return dic
24
24
 
@@ -7,6 +7,11 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
7
7
 
8
8
  assoc, traits, studies, variants = get_associations_from_gwascatalog(sumstats, rsid=rsid, log=log, verbose=verbose)
9
9
 
10
+ if len(assoc)==0:
11
+ # if no associations
12
+ log.write("No associations!")
13
+ return None, None
14
+
10
15
  assoc = _fix_beta(assoc)
11
16
 
12
17
  traits_agg = traits.groupby("associationId")[["trait","shortForm"]].agg(lambda x: ",".join(x)).reset_index()
@@ -14,21 +19,25 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
14
19
  assoc_traits_agg= pd.merge(assoc, traits_agg, on ="associationId",how="left")
15
20
 
16
21
  assoc_traits_agg= pd.merge(assoc_traits_agg, studies, on ="associationId", how="left")
17
-
22
+
18
23
  assoc_traits_agg= pd.merge(assoc_traits_agg, variants, on ="associationId",how="left")
19
24
 
20
25
  assoc_traits_agg = assoc_traits_agg.rename(columns={"trait":"GWASCATALOG_TRAIT",
21
26
  "riskFrequency":"RAF",
22
27
  "betaNum":"Beta",
23
- "pvalue":"P-value"
28
+ "pvalue":"P-value",
29
+ "betaUnit":"Unit"
24
30
  })
25
31
 
26
32
  summary_columns=['GWASCATALOG_TRAIT','associationId', 'rsID', "geneName",
27
- 'RA', 'RAF','Beta', 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
33
+ 'RA', 'RAF','Beta',"Unit", 'P-value','cohort','initialSampleSize','publicationInfo.pubmedId',
28
34
  "functionalClass","gene.geneName"]
29
35
 
30
36
  assoc_traits_agg_summary = assoc_traits_agg[summary_columns]
31
37
 
38
+ assoc_traits_agg_summary = _align_beta(sumstats, assoc_traits_agg_summary, log, verbose)
39
+ assoc_traits_agg = _align_beta(sumstats, assoc_traits_agg, log, verbose)
40
+
32
41
  return assoc_traits_agg, assoc_traits_agg_summary
33
42
 
34
43
  def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=True):
@@ -101,7 +110,12 @@ def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=
101
110
  return association, traits, studies, variants
102
111
 
103
112
  def _fix_beta(association):
104
-
113
+ if "betaNum" not in association:
114
+ association["betaNum"] = pd.NA
115
+ if "orPerCopyNum" not in association:
116
+ association["orPerCopyNum"] = pd.NA
117
+ if "range" not in association:
118
+ association["range"] = pd.NA
105
119
  is_or_available = (association["betaNum"].isna()) & (~association["orPerCopyNum"].isna())
106
120
  is_range_available = (association["betaNum"].isna()) & (association["orPerCopyNum"].isna()) & (~association["range"].isna())
107
121
 
@@ -114,4 +128,42 @@ def parse_range(x):
114
128
  high = np.log(range_list[1])
115
129
  low = np.log(range_list[0])
116
130
  beta = (high + low)/2
117
- return beta
131
+ return beta
132
+
133
+ def _align_beta(sumstats, assoc_traits_agg_summary, log, verbose):
134
+ # merge with sumstats
135
+ log.write("Merging GWAS Catalog associationms with Sumstats...",)
136
+ assoc_traits_agg_summary = pd.merge(sumstats[["rsID","CHR","POS","EA","NEA","BETA"]], assoc_traits_agg_summary, on = "rsID", how="inner")
137
+ # check direction
138
+ assoc_traits_agg_summary["GC_Beta_GL_RA"] = np.nan
139
+ assoc_traits_agg_summary["GC_Beta_GL_EA"] = np.nan
140
+
141
+ # get sumstats RA
142
+ assoc_traits_agg_summary["_GL_RA_BETA"] = assoc_traits_agg_summary["BETA"].abs()
143
+ assoc_traits_agg_summary["_GL_RA"] = assoc_traits_agg_summary["EA"]
144
+ assoc_traits_agg_summary["_GL_NRA"] = assoc_traits_agg_summary["NEA"]
145
+ is_GL_RA_flipped = assoc_traits_agg_summary["BETA"]<0
146
+ assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_RA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "NEA"]
147
+ assoc_traits_agg_summary.loc[is_GL_RA_flipped, "_GL_NRA"] = assoc_traits_agg_summary.loc[is_GL_RA_flipped, "EA"]
148
+
149
+ is_matched = assoc_traits_agg_summary["_GL_RA"] == assoc_traits_agg_summary["RA"]
150
+ log.write(" -GL_RA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
151
+ assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_RA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
152
+
153
+ is_flipped = assoc_traits_agg_summary["_GL_NRA"] == assoc_traits_agg_summary["RA"]
154
+ log.write(" -GL_NRA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
155
+ assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_RA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
156
+
157
+ is_matched = assoc_traits_agg_summary["EA"] == assoc_traits_agg_summary["RA"]
158
+ log.write(" -EA matched RA for {} variants ".format(sum(is_matched)), verbose=verbose)
159
+ assoc_traits_agg_summary.loc[is_matched, "GC_Beta_GL_EA"] = assoc_traits_agg_summary.loc[is_matched, "Beta"]
160
+
161
+ is_flipped = assoc_traits_agg_summary["NEA"] == assoc_traits_agg_summary["RA"]
162
+ log.write(" -NEA matched RA for {} variants... Aligning with Sumstats Risk allele (BETA>0) in GC_Beta_GL_RA... ".format(sum(is_flipped)), verbose=verbose)
163
+ assoc_traits_agg_summary.loc[is_flipped, "GC_Beta_GL_EA"] = - assoc_traits_agg_summary.loc[is_flipped, "Beta"]
164
+
165
+ not_match = (assoc_traits_agg_summary["_GL_RA"] != assoc_traits_agg_summary["RA"])& (assoc_traits_agg_summary["_GL_NRA"] != assoc_traits_agg_summary["RA"])
166
+ log.write(" -NEA and EA not matching RA for {} variants... ".format(sum(not_match)), verbose=verbose)
167
+
168
+
169
+ return assoc_traits_agg_summary
@@ -53,7 +53,8 @@ def get_default_path(keyword,fmt="png"):
53
53
  "afc":"allele_frequency_comparision",
54
54
  "gwheatmap":"genome_wide_heatmap",
55
55
  "scatter":"scatter",
56
- "forest":"forest"
56
+ "forest":"forest",
57
+ "gwaslab":"gwaslab"
57
58
  }
58
59
  prefix = path_dictionary[keyword]
59
60
  count = 1
@@ -0,0 +1,61 @@
1
+ import seaborn as sns
2
+ import matplotlib.pyplot as plt
3
+ from gwaslab.io.io_process_args import _update_args
4
+ from gwaslab.io.io_process_args import _update_arg
5
+ from gwaslab.g_Log import Log
6
+
7
+ def _plot_associations(associations,
8
+ values="Beta",
9
+ fig_args=None,
10
+ log=Log(),
11
+ verbose=True,
12
+ sort="P-value",
13
+ fontsize=12,
14
+ font_family="Arial",
15
+ cmap=None,
16
+ ylabel="Traits",
17
+ xlabel="rsID - Gene Name",
18
+ **args
19
+ ):
20
+
21
+ log.write("Start to create heatmap for associations...", verbose=verbose)
22
+
23
+ cmap = _update_arg(cmap, "RdBu")
24
+
25
+ log.write(f" -Value to plot: {values}", verbose=verbose)
26
+ log.write(f" -Total number of associations :{len(associations)} ", verbose=verbose)
27
+ log.write(f" -Sorting associations by :{sort} ", verbose=verbose)
28
+
29
+ associations = associations.sort_values(by=[sort]).drop_duplicates(subset=["rsID","GWASCATALOG_TRAIT"])
30
+
31
+ log.write(f" -Keeping unique rsID-traits pairs :{len(associations)} ", verbose=verbose)
32
+
33
+ associations = associations.dropna(subset=[values])
34
+ log.write(f" -Keeping associations without NA in {values} :{len(associations)} ", verbose=verbose)
35
+
36
+ log.write(f" -Total number of unique variants for plotting :{associations["rsID"].nunique()} ", verbose=verbose)
37
+ log.write(f" -Total number of unique traits for plotting:{associations["GWASCATALOG_TRAIT"].nunique()} ", verbose=verbose)
38
+
39
+ matrix_beta = associations.pivot_table(index=['rsID','gene.geneName'],
40
+ columns='GWASCATALOG_TRAIT',
41
+ values=[values])
42
+
43
+ matrix_beta = matrix_beta.astype("float64")
44
+
45
+ matrix_beta.columns = matrix_beta.columns.droplevel(0)
46
+
47
+ height = max(2, len(matrix_beta)//2)
48
+ width = max(2, len(matrix_beta.columns)//2)
49
+
50
+ fig_args = _update_args(fig_args, dict(figsize=(width,height)))
51
+ fig,ax = plt.subplots(**fig_args)
52
+
53
+ sns.heatmap(matrix_beta.T, annot=True, fmt=".2f",cmap="RdBu",ax=ax)
54
+
55
+
56
+ ax.set_xlabel(xlabel,fontsize=fontsize, fontfamily=font_family)
57
+ ax.set_ylabel(ylabel,fontsize=fontsize, fontfamily=font_family)
58
+
59
+
60
+ log.write("Finished creating heatmap for associations.", verbose=verbose)
61
+ return fig, ax
@@ -100,6 +100,8 @@ def mqqplot(insumstats,
100
100
  qq_scatter_args=None,
101
101
  qqscatterargs=None,
102
102
  qq_line_color = "grey",
103
+ qq_xlabels = None,
104
+ qq_xlim = None,
103
105
  # region
104
106
  region = None,
105
107
  region_title=None,
@@ -204,6 +206,8 @@ def mqqplot(insumstats,
204
206
  highlight_color="#CB132D",
205
207
  highlight_windowkb = 500,
206
208
  highlight_anno_args = None,
209
+ highlight_lim = None,
210
+ highlight_lim_mode = "absolute",
207
211
  pinpoint= None,
208
212
  pinpoint_color ="red",
209
213
  stratified=False,
@@ -531,6 +535,8 @@ def mqqplot(insumstats,
531
535
  highlight=highlight,
532
536
  highlight_chrpos=highlight_chrpos,
533
537
  highlight_windowkb=highlight_windowkb,
538
+ highlight_lim = highlight_lim,
539
+ highlight_lim_mode = highlight_lim_mode,
534
540
  snpid=snpid,
535
541
  chrom=chrom,
536
542
  pos=pos)
@@ -1096,6 +1102,8 @@ def mqqplot(insumstats,
1096
1102
  linewidth=sc_linewidth,
1097
1103
  ytick3 = ytick3,
1098
1104
  ylabels = ylabels,
1105
+ xlabels = qq_xlabels,
1106
+ xlim = qq_xlim,
1099
1107
  ylabels_converted = ylabels_converted,
1100
1108
  verbose=verbose,
1101
1109
  qq_scatter_args=qq_scatter_args,
@@ -1335,19 +1343,38 @@ def _process_p_value(sumstats, mode,p, mlog10p, scaled, log, verbose ):
1335
1343
 
1336
1344
  return sumstats
1337
1345
 
1338
- def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, snpid, chrom, pos):
1346
+ def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, highlight_lim, highlight_lim_mode, snpid, chrom, pos):
1339
1347
  if pd.api.types.is_list_like(highlight[0]):
1340
1348
  if highlight_chrpos == False:
1341
1349
  # highlight for multiple sets
1342
1350
  for i, highlight_set in enumerate(highlight):
1343
1351
  to_highlight = sumstats.loc[sumstats[snpid].isin(highlight_set),:]
1344
1352
  #assign colors: 0 is hightlight color
1345
- for index,row in to_highlight.iterrows():
1353
+ #assign colors: i is highlight color
1354
+ for j, (index, row) in enumerate(to_highlight.iterrows()):
1346
1355
  target_chr = int(row[chrom])
1347
1356
  target_pos = int(row[pos])
1348
1357
  right_chr=sumstats[chrom]==target_chr
1349
- up_pos=sumstats[pos]>target_pos-highlight_windowkb*1000
1350
- low_pos=sumstats[pos]<target_pos+highlight_windowkb*1000
1358
+ # Check if highlight_lim is provided for this group and SNP
1359
+ if (highlight_lim is not None and
1360
+ i < len(highlight_lim) and
1361
+ j < len(highlight_lim[i]) and
1362
+ highlight_lim[i][j] is not None):
1363
+ # Use custom limits for this SNP
1364
+ if highlight_lim_mode == "absolute":
1365
+ # Absolute positions: (start_pos, end_pos)
1366
+ start_pos, end_pos = highlight_lim[i][j]
1367
+ up_pos = sumstats[pos] >= start_pos
1368
+ low_pos = sumstats[pos] <= end_pos
1369
+ else:
1370
+ # Offset mode: (lower_kb, upper_kb) relative to SNP position
1371
+ lower_kb, upper_kb = highlight_lim[i][j]
1372
+ up_pos = sumstats[pos] > target_pos + lower_kb * 1000
1373
+ low_pos = sumstats[pos] < target_pos + upper_kb * 1000
1374
+ else:
1375
+ # Use default highlight_windowkb
1376
+ up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
1377
+ low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
1351
1378
  sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=i
1352
1379
  else:
1353
1380
  for i, highlight_chrpos_tuple in enumerate(highlight):
@@ -1371,13 +1398,30 @@ def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb
1371
1398
  else:
1372
1399
  # highlight for one set
1373
1400
  to_highlight = sumstats.loc[sumstats[snpid].isin(highlight),:]
1374
- #assign colors: 0 is hightlight color
1375
- for index,row in to_highlight.iterrows():
1401
+ #assign colors: 0 is highlight color
1402
+ for j, (index, row) in enumerate(to_highlight.iterrows()):
1376
1403
  target_chr = int(row[chrom])
1377
1404
  target_pos = int(row[pos])
1378
1405
  right_chr=sumstats[chrom]==target_chr
1379
- up_pos=sumstats[pos]>target_pos-highlight_windowkb*1000
1380
- low_pos=sumstats[pos]<target_pos+highlight_windowkb*1000
1406
+ # Check if highlight_lim is provided for this SNP
1407
+ if (highlight_lim is not None and
1408
+ j < len(highlight_lim) and
1409
+ highlight_lim[j] is not None):
1410
+ # Use custom limits for this SNP
1411
+ if highlight_lim_mode == "absolute":
1412
+ # Absolute positions: (start_pos, end_pos)
1413
+ start_pos, end_pos = highlight_lim[j]
1414
+ up_pos = sumstats[pos] >= start_pos
1415
+ low_pos = sumstats[pos] <= end_pos
1416
+ else:
1417
+ # Offset mode: (lower_kb, upper_kb) relative to SNP position
1418
+ lower_kb, upper_kb = highlight_lim[j]
1419
+ up_pos = sumstats[pos] > target_pos + lower_kb * 1000
1420
+ low_pos = sumstats[pos] < target_pos + upper_kb * 1000
1421
+ else:
1422
+ # Use default highlight_windowkb
1423
+ up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
1424
+ low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
1381
1425
  sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=0
1382
1426
  return sumstats
1383
1427
 
@@ -39,6 +39,8 @@ def _plot_qq(
39
39
  linewidth,
40
40
  ytick3,
41
41
  ylabels,
42
+ xlabels,
43
+ xlim,
42
44
  ylabels_converted,
43
45
  qq_scatter_args,
44
46
  expected_min_mlog10p,
@@ -155,32 +157,12 @@ def _plot_qq(
155
157
  log=log,
156
158
  verbose=verbose
157
159
  )
158
-
159
- #if cut == 0:
160
- # ax2.set_ylim(skip, ceil(maxy*1.2) )
161
- #
162
- #if cut:
163
- # qcutline = ax2.axhline(y=cut, linewidth = linewidth, linestyle="--",color=cut_line_color,zorder=1)
164
- # step=2
165
- # if ((maxticker-cut)/cutfactor + cut) > cut:
166
- # if ystep == 0:
167
- # if (cut - skip ) // step > 10:
168
- # step = (cut - skip ) // 10
169
- # else:
170
- # step = ystep
171
- #
172
- # ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut]+[(maxticker-cut)/cutfactor + cut])
173
- # ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut]+[maxticker],fontsize=fontsize,family=font_family)
174
- # else:
175
- # if ystep == 0:
176
- # if (cut - skip ) // step > 10:
177
- # step = (cut - skip ) // 10
178
- # else:
179
- # step = ystep
180
- #
181
- # ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut])
182
- # ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut],fontsize=fontsize,family=font_family)
183
- # ax2.set_ylim(bottom = skip)
160
+ if xlim is not None:
161
+ ax2.set_xlim(xlim)
162
+
163
+ if xlabels is not None:
164
+ ax2.set_xticks(xlabels)
165
+ ax2.set_xticklabels(xlabels,fontsize=fontsize,family=font_family)
184
166
 
185
167
  ax2.tick_params(axis='both', which='both', labelsize=fontsize,labelfontfamily=font_family)
186
168
  #
@@ -0,0 +1,98 @@
1
+ import seaborn as sns
2
+ import matplotlib.pyplot as plt
3
+ from gwaslab.io.io_process_args import _update_args
4
+ from gwaslab.io.io_process_args import _update_arg
5
+ from gwaslab.g_Log import Log
6
+ from gwaslab.viz.viz_aux_save_figure import save_figure
7
+
8
+ def _plot( associations,
9
+ values="Beta",
10
+ sort="P-value",
11
+ mode="gwaslab",
12
+ fontsize=12,
13
+ font_family="Arial",
14
+ cmap=None,
15
+ ylabel="Y",
16
+ xlabel="X",
17
+ xlim=None,
18
+ ylim=None,
19
+ yticks=None,
20
+ xticks=None,
21
+ title="Title",
22
+ title_pad=1.08,
23
+ title_fontsize=13,
24
+ linewidth=None,
25
+ linestyle=None,
26
+ linecolor=None,
27
+ dpi=200,
28
+ fig_args= None,
29
+ scatter_args=None,
30
+ save=None,
31
+ save_args=None,
32
+ log=Log(),
33
+ verbose=True,
34
+ **args
35
+ ):
36
+
37
+ # update args
38
+
39
+ cmap = _update_arg(cmap, "RdBu")
40
+
41
+ fig_args = _update_args(fig_args, dict(figsize=(10,10)))
42
+
43
+ # create fig and ax
44
+ fig,ax = plt.subplots(**fig_args)
45
+
46
+ # draw lines
47
+ horizontal_line = ax.axhline(y=1, linewidth = linewidth,
48
+ linestyle="--",
49
+ color=linecolor,zorder=1000)
50
+ vertical_line = ax.axvline(x=1, linewidth = linewidth,
51
+ linestyle="--",
52
+ color=linecolor,zorder=1000)
53
+
54
+ # ticks
55
+ if xticks is not None:
56
+ ax.set_xticks(xticks)
57
+ ax.set_xticklabels(xticks,
58
+ fontsize=fontsize,
59
+ family=font_family)
60
+
61
+ if yticks is not None:
62
+ ax.set_xticks(yticks)
63
+ ax.set_xticklabels(yticks,
64
+ fontsize=fontsize,
65
+ family=font_family)
66
+
67
+ # labels
68
+ ax.set_xlabel(xlabel,
69
+ fontsize=fontsize,
70
+ fontfamily=font_family)
71
+ ax.set_ylabel(ylabel,
72
+ fontsize=fontsize,
73
+ fontfamily=font_family)
74
+
75
+ ax.tick_params(axis='x',
76
+ labelsize=fontsize,
77
+ labelfontfamily=font_family)
78
+ ax.tick_params(axis='y',
79
+ labelsize=fontsize,
80
+ labelfontfamily=font_family)
81
+
82
+ # title
83
+ title_pad = title_pad -0.05
84
+ fig.suptitle(title ,
85
+ fontsize = title_fontsize,
86
+ x=0.5,
87
+ y=title_pad)
88
+
89
+ # spines
90
+ ax.spines["top"].set_visible(False)
91
+ ax.spines["right"].set_visible(False)
92
+ ax.spines["left"].set_visible(True)
93
+ ax.spines["bottom"].set_visible(True)
94
+
95
+ save_figure(fig = fig, save = save, keyword=mode, save_args=save_args, log = log, verbose=verbose)
96
+
97
+ log.write("Finished creating plots.", verbose=verbose)
98
+ return fig, ax
@@ -57,6 +57,8 @@ def plottrumpet(mysumstats,
57
57
  highlight_color="#CB132D",
58
58
  highlight_windowkb = 500,
59
59
  highlight_anno_args = None,
60
+ highlight_lim = None,
61
+ highlight_lim_mode = "absolute",
60
62
  pinpoint= None,
61
63
  pinpoint_color ="red",
62
64
  scatter_args=None,
@@ -235,6 +237,8 @@ def plottrumpet(mysumstats,
235
237
  highlight=highlight,
236
238
  highlight_chrpos=highlight_chrpos,
237
239
  highlight_windowkb=highlight_windowkb,
240
+ highlight_lim=highlight_lim,
241
+ highlight_lim_mode=highlight_lim_mode,
238
242
  snpid=snpid,
239
243
  chrom=chrom,
240
244
  pos=pos)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gwaslab
3
- Version: 3.6.7
3
+ Version: 3.6.9
4
4
  Summary: A collection of handy tools for GWAS SumStats
5
5
  Author-email: Yunye <gwaslab@gmail.com>
6
6
  Project-URL: Homepage, https://cloufield.github.io/gwaslab/
@@ -2,7 +2,7 @@ gwaslab/__init__.py,sha256=tr8AGz-BqvOc5V0aUHNC-xW--LIAiUXrFo8HTR4SI9k,2861
2
2
  gwaslab/cache_manager.py,sha256=HOTnSkCOyGEPLRl90WT8D_6pAdI8d8AzenMIDGuCeWc,28113
3
3
  gwaslab/g_Log.py,sha256=C3Zv-_6c3C9ms8bgQ-ytplz22sjk7euqXYkWr9zNeAs,1573
4
4
  gwaslab/g_Phenotypes.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- gwaslab/g_Sumstats.py,sha256=7gRp2DIBxcBVYC6H5_4_3lde-VkGSKCiFCHOM3vLE1Q,45366
5
+ gwaslab/g_Sumstats.py,sha256=XH0QrEAofxvMwb07ISp1AUkagfgeCH971VmB2pb2fEA,45529
6
6
  gwaslab/g_SumstatsMulti.py,sha256=CDnYMK0L8bV-LNOwO4h9yJahOVHR-sPAxZMNaeKFb3U,15098
7
7
  gwaslab/g_SumstatsPair.py,sha256=3-4aFh6pMZ4phcqHCCfyFPC3ySuck43wuTsfLG-ZAyY,13470
8
8
  gwaslab/g_SumstatsSet.py,sha256=xuGLpsHyhY2SjMVsFHGdL3iCa-Leb_3bu_R8totkzBY,30180
@@ -14,8 +14,7 @@ gwaslab/g_meta.py,sha256=pXtSsQfFPv2UJmOxKMmLtcsp_Ku_H73YP7PnlfMd0sg,6472
14
14
  gwaslab/g_meta_update.py,sha256=W1m6mh5jNUeZAW4T6F6kKZ10gE4l8YieoEC2mAfkzGg,2495
15
15
  gwaslab/g_vchange_status.py,sha256=lc3G65-QBV5k5yK-ySGIxiUT0hMBmESLhMKYncwjSwU,1986
16
16
  gwaslab/g_vchange_status_polars.py,sha256=kxyGQCur0ibVFBCyZghA-XNf_kLDXKK-l7VC-Om2IdA,1839
17
- gwaslab/g_version.py,sha256=FfHZxV9uv1mOWW5g797u-_H31D7enHR2OVkcHrJA16I,1964
18
- gwaslab/hm_harmonize_sumstats.py,sha256=WkUGNxftEGF5NAJktbEqQfniwcoD6zWHd-4bGrBxOtM,84472
17
+ gwaslab/g_version.py,sha256=NJBby5_kMtMdDdDRyQc5s8LAjWzRq3QNF7LWqk1I_5o,1964
19
18
  gwaslab/run_script.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
19
  gwaslab/bd/bd_common_data.py,sha256=mlw977K-ihKf7TQEn6FwUCyJ2vcnq6KIhrX6J3bRMVA,14226
21
20
  gwaslab/bd/bd_config.py,sha256=t3YeDMGRSP8k3lw4rHHilIM4jAXSzFOF9DtuuIbpDS8,924
@@ -65,7 +64,7 @@ gwaslab/util/util_ex_infer_ancestry.py,sha256=AXLEhuJUBT6XIYjADB-envFRGIZ-misneg
65
64
  gwaslab/util/util_ex_ldproxyfinder.py,sha256=8E4g82gCmolAvrg52urNMJX11MZMwOAPGQaZ4cfggiU,16918
66
65
  gwaslab/util/util_ex_ldsc.py,sha256=ss1QlwH7duLuVx_Ckb9mDbyz2neK8tv0WefUGCqzZUc,21685
67
66
  gwaslab/util/util_ex_match_ldmatrix.py,sha256=uVfHKxWQRtUQ0lUkt1o2LtZPSd3fh1yQ1rElFa4FDao,17525
68
- gwaslab/util/util_ex_phewwas.py,sha256=vNC23DIQ-dvawLhqjoP9h8ai_pxUuGdN1HlWOChDqeU,5529
67
+ gwaslab/util/util_ex_phewwas.py,sha256=oLbAgh_ULLWNP0m6bmD9xtx3EdDcH3HSIeTjxHX_0HU,8745
69
68
  gwaslab/util/util_ex_plink_filter.py,sha256=pK1Yxtv9-J4rMOdVAG7VU9PktvI6-y4FxBiVEH0QuRs,1673
70
69
  gwaslab/util/util_ex_process_h5.py,sha256=LqfQKBjXnbPSRUVJy9hhRhuoS5wG93yoIguiFDZN1A4,2837
71
70
  gwaslab/util/util_ex_process_ref.py,sha256=qtDRxJT0O2NgW4fd6VkRMxIHhSdzhSwz6bfa4iLQvcc,17132
@@ -98,7 +97,8 @@ gwaslab/viz/viz_aux_chromatin.py,sha256=aWZaXOSvGyZY7wQcoFDaqHRYCSHZbi_K4Q70HruN
98
97
  gwaslab/viz/viz_aux_property.py,sha256=UIaivghnLXYpTwkKnXRK0F28Jbn9L6OaICk3K73WZaU,33
99
98
  gwaslab/viz/viz_aux_quickfix.py,sha256=6xgJYHBEz6iTRkuIAS1e28PQJH1eIViBCOMvczxI-BQ,18698
100
99
  gwaslab/viz/viz_aux_reposition_text.py,sha256=iRIP-Rkltlei068HekJcVubiqPrunBqvAoSQ1eHk04M,4304
101
- gwaslab/viz/viz_aux_save_figure.py,sha256=HwIRDMYpeXfkBgb7mqzLN7OVPMz163U-ZVOlQJABzeg,2811
100
+ gwaslab/viz/viz_aux_save_figure.py,sha256=IOhojOCPPUDjZZYw7i4BgzCpAeasNpnzBTyrpiSoH_4,2856
101
+ gwaslab/viz/viz_plot_associations.py,sha256=06sE8987NEj4v-4_OFo6rliN2RVsf_WoTmLmnfVvQVU,2472
102
102
  gwaslab/viz/viz_plot_compare_af.py,sha256=pnL6pEQOSXZ1Zm2UTX-TdvTYSFD9zSY2vaJZSo4Ry_w,5348
103
103
  gwaslab/viz/viz_plot_compare_effect.py,sha256=KF0Ug4OwVwfl205Z5nRqGwXBLceuwJXYXj6378sT1Sg,69629
104
104
  gwaslab/viz/viz_plot_credible_sets.py,sha256=CjTtO5Dk2R-_GpZ0KN2NW0bN-EDga1OCjt9U8zDiTcw,5864
@@ -106,18 +106,19 @@ gwaslab/viz/viz_plot_effect.py,sha256=quWnT_WwERt61s0iVpnznQWgw8a5S3LeVkMuWNi6iE
106
106
  gwaslab/viz/viz_plot_forestplot.py,sha256=xgOnefh737CgdQxu5naVyRNBX1NQXPFKzf51fbh6afs,6771
107
107
  gwaslab/viz/viz_plot_miamiplot.py,sha256=nzPqP8HD2RElrFFP0OtnsYoAEjVpkfcvkRZNul6pJPg,31318
108
108
  gwaslab/viz/viz_plot_miamiplot2.py,sha256=7Ixar822FLGEe8Jo2y54cOfcBC_AxQnwvbM7qth_Juw,18100
109
- gwaslab/viz/viz_plot_mqqplot.py,sha256=lO4sdrnmHb6b3jHOedG_OJy7ju8GbitEHVQo5Czqaag,71429
109
+ gwaslab/viz/viz_plot_mqqplot.py,sha256=n7PZ1ffPye1JMhjdCtL7wKuwWCWRHxuLCyNFCCtmTqw,74161
110
110
  gwaslab/viz/viz_plot_phe_heatmap.py,sha256=wUv3x7x2kyQWUfIrRiyxlAwILHbg3L4V-tMMvji8VQI,9589
111
- gwaslab/viz/viz_plot_qqplot.py,sha256=lLwzJ1DhnrE0gejt4bFOpAbIcY9jBdGOuHNsLcofglI,7494
111
+ gwaslab/viz/viz_plot_qqplot.py,sha256=XVRabkCKrAV83I-bbdMt5Hh0wkZEyZPiq-Wxtiq7azs,6619
112
112
  gwaslab/viz/viz_plot_regional2.py,sha256=p-A1N-18ENo0FSwTW6rJlCacEeHJFW7dVwuQ91Ozv-8,43160
113
113
  gwaslab/viz/viz_plot_regionalplot.py,sha256=UZSeXHfQlGWAYW_tMt00lZt8_vhiB6QcVLvMeiHBf_Q,37996
114
114
  gwaslab/viz/viz_plot_rg_heatmap.py,sha256=AvVAlOOAwhqGWCses7MfdIXLVQSIA2SFE6bd7K1NaLw,13865
115
115
  gwaslab/viz/viz_plot_scatter_with_reg.py,sha256=0cpE6ui7yuJ1lhoLu_klac2OSzd5QDx6V51fyplB3GI,8366
116
116
  gwaslab/viz/viz_plot_stackedregional.py,sha256=bgVQir_Wj3TxB3o7NJFf7b8HETlWjppgfwLsbUyr3oo,20668
117
- gwaslab/viz/viz_plot_trumpetplot.py,sha256=foc0VTYsp1O_sIHa5abuBMo_8Zhr27-rfgvsLeapLRY,42723
118
- gwaslab-3.6.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
119
- gwaslab-3.6.7.dist-info/licenses/LICENSE_before_v3.4.39,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
120
- gwaslab-3.6.7.dist-info/METADATA,sha256=O7b6UoB81quv8g6dlju1Vs966O1EXgoRnRwV5cuD2co,7073
121
- gwaslab-3.6.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
- gwaslab-3.6.7.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
123
- gwaslab-3.6.7.dist-info/RECORD,,
117
+ gwaslab/viz/viz_plot_template.py,sha256=3tOT4pWcxN8je6XEcqPTQ7PJXEG25cwXUnDnoIhqjMA,2917
118
+ gwaslab/viz/viz_plot_trumpetplot.py,sha256=_FKVkxckEFE11jZDwcHhF_bLuYbzxTWDaRTs6ylNEGg,42982
119
+ gwaslab-3.6.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
120
+ gwaslab-3.6.9.dist-info/licenses/LICENSE_before_v3.4.39,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
121
+ gwaslab-3.6.9.dist-info/METADATA,sha256=V7VQ4hyHm_LDCykfxBuRaDvqPdc4yKdrfKple7nROAI,7073
122
+ gwaslab-3.6.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
+ gwaslab-3.6.9.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
124
+ gwaslab-3.6.9.dist-info/RECORD,,