from sys import argv indata = open(argv[1] , "r") genbank = indata.readlines() #создает список по строкам файла с координатами реальных генов, заданного в командной строке первым indata.close() indata = open(argv[2] , "r") prodigal = indata.readlines() #создает список по строкам файла с координатами предсказанных генов генов, заданного в командной строке вторым indata.close() outfile = argv[3] out = open(outfile + ".txt" , "w") #создает выходной файл с заданным названием ident = list(set(genbank) & set(prodigal)) #список генов правильно предсказанных Prodigal (записывает в список элементы, содержащиеся в обоих списках prodigal и genbank) gb = [i.strip().split(" ") for i in genbank] #список с каждой координатой, как отдельным элеметом для файла реальных генов pg = [i.strip().split(" ") for i in prodigal] #аналогично для предсказанных n_gb = [] n_pg = [] c_gb = [] c_pg = [] #циклы создают списки координат N- и C-концов, в зависимости от цепи for i in gb : if i[2] == "+" : n_gb.append(i[0]) c_gb.append(i[1]) else : n_gb.append(i[1]) c_gb.append(i[0]) for i in pg : if i[2] == "+" : n_pg.append(i[0]) c_pg.append(i[1]) else : n_pg.append(i[1]) c_pg.append(i[0]) n_ok = [] c_ok = [] #циклы создают списки с координатами N- и С-концов, предсказанными правильно (включая координаты концов для полностью правиьно предсказанных генов) for i in n_gb : if i in n_pg : n_ok.append(i) for i in c_gb : if i in c_pg : c_ok.append(i) at_all = float(len(genbank)) #всего генов в контиге at_all_pg = float(len(prodigal)) #ксего предсказанных генов right = float(len(ident)) #всего правильно предсказанных Prodigal генов c_only = float(len(c_ok)) - right #количество генов, где правильно предсказаны только C-концы n_only = float(len(n_ok)) - right #количество генов, где правильно предсказаны только N-концы #в выходной файл записываются требуемые данные (количество и проценты) out.write("ident\t" + str(right) + "\n") out.write("at all genes in GenBank\t" + str(at_all) + "\t % of correct\t" + str(right*100/at_all) + "\n") out.write("wrong N-end\t" + str(c_only) + "\t%\t" + str(c_only*100/at_all) + "\n") out.write("wrong C-end\t" + str(n_only) + "\t%\t" + str(n_only*100/at_all) + "\n") out.write("all wrong\t" + str(at_all - right - n_only - c_only) + "\t%\t" + str((at_all - right - n_only - c_only)*100/at_all) + "\n")