datafile_germline_v0_20230221_finish.py 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. import pandas as pd
  2. import os,os.path
  3. import xlrd
  4. import re
  5. import argparse
  6. ########germline针对的为白细胞对照
  7. #保留条件如:频率>=30%、Func.refGene中intronic和ncRNA_exonic去掉、无突变注释信息的去掉、人群频率>=1%的去掉;
  8. # 胚系注释中终止密码止为X表示,请跟体系保持一致,用*号。
  9. # 胚系表头请按附近中示例调整一下顺序,VAF改为百分比的数据形式。
  10. #去掉HLA相关基因突变
  11. #输出按照基因名称进行排序
  12. #for the end change
  13. def rep(a):
  14. # print(a.group(0))
  15. st = re.sub("x","*",a.group(0),flags=re.I)
  16. st = re.sub("#","",st,flags=re.I)
  17. return st
  18. #frameshift replace
  19. def rep1(a):
  20. st = re.sub("fs\*.*", "", a.group(0), flags=re.I)
  21. st1 = re.split("(\d+)", st)
  22. if "," in a.group(0):
  23. st2 = st1[0] + st1[1] + "fs,"
  24. else:
  25. st2 = st1[0] + st1[1] + "fs"
  26. return st2
  27. ###当由多个基因构成时进行拆分
  28. ###当Gene.refGene由多个基因注释构成,且这几个基因是在我们的genelist中,我们需要的是将基因拆分,然后对应的AAchange信息保留
  29. def gene_split(svdata):
  30. df_name = svdata['Gene.refGene'].str.split(';', expand=True)
  31. # 三、把行转列成列
  32. df_name = df_name.stack()
  33. # 四、重置索引,并删除多于的索引
  34. df_name = df_name.reset_index(level=1, drop=True)
  35. # 五、与原始数据合并
  36. df_name.name = 'df_name1'
  37. df_new = svdata.drop(['Gene.refGene'], axis=1).join(df_name)
  38. df_new.rename(columns={'df_name1': 'Gene.refGene'}, inplace=True)
  39. df_new.reset_index(drop=True, inplace=True)
  40. return df_new
  41. ###1.对主转录本数据的筛选。
  42. #对'AAChange.refGene'的数据提取
  43. #当'AAChange_select'为空时,
  44. #1)当AAChange.refGene只有一个转录本的突变信息时,我们将这个转录本信息直接赋给AAChange_select
  45. #2)当AAChange.refGene有多个转录本的突变信息时,选择这些转录本中最长的那个
  46. #输入的是基因时
  47. def transid_select_gene(gene):
  48. refseq_transdir = '/cgdata/liuxiangqiong/work62pancancer/Client/v0/script/refdata/hg19_refGene_transcript.bed'
  49. refseq = pd.read_table(refseq_transdir, sep='\t', usecols=[0, 1, 2, 6, 7], names=['chr', 'start', 'end', 'transid', 'gene'])
  50. refseq['trans_length'] = refseq['end'] - refseq['start']
  51. genetand = refseq[refseq['gene'] == gene]
  52. maxlength = genetand['trans_length'].max()
  53. trans_unique_infor = genetand[genetand['trans_length'] == maxlength]
  54. trans_unique_infor.reset_index(drop=True, inplace=True)
  55. trans_unique_id = trans_unique_infor.loc[0, 'transid']
  56. return trans_unique_id
  57. #输入的时AAchange信息时.有一个或者多个转录本注释
  58. def transid_select_AAchange(AAchange,AAchange_gene):
  59. AAchangedata0=AAchange.split(',')
  60. AAchangedata0_1=pd.DataFrame()
  61. for i in range(len(AAchangedata0)):
  62. AAchangedata0_1.loc[i,'AAchange']=AAchangedata0[i]
  63. AAchangedata1 =AAchangedata0_1['AAchange'].str.split(':', expand=True)
  64. AAchangedata1['transid'] = AAchangedata1[1].str.split('.', expand=True)[0]
  65. AAchangedata1.rename(columns={0: 'gene'}, inplace=True)
  66. AAchangedata2=AAchangedata1[AAchangedata1['gene']==AAchange_gene]
  67. refseq_transdir = '/cgdata/liuxiangqiong/work62pancancer/Client/v0/script/refdata/hg19_refGene_transcript.bed'
  68. refseq = pd.read_table(refseq_transdir, sep='\t', usecols=[0, 1, 2, 6, 7], names=['chr', 'start', 'end', 'transid', 'gene'])
  69. refseq['trans_length'] = refseq['end'] - refseq['start']
  70. ##获得具有转录本编号的信息
  71. AAgene = pd.merge(AAchangedata2, refseq, on=['gene', 'transid'], how='inner')
  72. print(AAgene)
  73. #如果结果获得不为空则执行
  74. if len(AAgene) !=0:
  75. maxlength = AAgene['trans_length'].max()
  76. trans_unique_infor = AAgene[AAgene['trans_length'] == maxlength]
  77. trans_unique_infor.reset_index(drop=True, inplace=True)
  78. trans_unique_id = trans_unique_infor.loc[0, 'transid']
  79. geneinfor = AAchange_gene + ':' + trans_unique_id
  80. AAchange_select0 = [s for s in AAchangedata0 if geneinfor in s]
  81. AAchange_select=AAchange_select0[0]
  82. elif (len(AAgene) ==0) & (len(AAchangedata2)==1):
  83. AAchange_select =AAchange[0]
  84. elif (len(AAgene) ==0) & (len(AAchangedata2)>1):
  85. AAchange_select = AAchangedata0[0]
  86. return AAchange_select
  87. ####1.对AAchange_select的补充
  88. def AAchangeselect_plus(germdata):
  89. for j in range(len(germdata)):
  90. #print(j)
  91. gene = germdata.loc[j, 'Gene.refGene']
  92. if pd.isnull(germdata.loc[j, 'AAChange_select']):
  93. germdata.loc[j, 'AAChange_select']=''
  94. if ( ',' in germdata.loc[j, 'AAChange_select']) and (pd.notnull(germdata.loc[j, 'AAChange_select'])):
  95. AAChange_selectinfor = germdata.loc[j, 'AAChange_select'].split(',')
  96. AAChange_selectinfor1 = [s for s in AAChange_selectinfor if gene+':' in s]
  97. germdata.loc[j, 'AAChange_select']=AAChange_selectinfor1
  98. AAchangedata = germdata.loc[j, 'AAChange.refGene']
  99. #print(AAchangedata)
  100. if (AAchangedata.count(',') == 0) & (AAchangedata != '.') & (germdata.loc[j, 'AAChange_select']==''):
  101. germdata.loc[j, 'AAChange_select'] = germdata.loc[j, 'AAChange.refGene']
  102. elif (AAchangedata.count(',') != 0) & (AAchangedata != '.') & (germdata.loc[j, 'AAChange_select']==''):
  103. gene_transid_unque = transid_select_AAchange(AAchangedata, gene)
  104. AAchange_infor = AAchangedata.split(',')
  105. #geneinfor = gene + ':' + gene_transid_unque
  106. geneinfor = gene_transid_unque
  107. AAchange_select = [s for s in AAchange_infor if geneinfor in s]
  108. if len(AAchange_select) != 0:
  109. germdata.loc[j, 'AAChange_select'] = AAchange_select[0]
  110. else:
  111. germdata.loc[j, 'AAChange_select'] = ''
  112. return germdata
  113. #germdata1=AAchangeselect_plus(germdata)
  114. # 2.将c.注释的格式例如c.A8077T改为c.8077A>T
  115. #germdata2=cdsmut_trans(germdata1)
  116. #####2.将c.注释的格式例如c.A8077T改为c.8077A>T
  117. #3.终止密码止原来用X表示,转换后用*表示
  118. ###4.对移码突变的转换,如由p.P1353Qfs*89改成p.P1353fs
  119. def cdsmut_trans(germdata):
  120. newchange = germdata['AAChange_select'].str.split(":", expand=True)
  121. newchange['c1'] = newchange[3].str.split('.', expand=True)[1]
  122. for i in range(len(newchange)):
  123. if pd.notnull(newchange.loc[i, 'c1']):
  124. if ('ins' not in newchange.loc[i, 'c1']) & ('del' not in newchange.loc[i, 'c1']):
  125. new = 'c.' + re.findall("\d+\.?\d*", newchange.loc[i, 'c1'])[0] + re.sub("[0-9]+", '>',
  126. newchange.loc[i, 'c1'])
  127. newchange.loc[i, 'new_AA'] = new
  128. else:
  129. new = 'c.' + newchange.loc[i, 'c1']
  130. newchange.loc[i, 'new_AA'] = new
  131. else:
  132. newchange.loc[i, 'new_AA'] = ''
  133. germdata['new_select'] = newchange[0] + ':' + newchange[1] + ':' + newchange[2] + ':' + newchange['new_AA'] + ':' + newchange[4]
  134. # 终止密码止原来用X表示,转换后用*表示
  135. germdata['AAChange.refGene'] = (germdata['AAChange.refGene'] + "#").str.replace('p\..*?[,#]', rep)
  136. germdata['AAChange.refGene'] = germdata['AAChange.refGene'].str.replace('#$', "")
  137. germdata['new_select'] = (germdata['new_select'] + "#").str.replace('p\..*?[,#]', rep)
  138. germdata['new_select'] = (germdata['new_select']).str.replace('#$', "")
  139. # print(germline_filter4['AAChange_select'])
  140. ###对移码突变的转换,如由p.P1353Qfs*89改成p.P1353fs
  141. germdata['AAChange.refGene'] = (germdata['AAChange.refGene'] + "#").str.replace('p\..*fs\*.*?[,#]', rep1)
  142. germdata['AAChange.refGene'] = germdata['AAChange.refGene'].str.replace('#$', "")
  143. germdata['new_select'] = (germdata['new_select'] + "#").str.replace('p\..*fs\*.*?[,#]', rep1)
  144. germdata['new_select'] = (germdata['new_select']).str.replace('#$', "")
  145. return germdata
  146. ####对AAchange列进一步,提取经过vep和annovar注释后的Otherinfo11这列信息
  147. #并将氨基酸改变缩写改为单字母的简写,终止突变Ter改为*
  148. def AAchange_new_infor(svdata):
  149. data_INFO_1 = svdata.loc[:, 'Otherinfo11'].str.split("|", expand=True)
  150. data_INFO_1.fillna("", inplace=True)
  151. result_num = 0
  152. for i in [i1 for i1 in range(1, data_INFO_1.shape[1], 41)]:
  153. data_INFO_2 = pd.DataFrame()
  154. data_INFO_2["AAChange.refGene_1"] = data_INFO_1.iloc[:, i + 2] + ":" + \
  155. data_INFO_1.iloc[:, i + 5] + ":" + \
  156. "exon" + data_INFO_1.iloc[:, i + 7].str.split("/", expand=True)[0] + ":" + \
  157. "intron" + data_INFO_1.iloc[:, i + 8].str.split("/", expand=True)[0] + ":"
  158. data_INFO_3 = data_INFO_1.iloc[:, i + 9].str.split(":", expand=True)
  159. data_INFO_4 = data_INFO_1.iloc[:, i + 10].str.split(":", expand=True)
  160. if data_INFO_3.shape[1] == 1:
  161. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"] + data_INFO_3[0] + ":"
  162. else:
  163. data_INFO_3.fillna("", inplace=True)
  164. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"] + data_INFO_3[1] + ":"
  165. if data_INFO_4.shape[1] == 1:
  166. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"] + data_INFO_4[0]
  167. else:
  168. data_INFO_4.fillna("", inplace=True)
  169. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"] + data_INFO_4[1]
  170. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"].str.replace("exon:", "")
  171. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"].str.replace("intron:", "")
  172. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"].str.replace("::", ":")
  173. data_INFO_2["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"].str.replace(":$", "")
  174. if result_num == 0:
  175. svdata["AAChange.refGene_1"] = data_INFO_2["AAChange.refGene_1"] + ";"
  176. result_num = 1
  177. else:
  178. svdata["AAChange.refGene_1"] = svdata["AAChange.refGene_1"] + data_INFO_2["AAChange.refGene_1"] + ";"
  179. svdata["AAChange.refGene_1"] = svdata["AAChange.refGene_1"].str.replace(":;", "")
  180. svdata["AAChange.refGene_1"] = svdata["AAChange.refGene_1"].str.replace(";$", "")
  181. # 需要将氨基酸改变缩写改为单字母的简写,终止突变Ter改为*
  182. AA_path = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/AA_dict.txt'
  183. AAdata = pd.read_table(AA_path, sep='\t')
  184. for j in range(len(AAdata)):
  185. AAdata_abbre = AAdata.loc[j, 'Abbre_name']
  186. AAdata_short = AAdata.loc[j, 'Short_name']
  187. svdata['AAChange.refGene_1'] = svdata['AAChange.refGene_1'].str.replace(AAdata_abbre, AAdata_short)
  188. return svdata
  189. ##将vep和annovar注释结果进行整合
  190. def vepannovar_merge(AAchange_raw,AAchange_new,AAchange_gene):
  191. '''
  192. vep and vardict anno merge
  193. 输入数据均为字符串
  194. :param AAchange_raw: the AAchange.refgene from annovar anno of the data,one str。
  195. :param AAchange_new: the AAchange.refgene_1 from the vep anno of the data,one str
  196. :return: the modified AAchange,str
  197. '''
  198. ###1.当AAchange_new中没有c.和p.信息时候,需要从AAchange_-raw中提取出来补全
  199. ###1.1对AAchange_raw按照符合分列。
  200. AAchangeraw1 = AAchange_raw.split(',')
  201. ###1.2对AAchane_new按照符号分列
  202. AAchangenew0 = AAchange_new.split(';')
  203. ##从AAchane_new选择Gene.refGene在内的
  204. AAchangenew1 = [s for s in AAchangenew0 if AAchange_gene in s]
  205. if len(AAchangenew1) != 0:
  206. # 1.2.1循环分列后的AAchangenew1
  207. # 首先从割裂后的结果中,找到与AAchange_gene一致的突变
  208. # 然后从raw中查找对应的c.和p.信息。
  209. # 如果c.信息都不能找到,那么这个转录本对应的突变信息就设置为空。
  210. AAchangenew2 = ''
  211. for j in range(len(AAchangenew1)):
  212. #print(j)
  213. AAchangenew1_0 = AAchangenew1[j]
  214. #print(AAchangenew1_0)
  215. #如果信息中跨外显子的,那只提取外显子的
  216. if ('exon' in AAchangenew1_0) & ('intron' in AAchangenew1_0):
  217. AAchangenew1_1=re.sub('intron\d.*?:', "",AAchangenew1_0)
  218. else:
  219. AAchangenew1_1 =AAchangenew1_0
  220. #从AAchangeraw中把AAchangenew基因转录本对应的信息抓取出来
  221. id0 = AAchangenew1_1.split(':')
  222. id1 = id0[0] + ':' + id0[1].split('.')[0]
  223. select0 = [s for s in AAchangeraw1 if id1 in s]
  224. #print(select0)
  225. #3.当提取的信息不为空时,进行格式转换。如果抓取信息为空时,保留原来注释信息
  226. #c.注释的格式的转换:如c.A8077T改为c.8077A>T。由于AAchangeraw是annovar注释的,而AAchangenew时VEP注释
  227. if len(select0) != 0:
  228. # 如果信息中跨外显子的,那只提取外显子的
  229. if ('exon' in select0[0]) & ('intron' in select0[0]):
  230. select = re.sub('intron\d.*?:', "", select0[0])
  231. else:
  232. select = select0[0]
  233. select1 = select.split(':')
  234. #从分割后的list中体取出c.对应的信息
  235. cdsinfor0=[s for s in select1 if 'c.' in s]
  236. #如果能够找到c.信息,那么进行替换。如果找不到c.信息。那么新赋值的注释为空。我们只提取包含c.的,对于注释为n.的舍弃
  237. if len(cdsinfor0)!=0:
  238. changeinfro_select1=cdsinfor0[0].split(".")[1]
  239. if ('ins' not in changeinfro_select1) & ('del' not in changeinfro_select1)& ('dup' not in changeinfro_select1) & ('inv' not in changeinfro_select1):
  240. cdsinfor1 = 'c.' + re.findall("\d+\.?\d*", changeinfro_select1)[0] + re.sub("[0-9]+", '>',changeinfro_select1)
  241. else:
  242. cdsinfor1='c.'+changeinfro_select1
  243. # 从分隔后的list中提取楚p.对应的信息
  244. ppinfor0 = [s for s in select1 if 'p.' in s]
  245. if len(ppinfor0) != 0:
  246. ppinfor1 = ppinfor0[0]
  247. else:
  248. ppinfor1 = ''
  249. #获得新的注释
  250. annonew=id0[0] + ':' + id0[1]+':'+select1[2]+':'+cdsinfor1+':'+ppinfor1
  251. else:
  252. annonew =''
  253. # 4.对AAchangenew进行信息的填补
  254. # 如果AAchangenew没有c.信息时,那么新的赋值就用AAchangeraw里面
  255. if 'c.' not in AAchangenew1_1:
  256. AAchangenew2 = AAchangenew2 + annonew + ';'
  257. elif ('c.' in AAchangenew1_1) & ('p.' not in AAchangenew1_1):
  258. AAchangenew2 = AAchangenew2 + annonew + ';'
  259. else:
  260. AAchangenew2 = AAchangenew2 + AAchangenew1_1 + ';'
  261. else:
  262. AAchangenew2=AAchangenew2+AAchangenew1_1+';'
  263. AAchangenew3 = re.sub(r"(;)\1+", '', AAchangenew2)
  264. if AAchangenew3[-1] == ';':
  265. AAchangenew3_0 = AAchangenew3[:-1]
  266. if AAchangenew3_0[-1] ==':':
  267. AAchangenew4 = AAchangenew3_0[:-1]
  268. else:
  269. AAchangenew4 = AAchangenew3_0
  270. else:
  271. AAchangenew4 = AAchangenew3
  272. else:
  273. AAchangenew4 = AAchange_raw
  274. return AAchangenew4
  275. ###改,先对annovar注释的AAchange列进行格式转换
  276. ####对annovar注释的信息进行格式修改
  277. def AAchange_annovar_transdata(AAchange_annovar):
  278. '''
  279. :param AAchange_annovar: 输入为annovar注释的AAchange.refgene列的一行
  280. :return: 经过校正后的
  281. '''
  282. if (AAchange_annovar!='.') & (AAchange_annovar!='UNKNOWN'):
  283. annovarsplit = AAchange_annovar.split(',')
  284. annovar_new1 = ''
  285. for j in range(len(annovarsplit)):
  286. label_cpoint = annovarsplit[j].find('c.')
  287. label_ppoint = annovarsplit[j].find('p.')
  288. if (label_cpoint != -1) & (label_ppoint != -1):
  289. changeinfro_select1 = annovarsplit[j][(label_cpoint + 2):(label_ppoint - 1)]
  290. aainfor = annovarsplit[j][label_ppoint:]
  291. if ('ins' not in changeinfro_select1) & ('del' not in changeinfro_select1) & (
  292. 'dup' not in changeinfro_select1) & ('inv' not in changeinfro_select1):
  293. cdsinfor1 = 'c.' + re.findall("\d+\.?\d*", changeinfro_select1)[0] + re.sub("[0-9]+", '>',
  294. changeinfro_select1)
  295. else:
  296. cdsinfor1 = 'c.' + changeinfro_select1
  297. # annovar_new00 = annovarsplit[j][:label_cpoint] + cdsinfor1 + ':' + aainfor
  298. # 对终止密码子的替换
  299. # annovar_new00 = annovar_new00 + "@"
  300. # annovar_new0 = re.sub("p\..+?[,@]", rep2, annovar_new00)
  301. if 'X' in aainfor:
  302. aainfor1 = aainfor.replace('X', '*')
  303. else:
  304. aainfor1 = aainfor
  305. annovar_new0 = annovarsplit[j][:label_cpoint] + cdsinfor1 + ':' + aainfor1
  306. elif (label_cpoint != -1) & (label_ppoint == -1):
  307. changeinfro_select1 = annovarsplit[j][(label_cpoint + 2):(label_ppoint - 1)]
  308. if ('ins' not in changeinfro_select1) & ('del' not in changeinfro_select1):
  309. cdsinfor1 = 'c.' + re.findall("\d+\.?\d*", changeinfro_select1)[0] + re.sub("[0-9]+", '>',
  310. changeinfro_select1)
  311. else:
  312. cdsinfor1 = 'c.' + changeinfro_select1
  313. annovar_new0 = annovarsplit[j][:label_cpoint] + cdsinfor1
  314. else:
  315. annovar_new0 = annovarsplit[j]
  316. annovar_new1 = annovar_new0 + ',' + annovar_new1
  317. annovar_new_last = annovar_new1[:-1]
  318. else:
  319. annovar_new_last=AAchange_annovar
  320. return annovar_new_last
  321. def AAchange_merge(svdata):
  322. svdata.reset_index(drop=True, inplace=True)
  323. for i in range(len(svdata)):
  324. #print(i)
  325. svdata.loc[i, 'AAChange.refGene'] = AAchange_annovar_transdata(svdata.loc[i, 'AAChange.refGene'])
  326. AAchange_raw = svdata.loc[i, 'AAChange.refGene']
  327. AAchange_new = svdata.loc[i, 'AAChange.refGene_1']
  328. AAchange_gene = svdata.loc[i, 'Gene.refGene']
  329. exonfunc = svdata.loc[i, 'ExonicFunc.refGene']
  330. svdata.loc[i, 'AAChange.refGene_2'] = vepannovar_merge(AAchange_raw, AAchange_new,AAchange_gene)
  331. # 对AAChange.refGene_2进一步修改
  332. new2 = svdata.loc[i, 'AAChange.refGene_2']
  333. new21 = new2.split(';')
  334. if exonfunc == 'stopgain':
  335. # for stopgain,extract the mut including *
  336. new2_extract = [s for s in new21 if '*' in s]
  337. newchange = ';'.join(new2_extract)
  338. elif exonfunc == 'startloss':
  339. # for the startloss,extract the mut including ?
  340. new2_extract = [s for s in new21 if '?' in s]
  341. newchange = ';'.join(new2_extract)
  342. else:
  343. newchange = new2
  344. # 将%3D替换为=
  345. newchange_re = newchange.replace('%3D', '=')
  346. svdata.loc[i, 'AAChange.refGene_2'] = newchange_re
  347. return svdata
  348. #######对转录本和突变表示形式的修改
  349. ####修改:去除化疗相关位点
  350. ###读入vep注释信息,方便对同义突变进一步筛选
  351. def vepanno(inputpath,normalid):
  352. germdir = os.path.join(inputpath, '4Germline_unpair')
  353. # 读入vep注释
  354. vepdir = os.path.join(germdir, normalid + '.hg19_multianno.txt')
  355. if os.path.exists(vepdir) and os.path.getsize(vepdir) != 0:
  356. vepdata = pd.read_table(vepdir, sep='\t', header=0, low_memory=False)
  357. vepdata1 = AAchange_new_infor(vepdata)
  358. vepdata2 = AAchange_merge(vepdata1)
  359. #提取信息
  360. vepdata2['muttype'] = vepdata2['Otherinfo11'].str.split('|', expand=True)[1]
  361. vepdata3 = vepdata2[['Chr', 'Start', 'End', 'Ref', 'Alt', 'muttype', 'AAChange.refGene_1', 'AAChange.refGene_2']]
  362. vepdata3['Chr'] = vepdata3['Chr'].astype('str')
  363. vepdata3['Start'] = vepdata3['Start'].astype('str')
  364. vepdata3['End'] = vepdata3['End'].astype('str')
  365. return vepdata3
  366. ####改对unique的结果,根据vep的结果进一步校正。
  367. ####2.对于ExonicFunc.refGene为startloss选择结尾带?的突变信息;当为stopgain,选择下划线后面的信息。
  368. #对AAChange_select进一步核对
  369. def AAchange_select_new_test(germdata1):
  370. for i in range(len(germdata1)):
  371. aaannovar = germdata1.loc[i, 'AAChange_select'].split(':')
  372. aavep = germdata1.loc[i, 'AAChange.refGene_2'].split(';')
  373. if germdata1.loc[i,'ExonicFunc.refGene']=='startloss':
  374. result_aa = [s for s in aavep if '?' in s]
  375. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  376. elif germdata1.loc[i,'ExonicFunc.refGene']=='stopgain':
  377. result_aa = [s for s in aavep if '*' in s]
  378. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  379. else:
  380. seachgene = aaannovar[0] + ':' + aaannovar[1]
  381. result_aa = [s for s in aavep if seachgene in s]
  382. if len(result_aa) != 0:
  383. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  384. return germdata1
  385. ###对stopgain进一步修改
  386. def AAchange_select_new_raw(germdata1):
  387. for i in range(len(germdata1)):
  388. print(i)
  389. aaannovar = germdata1.loc[i, 'AAChange_select'].split(':')
  390. if len(germdata1.loc[i, 'AAChange.refGene_2'])!=0:
  391. germdata1.loc[i, 'AAChange.refGene_2'] = germdata1.loc[i, 'AAChange.refGene_2'].replace(',', ';')
  392. aavep = germdata1.loc[i, 'AAChange.refGene_2'].split(';')
  393. if germdata1.loc[i, 'ExonicFunc.refGene'] == 'startloss':
  394. result_aa = [s for s in aavep if '?' in s]
  395. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  396. elif germdata1.loc[i, 'ExonicFunc.refGene'] == 'stopgain':
  397. result_aa = [s for s in aavep if '*' in s]
  398. # 对于特殊的修改:p.K173_Y174ins* -> Y174ins*
  399. if 'ins*' in result_aa[0]:
  400. splitinfor = result_aa.split(':')
  401. newaa0 = splitinfor[4]
  402. if '_' in newaa0:
  403. newaa1 = newaa0.split('_')
  404. numbefore = int(re.findall("\d+", newaa1[0])[0])
  405. numafter = int(re.findall("\d+", newaa1[1])[0])
  406. if numafter - numbefore == 1:
  407. Pnew = "p." + newaa1[1]
  408. unique_new = splitinfor[0] + ':' + splitinfor[1] + ':' + splitinfor[2] + ':' + splitinfor[
  409. 3] + ':' + Pnew
  410. germdata1.loc[i, 'AAChange_select'] = unique_new
  411. else:
  412. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  413. else:
  414. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  415. else:
  416. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  417. else:
  418. seachgene = aaannovar[0] + ':' + aaannovar[1]
  419. result_aa = [s for s in aavep if seachgene in s]
  420. if len(result_aa) != 0:
  421. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  422. return germdata1
  423. ####改,当有多个的时候用唯一转录本
  424. ###对stopgain进一步修改
  425. def AAchange_select_new(germdata1):
  426. for i in range(len(germdata1)):
  427. print(i)
  428. aaannovar = germdata1.loc[i, 'AAChange_select'].split(':')
  429. if len(germdata1.loc[i, 'AAChange.refGene_2'])!=0:
  430. germdata1.loc[i, 'AAChange.refGene_2'] = germdata1.loc[i, 'AAChange.refGene_2'].replace(',', ';')
  431. aavep = germdata1.loc[i, 'AAChange.refGene_2'].split(';')
  432. if germdata1.loc[i, 'ExonicFunc.refGene'] == 'startloss':
  433. result_aa = [s for s in aavep if '?' in s]
  434. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  435. elif germdata1.loc[i, 'ExonicFunc.refGene'] == 'stopgain':
  436. result_aa = [s for s in aavep if '*' in s]
  437. # 对于特殊的修改:p.K173_Y174ins* -> Y174ins*
  438. if 'ins*' in result_aa[0]:
  439. splitinfor = result_aa.split(':')
  440. newaa0 = splitinfor[4]
  441. if '_' in newaa0:
  442. newaa1 = newaa0.split('_')
  443. numbefore = int(re.findall("\d+", newaa1[0])[0])
  444. numafter = int(re.findall("\d+", newaa1[1])[0])
  445. if numafter - numbefore == 1:
  446. Pnew = "p." + newaa1[1]
  447. unique_new = splitinfor[0] + ':' + splitinfor[1] + ':' + splitinfor[2] + ':' + splitinfor[
  448. 3] + ':' + Pnew
  449. germdata1.loc[i, 'AAChange_select'] = unique_new
  450. else:
  451. germdata1.loc[i, 'AAChange_select'] =(Transid_unique_search(','.join(result_aa))).replace(';','')
  452. else:
  453. germdata1.loc[i, 'AAChange_select'] = (Transid_unique_search(','.join(result_aa))).replace(';','')
  454. else:
  455. # 当不是p.K173_Y174ins*,从中选择唯一转录本所在的
  456. unqiue_trans_select = (Transid_unique_search(','.join(result_aa))).replace(';','')
  457. if len(unqiue_trans_select)!=0:
  458. germdata1.loc[i, 'AAChange_select'] =unqiue_trans_select
  459. else:
  460. germdata1.loc[i, 'AAChange_select'] =result_aa[0]
  461. else:
  462. #首先选择唯一转录本
  463. unqiue_trans_select = (Transid_unique_search(','.join(aavep))).replace(';','')
  464. #如果没有获得唯一转录本的信息,采用AAchange_select原始的
  465. if len(unqiue_trans_select)!=0:
  466. germdata1.loc[i, 'AAChange_select'] =unqiue_trans_select
  467. else:
  468. seachgene = aaannovar[0] + ':' + aaannovar[1]
  469. result_aa = [s for s in aavep if seachgene in s]
  470. if len(result_aa) != 0:
  471. germdata1.loc[i, 'AAChange_select'] = result_aa[0]
  472. print(germdata1.loc[i, 'AAChange_select'] )
  473. #判断唯一转录本的区域是否和Func.refGene一致,如果不一致按照唯一转录本进行修改
  474. functype=germdata1.loc[i, 'Func.refGene']
  475. if 'intron' in germdata1.loc[i, 'AAChange_select']:
  476. func_unique='intronic'
  477. elif 'exon' in germdata1.loc[i, 'AAChange_select']:
  478. func_unique='exonic'
  479. else:
  480. func_unique='other'
  481. if (func_unique not in functype) & (func_unique!='other'):
  482. germdata1.loc[i, 'Func.refGene'] =func_unique
  483. return germdata1
  484. ###对唯一转录本的再次选择。
  485. #首选在参考表中的转录本
  486. ###对于热门基因的转录本,采用主转录本
  487. def Transid_unique_search(AAchange):
  488. transid_path = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/Select_RefSeq_HGNC_MANE.txt'
  489. transiddata = pd.read_table(transid_path, sep='\t')
  490. unique_trans_last = ''
  491. if AAchange != ' ':
  492. AAchange1 = AAchange.split(',')
  493. for j in range(len(AAchange1)):
  494. if AAchange1[j].count(":") == 4:
  495. AAchange1_0 = AAchange1[j].split(':')[1]
  496. AAchange1_exon = AAchange1[j].split(':')[2]
  497. AAchange1_cc = AAchange1[j].split(':')[3]
  498. AAchange1_pp = AAchange1[j].split(':')[4]
  499. transinfor = transiddata[(transiddata['RefSeq'] == AAchange1_0) | (transiddata['HGNC'] == AAchange1_0) | (transiddata['MANE'] == AAchange1_0)].reset_index(drop=True)
  500. if not transinfor.empty:
  501. unique_trans = transinfor.loc[0, 'Symbol'] + ':' + AAchange1_0 + ':' + AAchange1_exon + ':' + AAchange1_cc + ':' + AAchange1_pp+';'
  502. else:
  503. unique_trans = ''
  504. unique_trans_last = unique_trans_last + unique_trans
  505. elif AAchange1[j].count(":") == 3:
  506. AAchange1_0 = AAchange1[j].split(':')[1]
  507. AAchange1_exon = AAchange1[j].split(':')[2]
  508. AAchange1_cc = AAchange1[j].split(':')[3]
  509. transinfor = transiddata[
  510. (transiddata['RefSeq'] == AAchange1_0) | (transiddata['HGNC'] == AAchange1_0) | (
  511. transiddata['MANE'] == AAchange1_0)].reset_index(drop=True)
  512. if not transinfor.empty:
  513. unique_trans = transinfor.loc[
  514. 0, 'Symbol'] + ':' + AAchange1_0 + ':' + AAchange1_exon + ':' + AAchange1_cc+';'
  515. else:
  516. unique_trans = ''
  517. unique_trans_last = unique_trans_last + unique_trans
  518. elif AAchange1[j].count(":") == 2:
  519. AAchange1_0 = AAchange1[j].split(':')[1]
  520. AAchange1_exon = AAchange1[j].split(':')[2]
  521. transinfor = transiddata[
  522. (transiddata['RefSeq'] == AAchange1_0) | (transiddata['HGNC'] == AAchange1_0) | (
  523. transiddata['MANE'] == AAchange1_0)].reset_index(drop=True)
  524. if not transinfor.empty:
  525. unique_trans = transinfor.loc[0, 'Symbol'] + ':' + AAchange1_0 + ':' + AAchange1_exon+';'
  526. else:
  527. unique_trans = ''
  528. unique_trans_last = unique_trans_last + unique_trans
  529. else:
  530. unique_trans = ''
  531. unique_trans_last = unique_trans_last + unique_trans
  532. else:
  533. unique_trans_last = ''
  534. return unique_trans_last
  535. ###进行gnomAD_exome_EAS和STR区域的筛选
  536. def snvfilter(inputpath,germline_filter1,sampleid):
  537. germdir = os.path.join(inputpath, '4Germline_unpair')
  538. STRdir = '/cgdata/liuxiangqiong/work62pancancer/Client/v0/script/refdata/UCSC_STR_LCR_simpleRepeat_genomicSuperDups.bed'
  539. germline_filter1.rename(columns={'AAChange_select': 'raw_AAChange_select'}, inplace=True)
  540. germline_filter1.rename(columns={'new_select': 'AAChange_select'}, inplace=True)
  541. germline_filter1.sort_values(by='Gene.refGene', inplace=True)
  542. # for the germline summary data
  543. germdata = '/cgdata/liuxiangqiong/work62pancancer/Client/v0/script/refdata/germline_counts_stastic20220815.txt'
  544. germref = pd.read_table(germdata, sep='\t', header=0)
  545. germref1 = germref[['mut_new', 'sample_counts']].drop_duplicates(keep='first')
  546. germref1.reset_index(drop=True, inplace=True)
  547. titlelist = germline_filter1.columns
  548. if len(germline_filter1) != 0:
  549. # select Func.refGene !='intronic'和'ncRNA_exonic'
  550. germline_filter2 = germline_filter1[
  551. (germline_filter1['Func.refGene'] != 'intronic') & (germline_filter1['Func.refGene'] != 'ncRNA_exonic')]
  552. if len(germline_filter2) != 0:
  553. # selct AAChange.refGene!='.'
  554. germline_filter3 = germline_filter2[germline_filter2['AAChange.refGene'] != '.']
  555. if len(germline_filter3) != 0:
  556. # select gnomAD_exome_EAS<=1%
  557. print('step6---select the vaf of genomAD')
  558. filterdata4_0 = germline_filter3[(germline_filter3['gnomAD_exome_EAS'] != '.')]
  559. # 6.1提取频率小于1%
  560. filterdata4_1 = filterdata4_0[(filterdata4_0['gnomAD_exome_EAS'].astype("float") <= 0.01)]
  561. # 6.2提取没有突变频率的
  562. filterdata4_2 = germline_filter3[(germline_filter3['gnomAD_exome_EAS'] == '.')]
  563. # 6.3将小于等于1%和没有突变频率的合并
  564. filterdata4_3 = filterdata4_2.append(filterdata4_1)
  565. germline_filter4 = filterdata4_3.reset_index(drop=True)
  566. germline_filter4.reset_index(drop=True, inplace=True)
  567. if len(germline_filter4) != 0:
  568. ##remove the mutation in STR region
  569. germbed = germline_filter4[['Chr', 'Start', 'End', 'Gene.refGene']]
  570. outputname1 = os.path.join(germdir, sampleid + '_germline.bed')
  571. germbed.to_csv(outputname1, index=False, header=None, encoding='gbk', sep='\t')
  572. outputname2 = os.path.join(germdir, sampleid + '_germline_unSTR.bed')
  573. STRcmd = 'bedtools subtract -a ' + outputname1 + ' -b ' + STRdir + '>' + outputname2
  574. os.system(STRcmd)
  575. germline_unSTR = pd.read_table(outputname2, sep='\t', names=['Chr', 'Start', 'End', 'Gene.refGene'])
  576. if len(germline_unSTR) != 0:
  577. germline_unSTR[['Chr', 'Start', 'End']] = germline_unSTR[['Chr', 'Start', 'End']].astype('str')
  578. germline_filter4[['Chr', 'Start', 'End']] = germline_filter4[['Chr', 'Start', 'End']].astype(
  579. 'str')
  580. germline_filter5 = pd.merge(germline_filter4, germline_unSTR,
  581. on=['Chr', 'Start', 'End', 'Gene.refGene'], how='inner')
  582. germline_filter5_1 = germline_filter5[titlelist]
  583. germline_filter5_1['mut_new'] = germline_filter5_1['Chr'] + '_' + germline_filter5_1[
  584. 'Start'] + '_' + germline_filter5_1['End'] + '_' + germline_filter5_1['Ref'] + '_' + \
  585. germline_filter5_1['Alt']
  586. germline_filter_result = pd.merge(germline_filter5_1, germref1, on=['mut_new'], how='left')
  587. del germline_filter_result['mut_new']
  588. for i in range(len(germline_filter_result)):
  589. Func_refGene = germline_filter_result.loc[i, 'Func.refGene']
  590. ExonicFunc_refGene = germline_filter_result.loc[i, 'ExonicFunc.refGene']
  591. if (Func_refGene == 'splicing') & (ExonicFunc_refGene == '.'):
  592. germline_filter_result.loc[i, 'ExonicFunc.refGene'] = 'splicing'
  593. germline_filter_result.sort_values(by='Gene.refGene', inplace=True)
  594. else:
  595. print(sampleid + ' has no result when filter the STR')
  596. germline_filter_result = pd.DataFrame(columns=titlelist)
  597. germline_filter_result.loc[0, 'sampleid'] = sampleid
  598. germline_filter_result.loc[0, 'label'] = 'No result after filtering the STR'
  599. os.remove(outputname1)
  600. os.remove(outputname2)
  601. # print(germline_filter_result['AAChange_select'])
  602. else:
  603. print(sampleid + ' has no result when filter the genomeAD_EAS')
  604. germline_filter_result = pd.DataFrame(columns=titlelist)
  605. germline_filter_result.loc[0, 'sampleid'] = sampleid
  606. germline_filter_result.loc[0, 'label'] = 'No result after filtered by genomeAD_EAS'
  607. else:
  608. print(sampleid + ' has no result when filtering the intronic and ncRNA_exonic')
  609. germline_filter_result = pd.DataFrame(columns=titlelist)
  610. germline_filter_result.loc[0, 'sampleid'] = sampleid
  611. germline_filter_result.loc[0, 'label'] = 'No result after filtering the intronic and ncRNA_exonic'
  612. else:
  613. print(sampleid + ' has no result aftere vaf filtering')
  614. germline_filter_result = pd.DataFrame(columns=titlelist)
  615. germline_filter_result.loc[0, 'sampleid'] = sampleid
  616. germline_filter_result.loc[0, 'label'] = 'No result after filtering VAF>=0.3'
  617. return germline_filter_result
  618. def germline_summary_control(inputpath,laneid,normalid,sampleid):
  619. germtitle_dir = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/germline_title.txt'
  620. #panel genelist
  621. panel_genelistdir = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/602gene_select.txt'
  622. panel_genelist = pd.read_table(panel_genelistdir, sep='\t', header=0, names=['Gene.refGene'])
  623. #druglist
  624. druglistdir = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/drug_genelist_20220829.txt'
  625. drug_genelist = pd.read_table(druglistdir, sep='\t', header=None, names=['Gene.refGene'])
  626. drug_genelist['drug_lable'] = 'Drug_gene'
  627. germtile = pd.read_table(germtitle_dir, sep='\t', header=0)
  628. titlelist_final = list(germtile.columns)
  629. titlelist_final.append('sample_counts')
  630. #对输出总表加上AAchange_1和AAchange_2
  631. #titlelist_summary=list(titlelist_final)
  632. #titlelist_summary.append('AAChange.refGene_1')
  633. #titlelist_summary.append('AAChange.refGene_2')
  634. germdir = os.path.join(inputpath, '4Germline_unpair')
  635. germdatafile=germdir+'/'+normalid+'.germ.xls'
  636. #读入vep注释
  637. vepdata1 = vepanno(inputpath,normalid)
  638. if os.path.exists(germdatafile) and os.path.getsize(germdatafile) !=0:
  639. #sampleid = normalid[:-2]
  640. # make the result dir
  641. result_dir = os.path.join(inputpath, 'resultfile')
  642. if not os.path.exists(result_dir):
  643. os.mkdir(result_dir)
  644. sample_dir = os.path.join(result_dir, sampleid)
  645. if not os.path.exists(sample_dir):
  646. os.mkdir(sample_dir)
  647. tempfile=os.path.join(inputpath,'tempfile')
  648. if not os.path.exists(tempfile):
  649. os.mkdir(tempfile)
  650. germ_tem_dir=os.path.join(tempfile,'germline')
  651. if not os.path.exists(germ_tem_dir):
  652. os.mkdir(germ_tem_dir)
  653. germdata_raw = pd.read_table(germdatafile, sep='\t')
  654. #先按照基因名排序
  655. germdata_raw.sort_values(by='Gene.refGene', inplace=True)
  656. germdata_raw.reset_index(drop=True, inplace=True)
  657. #修改列名
  658. germdata_raw.rename(columns={'CLNACC':'CLNALLELEID','CLNDBN':'CLNDN','CLNDSDB':'CLNDISDB','CLINVARREVSTATS':'CLNREVSTAT'},inplace=True)
  659. germdata_raw['Chr'] = germdata_raw['Chr'].astype('str')
  660. germdata_raw['Start'] = germdata_raw['Start'].astype('str')
  661. germdata_raw['End'] = germdata_raw['End'].astype('str')
  662. ##对基因进行分列
  663. germdata01 = gene_split(germdata_raw)
  664. # 提取在gene列表中的基因
  665. germdata02 = pd.merge(germdata01, panel_genelist, on=['Gene.refGene'], how='inner')
  666. germdata02.insert(0, 'sampleid', sampleid)
  667. #去除化疗基因
  668. germdata03 = pd.merge(germdata02, drug_genelist, on=['Gene.refGene'], how='left')
  669. germdata = germdata03[germdata03['drug_lable'] != 'Drug_gene']
  670. germdata.reset_index(drop=True, inplace=True)
  671. ###对CLINSIG进行分列
  672. if len(germdata[germdata['CLINSIG'].str.contains('\\[')]) != 0:
  673. germdata05 = germdata['CLINSIG'].str.split("[", expand=True)
  674. germdata05[1].fillna('.', inplace=True)
  675. germdata['CLNSIG'] = germdata05[0]
  676. germdata['CLNSIGCONF'] = germdata05[1].str.replace(']', '')
  677. else:
  678. germdata['CLNSIG'] = germdata['CLINSIG']
  679. germdata['CLNSIGCONF'] = '.'
  680. del germdata['CLINSIG']
  681. del germdata['drug_lable']
  682. print('clinsig')
  683. germdata.reset_index(drop=True, inplace=True)
  684. #1.add the AAchangedata
  685. germdata1=AAchangeselect_plus(germdata)
  686. # 2.将c.注释的格式例如c.A8077T改为c.8077A>T
  687. germdata2=cdsmut_trans(germdata1)
  688. # remove the HLA related gene
  689. germdata_result1 = germdata2[~germdata2['Gene.refGene'].str.contains('HLA')]
  690. germdata_result1.reset_index(drop=True, inplace=True)
  691. # select VAF>=0.3
  692. germline_filter1 = germdata_result1[germdata_result1['VAF'] >= 0.3]
  693. # VAF转为%
  694. germline_filter1['VAF'] = germline_filter1['VAF'].apply(lambda x: format(x, '.2%'))
  695. #进行gnomAD_exome_EAS和STR区域的筛选
  696. germline_filter_result0=snvfilter(inputpath,germline_filter1,sampleid)
  697. #对AAchange_select进行annovar和vep注释的合并进一步修改
  698. if len(vepdata1)!=0:
  699. germdata_vepanno0 = pd.merge(germline_filter_result0, vepdata1, on=['Chr', 'Start', 'End', 'Ref', 'Alt'], how='left')
  700. germdata_vepanno1 = germdata_vepanno0[~germdata_vepanno0['muttype'].str.contains('synonymous')]
  701. del germdata_vepanno1['muttype']
  702. germdata_vepanno1.reset_index(drop=True, inplace=True)
  703. #进行unique的筛选
  704. germdata_result=AAchange_select_new(germdata_vepanno1)
  705. #对移码突变的再次确认修改
  706. germdata_result['AAChange_select'] = (germdata_result['AAChange_select'] + "#").str.replace(
  707. 'p\..*fs\*.*?[,#]', rep1)
  708. germdata_result['AAChange_select'] = germdata_result['AAChange_select'].str.replace('#$', "")
  709. else:
  710. germdata_result=germline_filter_result0
  711. #输出两种注释结果
  712. outputfile0=os.path.join(germ_tem_dir,laneid + '-' + sampleid + '.germline_raw_infor.txt')
  713. germdata_result.to_csv(outputfile0,sep='\t',index=False,header=True)
  714. #输出规定的列
  715. germdata_result.rename(columns={'AAChange.refGene':'AAChange.refGene_annovar','AAChange.refGene_2':'AAChange.refGene'},inplace=True)
  716. germline_filter_result=germdata_result[titlelist_final]
  717. #输出结果
  718. outputfile1 = os.path.join(sample_dir, laneid + '-' + sampleid + '.germline.xlsx')
  719. writer = pd.ExcelWriter(outputfile1)
  720. germline_filter_result.to_excel(writer, sheet_name='germline', index=False)
  721. writer.save()
  722. writer.close()
  723. else:
  724. print(normalid+' has no data or the result is null')
  725. germline_filter_result=pd.DataFrame()
  726. germline_filter_result.loc[0, 'sampleid'] = sampleid
  727. germline_filter_result.loc[0, 'label'] = 'No file'
  728. # make the temp dir
  729. temp_dir = os.path.join(inputpath, 'tempfile')
  730. if not os.path.exists(temp_dir):
  731. os.mkdir(temp_dir)
  732. bugfile_dir = os.path.join(temp_dir, 'bugfile')
  733. if not os.path.exists(bugfile_dir):
  734. os.mkdir(bugfile_dir)
  735. outputfile2 = os.path.join(bugfile_dir, laneid + '-' + sampleid + '.germline.nofile.log.txt')
  736. germline_filter_result.to_csv(outputfile2, index=False, header=True, encoding='gbk', sep='\t')
  737. def germline_runmain(inputpath,normalid):
  738. laneid = inputpath.split('/')[-1].split('-')[-1]
  739. datasummarydir = os.path.join(inputpath, 'datasummary')
  740. isExists = os.path.exists(datasummarydir)
  741. if not isExists:
  742. os.makedirs(datasummarydir)
  743. sampledir = os.path.join(inputpath, laneid + '_sample_infor_label.txt')
  744. samplelist = pd.read_table(sampledir, sep='\t', header=0)
  745. sampledata = samplelist[samplelist['normal'] == normalid]
  746. sampledata.reset_index(drop=True, inplace=True)
  747. sampleid = sampledata.loc[0, 'samplename']
  748. germdir = os.path.join(inputpath, '4Germline_unpair')
  749. germdatafile = germdir + '/' + normalid + '.germ.xls'
  750. if os.path.exists(germdatafile) and os.path.getsize(germdatafile) != 0:
  751. germline_summary_control(inputpath, laneid, normalid, sampleid)
  752. else:
  753. print(normalid + ' is null')
  754. if __name__=='__main__':
  755. parser = argparse.ArgumentParser(description='filter the germline')
  756. parser.add_argument('-i', '--inputpath', type=str, help='the path of lane')
  757. parser.add_argument('-s', '--normalid', type=str, help='the normal name of sample')
  758. args = parser.parse_args()
  759. Inputpath = args.inputpath
  760. Normalid = args.normalid
  761. germline_runmain(Inputpath,Normalid)
  762. ###for all sample in lane
  763. def germlinesummary(inputpath,laneid):
  764. datasummarydir = os.path.join(inputpath, 'datasummary')
  765. isExists = os.path.exists(datasummarydir)
  766. if not isExists:
  767. os.makedirs(datasummarydir)
  768. sampledir = os.path.join(inputpath, laneid + '_sample_infor_label.txt')
  769. samplelist = pd.read_table(sampledir, sep='\t', header=0)
  770. germdatasummary = pd.DataFrame()
  771. for i in range(len(samplelist)):
  772. sampleid = samplelist.loc[i, 'samplename']
  773. normalid = samplelist.loc[i, 'normal']
  774. print(normalid)
  775. germdir = os.path.join(inputpath, '4Germline_unpair')
  776. germdatafile = germdir + '/' + normalid + '.germ.xls'
  777. if os.path.exists(germdatafile) and os.path.getsize(germdatafile) != 0:
  778. germre=germline_summary_control(inputpath, laneid, normalid,sampleid)
  779. germdatasummary =germdatasummary.append(germre)
  780. else:
  781. print(normalid+' is null')
  782. continue
  783. outputname = datasummarydir + '/' + laneid + '_table6_germlinne_datasummary.txt'
  784. germdatasummary.to_csv(outputname, index=False, header=True, encoding='gbk', sep='\t')