gsMap 1.65__py3-none-any.whl → 1.67__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.
- gsMap/GNN_VAE/adjacency_matrix.py +48 -68
- gsMap/GNN_VAE/model.py +68 -66
- gsMap/GNN_VAE/train.py +50 -61
- gsMap/__init__.py +1 -1
- gsMap/config.py +4 -4
- gsMap/find_latent_representation.py +103 -103
- gsMap/format_sumstats.py +20 -20
- gsMap/latent_to_gene.py +125 -109
- gsMap/spatial_ldsc_multiple_sumstats.py +0 -2
- {gsmap-1.65.dist-info → gsmap-1.67.dist-info}/METADATA +2 -2
- {gsmap-1.65.dist-info → gsmap-1.67.dist-info}/RECORD +14 -14
- {gsmap-1.65.dist-info → gsmap-1.67.dist-info}/LICENSE +0 -0
- {gsmap-1.65.dist-info → gsmap-1.67.dist-info}/WHEEL +0 -0
- {gsmap-1.65.dist-info → gsmap-1.67.dist-info}/entry_points.txt +0 -0
gsMap/latent_to_gene.py
CHANGED
@@ -15,119 +15,126 @@ from gsMap.config import LatentToGeneConfig
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
17
17
|
|
18
|
-
def
|
18
|
+
def find_neighbors(coor, num_neighbour):
|
19
19
|
"""
|
20
|
-
|
20
|
+
Find Neighbors of each cell (based on spatial coordinates).
|
21
21
|
"""
|
22
22
|
nbrs = NearestNeighbors(n_neighbors=num_neighbour).fit(coor)
|
23
23
|
distances, indices = nbrs.kneighbors(coor, return_distance=True)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
spatial_net = KNN_df.copy()
|
31
|
-
id_cell_trans = dict(zip(range(coor.shape[0]), np.array(coor.index)))
|
32
|
-
|
33
|
-
spatial_net['Cell1'] = spatial_net['Cell1'].map(id_cell_trans)
|
34
|
-
spatial_net['Cell2'] = spatial_net['Cell2'].map(id_cell_trans)
|
35
|
-
|
24
|
+
cell_indices = np.arange(coor.shape[0])
|
25
|
+
cell1 = np.repeat(cell_indices, indices.shape[1])
|
26
|
+
cell2 = indices.flatten()
|
27
|
+
distance = distances.flatten()
|
28
|
+
spatial_net = pd.DataFrame({'Cell1': cell1, 'Cell2': cell2, 'Distance': distance})
|
36
29
|
return spatial_net
|
37
30
|
|
38
31
|
|
39
|
-
def
|
32
|
+
def build_spatial_net(adata, annotation, num_neighbour):
|
40
33
|
"""
|
41
|
-
|
34
|
+
Build spatial neighbourhood matrix for each spot (cell) based on the spatial coordinates.
|
42
35
|
"""
|
43
36
|
logger.info(f'------Building spatial graph based on spatial coordinates...')
|
44
37
|
|
45
|
-
coor =
|
46
|
-
|
47
|
-
|
48
|
-
if not annotation is None:
|
38
|
+
coor = adata.obsm['spatial']
|
39
|
+
if annotation is not None:
|
49
40
|
logger.info(f'Cell annotations are provided...')
|
50
|
-
|
41
|
+
spatial_net_list = []
|
51
42
|
# Cells with annotations
|
52
43
|
for ct in adata.obs[annotation].dropna().unique():
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
idx = np.where(adata.obs[annotation] == ct)[0]
|
45
|
+
coor_temp = coor[idx, :]
|
46
|
+
spatial_net_temp = find_neighbors(coor_temp, min(num_neighbour, coor_temp.shape[0]))
|
47
|
+
# Map back to original indices
|
48
|
+
spatial_net_temp['Cell1'] = idx[spatial_net_temp['Cell1'].values]
|
49
|
+
spatial_net_temp['Cell2'] = idx[spatial_net_temp['Cell2'].values]
|
50
|
+
spatial_net_list.append(spatial_net_temp)
|
56
51
|
logger.info(f'{ct}: {coor_temp.shape[0]} cells')
|
57
52
|
|
58
53
|
# Cells labeled as nan
|
59
54
|
if pd.isnull(adata.obs[annotation]).any():
|
60
|
-
|
61
|
-
logger.info(f'Nan: {len(
|
62
|
-
|
63
|
-
spatial_net_temp =
|
64
|
-
|
65
|
-
|
55
|
+
idx_nan = np.where(pd.isnull(adata.obs[annotation]))[0]
|
56
|
+
logger.info(f'Nan: {len(idx_nan)} cells')
|
57
|
+
spatial_net_temp = find_neighbors(coor, num_neighbour)
|
58
|
+
spatial_net_temp = spatial_net_temp[spatial_net_temp['Cell1'].isin(idx_nan)]
|
59
|
+
spatial_net_list.append(spatial_net_temp)
|
60
|
+
spatial_net = pd.concat(spatial_net_list, axis=0)
|
66
61
|
else:
|
67
62
|
logger.info(f'Cell annotations are not provided...')
|
68
|
-
spatial_net =
|
63
|
+
spatial_net = find_neighbors(coor, num_neighbour)
|
69
64
|
|
70
65
|
return spatial_net
|
71
66
|
|
72
67
|
|
73
|
-
def
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
68
|
+
def find_neighbors_regional(cell_pos, spatial_net_dict, coor_latent, config, cell_annotations):
|
69
|
+
num_neighbour = config.num_neighbour
|
70
|
+
annotations = config.annotation
|
71
|
+
|
72
|
+
cell_use_pos = spatial_net_dict.get(cell_pos, [])
|
73
|
+
if len(cell_use_pos) == 0:
|
74
|
+
return []
|
75
|
+
|
76
|
+
cell_latent = coor_latent[cell_pos, :].reshape(1, -1)
|
77
|
+
neighbors_latent = coor_latent[cell_use_pos, :]
|
78
|
+
similarity = cosine_similarity(cell_latent, neighbors_latent).reshape(-1)
|
83
79
|
|
84
|
-
|
85
|
-
|
80
|
+
if annotations is not None:
|
81
|
+
cell_annotation = cell_annotations[cell_pos]
|
82
|
+
neighbor_annotations = cell_annotations[cell_use_pos]
|
83
|
+
mask = neighbor_annotations == cell_annotation
|
84
|
+
if not np.any(mask):
|
85
|
+
return []
|
86
|
+
similarity = similarity[mask]
|
87
|
+
cell_use_pos = cell_use_pos[mask]
|
86
88
|
|
87
|
-
|
89
|
+
if len(similarity) == 0:
|
90
|
+
return []
|
88
91
|
|
92
|
+
indices = np.argsort(-similarity) # descending order
|
93
|
+
top_indices = indices[:num_neighbour]
|
94
|
+
cell_select_pos = cell_use_pos[top_indices]
|
95
|
+
return cell_select_pos
|
89
96
|
|
90
|
-
|
97
|
+
|
98
|
+
def compute_regional_mkscore(cell_pos, spatial_net_dict, coor_latent, config, cell_annotations,
|
99
|
+
ranks, frac_whole, adata_X_bool):
|
91
100
|
"""
|
92
|
-
|
101
|
+
Compute gmean ranks of a region.
|
93
102
|
"""
|
94
|
-
|
103
|
+
cell_select_pos = find_neighbors_regional(
|
104
|
+
cell_pos, spatial_net_dict, coor_latent, config, cell_annotations
|
105
|
+
)
|
106
|
+
if len(cell_select_pos) == 0:
|
107
|
+
return np.zeros(ranks.shape[1], dtype=np.float16)
|
95
108
|
|
96
109
|
# Ratio of expression ranks
|
97
|
-
ranks_tg = ranks
|
110
|
+
ranks_tg = ranks[cell_select_pos, :]
|
98
111
|
gene_ranks_region = gmean(ranks_tg, axis=0)
|
99
112
|
gene_ranks_region[gene_ranks_region <= 1] = 0
|
100
113
|
|
101
|
-
if not
|
114
|
+
if not config.no_expression_fraction:
|
102
115
|
# Ratio of expression fractions
|
103
|
-
frac_focal =
|
116
|
+
frac_focal = adata_X_bool[cell_select_pos, :].sum(axis=0).A1 / len(cell_select_pos)
|
104
117
|
frac_region = frac_focal / frac_whole
|
105
118
|
frac_region[frac_region <= 1] = 0
|
106
119
|
frac_region[frac_region > 1] = 1
|
107
120
|
|
108
121
|
# Simultaneously consider the ratio of expression fractions and ranks
|
109
|
-
gene_ranks_region =
|
122
|
+
gene_ranks_region = gene_ranks_region * frac_region
|
110
123
|
|
111
124
|
mkscore = np.exp(gene_ranks_region ** 1.5) - 1
|
112
125
|
return mkscore.astype(np.float16, copy=False)
|
113
126
|
|
114
127
|
|
115
128
|
def run_latent_to_gene(config: LatentToGeneConfig):
|
116
|
-
global adata, coor_latent, spatial_net, ranks, frac_whole, args, spatial_net_dict, expressed_mask
|
117
|
-
args = config
|
118
|
-
# Load and process the spatial data
|
119
129
|
logger.info('------Loading the spatial data...')
|
120
130
|
adata = sc.read_h5ad(config.hdf5_with_latent_path)
|
121
131
|
|
122
|
-
|
123
|
-
adata.layers['rank'] = rankdata(adata.X.toarray().astype(np.float32), axis=1).astype(np.float32)
|
124
|
-
|
125
|
-
if not config.annotation is None:
|
132
|
+
if config.annotation is not None:
|
126
133
|
logger.info(f'------Cell annotations are provided as {config.annotation}...')
|
127
134
|
adata = adata[~pd.isnull(adata.obs[config.annotation]), :]
|
128
135
|
|
129
136
|
# Homologs transformation
|
130
|
-
if
|
137
|
+
if config.homolog_file is not None:
|
131
138
|
logger.info(f'------Transforming the {config.species} to HUMAN_GENE_SYM...')
|
132
139
|
homologs = pd.read_csv(config.homolog_file, sep='\t')
|
133
140
|
if homologs.shape[1] != 2:
|
@@ -137,34 +144,42 @@ def run_latent_to_gene(config: LatentToGeneConfig):
|
|
137
144
|
homologs.columns = [config.species, 'HUMAN_GENE_SYM']
|
138
145
|
homologs.set_index(config.species, inplace=True)
|
139
146
|
adata = adata[:, adata.var_names.isin(homologs.index)]
|
140
|
-
# Log the number of genes left after homolog transformation
|
141
147
|
logger.info(f"{adata.shape[1]} genes retained after homolog transformation.")
|
142
148
|
if adata.shape[1] < 100:
|
143
149
|
raise ValueError("Too few genes retained in ST data (<100).")
|
144
150
|
adata.var_names = homologs.loc[adata.var_names, 'HUMAN_GENE_SYM'].values
|
145
|
-
# drop duplicated genes
|
146
151
|
adata = adata[:, ~adata.var_names.duplicated()]
|
147
152
|
|
148
|
-
#
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
153
|
+
# Create mappings
|
154
|
+
n_cells = adata.n_obs
|
155
|
+
n_genes = adata.n_vars
|
156
|
+
|
157
|
+
if config.annotation is not None:
|
158
|
+
cell_annotations = adata.obs[config.annotation].values
|
159
|
+
else:
|
160
|
+
cell_annotations = None
|
161
|
+
|
162
|
+
# Build the spatial graph
|
163
|
+
spatial_net = build_spatial_net(adata, config.annotation, config.num_neighbour_spatial)
|
164
|
+
spatial_net_dict = spatial_net.groupby('Cell1')['Cell2'].apply(np.array).to_dict()
|
157
165
|
|
158
166
|
# Extract the latent representation
|
159
|
-
coor_latent =
|
160
|
-
coor_latent
|
161
|
-
|
162
|
-
|
167
|
+
coor_latent = adata.obsm[config.latent_representation]
|
168
|
+
coor_latent = coor_latent.astype(np.float32)
|
169
|
+
|
170
|
+
# Compute ranks
|
171
|
+
logger.info('------Ranking the spatial data...')
|
172
|
+
adata_X = adata.X.tocsr()
|
173
|
+
ranks = np.zeros((n_cells, n_genes), dtype=np.float32)
|
174
|
+
|
175
|
+
for i in tqdm(range(n_cells), desc="Computing ranks per cell"):
|
176
|
+
data = adata_X[i, :].toarray().flatten()
|
177
|
+
ranks[i, :] = rankdata(data, method='average')
|
163
178
|
|
164
|
-
#
|
179
|
+
# Geometric mean across slices
|
165
180
|
if config.gM_slices is not None:
|
166
181
|
logger.info('Geometrical mean across multiple slices is provided.')
|
167
|
-
|
182
|
+
gM_df = pd.read_parquet(config.gM_slices)
|
168
183
|
if config.species is not None:
|
169
184
|
homologs = pd.read_csv(config.homolog_file, sep='\t', header=None)
|
170
185
|
if homologs.shape[1] < 2:
|
@@ -172,47 +187,48 @@ def run_latent_to_gene(config: LatentToGeneConfig):
|
|
172
187
|
"Homologs file must have at least two columns: one for the species and one for the human gene symbol.")
|
173
188
|
homologs.columns = [config.species, 'HUMAN_GENE_SYM']
|
174
189
|
homologs.set_index(config.species, inplace=True)
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
gM =
|
180
|
-
adata = adata[:,
|
190
|
+
gM_df = gM_df.loc[gM_df.index.isin(homologs.index)]
|
191
|
+
gM_df.index = homologs.loc[gM_df.index, 'HUMAN_GENE_SYM'].values
|
192
|
+
common_genes = np.intersect1d(adata.var_names, gM_df.index)
|
193
|
+
gM_df = gM_df.loc[common_genes]
|
194
|
+
gM = gM_df['G_Mean'].values
|
195
|
+
adata = adata[:, common_genes]
|
196
|
+
ranks = ranks[:, np.isin(adata.var_names, common_genes)]
|
181
197
|
else:
|
182
|
-
gM = gmean(
|
198
|
+
gM = gmean(ranks, axis=0)
|
183
199
|
|
184
200
|
# Compute the fraction of each gene across cells
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
# Normalize the
|
189
|
-
ranks =
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
# adata.layers['mkscore'] = mk_score.values.T
|
201
|
+
adata_X_bool = adata_X.astype(bool)
|
202
|
+
frac_whole = np.asarray(adata_X_bool.sum(axis=0)).flatten() / n_cells
|
203
|
+
|
204
|
+
# Normalize the ranks
|
205
|
+
ranks = ranks / gM
|
206
|
+
|
207
|
+
# Compute marker scores in parallel
|
208
|
+
logger.info('------Computing marker scores...')
|
209
|
+
|
210
|
+
def compute_mk_score_wrapper(cell_pos):
|
211
|
+
return compute_regional_mkscore(
|
212
|
+
cell_pos, spatial_net_dict, coor_latent, config, cell_annotations, ranks, frac_whole, adata_X_bool
|
213
|
+
)
|
214
|
+
|
215
|
+
mk_scores = [compute_mk_score_wrapper(cell_pos) for cell_pos in tqdm(range(n_cells), desc="Calculating marker scores")]
|
216
|
+
mk_score = np.vstack(mk_scores).T
|
217
|
+
|
218
|
+
# Remove mitochondrial genes
|
219
|
+
gene_names = adata.var_names.values.astype(str)
|
220
|
+
mt_gene_mask = ~(np.char.startswith(gene_names, 'MT-') | np.char.startswith(gene_names, 'mt-'))
|
221
|
+
mk_score = mk_score[mt_gene_mask, :]
|
222
|
+
gene_names = gene_names[mt_gene_mask]
|
208
223
|
|
209
224
|
# Save the marker scores
|
210
225
|
logger.info(f'------Saving marker scores ...')
|
211
226
|
output_file_path = Path(config.mkscore_feather_path)
|
212
227
|
output_file_path.parent.mkdir(parents=True, exist_ok=True, mode=0o755)
|
213
|
-
|
214
|
-
|
215
|
-
|
228
|
+
mk_score_df = pd.DataFrame(mk_score, index=gene_names, columns=adata.obs_names)
|
229
|
+
mk_score_df.reset_index(inplace=True)
|
230
|
+
mk_score_df.rename(columns={'index': 'HUMAN_GENE_SYM'}, inplace=True)
|
231
|
+
mk_score_df.to_feather(output_file_path)
|
216
232
|
|
217
233
|
# Save the modified adata object to disk
|
218
234
|
adata.write(config.hdf5_with_latent_path)
|
@@ -20,8 +20,6 @@ logger = logging.getLogger('gsMap.spatial_ldsc')
|
|
20
20
|
|
21
21
|
# %%
|
22
22
|
def _coef_new(jknife):
|
23
|
-
# return coef[0], coef_se[0], z[0]]
|
24
|
-
# est_ = jknife.est[0, 0] / Nbar
|
25
23
|
est_ = jknife.jknife_est[0, 0] / Nbar
|
26
24
|
se_ = jknife.jknife_se[0, 0] / Nbar
|
27
25
|
return est_, se_
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: gsMap
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.67
|
4
4
|
Summary: Genetics-informed pathogenic spatial mapping
|
5
5
|
Author-email: liyang <songliyang@westlake.edu.cn>, wenhao <chenwenhao@westlake.edu.cn>
|
6
6
|
Requires-Python: >=3.8
|
@@ -27,7 +27,7 @@ Requires-Dist: pyfiglet
|
|
27
27
|
Requires-Dist: plotly
|
28
28
|
Requires-Dist: kaleido
|
29
29
|
Requires-Dist: jinja2
|
30
|
-
Requires-Dist: scanpy
|
30
|
+
Requires-Dist: scanpy >=1.8.0
|
31
31
|
Requires-Dist: zarr
|
32
32
|
Requires-Dist: bitarray
|
33
33
|
Requires-Dist: pyarrow
|
@@ -1,22 +1,22 @@
|
|
1
|
-
gsMap/__init__.py,sha256=
|
1
|
+
gsMap/__init__.py,sha256=dO26Gwp-UoxhNp0ZHWuBVMGsjg6EVy09d93LGJ7pjqA,78
|
2
2
|
gsMap/__main__.py,sha256=jR-HT42Zzfj2f-7kFJy0bkWjNxcV1MyfQHXFpef2nSE,62
|
3
3
|
gsMap/cauchy_combination_test.py,sha256=zBPR7DOaNkr7rRoua4tAjRZL7ArjCyMRSQlPSUdHNSE,5694
|
4
|
-
gsMap/config.py,sha256=
|
4
|
+
gsMap/config.py,sha256=xHSIAdt5_4Vdr_2CA-YR1Wbn7i0FW70Eokd0cbi4hqU,41109
|
5
5
|
gsMap/diagnosis.py,sha256=pp3ONVaWCOoNCog1_6eud38yicBFxL-XhH7D8iTBgF4,13220
|
6
|
-
gsMap/find_latent_representation.py,sha256=
|
7
|
-
gsMap/format_sumstats.py,sha256=
|
6
|
+
gsMap/find_latent_representation.py,sha256=SOGSEHyi7XAPJnTUIRWHv-fCXHR3K9UYcyJI_nuPHFY,4834
|
7
|
+
gsMap/format_sumstats.py,sha256=00VLNbfjXRqIgFn44WM-mMIboLTYTRn_3JiEtqJDfeQ,13846
|
8
8
|
gsMap/generate_ldscore.py,sha256=2JfQoMWeQ0-B-zRHakmwq8ovkeewlnWHUCnih6od6ZE,29089
|
9
|
-
gsMap/latent_to_gene.py,sha256=
|
9
|
+
gsMap/latent_to_gene.py,sha256=oRYtRcq1TLXpzkoP_l93CwPDPc6LZvw6_MGrdPJhC_o,9686
|
10
10
|
gsMap/main.py,sha256=skyBtESdjvuXd9HNq5c83OPxQTNgLVErkYhwuJm8tE4,1285
|
11
11
|
gsMap/report.py,sha256=H0uYAru2L5-d41_LFHPPdoJbtiTzP4f8kX-mirUNAfc,6963
|
12
12
|
gsMap/run_all_mode.py,sha256=sPEct9fRw7aAQuU7BNChxk-I8YQcXuq--mtBn-2wTTY,8388
|
13
13
|
gsMap/setup.py,sha256=eOoPalGAHTY06_7a35nvbOaKQhq0SBE5GK4pc4bp3wc,102
|
14
|
-
gsMap/spatial_ldsc_multiple_sumstats.py,sha256=
|
14
|
+
gsMap/spatial_ldsc_multiple_sumstats.py,sha256=qyKLeWz-_78WMjkpnMtoSJyJcDLnfp-armyY_mzlwkI,18391
|
15
15
|
gsMap/visualize.py,sha256=FLIRHHj1KntLMFDjAhg1jZnJUdvrncR74pCW2Kj5pus,7453
|
16
16
|
gsMap/GNN_VAE/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
-
gsMap/GNN_VAE/adjacency_matrix.py,sha256=
|
18
|
-
gsMap/GNN_VAE/model.py,sha256=
|
19
|
-
gsMap/GNN_VAE/train.py,sha256=
|
17
|
+
gsMap/GNN_VAE/adjacency_matrix.py,sha256=TJzf5JGPDfC0-50xRP1Tdf7xqEPBLBl9E9VvQq5FE1g,3333
|
18
|
+
gsMap/GNN_VAE/model.py,sha256=6c_zw_PTg9uBnRng9fNoU3HlbrjEP1j5cxFzwPJEW5s,2959
|
19
|
+
gsMap/GNN_VAE/train.py,sha256=Etro9QKA5jU14uO17wI_gzV0Nl4YFubk9A--jpRrM4w,3095
|
20
20
|
gsMap/templates/report_template.html,sha256=pdxHFl_W0W351NUzuJTf_Ay_BfKlEbD_fztNabAGmmg,8214
|
21
21
|
gsMap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
22
|
gsMap/utils/generate_r2_matrix.py,sha256=A1BrUnlTrYjRwEKxK0I1FbZ5SCQzcviWVM-JzFHHRkw,29352
|
@@ -24,8 +24,8 @@ gsMap/utils/jackknife.py,sha256=nEDPVQJOPQ_uqfUCGX_v5cQwokgCqUmJTT_8rVFuIQo,1824
|
|
24
24
|
gsMap/utils/make_annotations.py,sha256=lCbtahT27WFOwLgZrEUE5QcNRuMXmAFYUfsFR-cT-m0,22197
|
25
25
|
gsMap/utils/manhattan_plot.py,sha256=k3n-NNgMsov9-8UQrirVqG560FUfJ4d6wNG8C0OeCjY,26235
|
26
26
|
gsMap/utils/regression_read.py,sha256=n_hZZzQXHU-CSLvSofXmQM5Jw4Zpufv3U2HoUW344ko,8768
|
27
|
-
gsmap-1.
|
28
|
-
gsmap-1.
|
29
|
-
gsmap-1.
|
30
|
-
gsmap-1.
|
31
|
-
gsmap-1.
|
27
|
+
gsmap-1.67.dist-info/entry_points.txt,sha256=s_P2Za22O077tc1FPLKMinbdRVXaN_HTcDBgWMYpqA4,41
|
28
|
+
gsmap-1.67.dist-info/LICENSE,sha256=Ni2F-lLSv_H1xaVT3CoSrkiKzMvlgwh-dq8PE1esGyI,1094
|
29
|
+
gsmap-1.67.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
30
|
+
gsmap-1.67.dist-info/METADATA,sha256=YgGfS9s8cnWLy7fWpptkcMUKsMqcFdMod_V_RlMp0dM,3384
|
31
|
+
gsmap-1.67.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|