Velocity and pyGSEA calculations of ESR1
Run through the 10x Cellranger pipeline and velocyto for single cell RNAseq quatification and using (2) guides quantifiction. all found in the cellranger files folder bash
Guide Calling for dual guide. Use repogle method to take molecule.h5 generated by cellranger and py to run through repogle version of guide calling or use cellranger_guidecalling.ipynb for Direct Capture Perturb-Seq dual guide. Formed guide-specific lists of cells.
Pseudobulk analysis. A. Seperation of guide-specific fastq files. bash B. Whippet pseudobulk for transcript specific analysis, post UMI deduplication. bash C. Transcript quality control. R D. Whippet result visualisation.
Normalisation of adata object and E-distance of KD
Check gene and neighboring gene expression
Create individual umaps per gene of interest A. UMAPs B. Rand Index score
Cell phase assignment model from FUCCI-matched single cell paper (GSE146773)
Differential Expression analysis. A. Find the shared P1 and P2 genes. B. Check the shared P1 and P2 across different protospacers with the same A/B and C/D.
CNV Score & Numbat to quantify and Velocity quantification with loom file
ESR1-specific analysis from proliferation analysis to rt-qpcr
Spectra analysis and visualisation for pathway enrichment
The notebook focuses on RNA velocity analysis, which is a method used to predict the future state of individual cells based on the ratio of unspliced to spliced mRNA transcripts. In the context of this study, it helps determine the “transcriptional direction” or momentum of cells following promoter-specific perturbations.
RNA velocity analysis requires quantifying two types of mRNA: spliced (mature) and unspliced (precursor).
What is happening: The notebook utilizes the tool velocyto to process the raw BAM files generated by Cell Ranger into a .loom file format.
The Logic: Unspliced mRNA represents “new” transcription, while spliced mRNA represents the current “pool” of mature transcripts. By comparing these, the model can infer whether a gene is being actively upregulated or downregulated in a specific cell.
[1]:
%load_ext autoreload
%matplotlib inline
%autoreload 2
#general
import scanpy as sc
import matplotlib.pyplot as pl
import anndata as ad
import pandas as pd
import numpy as np
import hdf5plugin
#form a location
loc="/Users/helenking/Desktop/Weatheritt_Lab_Y2/alt-prom-crispr-fiveprime/"
import seaborn as sns
from tqdm.notebook import tqdm
import scperturb
import sys
sys.path.append(loc+'scripts/')
from apu_analysis import *
import scperturb
import infercnvpy as cnv
from apu_analysis.cell_import import CellPopulation
from IPython.display import clear_output
pd.options.display.float_format = '{:.4f}'.format
import matplotlib.pyplot as plt
import scvelo as scv
#for this python
from scipy.special import rel_entr
import sklearn.cluster as cluster
import umap
from scipy import stats
from scipy.stats import bootstrap
import statsmodels.api as sm
from statsmodels.stats.multitest import multipletests
from numpy import reshape
from numpy import array
from sklearn.decomposition import PCA
import gseapy as gp
# Taken from:
# Adamson, B.A., Norman, T.M., *et al.* "A multiplexed CRISPR screening platform enables systematic dissection of the unfolded protein response", *Cell*, 2016.
# My experiment deals with two KDs- one of the MP, one of the AP using two guides. Positve controls include GINS1 ect. This is a combnatorial KD double for the same gene. No treatments were used
# colours using garvan
color1 ='#4d00c7'
palecolor1="#b366ff"
color2= '#da3c07'
palecolor2="#ff8954"
color3='#05d3d3'
color4='#c6c7c5'
color4="#434541"
color5="#eb31e1"
color6="#3175eb"
color7="#a7eb31"
color8="#b366ff"
color9="#ff8954"
color10="#35c9d4"
#use viridis
color1="#fde725"
color2="#7ad151"
color3="#22a884"
color4="#2a788e"
color5="#2a788e"
color6='#440154'
# %%capture
# Create the color palette
palette = sns.color_palette([palecolor1,palecolor2])
palette2 = sns.color_palette([color1, color2, color3, color4,color5,color6 ,color7])
# Create the color palette
palette = sns.color_palette([color1, color2,color3])
new_palette = sns.color_palette([color1, color2,color1, color2,color1, color2,color1, color2,color1, color2,color1, color2, color3, color4])
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
print("Scanpy", sc.__version__)
%matplotlib inline
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
Scanpy 1.10.3
[2]:
import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
[3]:
%%capture
adata_rna = ad.read_h5ad(loc+"files/adata_normalised_cellcycle.h5ad")
adata_rna.X=adata_rna.layers["log1p"]
#get the adata_rna.obs and merge it with adata.obs
adata_1 = scv.read('/Users/helenking/Desktop/Weatheritt_Lab_Y2/alt-prom-crispr-fiveprime/cellranger_output/AP_CRISPR_WHOLE_ENSEMBL.loom', cache=True)
adata_1.obs.index=adata_1.obs.index.str.split(":").str.get(1).str[:-1]+"-1"
#get only the adata_rna.obs and subset adata
adata_2= scv.read('/Users/helenking/Desktop/Weatheritt_Lab_Y2/alt-prom-crispr-fiveprime/cellranger_output_rerun/AP_CRISPR_WHOLE_ENSEMBL.loom', cache=True)
adata_2.obs.index=adata_2.obs.index.str.split(":").str.get(1).str[:-1]+"-1"
#merge adata_1 and adata_2 with the same cellbarcodes scv
adata = scv.utils.merge(adata_1, adata_2)
adata = adata[adata_rna.obs.index,:]
adata.obs=pd.merge(adata.obs, adata_rna.obs, left_index=True, right_index=True).set_index("cell_barcode")
[24]:
scv.pl.proportions(adata)
[25]:
scv.pp.normalize_per_cell(adata)
scv.pp.filter_genes_dispersion(adata, n_top_genes=2000)
sc.pp.log1p(adata)
WARNING: Did not normalize X as it looks processed already. To enforce normalization, set `enforce=True`.
WARNING: Did not normalize spliced as it looks processed already. To enforce normalization, set `enforce=True`.
WARNING: Did not normalize unspliced as it looks processed already. To enforce normalization, set `enforce=True`.
Extracted 2000 highly variable genes.
[30]:
sc.pp.pca(adata)
sc.pp.neighbors(adata, n_pcs=30, n_neighbors=30)
scv.pp.moments(adata, n_pcs=30, n_neighbors=30)
# scv.pp.moments(adata, n_pcs=30, n_neighbors=30)
# scv.tl.velocity(adata,min_r2=0.0001,min_likelihood=0.00001, use_highly_variable=False)
scv.tl.velocity(adata,min_r2=0.001,min_likelihood=0.001, use_highly_variable=False)
computing moments based on connectivities
finished (0:00:00) --> added
'Ms' and 'Mu', moments of un/spliced abundances (adata.layers)
computing velocities
WARNING: Too few genes are selected as velocity genes. Consider setting a lower threshold for min_r2 or min_likelihood.
finished (0:00:03) --> added
'velocity', velocity vectors for each individual cell (adata.layers)
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/tools/optimization.py:184: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
gamma[i] = np.linalg.pinv(A.T.dot(A)).dot(A.T.dot(y[:, i]))
[31]:
scv.tl.velocity_graph(adata)
#run & calculate umap
scv.tl.umap(adata)
adata.obs["negative"]= np.where(adata.obs["guide_id"]=="non-targeting_Control","non_targeting","knockdown")
scv.pl.velocity_embedding_stream(adata, basis='umap', color='negative', dpi=120)
scv.pl.velocity_embedding(adata, arrow_length=3, arrow_size=2, dpi=120)
scv.tl.velocity_pseudotime(adata)
computing velocity graph (using 1/12 cores)
finished (0:00:07) --> added
'velocity_graph', sparse matrix with cosine correlations (adata.uns)
computing velocity embedding
finished (0:00:02) --> added
'velocity_umap', embedded velocity vectors (adata.obsm)
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
[32]:
#subset adata just for esr1
# adata_esr1=adata[adata.obs["guide_id"].isin(["ESR1_MP","ESR1_AP"])]
adata_esr1=adata[adata.obs["guide_id"].isin(["ESR1_AP","ESR1_MP","non-targeting_Control"])]
sc.tl.umap(adata_esr1)
scv.pl.velocity_embedding_stream(adata_esr1, basis='umap', color='guide_id', save="output.svg", dpi=600)
scv.pl.scatter(adata_esr1, color='velocity_pseudotime', cmap='gnuplot', save="esr1_stream_pseudotime.pdf")
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
saving figure to file ./figures/scvelo_output.svg
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
/Users/helenking/anaconda3/envs/apu/lib/python3.12/site-packages/scvelo/plotting/utils.py:63: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
return isinstance(c, str) and c in data.obs.keys() and cat(data.obs[c])
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'MATH': 22 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Closed glyph list over 'MATH': 22 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Closing glyph list over 'GSUB': 22 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 22 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Closing glyph list over 'glyf': 22 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Closed glyph list over 'glyf': 22 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'c', 'd', 'e', 'i', 'l', 'm', 'nine', 'nonmarkingreturn', 'o', 'p', 'period', 's', 'six', 'space', 't', 'three', 'u', 'v', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 17, 19, 22, 25, 28, 70, 71, 72, 76, 79, 80, 82, 83, 86, 87, 88, 89, 92]
INFO:fontTools.subset:Retaining 22 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:MATH subsetted
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
saving figure to file ./figures/scvelo_esr1_stream_pseudotime.pdf
[15]:
adata_esr1=adata_rna[adata_rna.obs["guide_id"].isin(["ESR1_AP","ESR1_MP"])]
#calcualte umap
sc.tl.pca(adata_esr1, n_comps=10)
sc.tl.umap(adata_esr1)
#assign negative and other
adata_esr1=adata_rna[adata_rna.obs["guide_id"].isin(["ESR1_AP","non-targeting_Control"])]
# ,"ESR1_AP"
res = gp.gsea(data=adata_esr1.to_df().T, # row -> genes, column-> samples
gene_sets="GO_Biological_Process_2021",
cls=adata_esr1.obs.guide_id,
permutation_num=400,
permutation_type='phenotype',
outdir=None,
method='s2n', # signal_to_noise
threads= 16)
term = res.res2d.Term
# gp.gseaplot(res.ranking, term=term[i], **res.results[term[i]])
axs = res.plot(terms=term[:5])
#save the plot
plt.savefig("esr1_gsea.pdf", format="pdf", bbox_inches="tight")
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'GSUB': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closing glyph list over 'glyf': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'glyf': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Retaining 20 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'MATH': 45 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228]
INFO:fontTools.subset:Closed glyph list over 'MATH': 51 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'GSUB': 51 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 51 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'glyf': 51 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'glyf': 51 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'A', 'G', 'N', 'O', 'P', 'R', 'T', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 36, 42, 49, 50, 51, 53, 55, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Retaining 51 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:MATH subsetted
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0, 38]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
[16]:
#assign negative and other
adata_esr1=adata_rna[adata_rna.obs["guide_id"].isin(["ESR1_MP","non-targeting_Control"])]
# ,"ESR1_AP"
res = gp.gsea(data=adata_esr1.to_df().T, # row -> genes, column-> samples
gene_sets="GO_Biological_Process_2021",
cls=adata_esr1.obs.guide_id,
permutation_num=1000,
permutation_type='phenotype',
outdir=None,
method='s2n', # signal_to_noise
threads= 16)
term = res.res2d.Term
# gp.gseaplot(res.ranking, term=term[i], **res.results[term[i]])
axs = res.plot(terms=term[:5])
plt.savefig("esr1_gsea_p1.pdf", format="pdf", bbox_inches="tight")
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'GSUB': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closing glyph list over 'glyf': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'glyf': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Retaining 20 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'MATH': 38 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228]
INFO:fontTools.subset:Closed glyph list over 'MATH': 44 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'GSUB': 44 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 44 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'glyf': 44 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'glyf': 44 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nine', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 42, 50, 68, 69, 70, 71, 72, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Retaining 44 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:MATH subsetted
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0, 38]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
[17]:
#assign negative and other
adata_esr1=adata_rna[adata_rna.obs["guide_id"].isin(["ESR1_MP","ESR1_AP"])]
# ,"ESR1_AP"
res = gp.gsea(data=adata_esr1.to_df().T, # row -> genes, column-> samples
gene_sets="GO_Biological_Process_2021",
cls=adata_esr1.obs.guide_id,
permutation_num=1000,
permutation_type='phenotype',
outdir=None,
method='s2n', # signal_to_noise
threads= 16)
term = res.res2d.Term
# gp.gseaplot(res.ranking, term=term[i], **res.results[term[i]])
axs = res.plot(terms=term[:5])
plt.savefig("esr1_gsea_p1_p2.pdf", format="pdf", bbox_inches="tight")
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'GSUB': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closing glyph list over 'glyf': 20 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Closed glyph list over 'glyf': 20 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'E', 'G', 'R', 'S', 'a', 'c', 'd', 'e', 'h', 'i', 'k', 'm', 'n', 'nonmarkingreturn', 'o', 'r', 'space', 't']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 40, 42, 53, 54, 68, 70, 71, 72, 75, 76, 78, 80, 81, 82, 85, 87]
INFO:fontTools.subset:Retaining 20 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned
INFO:fontTools.subset:maxp pruned
INFO:fontTools.subset:cmap pruned
INFO:fontTools.subset:kern dropped
INFO:fontTools.subset:post pruned
INFO:fontTools.subset:FFTM dropped
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:Added gid0 to subset
INFO:fontTools.subset:Added first four glyphs to subset
INFO:fontTools.subset:Closing glyph list over 'MATH': 40 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228]
INFO:fontTools.subset:Closed glyph list over 'MATH': 46 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'GSUB': 46 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'GSUB': 46 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closing glyph list over 'glyf': 46 glyphs before
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Closed glyph list over 'glyf': 46 glyphs after
INFO:fontTools.subset:Glyph names: ['.notdef', '.null', 'G', 'O', 'a', 'b', 'c', 'colon', 'd', 'e', 'eight', 'five', 'four', 'g', 'h', 'hyphen', 'i', 'l', 'm', 'minus', 'n', 'nonmarkingreturn', 'o', 'one', 'p', 'parenleft', 'parenright', 'period', 'r', 's', 'seven', 'six', 'space', 't', 'three', 'two', 'u', 'uni239B', 'uni239C', 'uni239D', 'uni239E', 'uni239F', 'uni23A0', 'x', 'y', 'zero']
INFO:fontTools.subset:Glyph IDs: [0, 1, 2, 3, 11, 12, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 42, 50, 68, 69, 70, 71, 72, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 91, 92, 3228, 3506, 3507, 3508, 3509, 3510, 3511]
INFO:fontTools.subset:Retaining 46 glyphs
INFO:fontTools.subset:head subsetting not needed
INFO:fontTools.subset:hhea subsetting not needed
INFO:fontTools.subset:maxp subsetting not needed
INFO:fontTools.subset:OS/2 subsetting not needed
INFO:fontTools.subset:hmtx subsetted
INFO:fontTools.subset:cmap subsetted
INFO:fontTools.subset:fpgm subsetting not needed
INFO:fontTools.subset:prep subsetting not needed
INFO:fontTools.subset:cvt subsetting not needed
INFO:fontTools.subset:loca subsetting not needed
INFO:fontTools.subset:post subsetted
INFO:fontTools.subset:gasp subsetting not needed
INFO:fontTools.subset:MATH subsetted
INFO:fontTools.subset:GDEF subsetted
INFO:fontTools.subset:GPOS subsetted
INFO:fontTools.subset:GSUB subsetted
INFO:fontTools.subset:name subsetting not needed
INFO:fontTools.subset:glyf subsetted
INFO:fontTools.subset:head pruned
INFO:fontTools.subset:OS/2 Unicode ranges pruned: [0, 38]
INFO:fontTools.subset:OS/2 CodePage ranges pruned: [0]
INFO:fontTools.subset:glyf pruned
INFO:fontTools.subset:GDEF pruned
INFO:fontTools.subset:GPOS pruned
INFO:fontTools.subset:GSUB pruned
INFO:fontTools.subset:name pruned