s01_samplesheet_v0_20220915_finish.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #####
  2. import pandas as pd
  3. import xlrd
  4. import os,sys
  5. import argparse
  6. import re
  7. #原项目表只有一个sheet的代码
  8. def pancancer_project_v0(inputpath,laneid):
  9. #inputpath = '/cgdata/liuxiangqiong/work62pancancer/pipelinetest-CGB0158'
  10. #laneid = 'CGB0158'
  11. ###0.拷贝CNV分级表
  12. rawcnvdir = '/cgdata/pancancer_report/refdata/CNV.xlsx'
  13. cnvtable = pd.read_excel(rawcnvdir)
  14. cnvtable['gene'] = cnvtable['gene'].str.strip()
  15. cnvtable['CNV_label'] = cnvtable['CNV_label'].str.strip()
  16. refcnvdir1 = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/CNV_tier_infor.txt'
  17. biocnvdir2 = '/cgdata/bioproject/pancancer602gene/Project_table/CNV_tier_infor.txt'
  18. cnvtable.to_csv(refcnvdir1, index=False, header=True, sep='\t')
  19. cnvtable.to_csv(biocnvdir2, index=False, header=True, sep='\t')
  20. ###1.从项目表提取出当前大panel的样本表
  21. project = pd.read_excel('/cgdata/bioproject/pancancer602gene/Project_table/阅尔基因项目信息总表-0606.xlsx',engine='openpyxl')
  22. ###2.获得当前的项目,更新当前的样本表
  23. projectsample1 = project[project['检测项目1'] == '阅全-泛癌种602基因检测']
  24. projectsample2 = project[project['检测项目1'].str.contains('CPS', na=False)]
  25. projectsample=projectsample1.append(projectsample2)
  26. projectsample.reset_index(drop=True,inplace=True)
  27. outputfile1 = os.path.join('/cgdata/bioproject/pancancer602gene/Project_table/pancancer_602gene_samples.xlsx')
  28. writer = pd.ExcelWriter(outputfile1)
  29. projectsample.to_excel(writer, sheet_name='QC', index=False)
  30. writer.save()
  31. writer.close()
  32. ####3.提取出当前我们panel分析样本的信息
  33. selectlist = ['样本编号', '样本类型', '临床诊断']
  34. selectsample = projectsample[selectlist]
  35. selectsample.reset_index(drop=True, inplace=True)
  36. selectsample['样本编号'] = selectsample['样本编号'].str.replace("^A", "Lib")
  37. ###3.1 我们从底层表中获取疾病的名称
  38. tumordbdir = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/TCGA_tumor_list_20220915.txt'
  39. tumordblist = pd.read_table(tumordbdir, sep='\t', header=0, encoding='gbk')
  40. # 添加TCGA的名称
  41. selectsample.rename(columns={'临床诊断': 'tumor_name', '样本编号': 'sampleid', '样本类型': 'sampletype'}, inplace=True)
  42. selectsample_TCGA = pd.merge(selectsample, tumordblist, on=['tumor_name'], how='left')
  43. # 将不在TCGA的癌症名称标为unknown
  44. selectsample_TCGA['tumor_name'] = selectsample_TCGA['tumor_name'].fillna('unknown')
  45. # 3.2 获得当前的样本对应的信息
  46. ####提取出当前lane的样本对应的信息
  47. lane_sampelelist = pd.read_table(os.path.join(inputpath, laneid + '_sample.txt'), sep='\t', header=None, names=['sampleid'])
  48. lane_sampleinfor = pd.merge(lane_sampelelist, selectsample_TCGA, on=['sampleid'], how='left')
  49. # 输出原始信息表
  50. outputfile2 = os.path.join(inputpath, laneid + '_sampleinfor_raw.xlsx')
  51. writer = pd.ExcelWriter(outputfile2)
  52. lane_sampleinfor.to_excel(writer, sheet_name='sampleinfor', index=False)
  53. writer.save()
  54. writer.close()
  55. return lane_sampleinfor
  56. ##项目表有上海和启动两个sheet
  57. def pancancer_project(inputpath,laneid):
  58. #inputpath = '/cgdata/liuxiangqiong/work62pancancer/pipelinetest-CGB0158'
  59. #laneid = 'CGB0158'
  60. ###0.拷贝CNV分级表
  61. rawcnvdir = '/cgdata/pancancer_report/refdata/CNV.xlsx'
  62. cnvtable = pd.read_excel(rawcnvdir)
  63. cnvtable['gene'] = cnvtable['gene'].str.strip()
  64. cnvtable['CNV_label'] = cnvtable['CNV_label'].str.strip()
  65. refcnvdir1 = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/CNV_tier_infor.txt'
  66. biocnvdir2 = '/cgdata/bioproject/pancancer602gene/Project_table/CNV_tier_infor.txt'
  67. cnvtable.to_csv(refcnvdir1, index=False, header=True, sep='\t')
  68. cnvtable.to_csv(biocnvdir2, index=False, header=True, sep='\t')
  69. ###1.从项目表提取出当前大panel的样本表
  70. project = pd.read_excel('/cgdata/bioproject/pancancer602gene/Project_table/阅尔基因项目信息总表-0606.xlsx',engine='openpyxl',sheet_name=None)
  71. #提取出两个sheet的结果并追加合并
  72. project_SH=project['项目信息表-上海']
  73. project_QD=project['项目信息表-启东']
  74. project_all=project_QD.append(project_SH)
  75. project_all.reset_index(drop=True,inplace=True)
  76. ###2.获得当前的项目,更新当前的样本表
  77. projectsample1 = project_all[project_all['检测项目1'] == '阅全-泛癌种602基因检测']
  78. projectsample2 = project_all[project_all['检测项目1'].str.contains('CPS', na=False)]
  79. projectsample=projectsample1.append(projectsample2)
  80. projectsample.reset_index(drop=True,inplace=True)
  81. outputfile1 = os.path.join('/cgdata/bioproject/pancancer602gene/Project_table/pancancer_602gene_samples.xlsx')
  82. writer = pd.ExcelWriter(outputfile1)
  83. projectsample.to_excel(writer, sheet_name='QC', index=False)
  84. writer.save()
  85. writer.close()
  86. ####3.提取出当前我们panel分析样本的信息
  87. selectlist = ['样本编号', '样本类型', '临床诊断']
  88. selectsample = projectsample[selectlist]
  89. selectsample.reset_index(drop=True, inplace=True)
  90. selectsample['样本编号'] = selectsample['样本编号'].str.replace("^A", "Lib")
  91. ###3.1 我们从底层表中获取疾病的名称
  92. tumordbdir = '/cgdata/liuxiangqiong/work62pancancer/pipeline/v0/refdata/TCGA_tumor_list_20220915.txt'
  93. tumordblist = pd.read_table(tumordbdir, sep='\t', header=0, encoding='gbk')
  94. # 添加TCGA的名称
  95. selectsample.rename(columns={'临床诊断': 'tumor_name', '样本编号': 'sampleid', '样本类型': 'sampletype'}, inplace=True)
  96. selectsample_TCGA = pd.merge(selectsample, tumordblist, on=['tumor_name'], how='left')
  97. # 将不在TCGA的癌症名称标为unknown
  98. selectsample_TCGA['tumor_name'] = selectsample_TCGA['tumor_name'].fillna('unknown')
  99. # 3.2 获得当前的样本对应的信息
  100. ####提取出当前lane的样本对应的信息
  101. lane_sampelelist = pd.read_table(os.path.join(inputpath, laneid + '_sample.txt'), sep='\t', header=None, names=['sampleid'])
  102. lane_sampleinfor = pd.merge(lane_sampelelist, selectsample_TCGA, on=['sampleid'], how='left')
  103. # 输出原始信息表
  104. outputfile2 = os.path.join(inputpath, laneid + '_sampleinfor_raw.xlsx')
  105. writer = pd.ExcelWriter(outputfile2)
  106. lane_sampleinfor.to_excel(writer, sheet_name='sampleinfor', index=False)
  107. writer.save()
  108. writer.close()
  109. return lane_sampleinfor
  110. #####################获得项目表中样本的信息
  111. def project_pair(rawsheet):
  112. #inputfile = os.path.join(inputpath, laneid + '_sampleinfor_raw.xlsx')
  113. #rawsheet = pd.read_excel(inputfile)
  114. ##首先获得所有的肿瘤样本
  115. rawsheet_tumorid = rawsheet[rawsheet['sampleid'].str.contains('T')]
  116. rawsheet_tumorid.reset_index(drop=True, inplace=True)
  117. ###获得肿瘤样本名,构建配对表,因为不管正常如何命名,最后的normal也是根据肿瘤样本名,所以只需要看肿瘤样本名就可
  118. sample_pair = pd.DataFrame()
  119. for i in range(len(rawsheet_tumorid)):
  120. sample = rawsheet_tumorid.loc[i, 'sampleid']
  121. sampletype1 = rawsheet_tumorid.loc[i, 'sampletype']
  122. tumortype = rawsheet_tumorid.loc[i, 'Abbr']
  123. sample_pair.loc[i, 'samplename'] = sample
  124. sample_pair.loc[i, 'normal'] = sample + 'CN'
  125. if sampletype1 == '血浆':
  126. sample_pair.loc[i, 'tumor'] = sample + 'CT'
  127. sample_pair.loc[i, 'sampletype'] = 'blood'
  128. sample_pair.loc[i, 'tumortype'] = tumortype
  129. elif sampletype1=='外周血':
  130. sample_pair.loc[i, 'tumor'] = sample + 'CT'
  131. sample_pair.loc[i, 'sampletype'] = 'blood'
  132. sample_pair.loc[i, 'tumortype'] = tumortype
  133. else:
  134. sample_pair.loc[i, 'tumor'] = sample + 'TT'
  135. sample_pair.loc[i, 'sampletype'] = 'FFPE'
  136. sample_pair.loc[i, 'tumortype'] = tumortype
  137. return sample_pair
  138. ###########获得下机数据的样本表信息
  139. def subdir_list(dirname):
  140. """获取目录下所有子目录名
  141. @param dirname: str 目录的完整路径
  142. @return: list(str) 所有子目录完整路径组成的列表
  143. """
  144. return list(filter(os.path.isdir,
  145. map(lambda filename: os.path.join(dirname, filename),
  146. os.listdir(dirname))))
  147. def file_list(dirname, ext='.gz'):
  148. """获取目录下所有特定后缀的文件
  149. @param dirname: str 目录的完整路径
  150. @param ext: str 后缀名, 以点号开头
  151. @return: list(str) 所有子文件名(不包含路径)组成的列表
  152. """
  153. return list(filter(
  154. lambda filename: os.path.splitext(filename)[1] == ext,
  155. os.listdir(dirname)))
  156. def fastq_pair(bclpath):
  157. file0 = subdir_list(bclpath)
  158. fastq_sample = pd.DataFrame()
  159. for i in range(len(file0)):
  160. split0 = file0[i].split('/')[-1]
  161. sampleid0 = split0.split('-')[-1]
  162. corsampleid = re.findall(r"[Lib]+[0-9]+", sampleid0)
  163. fastq_sample.loc[i, 'corname'] = corsampleid[0]
  164. fastq_sample.loc[i, 'fastq_name'] = sampleid0
  165. # 制作下机数据的配对表
  166. core_samplelist = pd.DataFrame(fastq_sample.loc[:, 'corname'].drop_duplicates(keep='first'))
  167. core_samplelist.reset_index(drop=True, inplace=True)
  168. pair_fastq = pd.DataFrame()
  169. k = 0
  170. for i in range(len(core_samplelist)):
  171. corname = core_samplelist.loc[i, 'corname']
  172. # 从下机数据里面获得对应的样本编号
  173. fastqsample = fastq_sample[fastq_sample['corname'] == corname]
  174. fastqsample.reset_index(drop=True, inplace=True)
  175. fastqsample.rename(columns={'fastq_name': 'sampleid'}, inplace=True)
  176. ###提取出肿瘤的样本
  177. fastqsample_tumor = fastqsample[fastqsample['sampleid'].str.contains('T')]
  178. fastqsample_normal = fastqsample[fastqsample['sampleid'].str.contains('N')]
  179. fastqsample_tumor.reset_index(drop=True, inplace=True)
  180. fastqsample_normal.reset_index(drop=True, inplace=True)
  181. for j in range(len(fastqsample_tumor)):
  182. pair_fastq.loc[k, 'samplename'] = fastqsample_tumor.loc[j, 'sampleid']
  183. pair_fastq.loc[k, 'fastq_tumor'] = fastqsample_tumor.loc[j, 'sampleid']
  184. for m in range(len(fastqsample_normal)):
  185. pair_fastq.loc[k, 'fastq_normal'] = fastqsample_normal.loc[m, 'sampleid']
  186. k = k + 1
  187. return pair_fastq
  188. def sheetrunmain(inputpath,laneid,bclpath):
  189. lane_sampleinfor=pancancer_project(inputpath,laneid)
  190. project_sample=project_pair(lane_sampleinfor)
  191. fastq_sample=fastq_pair(bclpath)
  192. #merge the project and fastq
  193. print('project_sample')
  194. print(project_sample)
  195. print('fastq_sample')
  196. print(fastq_sample)
  197. sample_infor_pair = pd.merge(project_sample, fastq_sample, on=['samplename'], how='outer')
  198. print('mergedata')
  199. print(sample_infor_pair)
  200. outputfile = os.path.join(inputpath, laneid + '_sample_infor_label.txt')
  201. sample_infor_pair.to_csv(outputfile,sep='\t',header=True, index=False)
  202. print('finish')
  203. #inputpath='/cgdata/liuxiangqiong/work62pancancer/pipelinetest-CGB0158'
  204. #laneid='CGB0158'
  205. #sheetrun(inputpath,laneid)
  206. if __name__=='__main__':
  207. parser = argparse.ArgumentParser(description='sample pair')
  208. parser.add_argument('-i', '--inputpath', type=str, help='the path of lane')
  209. parser.add_argument('-l', '--laneid', type=str, help='laneid')
  210. parser.add_argument('-f', '--bclpath', type=str, help='the fastq file')
  211. args = parser.parse_args()
  212. Inputpath = args.inputpath
  213. Laneid = args.laneid
  214. Bclpath=args.bclpath
  215. sheetrunmain(Inputpath,Laneid,Bclpath)