Category: наука

Category was added automatically. Read all entries about "наука".

Им удалось: Saturated Reconstruction of a Volume of Neocortex

Кеннат Хейвортс опубликовал в Cell работу с демонстрацией автоматизированного высокопроизводительного электронно-микроскопического имаджинга для фрагмента мышиного мозга.

Saturated Reconstruction of a Volume of Neocortex


Хороший курс для введения в нейробиологию

Дисклеймер: описанное ограничено личным мнением.

logo-SNB
Некоторое время назад был прослушан курс Corsera Synapses, Neurons and Brains, этот курс хорошо сочетает разъяснение базовых знаний нейробиологии (работа нейрона), современное состояние нейробиологии (принципы и возможности текущих методов) и широту охвата тем. Ещё более примечательно то, что в курсе присутствуют весьма продвинутые вещи (в роде обоснования необходимости инвазивных методов с миллионами электродов) и адекватные рассказы об хайпово-раздуваемых проектах без хайпа. Прослушивание курса настоятельно рекомендуется фанатам загрузки и в приказном порядке  сторонникам трансгуманизма, изучавшим нейрофизиологию по Ghost in the Shell .

Немного молекулярной биологии, post 1

Дисклеймер: в рамках РТД обсуждался вопрос об полезных основах современной биологии для ТГ, в силу своей специальности я начну кратко описывать в адаптированной неформальной форме основные (и примечательные для ТГ) моменты. Биоинженер, помни! Ты должен всё это знать и ты мне это расскажешь на коллоквиуме, зачёте и экзамене!

Нет нужды напоминать основы биохимии, все помнят что основными компонентами живого являются белки, жиры, нуклеиновые кислоты, вода, неорганические вещества и продукты обмена веществ (метаболизма) как всяческие производные вышеназванного; при этом белки это функциональные исполнители всего-всего, жиры - главный компонент мембран и запас энергии, углеводы используются как носитель/оперативный запас энергии и для конструкционных материалов, нуклеиновые кислоты главным образом являются информационным и регуляторым агентом, вода это основная среда для жизни и неорганические вещества обеспечивают физико-химический "фон" чтобы это всё работало и ещё являются специфическими компонентами для многих ферментов.
Также все помнят основы молекулярной биологии, что ДНК это главное (и единственное) хранилище информации в клетке (хромосомы), изредка используемое как агент переноса генов (плазмиды и прочие векторы); РНК используется как временный носитель информации (мРНК), реже как регулятор чего-нибудь (РНК-интерференция, рибопереключатели) и ещё реже как исполняющий агент (рибозимы) за одним громадным исключением (рибосома); что белки являются главенствующими компонентами живого, которые что-то делают, поскольку делаю они всё - превращение метаболитов, перенос веществ (через мембраны и пр.), детекция веществ, передача сигнала, детекция физико-химических условий, механическую работу, регуляция других компонентов,...

В этом посте мы, после того как вспомнили основной бэкграунд, рассмотрим "центральную догму молекулярной биологии" вообще и что там насчёт контроля, который необходим для управления биологическими процессами и системами.
Collapse )

Закончено прослушивание курса Computational Neuroscience

Дисклеймер: замечание основано на личном опыте и выражает только субъективное мнение.


Закончен просмотр кура видеолекций Coursera Computational Neuroscience. Из-за большого количества математической статистики в непростых приложениях с подразумеваемыми навыками машинного обучения и ещё чёрти-чего этот курс - ещё тот вынос мозга. Польза от курса и вынесенный материал находятся под некоторым вопросом.

fMOST - презентация и доклад



1) Получение полной карты нервных клеток и их связей друг между другом в мозге млекопитающих является одной из самых важных целей для современных нейронаук. Я расскажу о высокопроизводительном оптико-микроскопическом методе определения структуры нервной ткани, названным фМОСТ на примере применения его к мозгу мыши. С помощью фМОСТ команде китайских нейробиологов удалось считать структуру целого мозга мыши с разрешением порядка микрометра, что позволяет различить отдельные нейроны и их связи с другими нейронами, и также показали возможность трассировки отдельных синапсов в масштабе всего мозга.
2) Данный доклад основнан на серии статей, посвящённой разработке метода МОСТ, отработке метода для объектов, экспрессирующих флуоресцентные белки и собственно применению метода фМОСТ.
3) Разработка метода МОСТ: они сконструировали систему из микротома, сервоприводов для перемещения образца, светлопольного оптического микроскопа и оптического детектора.
4) Микротом с алмазным ножом под слоем жидкости делал 1-микронные срезы образца шириной 450 мкм, система перемещения образца обеспечивала движение в 3 измерениях на получения ленточных срезов, считывание изображения выполнялось на лезвии ножа с помощью линейки ПЗС (это было выбрано для увеличения стабильности системы ради стабильности автоматического сканирования).
5) Мозг мыши предварительно прошёл пробоподготовку, заключавшуюся в крашении по Гольджи-Коксу (классический метод крашения тканей для нейробиологических исследований), которое представляет собой выдерживании в растворе растворимых хроматов и сулемы. Приблизительный результат представлен на слайде.
6) Затем была выполнена дегитратация с помощью градиента спирта и ацетона, после чего мозг был пропитан и заполимеризован в материале типа эпоксидной смолы. Заполимеризованный образец изображён на слайде.
7) Ход процесса показан в данном видео.
8) Следующей стадией являлась коррекция получаемых изображений: подавление периодического шума из-за типа лампы, нормализация интенсивности из-за неоднородностей освещения и регулярная калибровка по лезвию ножа. На слайде представлены первые 2 шага.
9) <зачитать статистику>
10) Пример виртуального среза в псевдоцвете
11) Пример ручной трассировки нескольких нейронов
12) fMOST - модификация метода MOST: авторы отказались от очень длительной процедуры крашения всего мозга, также и от последовательного крашения каждого среза в пользу мощного способа селективного мечения клеток с помощью флуоресцентных белков методами генетической инженерии. Им пришлось решать проблемы отсутствия методик фиксации массивных флуоресцентно-меченых образцов и потери интенсивнотсти при фиксации в полимере. Были выбраны мыши, экспрессирующие eYFP-H под контролем промотора Thy-1, считается нейрон-специфичным.
13) Были выбраны 4 широко используемых для микроскопии полимера: на основе гидроксиметилметакрилата, гидроксипропилметакрилата, гидрокси-бисфенол-метакрилата и метакрилата. Целью было уменьшить падение флуоресценции после полимеризации и ускорить пропитку мозга.
14) Измерение падения флуоресценции измерялось на флуоресцентном микроскопе для фиксированного тонкого среза, было показано что в флуоресценция снижается в 2-3 раза, но для HPMA возрастает и это коррелировало с pH. Полноту пропитки оценивали по отсутствию незафиксированных областей в целых мозгах с помощью MOST, все полимеры, кроме HPMA, пропитывали ткани за 2-3 дня. Оптимальным материалом был признан GMA.
15) Дальнейшая оптимизация GMA состояла в понижении температуры полимеризации на 5 градусов, удаление ингибитора полимеризации (работает как тушитель) и защелачивание. На слайде приведено сравнение флуоресцентных изображений группы нейронов до фиксации, после и их наложение - что демонстриует высокую сходимость интенсивностей и пространственного расположения.
16) fMOST – применение метода: они модифицировали микроскоп, добавив лазерную подсветку и переведя его в режим лазерного сканирующего (по оси Y) микроскопа, установив акустико-оптический дефлектор. Также был заменён оптический детектор. Программная часть была немного скорректирована для лучшей работы с другой технологией съёма изображения.
17) Были выбраны объекты <зачитать>, параметры процедуры для GFP и 14дневного YFP: ширина среза 300 мкм, конечный размер вокселя <зачитать>, для YFP 150 мкм, воксель <зачитать>. Общее время сканирования для взрослой YFP 450 часов. Для трассировки аксонов был выбран мозг мыши 14 дн. После рождения.
18) Пример реконструированных срезов для взрослых GFP и YFP показан на слайде.
19) Для трассировки аксонов необходима аннотация структур мозга, поскольку аннотации для 14 дневных мышей нет, они пересчитали аннотацию с помощью комбинирования данных атласа FPMA, MRI 14 дневной, MRI взрослой и собственно данных fMOST. Трассировка выполнялась полуавтоматически, пример для нескольких нейронов приведён на изображении.
20) Всего они отследили 40 нейронов в мозге 14 дневной, на изображении они выделены цветом, масштаб 1мм, показаны контуры областей мозга на основе пересчитанной аннотации.

Использование Rsamtools

Дисклеймер: это описание использования пакета Rsamtools на фоне реального анализа данных Ribosome Profiling

Адаптация samtools для R является основным средством импорта данных картирования NGS в R. Сопряжение со статистическим языком обеспечивает функционал, недоступный для самого samtools.

Сделано несколько методов чтения BAM файлов, различаются и возвращаемые ими объекты, но общий ввод основан на указании референсных файлов или содержащих множество BAM файлов  папок - объекты типа BamFile.
Метод scanBam возвращает (загруженный в память) объект класса list со своей сложной структурой,
метод readBamGappedAlignments из группы методов ReadBamGapped возвращает класс GenomicRanges (точнее GappedAlignments), что из пакета GenomicRanges, а не Rsamtools,
близкий ему метод readBamGappedAlignmentPairs возвращает класс GappedAlignmentPairs из пакета GenomicRanges,
метод readBamGappedReads принадлежит пакету ShortRead и возвращает класс GappedReads.

Главный метод чтения Rsamtools это scanBam с использованием sacnBamParam - указание диапазонов выборочного чтения BAM файла (вот они - Big Data): указание which - где читать, задаются Rle диапазоны и what - что читать, какие колонки из BAM файла оставлять. Серии файлов составляются с помощью list.files с использованием паттернов, не все методы Rsamtools поддерживают чтение серий файлов. Примечательно что методы GenomicRanges типа summarize работают и для list BAM и для серий BAM файлов.

library(Rsamtools)
### задание референса BamFile
mRNAalignd <- "/media/data/profiling_data_processing/mRNA-exp.sort.bam" # выровненные риды общего транскриптома
mRNAindx <- "/media/data/profiling_data_processing/mRNA-exp.sort.bam.bai" # индекс выравнивания
filebam <- BamFile(file = mRNAalignd, index = mRNAindx) # объект-ссылка типа BamFile
### перебор разных методов чтения BAM файлов
scannedBam <- scanBam(filebam) # файл в виде списка, тормозит, жрёт много памяти, зато загружает ВСЁ в виде иерархического списка
readedGAlign <- readBamGappedAlignments(filebam) # файл в виде GRanges с 8 колонками без метаданных (цепь-длина-старт-конец, гэпы и т.д.)
readedGAlignPair <- readBamGappedAlignmentPairs(filebam) # этот метод для paired-end! он не прочитал нормально файл, но должен быть аналог для paired
readedGappedReads <- readBamGappedReads(filebam) # не видно разницы между GappedAlignments - такой-же GRanges
### рассмотрение и преобразование основного формата хранения BAM Rsamtools
sapply(scannedBam[[1]], class) # получение типов элементов элемента листа
lst <- lapply(names(scannedBam[[1]]), function(elt) { # применение функции к элементу списка с выводом в результате списка
do.call(c, unname(lapply(scannedBam, "[[", elt))) # развоваричвание одного элемента списка в список со многимим элементами
}
)
names(lst) <- names(scannedBam[[1]]) # задание имён элементов списка
dataBam <- do.call("DataFrame", lst) # трансформация в data frame, очень ресурсоёмко
### фрагментарное чтение BAM файла
testRangeList <- RangesList(NC_000913.2 = IRanges(50000, 100000)) # пробный диапазон в виде RangeList с одним элементом, имя должно совпадать с хромосомой
partBamParam <- ScanBamParam(what = c("rname", "strand","pos"), which = testRangeList) # сборка параметров для чтения BAM
partBam <- scanBam(filebam, param = partBamParam) # читается
### чтение серий файлов и summarize из GenomicRanges
fls <- list.files(path = "/media/data/profiling_data_processing", pattern = "*mRNA.*sort.bam$", full = T) # создание списка файлов
BamFilesList <- BamFileList(fls, index = character()) # сборка листа файлов
testRange <- GRanges(seqnames = 'NC_000913.2', ranges = IRanges(start = 500000, end = 1000000), strand = '+') # тестовый GRange, GRL почему-то не заработал
summary <- summarizeOverlaps(testRange, BamFilesList) # саммари в объект
result <- assays(summary) # неудачный тестовый GRanges, ничего просяняющего
### остальные фукции Rsamtools - стандартные манипуляции с BAM и VCF файлами и построение референсов - BamViews

Colored with dumpz.org

GenomicRanges

Дисклеймер: кратко основные вещи по Bioconductor GenomicRanges

library("GenomicRanges")
 
### Сборка объекта GenomicRanges с нуля
GenRange <- GRanges(
  seqnames = Rle(c("chrX", "chrY", "chrZ"), c(1, 1, 2)), # задание "хромосом" и числа блоков на каждой как Rle
  ranges = IRanges(start = c(1, 3, 19, 30), end = c(7, 5, 35, 40), names = c('One', 'Two', 'XX', 'ZZ')), # задание координат и имён блоков как IRanges
  strand = Rle(strand(c("+", "-", "*")), c(1, 1, 2)), # задание ориентации цепей блоков с указанием "числа" как Rle
 
  score = c(10, 100, 500, 400), # Опциональная колонка численных значений
  lolID = c('d', 'g', 't', 'y') # Произвольная колонка
)
GenRange
 
GenRange2 <- GRanges(
  seqnames = Rle(c("chrX", "chrY", "chrZ"), c(1, 1, 2)), # задание "хромосом" и числа блоков на каждой как Rle
  ranges = IRanges(start = c(1, 3, 19, 25), end = c(7, 5, 35, 30), names = c('One', 'Two', 'XX', 'DD')), # задание координат и имён блоков как IRanges
  strand = Rle(strand(c("+", "-", "*")), c(1, 1, 2)), # задание ориентации цепей блоков с указанием "числа" как Rle
 
  score = c(10, 100, 500, 400), # Опциональная колонка численных значений
  lolID = c('d', 'g', 't', 's') # Произвольная колонка
)
GenRange2
 
### Базовый вывод (и ввод) из объекта
seqnames(GenRange) # Rle-факторный вывод числа блоков и хромосом
seqlengths(GenRange) <- c(1e6, 1.2e6, 9e5) # Вывод и ВВОД длин хромосом
seqlengths(GenRange2) <- c(1e6, 1.2e6, 9e5)
strand(GenRange) # Rle-факторный вывод цепей
length(GenRange) # вывод числа блоков
names(GenRange) # вывод имён блоков
ranges(GenRange) # вывод диапазонов в виде IRanges
mcols(GenRange) # вывод колонок метаданных в IRangesовский DataFrame
start(GenRange) # получение вектора всех стартов
end(GenRange) # ...и всех концов
width(GenRange) # всех длин
GenRange[4] # вызов , скажем, 4 строки (блока)
 
  # манипуляции с компонентами
rep(GenRange[2], 3) # повторение блоков
rev(GenRange) # полное инвертирование порядка
window(GenRange, start = 3, end = 4) # поднабор по номерам строк (блоков)
seqselect(GenRange, start = c(1,2), end = c(2,3)) # почти то-же самое с поддержкой конкатенации, только нихрена не удобно.
 
  # преобразования
    # Intra range
EndFlanksGenRange <- flank(GenRange, 2, start = F) # получение набора обрезков длиной 2 После краёв блоков (исключены статы)
  ranges(EndFlanksGenRange); ranges(GenRange) # сравнение
ShiftedGenRange <- shift(GenRange, 10) # получение смещённого на 10 GRanges
  ranges(ShiftedGenRange); ranges(GenRange) # смещение на + 10
ResizedGenRange <- resize(GenRange, 5, fix = 'start') # переприсвоение длины, стартовая точка задана стартом (это дефолт)
  ranges(ResizedGenRange); ranges(GenRange) # все сжались с конца
    # Inter range, имена стираются
reduce(GenRange) # слияние пересекающихся диапазонов, много внутренних параметров, чувствителен к цепи
Gaps <- gaps(GenRange) # получение набора всех непокрытых участков, требует длин хромосом, возвращает всю цепь-связанную кашу
  ranges(Gaps) # эээ... гэпы с цепью?...
DisjoinedGenRange <- disjoin(GenRange) # выщепление пересекающихся участков блоков
  ranges(DisjoinedGenRange); ranges(GenRange) # непересекающиеся оставлены, 2 пересекающихся расщеплены на непересекающиеся куски и 1 участок пересечения
Coverage <- coverage(GenRange) # получение зачений покрытия в данном случае по хромосомам в виде RleList
 
### манипуляции со многими GRanges
union(GenRange, GenRange2) # общие блоки
intersect(GenRange, GenRange2) # пересекающиеся блоки
setdiff(GenRange, GenRange2) # отличающеся блоки
 
### получение и работа с объектами GenomicRangeList
  # сборка с нуля
gr1 <- GRanges(seqnames = "chr1", ranges = IRanges(2, 4), strand = "+", score = 50, lolID = 'o'); seqlengths(gr1) <- 1e6
gr2 <- GRanges(seqnames = "chr1", ranges = IRanges(2, 6), strand = "*", score = 20, lolID = 'm'); seqlengths(gr2) <- 1e6
GRangeLN <- GRangesList("ex1" = gr1, "ex2" = gr2)
GRangeLN
 
  # Расщепление GRanges
GRangeL <- split(GenRange, rep(1:2, each = 2)) # получение GenomicRagneList объекта из 2 элементов по 2 блока в каждом
GRangeL[2] # второй элемент, 
GRangeL[[2]] # он-же, просто корректнее
GRangeL[1:2, "score"] # поднабор элементов и колонок метаданных
GRange <- c(GRangeL[[1]], GRangeL[[2]]) # склеиваем обратно в объект GRanges
GRange == GenRange #[1]  TRUE TRUE TRUE TRUE # ОНО!
 
  # базовый ввод-вывод идентичен GRanges кроме
elementLengths(GRangeLN)
GRangeLN$ex1
GRangeLN["ex2"]
  # манипуляции с диапазонами аналогичны
 
  # смешанная работа
ChromRangeL <- split(GenRange, names(GenRange)) # расщепление GRange в GRangeList по хромосомам
addGR <- GenRange # копирование
addGR[3] <- ChromRangeL[[1]] # переприсвоение третьего блока, элемент GRL нормально присваивается для GR
addGR # имена не меняются, переписан 3 блок, содержимое как у 1го
 
### эквивалентные циклам операции
sapply(GRangeLN, length) # возвращается вектор длин
lapply(GRangeLN, length) # возвращается список длин
mapply(c, GRangeLN, GRangeL) # не работает
Map(c, GRangeLN, GRangeL) # не работает
endoapply(c, GRangeLN, GRangeL) # не работает
mendoapply(c, GRangeLN, GRangeL) # не работает
 
### пересечения интервалов
overlaps <- findOverlaps(gr2, GRangeLN) # нахождения пересечений блоков в диапазонах и списках диапазонов, класс Hits
countOverlaps(gr1, GRangeLN) # подсчёт пересечений, возврат вектора
subsetByOverlaps(gr1, GRangeLN) # возврат пересечения в виде GRanges
match(GRangeLN, gr1) # устарело
gr1 %in% GRangeLN # устарело