{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#!/usr/bin/env python\n", "\n", "import re\n", "import sys\n", "import string\n", "import argparse\n", "import operator\n", "import pandas as pd\n", "import xgboost as xgb\n", "import numpy as np\n", "\n", "VERSION='0.1.0'\n", "\n", "parser = argparse.ArgumentParser(description=\"\"\"\n", "\n", "DESCRIPTION\n", "\n", "EXAMPLE:\n", "\n", " \"\"\", formatter_class= argparse.RawTextHelpFormatter)\n", "\n", "parser.add_argument('--fasta', '-f',\n", " type= str,\n", " help='''Input fasta file to search. Use '-' to read the file from stdin.\n", " \n", " ''',default='./seq.fasta',\n", " required= True)\n", "\n", "parser.add_argument('--classifier',\n", " required= False,\n", " default= 'G4Boost_classifier.json',\n", " help='''Use specified classifier (G4Boost_classifier.sav)\n", " ''')\n", "parser.add_argument('--regressor',\n", " required= False,\n", " default= 'G4Boost_regressor.json',\n", " help='''Use specified classifier (G4Boost_regressor.sav)\n", " ''')\n", "parser.add_argument('--maxloop', '-N',\n", " type= int,\n", " required= False,\n", " default= 12,\n", " help='''Maximum length of the loop. Default is to report up to 12nt.\n", " ''')\n", "parser.add_argument('--minloop', '-n',\n", " type= int,\n", " required= False,\n", " default= 1,\n", " help='''Minimum length of the loop. Default is to report up to 1nt.\n", " ''')\n", "parser.add_argument('--maxG', '-G',\n", " type= int,\n", " required= False,\n", " default= 7,\n", " help='''Maximum number of consecutive G bases within a G-stem. Default is to report up to 7 Gs.\n", " ''')\n", "parser.add_argument('--minG', '-g',\n", " type= int,\n", " required= False,\n", " default= 2,\n", " help='''Maximum number of consecutive G bases within a G-stem. Default is to report up to 1 Gs.\n", " ''')\n", "parser.add_argument('--loops', '-l',\n", " type= int,\n", " required= False,\n", " default= 11,\n", " help='''Maximum number of flexible loops separating the G-stems. Default is to report up to 11 Gs.\n", " ''')\n", "\n", "parser.add_argument('--noreverse',\n", " action= 'store_true',\n", " help='''Do not search the reverse complement of the input fasta.\n", " ''')\n", "\n", "parser.add_argument('--quiet', '-q',\n", " action= 'store_true',\n", " help='''Do not print progress report (i.e. sequence names as they are scanned). \n", " ''')\n", "\n", "parser.add_argument('--version', '-v', action='version', version='%(prog)s ' + VERSION)\n", "args = parser.parse_args()\n", "\n", "\n", "\" ------------------------------[ Functions ]--------------------------------- \"\n", "\n", "def sort_table(table, cols):\n", " for col in reversed(cols):\n", " table = sorted(table, key=operator.itemgetter(col))\n", " return(table)\n", "\n", "\n", "def chrom_name(header):\n", " if not header.startswith('>'):\n", "# raise Exception('FASTA header does not start with \">\":\\n%s' % header)\n", " return 'noID'\n", " chr= re.sub('^>\\s*', '', header)\n", " chr= re.sub('\\s.*', '', chr)\n", " return chr\n", "\n", "def revcomp(seq):\n", " complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'U': 'A', 'N': 'N'}\n", " return \"\".join(complement.get(base, base) for base in reversed(seq))\n", "\n", "\n", "def findall(seq, search):\n", " count=-1\n", " loc= 0\n", " newloc=0\n", " while newloc > -1:\n", " newloc=seq[loc:].find(search)\n", " loc=loc+newloc+1\n", " count+=1\n", " return count\n", "\n", "def initialize_dataFrame():\n", " header=[\"seq\", \"seq_length\", \"g4motif\", 'maxgbase', 'maxgstem', \"length\", \"maxlbase\", \"minlbase\", \"G\", \"C\", \"GG\", \"CC\"]\n", " data_dict={}\n", " for h in header:\n", " data_dict[h]=[]\n", " return data_dict\n", "\n", "def topology(reg, seq):\n", " split_seq=re.split(reg, seq)\n", " if len(split_seq[-1])==0: gstem_base=split_seq[-2]\n", " else: gstem_base=split_seq[-1]\n", " g=len(gstem_base)\n", " loops=[len(sp_seq)-g for sp_seq in split_seq]\n", " loops=[lbase for lbase in loops if lbase>0]\n", " maxlbase=max(loops)\n", " minlbase=min(loops)\n", " test=gstem_base\n", " for sp_seq in split_seq:\n", " if len(sp_seq)>g:\n", " test+=sp_seq[g:].lower()\n", " test+=gstem_base\n", " return [test, len(test), len(loops)+1, g, maxlbase, minlbase]\n", "\n", "def update_dataFrame(features, reg, seq, ref):\n", " [test, length, maxgstem, maxgbase, maxlbase, minlbase] = topology(reg, seq)\n", " features['g4motif'].append(test)\n", " features['length'].append(length)\n", " features['seq_length'].append(len(ref))\n", " features['maxgstem'].append(maxgstem)\n", " features['maxgbase'].append(maxgbase)\n", " features['maxlbase'].append(maxlbase)\n", " features['minlbase'].append(minlbase)\n", " features['G'].append(int(findall(ref,'G')*100/len(ref)))\n", " features['GG'].append(int(findall(ref,'GG')*100/len(ref)))\n", " features['C'].append(int(findall(ref,'C')*100/len(ref)))\n", " features['CC'].append(int(findall(ref,'CC')*100/len(ref)))\n", " return features\n", "\n", "\n", "def findmotifs(reg, seq, start):\n", " gquad_list=[]\n", " for m in re.finditer(reg, seq):\n", " seq= m.group(0)\n", " quad_id= chrom + '_' + str(m.start()+start) + '_' + str(m.end()+start)\n", " gquad_list.append([chrom, m.start()+start, m.end()+start, quad_id, len(m.group(0)), '+', seq])\n", " return gquad_list\n", "# -----------------------------------------------------------------------------\n", "\n", "\n", "if args.fasta != '-':\n", " ref_seq_fh= open(args.fasta)\n", " output= args.fasta+'.gff'\n", "else:\n", " ref_seq_fh= sys.stdin\n", " output='G4Boost_quadruplexes.gff'\n", "\n", "# ref_seq=[]\n", "# line= ref_seq_fh.readline()\n", "# if chrom != 'noID': line= ref_seq_fh.readline()\n", "# else: chrom = line.strip()\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "\n", "import re\n", "import sys\n", "import string\n", "import argparse\n", "import operator\n", "import pandas as pd\n", "import xgboost as xgb\n", "import numpy as np\n", "\n", "def predict(seqs,):\n", " gquad_list= []\n", "# eof= False\n", "\n", "\n", "\n", "#if args.fasta != '-': output= args.fasta+'.gff'\n", "#else: output = 'G4Boost_quadruplexes.gff'\n", "#out=open(output, 'w')\n", "\n", "\n", " sys.stderr.write('Starting stability prediction!\\n\\n')\n", " regressor = xgb.XGBRegressor()\n", " classifier = xgb.XGBClassifier()\n", " regressor.load_model(args.regressor)\n", " classifier.load_model(args.classifier)\n", " preds = []\n", " all_features = []\n", " for i in range(len(seqs)):\n", " chrom = str(i)\n", " gb=range(args.minG, args.maxG+1)[::-1]\n", " gs=range(3, args.loops+1)[::-1]\n", " longest = (args.maxG + args.maxloop) * args.loops + args.maxG\n", " features=initialize_dataFrame()\n", " ref_seq = seqs[i]\n", " # ref_seq= ''.join(ref_seq)\n", " ref_seq=ref_seq.upper().replace('U', 'T')\n", " rev_ref_seq=revcomp(ref_seq)\n", " seqlen= len(ref_seq)\n", " for g in gb:\n", " for s in gs:\n", " gstem_base=''\n", " for i in range(g): gstem_base+=\"G\"\n", " reg=\"\"\n", " for i in range(s): reg+='([gG]{%d}\\w{%d,%d})' % (g , args.minloop, args.maxloop)\n", " reg+='([gG]{%d})' % (g)\n", " for m in re.finditer(reg, ref_seq):\n", " seq= m.group(0)\n", " start=m.start()\n", " end=m.end()\n", " if len(ref_seq) > longest: ref = seq\n", " else: ref = ref_seq\n", " quad_id= chrom + '_' + str(m.start()) + '_' + str(m.end())\n", " gquad_list.append([chrom, start, end, quad_id, len(seq), '+', seq])\n", " if seq not in features['g4motif']:\n", " features = update_dataFrame(features, reg, seq, ref)\n", " features['seq'].append(chrom)\n", " temp=''\n", " for i in range(start,end): temp+='N'\n", " ref_seq=ref_seq[:start]+temp+ref_seq[end:]\n", " if args.noreverse is False:\n", " for m in re.finditer(reg, rev_ref_seq):\n", " seq= m.group(0)\n", " start=m.start()\n", " end=m.end()\n", " if len(rev_ref_seq) > longest: ref = seq\n", " else: ref = rev_ref_seq\n", " quad_id= chrom + '_' + str(m.start()) + '_' + str(m.end())\n", " gquad_list.append([chrom, seqlen-end, seqlen-start, quad_id, len(seq), '-', seq])\n", " if seq not in features['g4motif']:\n", " features = update_dataFrame(features, reg, seq, ref)\n", " features['seq'].append(chrom)\n", " temp=''\n", " for i in range(start,end): temp+='N'\n", " rev_ref_seq=rev_ref_seq[:start]+temp+rev_ref_seq[end:]\n", " gquad_sorted= sort_table(gquad_list, (1,2,3))\n", " gquad_list= []\n", " for xline in gquad_sorted:\n", " xline= '\\t'.join([str(x) for x in xline])\n", " with open(output, 'a') as out: out.write(xline+'\\n')\n", "\n", "\n", " #---------------\n", "\n", "\n", "\n", "\n", " selected=[\"seq_length\", \"length\", \"maxgstem\" ,\"maxgbase\", \"maxlbase\", \"minlbase\", \"G\", \"C\", \"GG\", \"CC\"]\n", " # print(features)\n", " # del features['G-quartet']\n", " # del features['loops']\n", " features=pd.DataFrame.from_dict(features)\n", " X_test = features[selected]\n", "\n", " X_test.columns = [\"length\", \"len\", \"maxgstem\", \"maxgbase\", \"maxlbase\", \"minlbase\", \"G\", \"C\", \"GG\", \"CC\"]\n", "\n", " # print(X_test)\n", "\n", "\n", " # X_test=xgb.DMatrix(X_test)\n", " g4_pred=classifier.predict(X_test)\n", " if len(g4_pred) < 1:\n", " preds.append(0)\n", " else:\n", " g4_pred_proba=classifier.predict_proba(X_test)[:, 1]\n", " mfe_pred = regressor.predict(X_test)\n", " if np.max(g4_pred_proba) < 0.5:\n", " preds.append(0)\n", " else:\n", " preds.append(1)\n", " # features['g4_pred']=g4_pred\n", " # features['g4_prob']=g4_pred_proba\n", " # features['mfe_pred']=mfe_pred\n", " # features['maxgstem']=[l-1 for l in features['maxgstem']]\n", "\n", " # if args.fasta != '-': output= args.fasta+'.g4scores.csv'\n", " # else: output = 'G4Boost_quadruplexes.g4.csv'\n", " # features.to_csv(output,sep='\\t',index=False)\n", "\n", "\n", " # print(float(np.sum(preds))/len(preds))\n", " return preds" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from Bio import SeqIO\n", "import pandas as pd\n", "import sys\n", "\n", "# read generated\n", "lines = []\n", "for record in SeqIO.parse('/data4/sina/UTR/MEME/1024_10000_init.fasta','fasta'):\n", " lines.append(str(record.seq))\n", "\n", "mut_inits = []\n", "for i in range(len(lines)):\n", " mut_inits.append(lines[i].replace('\\n','')[:50])\n", "\n", "\n", "# read optimus\n", "optimus = []\n", "for record in SeqIO.parse('/data4/sina/UTR/MEME/optimus_fasta.fasta','fasta'):\n", " optimus.append(str(record.seq))\n", "\n", "\n", "# read generated\n", "inits = []\n", "for record in SeqIO.parse('/data4/sina/UTR/MEME/1024_10000_init.fasta','fasta'):\n", " inits.append(str(record.seq))\n", "\n", "opts = []\n", "for record in SeqIO.parse('/data4/sina/UTR/MEME/1024_10000_opt.fasta','fasta'):\n", " opts.append(str(record.seq))\n", "\n", "\n", "# read natural:\n", "df = pd.read_csv('./../UTRGAN/data/utrdb2.csv')\n", "df = df['seq'].to_numpy()\n", "nats = []\n", "for i in range(len(df)):\n", " if len(df[i])< 129 and len(df[i]) > 64:\n", " nats.append(df[i].replace('T','U'))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Starting stability prediction!\n", "\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:44:31] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:44:32] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n", "Starting stability prediction!\n", "\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:54:47] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n", "Starting stability prediction!\n", "\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:55:05] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n", "Starting stability prediction!\n", "\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:55:24] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n", "Starting stability prediction!\n", "\n", "/var/anaconda3/envs/tf25/lib/python3.10/site-packages/xgboost/core.py:160: UserWarning: [12:55:33] WARNING: /croot/xgboost-split_1713972711803/work/cpp_src/src/learner.cc:873: Found JSON model saved before XGBoost 1.6, please save the model using current version again. The support for old JSON model will be discontinued in XGBoost 2.3.\n", " warnings.warn(smsg, UserWarning)\n" ] } ], "source": [ "nat_pred = predict(nats)\n", "init_pred = predict(inits)\n", "opt_pred = predict(opts)\n", "optimus_pred = predict(optimus)\n", "mut_init_pred = predict(mut_inits)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "236.76727819548873\n", "209\n", "199\n", "16\n", "162\n" ] } ], "source": [ "print(np.sum(nat_pred)/len(nat_pred)*1024.)\n", "print(np.sum(init_pred))\n", "print(np.sum(opt_pred))\n", "print(np.sum(optimus_pred))\n", "print(np.sum(mut_init_pred))" ] } ], "metadata": { "kernelspec": { "display_name": "tf25", "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.10.11" } }, "nbformat": 4, "nbformat_minor": 2 }