{ "cells": [ { "cell_type": "code", "execution_count": 4, "id": "b991b2cc", "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\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "a9f85aa0", "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": 3, "id": "6a34b944", "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_250up75d.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_250up75d.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": 4, "id": "ec324d4f", "metadata": {}, "outputs": [], "source": [ "filtered=joined_df[joined_df['bm03_NTS']/joined_df['bm03_TS']>2.5]" ] }, { "cell_type": "code", "execution_count": 6, "id": "88c525de", "metadata": {}, "outputs": [], "source": [ "#filtered=filtered[filtered['bm03_NTS']>10]" ] }, { "cell_type": "code", "execution_count": 5, "id": "11743f05", "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
3aaeX19-159
7abgB3-21
45adiA7-18
46adiC3-10
90alsA21-57
...............
4378ytfE70-251
4390ytiA9-56
4396yzcX28+89
4397yzfA1-227
4398yzgL72-1462
\n", "

252 rows × 4 columns

\n", "
" ], "text/plain": [ " Gene name bm03_TS 6 bm03_NTS\n", "3 aaeX 19 - 159\n", "7 abgB 3 - 21\n", "45 adiA 7 - 18\n", "46 adiC 3 - 10\n", "90 alsA 21 - 57\n", "... ... ... .. ...\n", "4378 ytfE 70 - 251\n", "4390 ytiA 9 - 56\n", "4396 yzcX 28 + 89\n", "4397 yzfA 1 - 227\n", "4398 yzgL 72 - 1462\n", "\n", "[252 rows x 4 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered" ] }, { "cell_type": "code", "execution_count": 6, "id": "9eacf69f", "metadata": {}, "outputs": [], "source": [ "filtered.to_csv('250up75d_high_NTS')" ] }, { "cell_type": "code", "execution_count": 1, "id": "6b55a01e", "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": 2, "id": "705d5de5", "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": 5, "id": "a6aaf040", "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": 6, "id": "5dbb6ab8", "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": 7, "id": "c9207bd7", "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": 20, "id": "c1806d9d", "metadata": {}, "outputs": [], "source": [ "#filter_file='high_NTS_end_2'\n", "filter_file='150up50d_high_NTS' #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": 21, "id": "e480db91", "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": 22, "id": "03c9c66d", "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": 23, "id": "27c61731", "metadata": {}, "outputs": [], "source": [ "ts_final_df=ts_final_df\n", "nts_final_df=nts_final_df" ] }, { "cell_type": "code", "execution_count": 24, "id": "1b9dd54a", "metadata": {}, "outputs": [], "source": [ "joined_df=ts_final_df.join(nts_final_df,lsuffix='_TS',rsuffix='_NTS')" ] }, { "cell_type": "code", "execution_count": 25, "id": "cde74a75", "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": 26, "id": "b7d73129", "metadata": {}, "outputs": [], "source": [ "sub_df=joined_df.loc[:,['bm02_TS','bm02_NTS','bm03_TS','bm03_NTS']]" ] }, { "cell_type": "code", "execution_count": 28, "id": "af36c1df", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Average CPD Total')" ] }, "execution_count": 28, "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(48,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('100up100dend_gene_highNTS.png',transparent=True,bbox_inches='tight',dpi=600)" ] }, { "cell_type": "code", "execution_count": null, "id": "ecda7f2a", "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": 5 }