KaKs计算

一.基本步骤

ParaAT.pl 计算得到 file.axt 文件,如果加上 -k 参数,就会使用KaKs_Calculator的MA方法来计算(速度很慢),为了加快计算速度,可以使用YN的方法来计算。于是先用 ParaAT.pl 得到 file.axt 文件,然后使用 KaKs_Calculator 来计算。

ParaAT.pl -h test.homologs -n test.cds -a test.pep -p proc -m muscle -f axt -g -k -o result_dir #proc文件必须与输出位置在同一个目录下,不然会报错
# -h 指定同源基因对列表文件:
# -n 指定核酸序列文件  
# -a 指定蛋白序列文件  
# -p 指定多线程文件(必须是一个文件而不是数字)
# -m 指定比对工具:muscle这个序列比对软件有问题,可能会导致比对空文件的出现,mafft发现正常。主要是muscle不同版本的命令不同。
[clustalw2 | t_coffee | mafft | muscle , optional]
# -g 去除比对有gap的密码子  
# -k 用 KaKs_Calculator 计算kaks值 : 使用这个参数会使用使用多个方法进行计算,导致速度变慢
# -o 输出结果的目录,两次运行的输出目录不能相同
# -f 输出比对文件的格式:[axt | fasta | paml | codon | clustal, optional], default = fasta
# ParaAT.pl -help 

KaKs_Calculator 计算kaks值

find output/ -name '*.axt' -type f -print0 | parallel -0 -j 40 KaKs_Calculator -i {} -o ${kaks_outdir}/{/.}.kaks -m YN

上面的方法其实可以优化,只需要将 ParaAT.pl 脚本进行适当修改即可。这样修改之后就可以一行命令执行了。

my $cmd = $KaKsCMD." -i ".$file.".cds_aln.axt -o  ".$file.".cds_aln.axt.kaks >> msg.kaks";
# 在这行代码里面添加方法参数(-m YN):
my $cmd = $KaKsCMD." -i ".$file.".cds_aln.axt -o  ".$file.".cds_aln.axt.kaks -m YN >> msg.kaks";
run_kaks(){
    cat ${qry}.cds ${ref}.cds > "${qry_basename}.cds"
    cat ${qry}.pep ${ref}.pep > "${qry_basename}.pep"
    echo "${thread}" > "threadNum.txt"
    if ! [ -e "${qry_basename}-${ref_basename}.pair" ];then
        ls /home/bqxiao/data5/01.pan/19.duplicate/2.analyse/data/alignment/${qry_basename}_${ref_basename}.blast | xargs -I {} awk -F "\t" "{ if (\$1 != \$2) print \$1\"\t\"\$2 }" {} > ${qry_basename}-${ref_basename}.pair
    fi
        nohup ParaAT.pl -h "${qry_basename}-${ref_basename}.pair" \
        -n "${qry_basename}.cds" \
        -a "${qry_basename}.pep" \
        -p "threadNum.txt" \
        -o "output" -m mafft -g -f axt -k > ParaAT.log & 
}
ref="/home/bqxiao/data5/01.pan/19.duplicate/data/cacao/temp/cacao"
qrys="/home/bqxiao/data5/01.pan/01.newdata/cds-pep/Aralia_elata_Seem
/home/bqxiao/data5/01.pan/01.newdata/cds-pep/Coriandrum_sativum
"
ref_basename=$(basename ${ref})
thread=10
for qry in ${qrys};do
    qry_basename=$(basename ${qry})
    if ! [ -e "${qry_basename}" ];then
        mkdir "${qry_basename}"
    fi
    cd ${qry_basename}
    run_kaks
    cd ..
done

二.使用这个脚本时可能遇到的问题

  • 输出目录必须没有创建

  • 这个脚本会自动修改基因名称(将基因名称后面的 点 去除)。目前已做修改,可以返回完整的基因名称,而不会因为名称里面有版本号而去除。主要是这两个函数,GenerateSequenceFiles和ReadSeqs。

  • -h 对应的参数必须是基因对列表,不能直接使用blast文件。

    • ls alignment/${qry_basename}_${ref_basename}.blast | xargs -I {} awk -F "\t" "{ if (\$1 != \$2) print \$1\"\t\"\$2 }" {} > output/${qry_basename}/${qry_basename}-${ref_basename}.pair
  • 运行ParaAT.pl脚本的运行位置必须和输入文件及输出目录处在同一个目录下,不然运行到序列比对时,将会出现bug(无法找到多线程文件proc)

  • 若是出现检查完cds文件、pep文件以及基因对文件之后,程序直接结束。Generating homologous group files for alignments: 964 from 964 groups 这两个数字不相等,说明cds和pep文件以及基因对文件中名称可能不一致,或者fasta文件中有注释信息,比如:

    • >gene1 [sequence in Human]...
  • 几个程序的比对速度以及准确性:

    • 比对速度:Muscle>MAFFT>ClustalW>T-Coffee
    • 比对准确性:MAFFT>Muscle>T-Coffee>ClustalW
  • 这个脚本中的muscle命令如下:

elsif ($MSACMD =~ /muscle/) {
        $cmd = "muscle -quiet  -in ".$file.".pep  -out ".$file.".pep_aln >> msg.msa";
}
# 显然这是muscle3的输入格式,而muscle5的输入格式如下:
# muscle -align input.fa -output aln.afa
  • 所输入的cds文件和pep文件基因名称必须一致,而且都没有注释信息。可使用下面的命令过滤文件。
# Usage: 
# ls *.pep | xargs -I {} filter.py {}
# ls *.cds | xargs -I {} filter.py {}
def process_file(input_filename, output_filename):
    with open(input_filename, 'r', encoding='utf-8') as file:
        lines = file.readlines()
    processed_lines = []
    for line in lines:
        if line.startswith('>'):
            # 去除>开头中中的注释部分内容,只保留基因名称
            line = line.split()[0] + "\n"
            processed_lines.append(line)
        else:
            processed_line = line.replace('.', '').replace('*', '')
            if processed_line.strip():  # 检查行是否只剩换行符
                processed_lines.append(processed_line)
    
    with open(output_filename, 'w', encoding='utf-8') as file:
        file.writelines(processed_lines)

import sys
if len(sys.argv) != 2:
    print("Usage: python3 filter.py input_filename")
    sys.exit(1)
input_filename = sys.argv[1]
output_filename = input_filename
process_file(input_filename, output_filename)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容