Этот пример показывает, как сравнить целые геномы для организмов, что позволяет вам сравнивать организмы с очень другим разрешением относительно сравнения отдельных генов. Вместо того, чтобы просто фокусироваться на различиях между гомологичными генами, вы можете получить представление о крупномасштабных функциях геномной эволюции.
Этот пример использует два штамма Chlamydia, Chlamydia trachomatis и Chlamydophila pneumoniae. Это тесно связанные бактерии, которые вызывают различные, хотя и очень распространенные, заболевания у людей. Целые геномы доступны в базе данных GenBank ® для обоих организмов.
Вы можете скачать эти геномы с помощью getgenbank
функция. Сначала скачайте геном Chlamydia trachomatis. Заметьте, что геном округлый и чуть более одного миллиона б.п. в длину. Эти последовательности довольно большие, поэтому может потребоваться некоторое время для загрузки.
seqtrachomatis = getgenbank('NC_000117');
Далее скачать Chlamydophila pneumoniae. Этот геном также округлый и немного длиннее на 1,2 Мбит/с.
seqpneumoniae = getgenbank('NC_002179');
Для вашего удобства ранее загруженные последовательности включаются в MAT-файл. Обратите внимание, что данные в общедоступных репозиториях часто кураторятся и обновляются. Следовательно, результаты этого примера могут быть немного различными, когда вы используете современные наборы данных.
load('chlamydia.mat','seqtrachomatis','seqpneumoniae')
Очень простой подход для сравнения двух геномов состоит в том, чтобы выполнить парное выравнивание между всеми генами в геномах. Учитывая, что это бактериальные геномы, простой подход заключался бы в сравнении всех ORF в двух геномах. Однако данные GenBank включают больше информации о генах в последовательностях. Это сохранено в поле CDS структуры данных. Chlamydia trachomatis имеет 895 кодирующих областей, в то время как Chlamydophila pneumoniae имеет 1112.
M = numel(seqtrachomatis.CDS) N = numel(seqpneumoniae.CDS)
M = 895 N = 1112
Большинство записей CDS содержат трансляцию в аминокислотные последовательности. Первая запись CDS в данных Chlamydia trachomatis является гипотетическим белком длины 591 остатка.
seqtrachomatis.CDS(1)
ans = struct with fields: location: 'join(1041920..1042519,1..1176)' gene: [] product: 'hypothetical protein' codon_start: '1' indices: [1041920 1042519 1 1176] protein_id: 'NP_219502.1' db_xref: 'GeneID:884145' note: [] translation: 'MSIRGVGGNGNSRIPSHNGDGSNRRSQNTKGNNKVEDRVCSLYSSRSNENRESPYAVVDVSSMIESTPTSGETTRASRGVFSRFQRGLVRVADKVRRAVQCAWSSVSTRRSSATRAAESGSSSRTARGASSGYREYSPSAARGLRLMFTDFWRTRVLRQTSPMAGVFGNLDVNEARLMAAYTSECADHLEANKLAGPDGVAAAREIAKRWEQRVRDLQDKGAARKLLNDPLGRRTPNYQSKNPGEYTVGNSMFYDGPQVANLQNVDTGFWLDMSNLSDVVLSREIQTGLRARATLEESMPMLENLEERFRRLQETCDAARTEIEESGWTRESASRMEGDEAQGPSRAQQAFQSFVNECNSIEFSFGSFGEHVRVLCARVSRGLAAAGEAIRRCFSCCKGSTHRYAPRDDLSPEGASLAETLARFADDMGIERGADGTYDIPLVDDWRRGVPSIEGEGSDSIYEIMMPIYEVMDMDLETRRSFAVQQGHYQDPRASDYDLPRASDYDLPRSPYPTPPLPPRYQLQNMDVEAGFREAVYASFVAGMYNYVVTQPQERIPNSQQVEGILRDMLTNGSQTFRDLMRRWNREVDRE' text: [19x58 char]
Четвертая запись CDS относится к гену gatA, который имеет продукт глутамил-тРНК амидотрансфераза подмодуль А. Длина последовательности продукта составляет 491 остаток.
seqtrachomatis.CDS(4)
ans = struct with fields: location: '2108..3583' gene: 'gatA' product: [2x47 char] codon_start: '1' indices: [2108 3583] protein_id: 'NP_219505.1' db_xref: 'GeneID:884087' note: [7x58 char] translation: 'MYRKSALELRDAVVNRELSVTAITEYFYHRIESHDEQIGAFLSLCKERALLRASRIDDKLAKGDPIGLLAGIPIGVKDNIHITGVKTTCASKMLENFVAPFDSTVVRRIEMEDGILLGKLNMDEFAMGSTTRYSAFHPTNNPWDLERVPGGSSGGSAAAVSARFCPIALGSDTGGSIRQPAAFCGVVGFKPSYGAVSRYGLVAFGSSLDQIGPLTTVVEDVALAMDAFAGRDPKDSTTRDFFKGTFSQALSLEVPKLIGVPRGFLDGLQEDCKENFFEALAVMEREGSRIIDVDLSVLKHAVPVYYIVASAEAATNLARFDGVRYGHRCAQADNMHEMYARSRKEGFGKEVTRRILLGNYVLSAERQNIFYKKGMAVRARLIDAFQAAFERCDVIAMPVCATPAIRDQDVLDPVSLYLQDVYTVAVNLAYLPAISVPSGLSKEGLPLGVQFIGERGSDQQICQVGYSFQEHSQIKQLYPKAVNGLFDGGIE' text: [26x58 char]
Некоторые из Chlamydophila pneumoniae CDS имеют пустые переводы. Заполните их следующим образом. Сначала найдите все пустые переводы, затем отобразите первый пустой перевод.
missingPn = find(cellfun(@isempty,{seqpneumoniae.CDS.translation})); seqpneumoniae.CDS(missingPn(1))
ans = struct with fields: location: 'complement(73364..73477)' gene: [] product: 'hypothetical protein' codon_start: '1' indices: [73477 73364] protein_id: 'NP_444613.1' db_xref: 'GeneID:963699' note: 'hypothetical protein; identified by Glimmer2' translation: [] text: [10x52 char]
Функция featureparse
извлекает функции, такие как CDS, из структуры последовательности. Затем можно использовать cellfun
для применения nt2aa
к последовательностям с отсутствующими переводами.
allCDS = featureparse(seqpneumoniae,'Feature','CDS','Sequence',true); missingSeqs = cellfun(@nt2aa,{allCDS(missingPn).Sequence},'uniform',false); [seqpneumoniae.CDS(missingPn).translation] = deal(missingSeqs{:}); seqpneumoniae.CDS(missingPn(1))
ans = struct with fields: location: 'complement(73364..73477)' gene: [] product: 'hypothetical protein' codon_start: '1' indices: [73477 73364] protein_id: 'NP_444613.1' db_xref: 'GeneID:963699' note: 'hypothetical protein; identified by Glimmer2' translation: 'MLTDQRKHIQMLHKHNSIEIFLSNMVVEVKLFFKTLK*' text: [10x52 char]
Чтобы сравнить ген gatA при Chlamydia trachomatis со всеми генами CDS в Chlamydophila pneumoniae, поставьте for
цикл вокруг nwalign
функция. Можно также использовать локальное выравнивание (swalign
).
tic gatAScores = zeros(1,N); for inner = 1:N gatAScores(inner) = nwalign(seqtrachomatis.CDS(4).translation,... seqpneumoniae.CDS(inner).translation); end toc % |tic| and |toc| are used to report how long the calculation takes.
Elapsed time is 1.898762 seconds.
Гистограмма счетов показывает большое количество отрицательных счетов и один очень высокий положительный счет.
hist(gatAScores,100) title(sprintf(['Alignment Scores for Chlamydia trachomatis %s\n',... 'with all CDS in Chlamydophila pneumoniae'],seqtrachomatis.CDS(4).gene))
Как и ожидалось, высокая оценка соответствия с геном gatA у Chlamydophila pneumoniae.
[gatABest, gatABestIdx] = max(gatAScores); seqpneumoniae.CDS(gatABestIdx)
ans = struct with fields: location: 'complement(838828..840306)' gene: 'gatA' product: [2x47 char] codon_start: '1' indices: [840306 838828] protein_id: 'NP_445311.1' db_xref: 'GeneID:963139' note: [7x58 char] translation: 'MYRYSALELAKAVTLGELTATGVTQHFFHRIEEAEGQVGAFISLCKEQALEQAELIDKKRSRGEPLGKLAGVPVGIKDNIHVTGLKTTCASRVLENYQPPFDATVVERIKKEDGIILGKLNMDEFAMGSTTLYSAFHPTHNPWDLSRVPGGSSGGSAAAVSARFCPVALGSDTGGSIRQPAAFCGVVGFKPSYGAVSRYGLVAFASSLDQIGPLANTVEDVALMMDVFSGRDPKDATSREFFRDSFMSKLSTEVPKVIGVPRTFLEGLRDDIRENFFSSLAIFEGEGTHLVDVELDILSHAVSIYYILASAEAATNLARFDGVRYGYRSPQAHTISQLYDLSRGEGFGKEVMRRILLGNYVLSAERQNVYYKKATAVRAKIVKAFRTAFEKCEILAMPVCSSPAFEIGEILDPVTLYLQDIYTVAMNLAYLPAIAVPSGFSKEGLPLGLQIIGQQGQDQQVCQVGYSFQEHAQIKQLFSKRYAKSVVLGGQS' text: [26x58 char]
Парное выравнивание одного гена от Chlamydia trachomatis со всеми генами от Chlamydophila pneumoniae занимает чуть менее минуты на машине Intel ® Pentium 4, 2,0 ГГц под управлением Windows ® XP. Для выполнения этого расчета для всех 895 CDS в Chlamydia trachomatis потребовалось бы около 12 часов на одной машине. Раскомментируйте следующий код, если хотите запустить вычисление целиком.
scores = zeros(M,N); parfor outer = 1:M theScore = zeros(1,outer); theSeq = seqtrachomatis.CDS(outer).translation; for inner = 1:N theScore(inner) = ... nwalign(theSeq,... seqpneumoniae.CDS(inner).translation); end scores(outer,:) = theScore; end
Обратите внимание на командную parfor
используется во внешнем контуре. Если ваша машина сконфигурирована для запуска нескольких лабораторий, внешний контур будет выполнен параллельно. Полное понимание этой конструкции смотрите doc parfor
.
Распределения счетов для нескольких генов показывают шаблон. CDS (3) Chlamydia trachomatis является геном gatC. Это имеет относительно короткий продукт, аспартил/глутамил-тРНК амидотрансферазный подмодуль С, с только 100 остатками.
gatCScores = zeros(1,N); for inner = 1:N gatCScores(inner) = nwalign(seqtrachomatis.CDS(3).translation,... seqpneumoniae.CDS(inner).translation); end figure hist(gatCScores,100) title(sprintf(['Alignment Scores for Chlamydia trachomatis %s\n',... 'with all CDS in Chlamydophila pneumoniae'],seqtrachomatis.CDS(3).gene)) xlabel('Score');ylabel('Number of genes');
Лучший счет снова соответствует тому же гену в Chlamydophila pneumoniae.
[gatCBest, gatCBestIdx] = max(gatCScores); seqpneumoniae.CDS(gatCBestIdx).product
ans = 2x47 char array 'aspartyl/glutamyl-tRNA amidotransferase subunit' 'C '
CDS (339) Chlamydia trachomatis является геном uvrA. Это имеет очень длинный продукт, excinuclease ABC подмодуля A, длиной 1786.
uvrAScores = zeros(1,N); for inner = 1:N uvrAScores(inner) = nwalign(seqtrachomatis.CDS(339).translation,... seqpneumoniae.CDS(inner).translation); end figure hist(uvrAScores,100) title(sprintf(['Alignment Scores for Chlamydia trachomatis %s\n',... 'with all CDS in Chlamydophila pneumoniae'],seqtrachomatis.CDS(339).gene)) xlabel('Score');ylabel('Number of genes'); [uvrABest, uvrABestIdx] = max(uvrAScores); seqpneumoniae.CDS(uvrABestIdx)
ans = struct with fields: location: '716887..722367' gene: [] product: 'excinuclease ABC subunit A' codon_start: '1' indices: [716887 722367] protein_id: 'NP_445220.1' db_xref: 'GeneID:963214' note: [6x58 char] translation: 'MKSLPVYVSGIKVRNLKNVSIHFNSEEIVLLTGVSGSGKSSIAFDTLYAAGRKRYISTLPTFFATTITTLPNPKVEEIHGLSPTIAIKQNHFSHYSHATVGSTTELFSHLALLFTLEGQARDPKTKEVLDLYSKEKVLSTIMELSEGVQISILAPLLRKDIAAIHEYAQQGFTKVRCNGTIHPIYSFLTSGIPEDCSVDIVIDTLIKSENNIARLKVSLFTALEFGEGHCSVLSDEELMTFSTKQQIDDVTYTPLTQQLFSPHALESRCSLCQGSGIFISIDNPLLIDENLSIKENCCSFAGNCSSYLYHTIYQALADALNFNLETPWKDLSPEIQNIFLRGKNNLVLPVRLFDQTLGKKNLTYKVWRGVLNDIGDKVRYTTKPSRYLSKGMSAHSCSLCKGTGLGDYASVATWEGKTFTEFQQMSLNNWHVFFSKVKSPSLSIQEILQGLKQRLSFLIDLGLGYLTPNRALATLSGGEQERTAIAKHLGGELFGITYILDEPSIGLHPQDTEKLIGVIKKLRDQGNTVILVEHEERMISLADRIIDIGPGAGIFGGEVLFNGKPEDFLMNSSSLTAKYLRQELTIPIPESREAPTSWLLLTEATIHNLKNLSIRLPLARLIGVTGVSGSGKSSLINNTLVPAIESFLKQENPKNLHFEWGCIGRLIHITRDLPGRSQRSIPLTYIKAFDDIRELFASQPRSLRQGLTKAHFSFNQPQGACIQCQGLGTMTISDDDTPIPCSECQGKRYHSEVLEILYEGKNIADILDMTAYEAEKFFISHPKIHEKIHALCSLRLDYLPLGRPLSTLSGGEIQRLKLAHELLFASPKQTLYVLDEPTTGLHTHDIQALIEVLLSLTYLGHTVLVIEHNMHVVKVCDYVLELGPEGGDLGGYLLASCTPKDLIQLNTPTAKALAPYIEGSLDIPVVKSEPPSSPKSCDILIKDAYQNNLKHIDLALPRNSLIAIAGPGASGKHSLVFDILYASGNIAYAELFPPYIRQGLLKETPLPSVGEVKGLSPVISVRKCSSSNRSYHTIASALGLSNGLEKLFAILGEPFSPLTEEKLSKTTPQTIIDSLLKSYKDDYVTITSPIPLGSDLEIFLQEKQKEGFIKLYSEGNLYDLDERLPLNLIEPAIVIQHTKVSPKNSSSLLSAISVAFSLSSEIWIYISQKKQRKLSYSLGWKDKKGRLYPEITHQLLSSDHPEGRCLTCGGRGEILKISLEEHKEKIAHYTPLEFFSLFFPKSYMKPVQKLLKDENASQPLKLLTTKEFLNFCRGSSEFPGMNALLMEQLDTESDSPLIKPLLALTSCPACKGSGLNDYANYVRINNTSLLDIYQEDATFLESFLNTIGTDDTRSIIQDLMNRLTFISKVGLSYITLGQRQDTLSDGENYRLHLAKKISINLTNIVYLFEEPLSGLHPQDLPTIVQLLKELVANNNTVIATDRSCSLIPHADHAIFLGPGSGPQGGFLMDSDTEVCPSVDLHANVPQTEVCPKAPLSISKANHTRGSDRTLKVNLSIHHIQNLKVSAPLHALVAIGGVSGSGKTSLLLEGFKKQAELLIAKGTTTFSDLVVIDSHPIASSQRSDISTYFDIAPSLRAFYASLTQAKALNISSTMFSTNTKQGQCSDCQGLGYQWIDRAFYALEKRPCPTCSGFRIQPLAQEVLYEGKHFGELLHTPIETVALRFPFIKKIQKPLKALLDIGLGYLPIGQKLSSLSVSEKTALKTAYFLYQTPETPTLFLIDELFSSLDPIKKQHLPEKLRSLINSGHSVIYIDHDVKLLKSADYLIEIGPGSGKQGGKLLFSGSPKDIYASKDSLLKKYICNEELDS' text: [46x58 char]
Распределение счетов зависит от длины последовательностей, причем очень длинные последовательности потенциально имеют намного более высокие или более низкие счета, чем более короткие последовательности. Нормализоваться для этого можно несколькими способами. Одним из способов является деление на длины последовательностей.
lnormgatABest = gatABest./length(seqtrachomatis.CDS(4).product) lnormgatCBest = gatCBest./length(seqtrachomatis.CDS(3).product) lnormuvrABest = uvrABest./length(seqtrachomatis.CDS(339).product)
lnormgatABest = 16.8794 lnormgatCBest = 2.2695 lnormuvrABest = 78.9615
Альтернативным методом нормализации является использование счета самовыравнивания, то есть счета от выравнивания последовательности с самой собой.
gatASelf = nwalign(seqtrachomatis.CDS(4).translation,... seqtrachomatis.CDS(4).translation); gatCSelf = nwalign(seqtrachomatis.CDS(3).translation,... seqtrachomatis.CDS(3).translation); uvrASelf = nwalign(seqtrachomatis.CDS(339).translation,... seqtrachomatis.CDS(339).translation); normgatABest = gatABest./gatASelf normgatCBest = gatCBest./gatCSelf normuvrABest = uvrABest./uvrASelf
normgatABest = 0.7380 normgatCBest = 0.5212 normuvrABest = 0.5253
Вычисление выравнивания «все против всех» не только занимает много времени, но и генерирует большую матрицу счетов. Если вы ищете похожие гены по всем видам, то интересными показателями являются положительные счета, которые указывают на хорошее выравнивание. Однако большинство из этих счетов отрицательны, и фактические значения не особенно полезны для этого типа исследования. Разреженные матрицы позволяют хранить интересные значения более эффективным способом.
Разреженная матрица, spScores
, в MAT-файле chlamydia.mat
содержит положительные значения от всех по отношению ко всем парным вычислениям выравнивания, нормированным по счету самовыравнивания.
load('chlamydia.mat','spScores')
С помощью матрицы счетов вы можете посмотреть на распределение счетов генов Chlamydophila pneumoniae, выровненных с Chlamydia trachomatis, и на обратное из этого, генов Chlamydia trachomatis, выровненных с генами Chlamydophila pneumoniae
figure subplot(2,1,1) hist(max(spScores),100) title('Highest Alignment Scores for Chlamydophila pneumoniae Genes') xlabel('Score');ylabel('Number of genes'); subplot(2,1,2) hist(max(spScores,[],2),100) title('Highest Alignment Scores for Chlamydia trachomatis Genes') xlabel('Score');ylabel('Number of genes');
Помните, что в Chlamydophila pneumoniae 1112 CDS и только 895 в Chlamydia trachomatis. Высокое количество нулевых счетов в верхней гистограмме указывает, что многие дополнительные CDS у Chlamydophila pneumoniae не имеют хороших совпадений при Chlamydia trachomatis.
Другой способ визуализации данных - это просмотр положительных позиций точек в матрице счетов. Разреженная функция spy
является простым способом быстрого просмотра точечных графиков матриц. Это показывает некоторую интересную структуру на позициях высоких голевых матчей.
figure
spy(spScores > 0)
title(sprintf('Dot Plot of High-Scoring Alignments.\nNormalized Threshold = 0'))
Поднимите порог чуть выше, чтобы увидеть четкие диагональные линии на графике.
spy(spScores >.1)
title(sprintf('Dot Plot of High-Scoring Alignments.\nNormalized Threshold = 0.1'))
Помните, что это круговые геномы, и кажется, что начальные точки в GenBank произвольные. Переместите матрицу счетов так, чтобы лучшее соответствие первой CDS в Chlamydophila pneumoniae находилось в первой строке, чтобы увидеть четкий диагональный график. Это показывает синтению между двумя организмами.
[bestScore bestMatch] = max(spScores(:,1));
spy(spScores([bestMatch:end 1:bestMatch-1],:)>.1);
title('Synteny Plot of Chlamydophila pneumoniae and Chlamydia trachomatis')
Гены в разных геномах, которые связаны друг с другом, считаются гомологичными. Подобие может быть путем видообразования (ортологические гены) или репликации (паралогичные гены). Наличие матрицы скоринга позволяет вам искать оба типа отношений.
Самый очевидный способ найти ортологов - искать самую высокую оценку сопряжения для каждого гена. Если счет значителен, эти лучшие взаимные пары с большой вероятностью будут ортологичными.
[bestScores, bestIndices] = max(spScores);
Переменные bestIndices содержат индекс лучших взаимных пар для генов в Chlamydophila pneumoniae. Отсортируйте лучшие счета и создайте таблицу, чтобы сравнить описание лучших взаимных пар и обнаружить очень высокое сходство между лучшими взаимными парами.
[orderedScores, permScores] = sort(full(bestScores),'descend'); matches = [num2cell(orderedScores)',num2cell(bestIndices(permScores))',... num2cell((permScores))',... {seqtrachomatis.CDS(bestIndices(permScores)).product;... seqpneumoniae.CDS((permScores)).product; }']; for count = 1:7 fprintf(['Score %f\nChlamydia trachomatis Gene : %s\n',... 'Chlamydophila pneumoniae Gene : %s\n\n'],... matches{count,1}, matches{count,4}, matches{count,5}) end
Score 0.982993 Chlamydia trachomatis Gene : 50S ribosomal protein L36 Chlamydophila pneumoniae Gene : 50S ribosomal protein L36 Score 0.981818 Chlamydia trachomatis Gene : 30S ribosomal protein S15 Chlamydophila pneumoniae Gene : 30S ribosomal protein S15 Score 0.975422 Chlamydia trachomatis Gene : integration host factor alpha-subunit Chlamydophila pneumoniae Gene : integration host factor beta-subunit Score 0.971647 Chlamydia trachomatis Gene : 50S ribosomal protein L16 Chlamydophila pneumoniae Gene : 50S ribosomal protein L16 Score 0.970105 Chlamydia trachomatis Gene : 30S ribosomal protein S10 Chlamydophila pneumoniae Gene : 30S ribosomal protein S10 Score 0.969554 Chlamydia trachomatis Gene : rod shape-determining protein MreB Chlamydophila pneumoniae Gene : rod shape-determining protein MreB Score 0.953654 Chlamydia trachomatis Gene : hypothetical protein Chlamydophila pneumoniae Gene : hypothetical protein
Для просмотра данных в формате электронных таблиц можно использовать Редактор переменных.
open('matches')
Сравните описания, чтобы увидеть, что большинство лучших взаимных пар имеют идентичные описания.
exactMatches = strcmpi(matches(:,4),matches(:,5)); sum(exactMatches)
ans = 808
Возможно, более интересными являются лучшие взаимные пары, где описания не идентичны. Некоторые являются просто различиями в том, как описан один и тот же ген, но другие показывают совсем другие описания.
mismatches = matches(~exactMatches,:); for count = 1:7 fprintf(['Score %f\nChlamydia trachomatis Gene : %s\n',... 'Chlamydophila pneumoniae Gene : %s\n\n'],... mismatches{count,1}, mismatches{count,4}, mismatches{count,5}) end
Score 0.975422 Chlamydia trachomatis Gene : integration host factor alpha-subunit Chlamydophila pneumoniae Gene : integration host factor beta-subunit Score 0.929565 Chlamydia trachomatis Gene : low calcium response D Chlamydophila pneumoniae Gene : type III secretion inner membrane protein SctV Score 0.905000 Chlamydia trachomatis Gene : NrdR family transcriptional regulator Chlamydophila pneumoniae Gene : transcriptional regulator NrdR Score 0.903226 Chlamydia trachomatis Gene : Yop proteins translocation protein S Chlamydophila pneumoniae Gene : type III secretion inner membrane protein SctS Score 0.896212 Chlamydia trachomatis Gene : ATP-dependent protease ATP-binding subunit ClpX Chlamydophila pneumoniae Gene : ATP-dependent protease ATP-binding protein ClpX Score 0.890705 Chlamydia trachomatis Gene : ribonuclease E Chlamydophila pneumoniae Gene : ribonuclease G Score 0.884234 Chlamydia trachomatis Gene : ClpC protease ATPase Chlamydophila pneumoniae Gene : ATP-dependent Clp protease ATP-binding protein
Просмотрите данные для несоответствий.
open('mismatches')
Как только у вас есть матрица оценки, это открывает много возможностей для дальнейшего исследования. Для примера можно искать CDS, где существует несколько обратных CDS с высоким баллом. Для получения дополнительной информации см. Cristianini и Hahn [1].
[1] Cristianini, N. and Hahn, M.W., «Introduction to Computational Genomics: A Case Studies Approach», Cambridge University Press, 2007.