检测范围是否重叠 - MATLAB

时间:2015-06-17 10:34:50

标签: matlab

我有一个脚本,旨在检测染色体上基因之间的间隙,这些间隙的坐标,并为间隙指定一个类别。

它采用以下格式的输入文件:

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之间检测到第一个缺口:

enter image description here

红色区块表示我试图检测的区域,同时忽略重叠的基因(因为它们不产生间隙)。蓝色区块显示每个基因的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上的第一个基因进行检查。

2 个答案:

答案 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重叠,则mn。你可能想要删除对角线(一个明显与自身重叠的范围,但这并不重要):

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

这是你想要的吗?

巴勒