更新头脑风暴以后如何分析ROH的保留和固定

思路:

1.拟配对个体ROH片段取交集
2.提取出交集的染色体编号和位置坐标
3.从总vcf文件中提取出拟配对个体的vcf文件
4.根据第2步中的染色体编号和位置坐标提取出每个ROH片段对应的vcf文件
5.制定规则,预测拟配对个体配对后产生的新的vcf文件
6.新的vcf文件能否继续被评估为ROH片段,预测ROH的保留和消除
7.计算每一个配对ROH保留和消除的概率

代码实现:

1.配对个体ROH片段取交集

import pandas as pd

# 定义读取数据的函数
def read_data(file_path):
    return pd.read_csv(file_path, sep='\t', usecols=[3, 6, 7], header=0, names=['CHR', 'POS1', 'POS2'])

# 定义寻找相交ROH的函数
def find_intersections(df1, df2):
    intersections = []
    for chr_num in pd.unique(df1['CHR']):
        df1_chr = df1[df1['CHR'] == chr_num]
        df2_chr = df2[df2['CHR'] == chr_num]
        for _, row1 in df1_chr.iterrows():
            for _, row2 in df2_chr.iterrows():
                start_max = max(row1['POS1'], row2['POS1'])
                end_min = min(row1['POS2'], row2['POS2'])
                if start_max < end_min:
                    kb = end_min - start_max
                    intersections.append((chr_num, start_max, end_min, kb))
    return intersections

# 加载数据
data_1 = read_data('467.txt') # 请替换为第一个文件的实际路径
data_2 = read_data('522.txt') # 请替换为第二个文件的实际路径

# 查找相交区域
intersections = find_intersections(data_1, data_2)

# 将结果转换为DataFrame
intersections_df = pd.DataFrame(intersections, columns=['CHR', 'POS1', 'POS2', 'KB'])

# 显示或保存结果
print(intersections_df)
intersections_df.to_csv('intersections.txt', sep='\t', index=False)

2.提取出交集的染色体编号和位置坐标

awk '{print $1 "\t" $2"-"$3}' intersections.txt > 1.txt

3.从总vcf文件中提取出拟配对个体的vcf文件

## 1.提取出配对个体的snp位点组成新的vcf文件
vcftools --vcf chr1.vcf --recode --recode-INFO-all --stdout --indv Pta_467 --indv Pta_522 > 467_522.vcf      
## 2.vcf文件转换为vcf.gz  
bcftools view 467_522.vcf -Oz -o 467_522.vcf.gz    
## 3.加标签
 bcftools index 467_522.vcf.gz
## 4.使用bcftools提取某一范围内的snp位点    
 bcftools filter 467_522.vcf.gz --regions 1:75520805-81296155 > position1.vcf                   

4. 根据第2步中的染色体编号和位置坐标提取出每个ROH片段对应的vcf文件 (利用脚本实现批量化处理)

这个脚本会占用服务器全部线程,这可能会导致其他任务崩溃,所以我在下面更新了代码

  #!/bin/bash

# 假定原始 VCF 文件名为 source.vcf.gz
input_vcf="467_522.vcf.gz"

# 读取1.txt文件中的每一行
while IFS=$'\t' read -r chr range; do
    if [ "$chr" != "CHR" ]; then  # 跳过标题行
        # 生成输出文件名
        output_file="CHR${chr}.${range}.vcf"
        # 格式化区域字符串
        region="${chr}:${range}"
        # 使用 bcftools 提取指定区域的数据
        bcftools filter "$input_vcf" --regions "$region" > "$output_file"
    fi
done < "1.txt"

4.更新后提取出每个ROH片段对应的vcf文件(利用snakemake)

自动设置使用线程,不会导致服务器崩溃

import pandas as pd

# 载入位置信息
positions = pd.read_csv("chr_position.txt", sep="\t", header=0)

# 生成明确的输出文件列表
output_files = ["CHR{0}.{1}.vcf".format(row['CHR'], row['POS1-POS2']) for index, row in positions.iterrows()]

rule all:
    input:
        output_files

rule filter_vcf:
    input:
        vcf="467_334.vcf.gz"
    output:
        vcf="CHR{chr}.{range}.vcf"
    params:
        region=lambda wildcards: f"{wildcards.chr}:{wildcards.range}"  # Simplified region specification
    shell:
        """
        bcftools filter {input.vcf} --regions {params.region} > {output.vcf}
        """

5. 制定规则,预测拟配对个体配对后产生的新的基因型的vcf文件

这一步需要注意,我将建立一个新的文件夹,将生成的结果导入到新的文件夹中,同时生成chr.txt文件,这个文件是上一步生成的vcf文件的路径和文件名

ls CHR* | tr "\t" "\n" > CHR.txt
awk '{print "../" $1}' CHR.txt > chr.txt

生成新基因型vcf文件的代码

def recombine_genotypes(gt1, gt2):
    # 根据两个基因型来重组新的基因型
    if gt1 == "0/1" or gt2 == "0/1":
        return "0/1"
    elif (gt1 == "0/0" and gt2 == "1/1") or (gt1 == "1/1" and gt2 == "0/0"):
        return "0/1"
    elif gt1 == "1/1" and gt2 == "1/1":
        return "1/1"
    else:
        return "0/0"

def process_vcf(input_filename, output_filename):
    with open(input_filename, 'r') as file_in, open(output_filename, 'w') as file_out:
        for line in file_in:
            if line.startswith('#'):
                if line.startswith('#CHROM'):
                    # 修改列标题
                    headers = line.strip().split('\t')
                    headers = headers[:9] + ['forecast']
                    file_out.write('\t'.join(headers) + '\n')
                else:
                    # 复制注释行
                    file_out.write(line)
            else:
                # 处理基因型数据
                parts = line.strip().split('\t')
                gt1 = parts[9]
                gt2 = parts[10]
                forecast_gt = recombine_genotypes(gt1, gt2)
                new_line = parts[:9] + [forecast_gt]
                file_out.write('\t'.join(new_line) + '\n')

def batch_process(file_list):
    with open(file_list, 'r') as files:
        for file_path in files:
            file_path = file_path.strip()
            output_filename = file_path.split('/')[-1]  # 提取文件名
            process_vcf(file_path, output_filename)

# 输入文件名列表文件
file_list = 'chr.txt'

# 调用批量处理函数
batch_process(file_list)   

6.新的vcf文件能否继续被评估为ROH片段,预测ROH的保留和消除

### 新建文件夹ped
ls *vcf | tr "\t" "\n" | awk -F "." '{print $1"."$2}' | while read id ; do plink --vcf $id.vcf --make-bed --out ped/$id ; done
ls *bed | tr "\t" "\n" | awk -F "." '{print $1"."$2}' | while read id ; do plink --bfile $id --recode --out $id ; done
### 新建文件夹ROH
ls *bed | tr "\t" "\n" | awk -F "." '{print $1"."$2}' | while read id ; do plink --bfile $id --homozyg --homozyg-density 20 --homozyg-gap 100 --homozyg-kb 500 --homozyg-snp 50 --homozyg-window-het 3 --homozyg-window-snp 50 --homozyg-window-threshold 0.05 --homozyg-window-missing 5 --out ROH/ROH$id; done
rm ROH*summary ROH*log ROH*nosex ROH*indiv

7.计算每一个配对ROH保留和消除的概率

find . -type f -size +135c | wc -l
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容