加性分析

将杂种后代基因的表达量与两个亲本基因组中对应同源基因表达量相加后的平均值(也被称为中亲值,MPV)进行比较,根据杂种后代中差异表达基因的表达值与两个亲本的 MPV 是否存在显著差异来分析基因表达模式的变化情况。若杂种后代中基因的表达量与MPV无显著差异,则认为这类基因属于加性表达基因(additive gene expression)(I,XII),反之则认为这类基因属于非加性表达基因( non-additive gene expression)。非加性表达基因又被分为了4类别:(1)母本显性表达(IV,IX),即母本的表达量等于子代,同时高于或低于父本的表达量;(2)父本显性表达(II,XI),即父本的表达量等于子代,同时高于或低于母本的表达量;(3)超亲下调表达(I,VII,X),即子代的表达量同时低于两个亲本;(4)超亲上调表达(V,VI,VII),即子代的表达量同时高于两个亲本,参照前人的方法将杂种后代中差异表达的部分同源基因分为12种表达模式(I-XII)。

1, 同源比对分析,确定两个亲本参考基因组中的同源基因

2, 计算中亲值,(父本+母本)/2

3, 使用同源基因的readcount做差异分析,分为母与子,父与子,亲本间,子与中亲值4组差异分析

4, 根据上步的结果,对差异表达基因分类统计。

脚本如下

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import argparse
parser = argparse.ArgumentParser(prog='get_table.py',usage='%(prog)s [opthions] <value>',description='get final table for jiaxing gene summary')
parser.add_argument('-ZF','--zivsfu',help='the diff gene dir in zi vs fu',required=True)
parser.add_argument('-MZ','--muvszi',help='the diff gene dir in mu vs zi',required=True)
parser.add_argument('-MF','--muvsfu',help='the diff gene dir in mu vs fu',required=True)
parser.add_argument('-MPV','--mpv',help='the diff gene in mpv',required=True)
argv=vars(parser.parse_args())

if argv['zivsfu'] == None:
	raise Exception('You should provide the diff gene dir in zi vs fu!')
else:
	zivsfu = argv['zivsfu'].strip()

if argv['muvszi'] == None:
    raise Exception('You should provide the diff gene dir in mu vs zi!')
else:
    muvszi = argv['muvszi'].strip()

if argv['muvsfu'] == None:
    raise Exception('You should provide the diff gene dir in mu vs fu!')
else:
    muvsfu = argv['muvsfu'].strip()

if argv['mpv'] == None:
    raise Exception('You should provide the pmv table!')
else:
    mpv = argv['mpv'].strip()



def get_gene_list(input_file):
	input_ = open(input_file).readlines()
	gene_list = []
	for each in input_[1:]:
		each_lines = each.strip().split("\t")
		gene_list.append(each_lines[0])
	return gene_list

def get_diff_dic(diff_dir):
	diff_dic = {}
	compare = diff_dir.strip().strip("/").split("/")[-1]
	all_diff = diff_dir + "/" + compare + "_deg_all.xls"
	up_diff = diff_dir + "/" + compare + "_deg_up.xls"
	down_diff = diff_dir + "/" + compare + "_deg_down.xls"
	all_ = get_gene_list(all_diff)
	up_ = get_gene_list(up_diff)
	down_ = get_gene_list(down_diff)
	diff_dic = {
		"all" : all_,
		"up" : up_,
		"down" : down_
		}
	return diff_dic

mpv_list = get_gene_list(mpv)
all_gene = get_gene_list("/TJPROJ6/NC_BG_SH/shouhou/202403/X101SC23084620-Z01-J018_special/03.Result_X101SC23084620-Z01-J018_zea_mays/Result_X101SC23084620-Z01-J018_zea_mays/4.Quant/1.Count/h8_gene_conut_mpv.xls")

zivsfu_dic = get_diff_dic(zivsfu)
muvszi_dic = get_diff_dic(muvszi)
muvsfu_dic = get_diff_dic(muvsfu)


I = []
II = []
III = []
IV = []
V = []
VI = []
VII = []
VIII = []
IX = []
X = []
XI = []
XII = []
NC = []

for each in all_gene:
	if each not in mpv_list and each in zivsfu_dic["up"] and each in muvszi_dic["up"]:
		I.append(each)
	elif each not in mpv_list and each in zivsfu_dic["down"] and each in muvszi_dic["down"]:
		XII.append(each)
	elif each in mpv_list and each in zivsfu_dic["up"] and each not in muvszi_dic["all"]:
		II.append(each)
	elif each in mpv_list and each in zivsfu_dic["down"] and each not in muvszi_dic["all"]:
		XI.append(each)
	elif each in mpv_list and each not in zivsfu_dic["all"] and each in muvszi_dic["down"]:
		IV.append(each)
	elif each in mpv_list and each not in zivsfu_dic["all"] and each in muvszi_dic["up"]:
		IX.append(each)
	elif each in mpv_list and each in zivsfu_dic["down"] and each in muvszi_dic["up"] and each in muvsfu_dic["up"]:
		III.append(each)
	elif each in mpv_list and each in zivsfu_dic["down"] and each in muvszi_dic["up"] and each not in muvsfu_dic["all"]:
		VII.append(each)
	elif each in mpv_list and each in zivsfu_dic["down"] and each in muvszi_dic["up"] and each in muvsfu_dic["down"]:
		X.append(each)
	elif each in mpv_list and each in zivsfu_dic["up"] and each in muvszi_dic["down"] and each in muvsfu_dic["up"]:
		V.append(each)
	elif each in mpv_list and each in zivsfu_dic["up"] and each in muvszi_dic["down"] and each in muvsfu_dic["down"]:
		VI.append(each)
	elif each in mpv_list and each in zivsfu_dic["up"] and each in muvszi_dic["down"] and each not in muvsfu_dic["all"]:
		VIII.append(each)
	else:
		NC.append(each)

list_table = [I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII,NC]
duiying = {1:"I",2:"II",3:"III",4:"IV",5:"V",6:"VI",7:"VII",8:"VIII",9:"IX",10:"X",11:"XI",12:"XII",13:"NC"}

for each in list_table:
	out = open("Y"+duiying[list_table.index(each)+1]+".xls",'w')
	out.write("\n".join(each))