我有一个脚本,旨在检测染色体上基因之间的间隙,这些间隙的坐标,并为间隙指定一个类别。
它采用以下格式的输入文件:
Chr start finish dir
chrI 335 649 +
chrI 538 792 +
chrI 1807 2169 -
chrI 2480 2707 +
chrI 7235 9016 -
chrI 10091 10399 +
chrI 11565 11951 -
chrI 12046 12426 +
chrI 13363 13743 -
chrI 21566 21850 +
chrI 22395 22685 -
chrI 24000 27968 -
chrI 31567 32940 +
chrI 33448 34701 +
脚本:
k = 0;
for i=1:(length(start)-1)
if start(i+1)<finish(i)
continue
else
end
k = k+1;
IGR(k,1) = finish(i)+1;
IGR(k,2) = start(i+1)-1;
if dir{i}=='+' && dir{i+1}=='-'
type{k,1} = 'Convergent';
end
if dir{i}=='+' && dir{i+1}=='+'
type{k,1} = 'Tandem';
end
if dir{i}=='-' && dir{i+1}=='+'
type{k,1} = 'Divergent';
end
if dir{i}=='-' && dir{i+1}=='-'
type{k,1} = 'Tandem';
end
end
这适用于上述输入,但是如果超过2重叠,则检查以确定相邻基因是否重叠if start(i+1)<finish(i)
会失败。下面的输入无法正常工作,因为输入数据按start
排序,因此无法检测到第三个基因与第一个基因重叠 - 只检查基因2和3是否重叠。
chrII 280 2658 -
chrII 646 1128 +
chrII 2582 2899 -
chrII 2997 5009 -
chrII 5790 6125 +
chrII 7605 7733 -
所需的输出将是系统检测基因1-3彼此重叠并因此忽略它们 - 在基因3和4之间检测到第一个缺口:
红色区块表示我试图检测的区域,同时忽略重叠的基因(因为它们不产生间隙)。蓝色区块显示每个基因的chrII开始。
是否有人建议采用更强大的方法来检查重叠?
修改:
我的完整输入文件具有按染色体分类的基因,即:
Chr start finish dir
chrI 335 649 +
chrI 538 792 +
chrI 1807 2169 -
chrI 2480 2707 +
chrI 7235 9016 -
chrII 280 2658 -
chrII 646 1128 +
chrII 2582 2899 -
chrII 2997 5009 -
chrII 5790 6125 +
chrII 7605 7733 -
任何检测重叠的方法都不能跨越染色体边界,一旦chrI结束并且chrII开始,就必须刷新该过程,使得chrI上的最后一个基因不针对chrII上的第一个基因进行检查。
答案 0 :(得分:2)
根据你的问题,我假设你已经有两个向量中每个范围的起始值和结束值:
start = [ 280
646
2582
2997
5790
7605 ];
finish = [ 2658
1128
2899
5009
6125
7733 ];
现在,两个范围重叠,当且仅当每个范围在另一个完成之前开始。所以
overlap = bsxfun(@lt, start(:), finish(:).'); %'// or @le to include equality
overlap = overlap & overlap.';
给出方形对称矩阵overlap
,如果范围overlap(m,n)
和1
重叠,则m
为n
。你可能想要删除对角线(一个明显与自身重叠的范围,但这并不重要):
overlap(1:numel(start)+1:end) = 0;
示例输出的结果是
overlap =
0 1 1 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
告诉您范围1和2重叠,范围1和3重叠(但请注意,范围2和3不重叠)。
答案 1 :(得分:1)
将脚本的第3行更改为
是否足够if start(i+1)<max(finish(1:i))
使用第二组示例数据,我得到以下输出:
2900-2996: Tandem
5010-5789: Divergent
6126-7604: Convergent
这是你想要的吗?
巴勒