{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import argparse\n", "import pandas as pd\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import seaborn as sns\n", "from collections import Counter" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "genes_df=pd.read_table(\"U00096.3.gtf\",header=None)\n", "genes_df[\"Gene name\"]=genes_df[8].apply(lambda x: x.split(';')[4].split('=')[1])\n", "genes_df=genes_df.loc[:,[6,'Gene name']]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/britney/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:15: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", "of pandas will change to not sort by default.\n", "\n", "To accept the future behavior, pass 'sort=False'.\n", "\n", "To retain the current behavior and silence the warning, pass 'sort=True'.\n", "\n", " from ipykernel import kernelapp as app\n" ] } ], "source": [ "sample='bm03'\n", "plus_df=pd.read_table('2018-05-22_RNAseq/bm03_fwd_end50genes.txt',header=None)\n", "plus_df=plus_df.iloc[0:4419,:]\n", "plus_df.columns=['Gene name','plus_count']\n", "plus_df=plus_df.merge(genes_df, on ='Gene name')\n", "minus_df=pd.read_table('2018-05-22_RNAseq/bm03_rev_end50genes.txt',header=None)\n", "minus_df=minus_df.iloc[0:4419,:]\n", "minus_df.columns=['Gene name','minus_count']\n", "minus_df=minus_df.merge(genes_df, on ='Gene name')\n", "merge_df=pd.merge(plus_df,minus_df)\n", "plusgenes_df=merge_df[merge_df[6]=='+']\n", "plusgenes_df.columns=['Gene name',sample+'_TS',6,sample+'_NTS']\n", "minusgenes_df=merge_df[merge_df[6]=='-']\n", "minusgenes_df.columns=['Gene name',sample+'_NTS',6,sample+'_TS']\n", "joined_df=pd.concat([plusgenes_df,minusgenes_df])\n", "joined_df=joined_df.sort_index()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "filtered=joined_df[joined_df['bm03_NTS']/joined_df['bm03_TS']>2]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "filtered=filtered[filtered['bm03_NTS']>20]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "#filtered.to_csv('test_high_NTS')" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "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", "
Gene namebm03_TS6bm03_NTS
3aaeX17-136
12abrB19-43
31acrD23+3420
50aes30-61
57agaS10+24
...............
4030ytfE46-169
4041ytiA6-53
4044yzcX37+93
4045yzfA0-106
4046yzgL74-1782
\n", "

183 rows × 4 columns

\n", "
" ], "text/plain": [ " Gene name bm03_TS 6 bm03_NTS\n", "3 aaeX 17 - 136\n", "12 abrB 19 - 43\n", "31 acrD 23 + 3420\n", "50 aes 30 - 61\n", "57 agaS 10 + 24\n", "... ... ... .. ...\n", "4030 ytfE 46 - 169\n", "4041 ytiA 6 - 53\n", "4044 yzcX 37 + 93\n", "4045 yzfA 0 - 106\n", "4046 yzgL 74 - 1782\n", "\n", "[183 rows x 4 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "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", "
Gene namebm03_TS6bm03_NTS
2aaeR28+43
3aaeX17-136
7abgB3-17
8abgR22+39
12abrB19-43
...............
4041ytiA6-53
4044yzcX37+93
4045yzfA0-106
4046yzgL74-1782
4061zraP16-32
\n", "

492 rows × 4 columns

\n", "
" ], "text/plain": [ " Gene name bm03_TS 6 bm03_NTS\n", "2 aaeR 28 + 43\n", "3 aaeX 17 - 136\n", "7 abgB 3 - 17\n", "8 abgR 22 + 39\n", "12 abrB 19 - 43\n", "... ... ... .. ...\n", "4041 ytiA 6 - 53\n", "4044 yzcX 37 + 93\n", "4045 yzfA 0 - 106\n", "4046 yzgL 74 - 1782\n", "4061 zraP 16 - 32\n", "\n", "[492 rows x 4 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "joined_df[joined_df['bm03_NTS']>joined_df['bm03_TS']]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def readgenome(fasta): #for genes in the '+' orientation, reading would give the NTS (coding)\n", " genome=\"\"\n", " with open(fasta,\"r\") as file1:\n", " for line in file1:\n", " if line.startswith(\">\"):\n", " pass\n", " else:\n", " genome=genome+''.join(line.rstrip())\n", " \n", " \n", " return genome\n", "\n", "def complement(gene): #for genes in the '+' orientation, the complement genome would give the TS \n", " code={\"A\":\"T\",\"T\":\"A\",\"G\":\"C\",\"C\":\"G\"}\n", " minus_strand=\"\"\n", " for nuc in gene:\n", " minus_strand=minus_strand+code[nuc]\n", " return minus_strand" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "plus_genome=complement(readgenome(\"U00096.3.fa\")) #I am calling the compliment genome plus (plus would refer to TS of plus genes)\n", "minus_genome=readgenome(\"U00096.3.fa\") #the minus is the original read-in and would refer to the TS of minus genes" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#the files here were made with pos_count.py script and alignment bedfiles\n", "p_data=pd.read_csv('2020-06-25_CPDseq/p_data_df',index_col=0).to_dict()\n", "m_data=pd.read_csv('2020-06-25_CPDseq/m_data_df',index_col=0).to_dict()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def count_TT(seq):\n", " count=0\n", " for i in range(len(seq)-1):\n", " if seq[i:i+2]=='TT':\n", " count=count+1\n", " i=i+2\n", " return count\n", "\n", "def select_reg(d,coord):\n", " gene_dict={}\n", " for i in range(coord[0],coord[1]):\n", " if i in d:\n", " gene_dict[i]=d[i]\n", " else:\n", " gene_dict[i]=0\n", " return gene_dict\n", "\n", "\n", "def calc_sum(c,p_data,m_data,strand):\n", " r_dict={}\n", " #nts_dict={}\n", " for key in p_data: \n", " m_tt=count_TT(minus_genome[c[0]:c[1]])\n", " p_tt=count_TT(plus_genome[c[0]:c[1]])\n", " p_strand=select_reg(p_data[key],c)\n", " m_strand=select_reg(m_data[key],c)\n", " if m_tt > 0 and p_tt > 0:\n", " if strand == '-':\n", " ts=sum(m_strand.values())/m_tt\n", " nts=sum(p_strand.values())/p_tt\n", " r_dict[key]=(ts,nts)\n", " #nts_dict[key]=nts\n", " else:\n", " ts=sum(p_strand.values())/p_tt\n", " nts=sum(m_strand.values())/m_tt\n", " r_dict[key]=(ts,nts)\n", " #nts_dict[key]=nts\n", " return r_dict\n", "\n", "def add_lis(lis1,lis2):\n", " sum_lis=[]\n", " for i in range(len(lis1)):\n", " n=lis1[i]+lis2[i]\n", " sum_lis.append(n)\n", " return sum_lis" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "final_dict={} #gene is split into 6 sections and for each sample the total amount of damage is determined for that section\n", "bedfile='U00096.3.gtf'\n", "with open(bedfile,'r') as file1:\n", " for line in file1:\n", " l=line.split()\n", " gene=l[8].split(';')[4].split('=')[1]\n", " strand=l[6]\n", " \n", " ar=np.array(range(int(l[3]),int(l[4])))\n", " \n", " split=np.array_split(ar,4)\n", " total_lis=[]\n", " for sec in split:\n", " c=(sec[0],sec[-1])\n", " total=calc_sum(c,p_data,m_data,strand)\n", " total_lis.append(total)\n", " if strand == '-':\n", " total_lis=total_lis[::-1]\n", " final_dict[gene]=total_lis\n", "\n", "r_dict={} #restructuring dictionary do that each sample holds list of section values\n", "for gene in final_dict:\n", " new={}\n", " new2={}\n", " for d in final_dict[gene]:\n", " for sample in d:\n", " if sample not in new:\n", " new[sample]=[d[sample]]\n", " else:\n", " \n", " lis=new[sample]\n", " lis.append(d[sample])\n", " new2[sample]=lis\n", " \n", " r_dict[gene]=new2" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "#filter_file='high_NTS_end_2'\n", "filter_file='high_NTS_end_5' #original figure\n", "df=pd.DataFrame(r_dict).transpose()\n", "gene_df=pd.read_csv(filter_file,index_col=1)#filter to certain genes\n", "gene_df=gene_df.iloc[:,:0]\n", "df=df.loc[df.index.isin(gene_df.index)]\n", "df=df.dropna()\n", "final_df=df.to_dict()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "ts_sum_dict={} #add the list across all genes to have one final sum_lis for each sample \n", "nts_sum_dict={}\n", "\n", "for sample in final_df:\n", " ts_sum_lis=[]\n", " nts_sum_lis=[]\n", " for gene in final_df[sample]:\n", " if type(final_df[sample][gene])==list:\n", " if len(final_df[sample][gene])==4:\n", " if ts_sum_lis:\n", " ts_lis,nts_lis=zip(*final_df[sample][gene])\n", " ts_lis1=list(ts_lis)\n", " nts_lis1=list(nts_lis)\n", " \n", " ts_lis2=ts_sum_lis\n", " nts_lis2=nts_sum_lis\n", " ts_sum_lis=add_lis(ts_lis1,ts_lis2)\n", " nts_sum_lis=add_lis(nts_lis1,nts_lis2)\n", " else:\n", " ts_lis,nts_lis=zip(*final_df[sample][gene])\n", " ts_sum_lis=list(ts_lis)\n", " nts_sum_lis=list(nts_lis)\n", " ts_sum_dict[sample]=ts_sum_lis\n", " nts_sum_dict[sample]=nts_sum_lis" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "ts_final_df=pd.DataFrame(ts_sum_dict)\n", "nts_final_df=pd.DataFrame(nts_sum_dict)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "ts_final_df=ts_final_df\n", "nts_final_df=nts_final_df" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "joined_df=ts_final_df.join(nts_final_df,lsuffix='_TS',rsuffix='_NTS')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "label_dict={'bm01':'wt NT',\n", " 'bm02':'wt 0',\n", " 'bm03':'wt 10',\n", " 'bm04':'wt 20',\n", " 'bm05':'wt 30',\n", " 'bm06':'wt 40',\n", " 'bm07':'mfd NT',\n", " 'bm08':'mfd 0',\n", " 'bm09':'mfd 10',\n", " 'bm10':'mfd 20',\n", " 'bm11':'mfd 30',\n", " 'bm12':'mfd 40',\n", " 'bm13':'D210G NT',\n", " 'bm14':'D210G 0',\n", " 'bm15':'D210G 10',\n", " 'bm16':'D210G 20',\n", " 'bm17':'D210G 30',\n", " 'bm18':'D210G 40',\n", " 'bm19':'L187R NT',\n", " 'bm20':'L187R 0',\n", " 'bm21':'L187R 10',\n", " 'bm22':'L187R 20',\n", " 'bm23':'L187R 30',\n", " 'bm24':'L187R 40'}\n", "norm_dict={'bm01':9151942,\n", " 'bm02':10811640,\n", " 'bm03':8798072,\n", " 'bm04':10729975,\n", " 'bm05':9861146,\n", " 'bm06':9173308,\n", " 'bm07':10126351,\n", " 'bm08':11049652,\n", " 'bm09':10774184,\n", " 'bm10':11381834,\n", " 'bm11':10681688,\n", " 'bm12':9912594,\n", " 'bm13':9866758,\n", " 'bm14':11044634,\n", " 'bm15':10038700,\n", " 'bm16':12919112,\n", " 'bm17':10206186,\n", " 'bm18':10161969,\n", " 'bm19':10899062,\n", " 'bm20':11521524,\n", " 'bm21':15445725,\n", " 'bm22':12503461,\n", " 'bm23':10330716,\n", " 'bm24':16988854}" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "sub_df=joined_df.loc[:,['bm02_TS','bm02_NTS','bm03_TS','bm03_NTS']]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Average CPD Total')" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.rc('xtick',labelsize=12)\n", "plt.rc('ytick',labelsize=12)\n", "sns.set_style(\"whitegrid\")\n", "#sns.set_context(\"paper\")\n", "plt.figure(figsize=(4.4,2.7))\n", "T=np.array(list(sub_df.index))\n", "for sample in list(sub_df.columns):\n", " y=sub_df[sample].tolist()\n", " y=[(x / norm_dict[sample[0:4]])*1000000 for x in y]\n", " if sample[5:7]=='TS':\n", " marker='o'\n", " line='-'\n", " else:\n", " marker='x'\n", " line='--'\n", " \n", " if label_dict[sample[0:4]].split()[1]=='0':\n", " color='blue'\n", " if label_dict[sample[0:4]].split()[1]=='10':\n", " color='orange'\n", " if label_dict[sample[0:4]].split()[1]=='20':\n", " color='black'\n", " if label_dict[sample[0:4]].split()[1]=='30':\n", " color='red'\n", " if label_dict[sample[0:4]].split()[1]=='40':\n", " color='purple'\n", " \n", " plt.plot(T,y,label=label_dict[sample[0:4]]+' '+sample[5:7],marker=marker,color=color,linestyle=line,linewidth=2,markersize=5)\n", "plt.legend([\"0 TS\", \"0 NTS\",\"10 TS\",\"10 NTS\"],bbox_to_anchor=(1., 1), loc=2, borderaxespad=0.,fontsize=12,fancybox=True)\n", "#plt.axvline(x=49,linewidth=2, color='k')#plt.ylim(0,12)\n", "plt.margins(x=0.02)\n", "#plt.ylim(30,58)\n", "\n", "\n", "sns.despine(top=True, right=True, left=False, bottom=False)\n", "\n", "plt.ylabel('Average CPD Total',fontsize=14)\n", "#plt.savefig('end_gene_highNTS.png',transparent=True,bbox_inches='tight',dpi=600)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }