{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "74846eb0", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:04:50.457724Z", "iopub.status.busy": "2021-09-23T15:04:50.456036Z", "iopub.status.idle": "2021-09-23T15:04:50.981763Z", "shell.execute_reply": "2021-09-23T15:04:50.980817Z" }, "tags": [ "snakemake-job-properties" ] }, "outputs": [], "source": [ "\n", "######## snakemake preamble start (automatically inserted, do not edit) ########\n", "import sys; sys.path.extend(['/project2/gilad/bjf79_project1/envs/main/lib/python3.9/site-packages', '/project2/yangili1/bjf79/ChromatinSplicingQTLs/code/notebooks']); import pickle; snakemake = pickle.loads(b'\\x80\\x04\\x95\\x9f\\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x10snakemake.script\\x94\\x8c\\tSnakemake\\x94\\x93\\x94)\\x81\\x94}\\x94(\\x8c\\x05input\\x94\\x8c\\x0csnakemake.io\\x94\\x8c\\nInputFiles\\x94\\x93\\x94)\\x81\\x94(\\x8c=QTLs/QTLTools/polyA.Splicing/PermutationPass.FDR_Added.txt.gz\\x94\\x8c?QTLs/QTLTools/polyA.Splicing/OnlyFirstReps.sorted.qqnorm.bed.gz\\x94\\x8c>QTLs/QTLTools/Expression.Splicing/Genotypes/WholeGenome.vcf.gz\\x94e}\\x94(\\x8c\\x06_names\\x94}\\x94\\x8c\\x12_allowed_overrides\\x94]\\x94(\\x8c\\x05index\\x94\\x8c\\x04sort\\x94eh\\x12\\x8c\\tfunctools\\x94\\x8c\\x07partial\\x94\\x93\\x94h\\x06\\x8c\\x19Namedlist._used_attribute\\x94\\x93\\x94\\x85\\x94R\\x94(h\\x18)}\\x94\\x8c\\x05_name\\x94h\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bub\\x8c\\x06output\\x94h\\x06\\x8c\\x0bOutputFiles\\x94\\x93\\x94)\\x81\\x94\\x8cOQTLs/QTLTools/polyA.Splicing/PermutationPass.FDR_Added.SS_SNPs.Annotated.txt.gz\\x94a}\\x94(h\\x0e}\\x94h\\x10]\\x94(h\\x12h\\x13eh\\x12h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bub\\x8c\\x06params\\x94h\\x06\\x8c\\x06Params\\x94\\x93\\x94)\\x81\\x94}\\x94(h\\x0e}\\x94h\\x10]\\x94(h\\x12h\\x13eh\\x12h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bub\\x8c\\twildcards\\x94h\\x06\\x8c\\tWildcards\\x94\\x93\\x94)\\x81\\x94}\\x94(h\\x0e}\\x94h\\x10]\\x94(h\\x12h\\x13eh\\x12h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bub\\x8c\\x07threads\\x94K\\x01\\x8c\\tresources\\x94h\\x06\\x8c\\tResources\\x94\\x93\\x94)\\x81\\x94(K\\x01K\\x01e}\\x94(h\\x0e}\\x94(\\x8c\\x06_cores\\x94K\\x00N\\x86\\x94\\x8c\\x06_nodes\\x94K\\x01N\\x86\\x94uh\\x10]\\x94(h\\x12h\\x13eh\\x12h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bhWK\\x01hYK\\x01ub\\x8c\\x03log\\x94h\\x06\\x8c\\x03Log\\x94\\x93\\x94)\\x81\\x94\\x8c4../docs/20210921_CountSpliceSiteSNPsInSQTLs.py.ipynb\\x94a}\\x94(h\\x0e}\\x94\\x8c\\x08notebook\\x94K\\x00N\\x86\\x94sh\\x10]\\x94(h\\x12h\\x13eh\\x12h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x12sNt\\x94bh\\x13h\\x16h\\x18\\x85\\x94R\\x94(h\\x18)}\\x94h\\x1ch\\x13sNt\\x94bhkhhub\\x8c\\x06config\\x94}\\x94(\\x8c\\x07scratch\\x94\\x8c\\x17/scratch/midway2/bjf79/\\x94\\x8c\\x07samples\\x94\\x8c\\x0bsamples.tsv\\x94\\x8c\\naspera_key\\x94\\x8c8/home/bjf79/.aspera/connect/etc/asperaweb_id_dsa.openssh\\x94\\x8c\\x0bsQTL_chunks\\x94M\\xe8\\x03u\\x8c\\x04rule\\x94\\x8c\\x1fCount_sQTLs_with_SpliceSiteSNPs\\x94\\x8c\\x0fbench_iteration\\x94N\\x8c\\tscriptdir\\x94\\x8c=/project2/yangili1/bjf79/ChromatinSplicingQTLs/code/notebooks\\x94ub.'); from snakemake.logging import logger; logger.printshellcmds = True; import os; os.chdir('/project2/yangili1/bjf79/ChromatinSplicingQTLs/code');\n", "######## snakemake preamble end #########\n" ] }, { "cell_type": "markdown", "id": "abandoned-failing", "metadata": {}, "source": [ "# Intro\n", "\n", "In this notebook, I was planning to better understand how many spliceQTLs are due to SNPs in core splice sites (5'ss or 3'ss). As a simple first pass at this, I will look at the QTLtools permutation pass output in which I performed permutation pass on leafcutter intron phenotypes, using the smallest P-value amongst any intron within a cluster as the test statistic. Therefore, this QTLtools output has a single nominal P value (and single FDR corrected Qvalue) for each cluster of introns. So the way I plan to go about this, is to check for each cluster, check if any of the introns in the cluster overlap splice sites, then look for a pattern between the cluster P-value and whether any of the cluster's introns contain a splice site.\n", "\n", "Now onto the code..." ] }, { "cell_type": "markdown", "id": "quality-europe", "metadata": {}, "source": [ "## import libs\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "5285cdf6", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:04:50.988508Z", "iopub.status.busy": "2021-09-23T15:04:50.987589Z", "iopub.status.idle": "2021-09-23T15:04:50.990411Z", "shell.execute_reply": "2021-09-23T15:04:50.989646Z" } }, "outputs": [], "source": [ "import os" ] }, { "cell_type": "markdown", "id": "2a55b3f5", "metadata": {}, "source": [ "I think jupyter notebook will open a notebook and change to the parent directory of the notebook while you are editing. But I want this notebook to execute as if it will be executed in a snakemake, so while I am editing in jupyter notebook, I will change to that snakemake's parent directory, and be sure to comment out that change directory command" ] }, { "cell_type": "code", "execution_count": 3, "id": "a1f691bc", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:04:50.995482Z", "iopub.status.busy": "2021-09-23T15:04:50.994710Z", "iopub.status.idle": "2021-09-23T15:05:21.963809Z", "shell.execute_reply": "2021-09-23T15:05:21.962939Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/project2/yangili1/bjf79/ChromatinSplicingQTLs/code\n" ] } ], "source": [ "# os.chdir(\"../\")\n", "print(os.getcwd())\n", "\n", "import pandas as pd\n", "import gzip\n", "import vcf\n", "from plotnine import *" ] }, { "cell_type": "markdown", "id": "swedish-bottle", "metadata": {}, "source": [ "## helper functions" ] }, { "cell_type": "code", "execution_count": 4, "id": "hungarian-meeting", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:05:21.975427Z", "iopub.status.busy": "2021-09-23T15:05:21.974311Z", "iopub.status.idle": "2021-09-23T15:05:21.977752Z", "shell.execute_reply": "2021-09-23T15:05:21.976819Z" } }, "outputs": [], "source": [ "def count_iterable(i):\n", " return sum(1 for e in i)\n", "\n", "def Count_SNPs_Around_Pos(vcf_reader, chrom, pos, upstream_bp, downstream_bp, strand=\"+\"):\n", " \"\"\"\n", " for a vcf_reader object, return an integer of the number of variants that intersect a window\n", " defined by a upstream_bp (normally negative), and a downstream_bp (normally positive),\n", " relative to a pos on a chrom. Reverse upstream_bp and downstream_bp if strand not +\n", " \"\"\"\n", " if strand==\"+\":\n", " return count_iterable(vcf_reader.fetch(chrom, pos+upstream_bp, pos+downstream_bp))\n", " else:\n", " return count_iterable(vcf_reader.fetch(chrom, pos-downstream_bp, pos-upstream_bp))\n", "\n", "def PickArg2IfStrandNegative(arg1, arg2, strand):\n", " if strand == \"+\":\n", " return arg1\n", " else:\n", " return arg2" ] }, { "cell_type": "markdown", "id": "fifth-figure", "metadata": {}, "source": [ "## read clusters\n", "\n", "Read introns from QTLtools bedgz input, which has intron coordinates and cluster ID for each intron. Then read in QTLtools permutation test output (permutation tested grouped by cluster) to get Q value for each cluster being a QTL." ] }, { "cell_type": "code", "execution_count": 5, "id": "hawaiian-hollywood", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:05:21.985664Z", "iopub.status.busy": "2021-09-23T15:05:21.985001Z", "iopub.status.idle": "2021-09-23T15:05:36.206183Z", "shell.execute_reply": "2021-09-23T15:05:36.207112Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
#Chrstartendpidgidgrp_idq
0chr115947166071:15947:16607:clu_1_-chr1_clu_1_-chr1_clu_1_-0.51821
1chr116310166071:16310:16607:clu_1_-chr1_clu_1_-chr1_clu_1_-0.51821
2chr117055179151:17055:17915:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293
3chr117055172331:17055:17233:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293
4chr117368179151:17368:17915:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293
........................
143404chr91377989141378008809:137798914:137800880:clu_20895_+chr9_clu_20895_+chr9_clu_20895_+0.76432
143405chr91378005751378008809:137800575:137800880:clu_20895_+chr9_clu_20895_+chr9_clu_20895_+0.76432
143406chr91378009841378024099:137800984:137802409:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322
143407chr91378009841378028579:137800984:137802857:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322
143408chr91378009841378114619:137800984:137811461:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322
\n", "

143409 rows × 7 columns

\n", "
" ], "text/plain": [ " #Chr start end pid \\\n", "0 chr1 15947 16607 1:15947:16607:clu_1_- \n", "1 chr1 16310 16607 1:16310:16607:clu_1_- \n", "2 chr1 17055 17915 1:17055:17915:clu_2_- \n", "3 chr1 17055 17233 1:17055:17233:clu_2_- \n", "4 chr1 17368 17915 1:17368:17915:clu_2_- \n", "... ... ... ... ... \n", "143404 chr9 137798914 137800880 9:137798914:137800880:clu_20895_+ \n", "143405 chr9 137800575 137800880 9:137800575:137800880:clu_20895_+ \n", "143406 chr9 137800984 137802409 9:137800984:137802409:clu_20894_+ \n", "143407 chr9 137800984 137802857 9:137800984:137802857:clu_20894_+ \n", "143408 chr9 137800984 137811461 9:137800984:137811461:clu_20894_+ \n", "\n", " gid grp_id q \n", "0 chr1_clu_1_- chr1_clu_1_- 0.51821 \n", "1 chr1_clu_1_- chr1_clu_1_- 0.51821 \n", "2 chr1_clu_2_- chr1_clu_2_- 0.79293 \n", "3 chr1_clu_2_- chr1_clu_2_- 0.79293 \n", "4 chr1_clu_2_- chr1_clu_2_- 0.79293 \n", "... ... ... ... \n", "143404 chr9_clu_20895_+ chr9_clu_20895_+ 0.76432 \n", "143405 chr9_clu_20895_+ chr9_clu_20895_+ 0.76432 \n", "143406 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 \n", "143407 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 \n", "143408 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 \n", "\n", "[143409 rows x 7 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "splicing_bedgz_f = \"QTLs/QTLTools/polyA.Splicing/OnlyFirstReps.sorted.qqnorm.bed.gz\"\n", "Clusters = pd.read_csv(splicing_bedgz_f, delimiter='\\t', usecols=range(0,5))\n", "\n", "\n", "splicing_QTL_permutation_test_f = \"QTLs/QTLTools/polyA.Splicing/PermutationPass.FDR_Added.txt.gz\"\n", "Cluster_sig = pd.read_csv(splicing_QTL_permutation_test_f, delimiter=' ', usecols=['grp_id', 'q'])\n", "\n", "\n", "Merged = pd.merge(Clusters, Cluster_sig, left_on=\"gid\", right_on=\"grp_id\", how=\"left\")\n", "Merged" ] }, { "cell_type": "markdown", "id": "young-correction", "metadata": {}, "source": [ "Now, let's add a column for the donor position (5' intron boundary), and the acceptor (3' intron boundary), which will have to take strandedness into account." ] }, { "cell_type": "code", "execution_count": 6, "id": "attractive-variation", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:05:36.222564Z", "iopub.status.busy": "2021-09-23T15:05:36.221550Z", "iopub.status.idle": "2021-09-23T15:05:40.944912Z", "shell.execute_reply": "2021-09-23T15:05:40.945853Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
#Chrstartendpidgidgrp_idqstrandDonorPosAcceptorPos
0chr115947166071:15947:16607:clu_1_-chr1_clu_1_-chr1_clu_1_-0.51821-1660615947
1chr116310166071:16310:16607:clu_1_-chr1_clu_1_-chr1_clu_1_-0.51821-1660616310
2chr117055179151:17055:17915:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293-1791417055
3chr117055172331:17055:17233:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293-1723217055
4chr117368179151:17368:17915:clu_2_-chr1_clu_2_-chr1_clu_2_-0.79293-1791417368
.................................
143404chr91377989141378008809:137798914:137800880:clu_20895_+chr9_clu_20895_+chr9_clu_20895_+0.76432+137798914137800879
143405chr91378005751378008809:137800575:137800880:clu_20895_+chr9_clu_20895_+chr9_clu_20895_+0.76432+137800575137800879
143406chr91378009841378024099:137800984:137802409:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322+137800984137802408
143407chr91378009841378028579:137800984:137802857:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322+137800984137802856
143408chr91378009841378114619:137800984:137811461:clu_20894_+chr9_clu_20894_+chr9_clu_20894_+0.43322+137800984137811460
\n", "

143409 rows × 10 columns

\n", "
" ], "text/plain": [ " #Chr start end pid \\\n", "0 chr1 15947 16607 1:15947:16607:clu_1_- \n", "1 chr1 16310 16607 1:16310:16607:clu_1_- \n", "2 chr1 17055 17915 1:17055:17915:clu_2_- \n", "3 chr1 17055 17233 1:17055:17233:clu_2_- \n", "4 chr1 17368 17915 1:17368:17915:clu_2_- \n", "... ... ... ... ... \n", "143404 chr9 137798914 137800880 9:137798914:137800880:clu_20895_+ \n", "143405 chr9 137800575 137800880 9:137800575:137800880:clu_20895_+ \n", "143406 chr9 137800984 137802409 9:137800984:137802409:clu_20894_+ \n", "143407 chr9 137800984 137802857 9:137800984:137802857:clu_20894_+ \n", "143408 chr9 137800984 137811461 9:137800984:137811461:clu_20894_+ \n", "\n", " gid grp_id q strand DonorPos \\\n", "0 chr1_clu_1_- chr1_clu_1_- 0.51821 - 16606 \n", "1 chr1_clu_1_- chr1_clu_1_- 0.51821 - 16606 \n", "2 chr1_clu_2_- chr1_clu_2_- 0.79293 - 17914 \n", "3 chr1_clu_2_- chr1_clu_2_- 0.79293 - 17232 \n", "4 chr1_clu_2_- chr1_clu_2_- 0.79293 - 17914 \n", "... ... ... ... ... ... \n", "143404 chr9_clu_20895_+ chr9_clu_20895_+ 0.76432 + 137798914 \n", "143405 chr9_clu_20895_+ chr9_clu_20895_+ 0.76432 + 137800575 \n", "143406 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 + 137800984 \n", "143407 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 + 137800984 \n", "143408 chr9_clu_20894_+ chr9_clu_20894_+ 0.43322 + 137800984 \n", "\n", " AcceptorPos \n", "0 15947 \n", "1 16310 \n", "2 17055 \n", "3 17055 \n", "4 17368 \n", "... ... \n", "143404 137800879 \n", "143405 137800879 \n", "143406 137802408 \n", "143407 137802856 \n", "143408 137811460 \n", "\n", "[143409 rows x 10 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Merged['strand']=Merged['pid'].str[-1:]\n", "Merged['DonorPos']=Merged.apply(lambda x: PickArg2IfStrandNegative(x['start'], x['end']-1, x['strand']), axis=1)\n", "Merged['AcceptorPos']=Merged.apply(lambda x: PickArg2IfStrandNegative(x['end']-1, x['start'], x['strand']), axis=1)\n", "\n", "Merged" ] }, { "cell_type": "markdown", "id": "challenging-feature", "metadata": {}, "source": [ "Now, I want to classify the introns by whether or not there is a test SNP near the intron boundaries... I did some careful checking of my code with the help of visualizing SNPs and splice sites in IGV, to check that this counting works as expected with regards to both plus and minus strand introns at both 5'ss and 3'ss SNPs." ] }, { "cell_type": "code", "execution_count": 7, "id": "incomplete-listening", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:05:40.951590Z", "iopub.status.busy": "2021-09-23T15:05:40.950579Z", "iopub.status.idle": "2021-09-23T15:08:03.786371Z", "shell.execute_reply": "2021-09-23T15:08:03.785374Z" } }, "outputs": [], "source": [ "vcf_reader = vcf.Reader(filename='QTLs/QTLTools/Expression.Splicing/Genotypes/WholeGenome.vcf.gz')\n", "\n", "#From -1 to 5 pos relative to donor GT: [0]G[1]T\n", "Merged['DonorSnpCount'] = Merged.apply(lambda x: Count_SNPs_Around_Pos(vcf_reader, x['#Chr'], x['DonorPos'], -1, 5, strand=x['strand']), axis=1)" ] }, { "cell_type": "code", "execution_count": 8, "id": "metallic-explanation", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:08:03.793449Z", "iopub.status.busy": "2021-09-23T15:08:03.792697Z", "iopub.status.idle": "2021-09-23T15:09:40.714975Z", "shell.execute_reply": "2021-09-23T15:09:40.713894Z" } }, "outputs": [], "source": [ "# From -3 position to 0 (YAG) 3'ss\n", "Merged['AcceptorSnpCount'] = Merged.apply(lambda x: Count_SNPs_Around_Pos(vcf_reader, x['#Chr'], x['AcceptorPos'], -3, 0, strand=x['strand']), axis=1)\n" ] }, { "cell_type": "markdown", "id": "optical-leisure", "metadata": {}, "source": [ "Now make a column to categorize introns as having SNP in splice site or not." ] }, { "cell_type": "code", "execution_count": 9, "id": "arranged-static", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:09:40.721100Z", "iopub.status.busy": "2021-09-23T15:09:40.720145Z", "iopub.status.idle": "2021-09-23T15:09:40.787979Z", "shell.execute_reply": "2021-09-23T15:09:40.787097Z" } }, "outputs": [], "source": [ "Merged['SNP_in_SS'] = (Merged['AcceptorSnpCount'] + Merged['DonorSnpCount']) > 0" ] }, { "cell_type": "markdown", "id": "present-citizenship", "metadata": {}, "source": [ "How many introns SNPs overlapping the splice sites?" ] }, { "cell_type": "code", "execution_count": 10, "id": "cardiac-resort", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:09:40.811345Z", "iopub.status.busy": "2021-09-23T15:09:40.810384Z", "iopub.status.idle": "2021-09-23T15:09:40.813640Z", "shell.execute_reply": "2021-09-23T15:09:40.814419Z" } }, "outputs": [ { "data": { "text/plain": [ "2982" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(Merged['SNP_in_SS'])" ] }, { "cell_type": "markdown", "id": "e5a1543e", "metadata": {}, "source": [ "Now let's plot how many sQTLs have splice site SNPs.." ] }, { "cell_type": "code", "execution_count": 11, "id": "d562faf1", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:09:40.820378Z", "iopub.status.busy": "2021-09-23T15:09:40.819642Z", "iopub.status.idle": "2021-09-23T15:09:41.653483Z", "shell.execute_reply": "2021-09-23T15:09:41.654382Z" } }, "outputs": [ { "data": { "image/png": "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ihUrVKpUKU2YMEGenp6SpLJly+rFF19UdHS0Lly4oCpVqmjMmDHGGGFhYUpJSdHIkSOVnZ2tp59+WhEREUb74MGDFR0drcjISLm5ualnz56qUaPG/Tt4AAAAAAVi9yBTsmRJffbZZzdsL1++fK73hrle48aN1bhx43zbLBaLevXqpV69euXb7uHhoVdeeeXOCgYAAABgd8y9AwAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAAAA0yHIAAAAADAdggwAAMA98u6776pcuXJydHRUeHh4oYy5d+9eRUVFKT09vVDGu17dunU1Z84c43FkZKSefPLJfPverO1upKena8qUKapSpYrc3Nzk7++vunXr6tVXX73jsbZu3SqLxaLdu3cb28qXL68XXnihMEs2LF++XE899ZS8vb3l5eWlkJAQDRgwQGfOnDH6NG3aVM8880yuGt94440CP+e5c+c0cuRIVapUSS4uLipZsqQaN26s9957z+iTkJAgi8UiJycnHTp0KNf+OW2rV682tkVGRspisRgfpUuXVseOHbV//36jT2xsrEJCQpSdnV3g2u8GQQYAAOAeOHjwoEaNGqWePXtq+/bteuuttwpl3L1792ry5Mn3JMisWbNGiYmJGjhwYKGPfSe6dOmi2bNnq3///vriiy8UExOjFi1a6NNPPy2U8deuXasxY8YUyljXevPNN/X888+rSZMmWrlypVauXKl+/fpp9+7dSkpKMvrNnz9fs2bNMh7fTZC5cuWKmjVrpjVr1mj06NFav3695syZo9DQUH3++ed5+mdnZ2vatGm3Nfajjz6quLg47dy5U//4xz+0f/9+Pf3000pOTpYk9ejRQ5mZmVq2bFmBar9bTnZ5VgAAgIfcwYMHJUkDBw7Uo48+audqbiwjI0Ourq6SpPfee0/PPfec8dgefv/9d3311VdatmyZevfubWx/9tln72rW4lqhoaGFMs715s6dq8jIyFwhpW3btho7dqysVquxrUqVKoX2nFu3btX+/fu1bds2Pf3008b27t2753rOHM2bN9eKFSv02muvqVKlSjcd29XVVfXr15ckNWjQQOXLl9fTTz+t2NhYjRkzRo6Ojurdu7dmz56tfv36Fdox3S5mZAAAAApZZGSkOnfuLEmqWLGiLBaL5s2bpxdeeEGVK1eWm5ubypcvryFDhuiPP/7Is/+HH36o0NBQubi4yN/fX+3atVNiYqKWLl2qvn37SpICAgJksVhUvnx5Y79ffvlFbdq0kYeHh7y8vNSpUycdPnw419gWi0Vvvvmmxo8fr8DAQAUEBEiSjh49qu3bt6tr164FPu60tLTbOsbPPvtMderUkYeHh3x8fFSnTh19+eWXkqSLFy9KkoKCgvKM7+Dwvz9dc5ZDLVu2TP3795e3t7f8/Pw0atQoZWVl3bTO/JaWxcXFKSwsTF5eXvL09FS9evX09ddfG+2XL1/WhAkTFBwcrOLFiyskJEQrVqzINcbFixfzrfv62q9dWhYVFaXJkycrLS3NWMbVtGlTo++BAwfUqVMneXt7y93dXe3bt9eRI0dyPeftvF45+vfvr6CgIE2fPv0Gr86N1a5dW5IUHx9vbOvWrZv27dunvXv33vF4d4sgAwAAUMhee+01Y/ZgzZo1iouLU0REhLKzszV9+nStW7dO06ZN07Zt24zAk2PmzJnq06ePateurTVr1mjRokWqVKmSUlJS1L59e02cOFGStH79esXFxWnt2rWSpOPHj6tJkyY6ffq0li1bpoULF+rQoUNq0qSJUlJScj3H7NmzdfjwYS1evFixsbGSpE2bNsnZ2Vl169bN95iysrLyfNhstlx90tPTb3mMR44cUdeuXVW1alWtXbtWK1euVEREhC5cuCBJqly5sjw8PDR69Gh98cUXSk1NvelrPWHCBFmtVq1atUpjx47V3Llzjdfodu3YsUNNmzbV5cuXtXDhQv2///f/1KlTJx07dszoExERoZiYGKOuNm3aqFevXlq3bp3Rp3bt2vrggw+0cOFCY/nVrQwYMED9+/eXq6ur4uLiFBcXp/nz50u6Gi4bNmyo8+fPa+nSpVqxYoVSUlLUokULXb58WdLV2SUHBwcNGDBAmzdvNrbfSLFixfTKK68oNjY2T8i9lZwAU7p0aWNb1apV5ePjkyv03S8sLQMAAChkFStWNJbthIaGGrMm77//vtEnKytLFSpUUOPGjXXo0CE9/vjj+uOPPxQVFaVBgwYpJibG6NupU6dcY0tX/2j29/c3tr/77rv666+/tGHDBmOWpV69eqpUqZLmzZunqKgoo2+JEiW0evVqWSwWY9vu3bv1+OOPq3jx4nmO59dff5Wzs3O+x1q1alXj84CAgFse4549e3TlyhVFR0fL09NTktS6dWtjHy8vLy1atEgDBgxQhw4d5OjoqBo1aqhLly56+eWX5e7unue1XrJkiTFOenq63nnnHY0fP16+vr751ny9cePG6bHHHtPmzZvl6OgoSQoLCzPat2zZos8++0xfffWVsb1Vq1Y6efKkJk2apLZt20q6eu1L586djWuMKlSooA4dOmjkyJG5Zs6uVaZMGZUpU0YODg7GMq4ckydPlq+vr77++mu5uLhIkho2bKgKFSpo0aJFGjZsmB577DG98847GjdunFq0aCFnZ2fVq1dPERERGjp0qJyc8v65P2DAAM2YMUPTp083XrsbyQmsR44c0dChQ+Xs7Jzr+9Fisah69er67rvvbjrOvcCMDAAAwH3yr3/9S6GhofLw8JCzs7MaN24sScZdpOLi4pSenq7+/fvf8djbt29X8+bNjRAjScHBwWrYsKG2b9+eq2/btm1zhRhJOnXqVK59r1WxYkX98MMPeT6uvfPW7R5j9erV5ejoqOeee06ff/55vkvrIiIilJiYqA8//FC9e/fW2bNnNXHiRNWpU0dpaWm5+l4/o9WlSxelp6fnurvWzaSnp2vXrl3q06ePEWKut2HDBvn5+al58+a5ZqRatGihPXv2GHftevLJJ/Xrr7/qP//5j0aMGCFvb2/NmTNH1atXL9DSqw0bNqhTp05ycnIyntPX11c1atTQDz/8YPQbMWKEEhMTFRMTo27duunQoUN66aWX1LJly3yvkylevLjGjRun2NhYHT169IbPnxNgixUrppCQEB05ckTLly/Pc6c6f3//256BKkwEGQAAgPtg7dq16t27t5566imtWrVKu3btMpaFZWZmSrp6G10p99Kd23XhwgUFBgbm2R4YGKjz58/n2layZMk8/TIzM/OdjZEkFxcX1alTJ89HiRIl7vgYH3/8cX3xxRf6448/1LlzZwUEBKhjx465lnFJkq+vr55//nktXrxYCQkJeu2113Tw4EEtWrTopseS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AAAAMB2CDAAAAADTIcgAAAAAMB2CDAAAAADTIcgAAAAAMB2CDICbevfdd1WuXDk5OjoqPDy8UMbcu3evoqKilJ6eXijjXa9u3bqaM2eO8TgyMlJPPvnkHY3x3//+V926dVOZMmXk4uKiMmXK6JlnntG6devy9N24caNat24tX19fubq6qlq1apo5c6b++usvo0/Tpk1lsVhu+hEZGSlJKl++vF544YUb1hYbG6uQkBBlZ2ff0TEBAPAwIcgAuKGDBw9q1KhR6tmzp7Zv36633nqrUMbdu3evJk+efE+CzJo1a5SYmKiBAwcWeIzDhw+rXr16SkpK0qxZs7Ru3TpNnTpVrq6u2rp1a66+s2fPVqtWreTs7KwlS5boyy+/VOfOnTVp0iS1bdvWCDPz589XXFyc8REaGqpGjRrl2vbaa6/dVn09evRQZmamli1bVuBjBADA7JzsXQCAB9fBgwclSQMHDtSjjz5q52puLCMjQ66urpKk9957T88995zxuCCWLFkiSfr666/l5uZmbO/bt6+sVqvx+Oeff9bo0aP197//XR9//LGxvVmzZmrQoIHatWunqVOnaurUqapSpUqu5/Dy8pKHh4fq169/x/U5Ojqqd+/emj17tvr163fH+wMA8DBgRgZAviIjI9W5c2dJUsWKFWWxWDRv3jy98MILqly5stzc3FS+fHkNGTJEf/zxR579P/zwQ4WGhsrFxUX+/v5q166dEhMTtXTpUvXt21eSFBAQIIvFovLlyxv7/fLLL2rTpo08PDzk5eWlTp066fDhw7nGtlgsevPNNzV+/HgFBgYqICBAknT06FFt375dXbt2vemxXblyRWPHjlVwcLCKFy+uoKAgdejQwTiOixcvysvLK1eIyeHg8L8fmznL19544408/dq2baumTZsqOjpaly9fvmk9BdGtWzft27dPe/fuLfSxAQAwA4IMgHy99tprxh/oa9asUVxcnCIiIpSdna3p06dr3bp1mjZtmrZt22YEnhwzZ85Unz59VLt2ba1Zs0aLFi1SpUqVlJKSovbt22vixImSpPXr1ysuLk5r166VJB0/flxNmjTR6dOntWzZMi1cuFCHDh1SkyZNlJKSkus5Zs+ercOHD2vx4sWKjY2VJG3atEnOzs6qW7fuTY9txowZ+uCDDzR+/Hht2LBB0dHRKl26tBE4ateuraSkJA0Z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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ToPlot = (Merged.filter(['q', 'gid', 'SNP_in_SS'])\n", " .groupby(['gid', 'q'])\n", " .agg({\"SNP_in_SS\": \"sum\"}))\n", "\n", "ToPlot = ToPlot.reset_index()\n", "\n", "\n", "ToPlot['IsSQTL'] = ToPlot['q'] < 0.1\n", "ToPlot['HasSpliceSiteSNP'] = ToPlot['SNP_in_SS'] > 0\n", "\n", "\n", "\n", "(ggplot(ToPlot, aes(x='factor(IsSQTL)', fill='factor(HasSpliceSiteSNP)'))\n", " + geom_bar()\n", " + theme_bw())" ] }, { "cell_type": "code", "execution_count": 12, "id": "81e2d107", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:09:41.670736Z", "iopub.status.busy": "2021-09-23T15:09:41.669633Z", "iopub.status.idle": "2021-09-23T15:09:42.118993Z", "shell.execute_reply": "2021-09-23T15:09:42.119643Z" } }, "outputs": [ { "data": { "image/png": "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LtT27duVnZ2twMBADRs2TA888ECxfhcvXtS8efP0/fffq7CwUAEBAZo0aZL8/PyUk5OjxYsXa9euXSooKFDr1q311FNPqVq1agacEXD7OnHihIYPH67nnntOy5cvV/Xq1TVlyhQNHz5cq1atss2pWbNm6a677tKAAQMkSd9//72WLl2qjIwM3XnnnRo+fLgaNWpk5KkAAG4C4QRVVkhIiPr16yd3d3d9+umn+vOf/6wFCxaoevXqdv02b96s7OxsLVq0SE5OTjpy5IhcXFwkSXPnzpWrq6sSEhJUWFioWbNmafny5XryySeNOCXgtpecnKx33nlHjo6OOnv27DX7pqSk6K233tKkSZN033336fvvv9eMGTP03nvvydPT89YUDAAoV9wQjypj4cKFiomJUUxMjIYOHap27drJ09NTjo6O6t27t/Lz83X06NFi+zk6Our8+fNKS0uTo6OjQkJC5OHhobNnz+rbb7/ViBEj5ObmJg8PD0VHR+s///mPAWcHVA4DBgyQm5tbsT8SlGTdunXq2LGj7r//fjk4OKhFixa65557tGvXrltQKQCgIrBygipj6NChdvecrFmzRhs2bNDp06dlsViUk5Ojc+fOFdvv0Ucf1alTp/SXv/xFWVlZevjhhzVo0CD99ttvKiws1NChQ219rVarCgsLb8n5AJWRv79/qfv+9ttv2rdvn7788ktbW35+vpo2bVoBlQEAbgXCCaqkH374QatWrdL06dMVHBwsBwcHxcTEqKTPJHVyclL//v3Vv39/ZWZmatq0aQoICFDr1q3l6OioDz/8UM7OzgacBVD5WCwW2/eurq6SpAsXLtjuOTlz5ozuuusuSZeDTJ8+fWz3nwAAbn9c1oUqKTc3Vw4ODvL09FRBQYFWrFih3NzcEvvu3btXR44cUUFBgVxcXOTg4CAHBwf5+PioefPm+tvf/qasrCxZrVZlZmbq+++/v8VnA1ROnp6e8vPz0+bNm1VQUKCdO3fqp59+sm3v3Lmz1q9fr//+978qLCzUhQsXtHfvXp08edLAqgEAN4OVE1RJYWFhatGihUaPHi0XFxf17NlTfn5+JfY9c+aM3nvvPZ06dUrVq1dXq1at1LFjR0nSiy++qL///e964YUXlJWVJT8/P3Xp0kXh4eG38nSASuu5557Te++9p3/84x+KiIjQgw8+aNsWEhKiF154QYsWLdLx48fl5OSk+vXr6+mnnzawYgDAzbBYS7qOBQAAAABuMS7rAgAAAGAKhBMAAAAApkA4AQAAAGAKhBMAAAAApkA4AQAAAGAKhBMAAAAApkA4AQAAAGAKhBMAAAAApkA4AQAAAGAKhBOginn77bdVu3ZtOTo6KioqqlzG3LNnj+Li4pSTk1Mu412pRYsWeuedd2yvY2Nj9cADD9zQGP/973/Vr18/BQUFycXFRUFBQXrssce0du3aYn03btyozp07y8fHR66urmrcuLFmzZqlixcv2vq0a9dOFovlml+xsbGSpDp16ujZZ5+9am1Lly5Vw4YNVVBQcEPnBABAZUM4AaqQn376SWPGjNHAgQO1bds2vfnmm+Uy7p49exQfH18h4WT16tVKTU3V8OHDyzzGwYMH1bJlS6WlpWn27Nlau3atXnvtNbm6umrLli12fefOnauOHTvK2dlZixcv1hdffKHevXtr6tSp6tq1qy2gzJ8/X0lJSbavsLAwtWnTxq7t1VdfLVV9MTExysvL05IlS8p8jgAAVAZORhcA4Nb56aefJEnDhw9X3bp1Da7m6nJzc+Xq6ipJmjNnjgYMGGB7XRaLFy+WJG3YsEFubm629iFDhqiwsND2+v/+7/80duxY/elPf9LHH39sa3/00UfVqlUrdevWTa+99ppee+013X///XbH8PT0lIeHhx566KEbrs/R0VGDBg3S3Llz9dRTT93w/gAAVBasnABVRGxsrHr37i1JCgkJkcViUUJCgp599lk1aNBAbm5uqlOnjkaNGqXff/+92P4ffvihwsLC5OLiIj8/P3Xr1k2pqan64IMPNGTIEEmSv7+/LBaL6tSpY9tv//796tKlizw8POTp6alevXrp4MGDdmNbLBa98cYbmjBhggICAuTv7y9JOnz4sLZt26a+ffte89wuXbqkcePGKTg4WNWrV1dgYKB69OhhO4+zZ8/K09PTLpgUcXD433+DRZeOzZgxo1i/rl27ql27dpo3b54uXLhwzXrKol+/ftq7d6/27NlT7mMDAHC7IJwAVcSrr75qe9O9evVqJSUlKTo6WgUFBXr99de1du1aTZ8+XVu3brWFmCKzZs3S4MGDFR4ertWrV2vhwoWqX7++MjMz1b17d02ePFmStG7dOiUlJWnNmjWSpKNHj6pt27Y6ceKElixZogULFujAgQNq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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(ggplot(ToPlot, aes(x='factor(IsSQTL)', fill='factor(HasSpliceSiteSNP)'))\n", " + geom_bar(position=\"fill\")\n", " + theme_bw())" ] }, { "cell_type": "markdown", "id": "bored-feeding", "metadata": {}, "source": [ "Finally, let's consider writing out the pertinent results, so I possibly replot in R or something, and also test having output files from my notebook that snakemake can track" ] }, { "cell_type": "code", "execution_count": 13, "id": "chicken-portugal", "metadata": { "execution": { "iopub.execute_input": "2021-09-23T15:09:42.125468Z", "iopub.status.busy": "2021-09-23T15:09:42.124437Z", "iopub.status.idle": "2021-09-23T15:09:45.050210Z", "shell.execute_reply": "2021-09-23T15:09:45.051148Z" } }, "outputs": [], "source": [ "Merged.to_csv(\"QTLs/QTLTools/polyA.Splicing/PermutationPass.FDR_Added.SS_SNPs.Annotated.txt.gz\", sep=\"\\t\", index=False)" ] } ], "metadata": { "kernelspec": { "display_name": "python_from_conda_env", "language": "python", "name": "python_from_conda_env" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.13" } }, "nbformat": 4, "nbformat_minor": 5 }