Проблема с функцией CoverageHeatmap (Bioconductor) в R

У меня есть 2 набора попарных выравниваний, где геном запроса 1 (q1) выровнен с эталонным геномом, а геном запроса 2 (q2) выровнен с тем же эталонным геномом. Поэтому у меня есть оба выравнивания с системой координат в эталонном геноме. Выравнивания имеют форму объектов GRange.

Я хотел бы спроецировать точки останова q2 на q1, выровняв точки останова q1 в центре, и искать любую кластеризацию точек останова q2 вокруг точек останова q1, все в системе координат эталонного генома.

Поэтому я создаю объект GRange из q1 с точками останова в центре. Например, если есть точка останова в q1 относительно эталонного генома на каркасе 1, п.н. 833, то при взятии окна на 500 по обе стороны от него объект q1 GRanges будет иметь элемент:

GRanges object with 1 range and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]       S1  333-1333      *
  -------
  seqinfo: 576 sequences from an unspecified genome; no seqlengths

Затем я создаю объект GRanges точек останова на q2, но все длины последовательностей имеют длину 1. Я пересекаю его с объектом q1 GRanges, так что q2 получает только точки, которые можно спроецировать на q1.

Для функции CoverageHeatmap требуется:

windows:
набор GRange равной длины.

track:
объект GRange или RleList, указывающий покрытие

Когда я вызываю функцию CoverageHeatmap, я всегда получаю эту ошибку и предупреждающее сообщение:

Error: subscript contains out-of-bounds ranges
In addition: Warning message:
In e1 == Rle(e2) :
  longer object length is not a multiple of shorter object length
Called from: S4Vectors:::.subscript_error("subscript contains out-of-bounds ", 
    "ranges")

Я пробовал кучу вещей, чтобы попытаться заставить это работать, и все равно получаю ту же ошибку и предупреждающее сообщение. Это мой код (в том числе, когда я пробовал функцию с q2 в качестве объекта GRange и RleList)

## BP Pairwise comparison, using 3rd genome as co-ordinate reference
# q1 is used as the centre point reference, with q2 bps projected on to it. 
# gr_ref_q1 is the pw alignment between the reference and query genome 1
# gr_ref_q2 is the pw alignment between the reference and query genome 2
# We construct two GRanges objects to feed into CoverageHeatMaps
library(schoolmath)
library(heatmaps)
library(IRanges)

bp_3gen_v2 <- function(gr_ref_q1, gr_ref_q2, win){

  # Failsafes (check ref genome is the same, etc)
  if(!(is.even(win))){stop("win should be an even number")}

  ## Construct g1_rco (1st GRanges object)
  # IRanges object
  q1_starts1 <- start(ranges(gr_ref_q1)) - (win*0.5)
  q1_starts2 <- end(ranges(gr_ref_q1)) - (win*0.5)
  q1_starts <- c(q1_starts1, q1_starts2)
  q1_ends1 <- start(ranges(gr_ref_q1)) + (win*0.5)
  q1_ends2 <- end(ranges(gr_ref_q1)) + (win*0.5)
  q1_ends <- c(q1_ends1, q1_ends2)
  q1_ir_ob <- IRanges(start = q1_starts, end = q1_ends) 

  # GR object
  g1_vec_seq <- as.vector(seqnames(gr_ref_q1))
  gr1_seqnames <- c(g1_vec_seq, g1_vec_seq)
  g1_rco <- GRanges(seqnames = gr1_seqnames, ranges = q1_ir_ob, 
                    seqinfo = seqinfo(gr_ref_q1))

  # Remove negative ranges from GR object
  g1_rco <- g1_rco[!(start(ranges(g1_rco)) < 0)] 



  ## Construct g2_rco (2nd GRanges object)
  # IRanges object
  q2_starts <- start(ranges(gr_ref_q2))
  q2_ends <- end(ranges(gr_ref_q2))
  q2_bps <- c(q2_starts, q2_ends)
  q2_ir_ob <- IRanges(start = q2_bps, end = q2_bps)
  # GR object
  g2_vec_seq <- as.vector(seqnames(gr_ref_q2))
  gr2_seqnames <- c(g2_vec_seq, g2_vec_seq)
  g2_rco <- GRanges(seqnames = gr2_seqnames, ranges = q2_ir_ob,
                    seqinfo = seqinfo(gr_ref_q2))

  # Try removing anywhere in g2_rco that is not present in g1_rco
  # find intersection of seqnames 
  g_inter <- intersect(g1_vec_seq, g2_vec_seq)
  # apply to g2_rco to remove out of bound scaffols
  g2_rco <- g2_rco[seqnames(g2_rco) == g_inter]
  # now to remove out of bound ranges (GRanges object)
  g2_red <- intersect(g1_rco, g2_rco)
  # And try as RleList object
  g2_red_rle <- coverage(g2_red)


  # Heatmap
  heat_map <- CoverageHeatmap(windows = g1_rco, track = g2_red_rle)


person Charlie W    schedule 24.12.2019    source источник


Ответы (1)


Чтобы избежать этих проблем и добиться того, что вам нужно, самым простым решением является использование одинаковых последовательностей и последовательностей для обоих GRange. Если вы знаете это для справки, предоставьте это, если не попробуйте это:

Первые примеры наборов данных:

library(heatmaps)
gr1 = GRanges(seqnames=c(1,2,3),
IRanges(start=c(1,101,1001),end=c(500,600,1500)))

gr2 = GRanges(seqnames=c(2,2,3,3),
IRanges(start=c(1,301,1,1201),end=c(2500,4800,3500,9700)))

Затем мы создаем комбинированный диапазон, чтобы получить уровни и длины:

combined= range(c(gr1,gr2))

seqlevels(gr1) = as.character(seqnames(combined))
seqlevels(gr2) = as.character(seqnames(combined))
seqlengths(gr1) = end(combined)
seqlengths(gr2) = end(combined)

Тогда тепловую карту можно легко получить:

CoverageHeatmap(gr1,coverage(gr2))

Или, если вы хотите просматривать только окна gr1, которые имеют некоторые значения в gr2, выполните:

CoverageHeatmap(gr1[countOverlaps(gr1,gr2)>0],coverage(gr2))
person StupidWolf    schedule 24.12.2019
comment
У меня есть seqlevels и seqlengths для генома ref, но кажется, что это вызывает больше ошибок. Я начал играть с настройкой, которую вы предложили выше. Ваш пример работает просто отлично, но я ввел числа, которые вызывают ошибку выхода за пределы диапазона, но я не понимаю, что это вызывает. Например, эта настройка работает просто отлично: Но эта настройка вызывает ошибку: Объект GRange содержит 1 диапазон вне границ, расположенный в последовательности 3. - person Charlie W; 25.12.2019
comment
да... но вам не нужно конвертировать туда и обратно только для того, чтобы получить окна. держись за гранж и все будет ок - person StupidWolf; 25.12.2019
comment
И я ничего не могу сделать, просто прочитав ваш код. Вам нужно предоставить воспроизводимый пример. - person StupidWolf; 25.12.2019
comment
Поэкспериментировав с предложенной вами настройкой, у меня есть следующие рабочие значения: gr2 = GRange(seqnames = c(1,2,3), IRanges(start = c(1,1,1), end = c(50,50,50) )) `И те, которые не соответствуют: ` gr1 = GRange(seqnames = c(1,2,3), IRanges(start = c(1,101,201), end = c(200,300, 400))) gr2 = GRange(seqnames = c(1,2,3), IRanges( start = c(1,1,101), end = c(50,50,150) )) ` Когда все, что я сделал, это сдвинул последовательность на 3 значения. Не могли бы вы объяснить, почему он перестает работать? - person Charlie W; 25.12.2019
comment
@CharlieW, спасибо, что указали на это .. Да, я ошибся, это должен быть конец диапазона, а не ширина. См. обновленный код выше - person StupidWolf; 25.12.2019
comment
Так что, если у вас есть seqlevels и seqlengths, всегда работайте с GRanges, потому что вы унаследуете seqlengths и seqlevel. все, что делается в IRanges, может быть сделано в GRange. - person StupidWolf; 25.12.2019
comment
Да, теперь это работает, спасибо за вашу помощь. Я попытаюсь внедрить его в свой более крупный код. - person Charlie W; 25.12.2019