вторник, 26 февруари 2013 г.

ДНК и телесната идентичност


Човешкият геном се състои от дезоксирибонуклеинова киселина (ДНК) и съдържа в себе си основната информация за изграждането на човешкото тяло. ДНК се намира в митохондриите и в 23 двойки хромозоми, разположени в клетъчното ядро. ДНК може да се представи като последователност от 4 вида нуклеотиди:  аденин (A), цитозин (C), гуанин (G) и тимин (T). Така ДНК може да се представи като текст, написан само с буквите A,C,G и T.
В типичния човешки геном се съдържат общо 3 070 537 685 нуклеотидни двойки - "букви" от генетичния код, разположени в двойна спирала. Това прави 6 141 075 370 бита (по 2 бита на нуклеотид), или към 733 мегабайта.

Понякога се твърди, че това е малък обем информация, по-малък от обема на съвременния компютърен софтуер. Такива твърдения са неоснователни. Софтуерът се състои от програми, които представляват последователности от команди на съответния компютърен хардуер. А геномът се състои от ДНК, която задава последователност от команди към биологичните механизми за синтезиране на белтъци. Синтезираните белтъци образуват тримерни структури, които изграждат живото тяло.

Ако сравним по сложност двете "машини" - един компютърен процесор и биологичните механизми, се вижда голямата разлика в сложността им. Докато процесорът изпълнява само команди за елементарна обработка на данни (числа, символи), то биологичните механизми могат да бъдат представени като сложна "машина", която произвежда последователности от аминокиселини, изграждащи първичната структура на белтъците.
По-нататък, съгласно законите на физиката, белтъкът се деформира в глобула или друга тримерна структура, притежаваща сложни свойства, проявяващи се при взаимодействията с други молекули.
Така компютърната програма представлява последователност от команди към доста проста машина (процесор), а генетичният код от генома представлява последователност от команди към много по-сложна биофизична "машина".

Частите на генома, които кодират образуването на белтък, се наричат гени. Освен гени, в ДНК има и части, които изпълняват други функции.
Генетичният код - езикът, на който е записана генетичната информация, допуска синонимия - една и съща генетична информация може да бъде записана по различни начини, с различни кодови думи - синоними, означаващи едно и също нещо.

Поради това е възможно да съществуват двама човека, които имат напълно еднакви тела, но различен генетичен код.
Също така, ако някакво външно въздействие, например радиация, промени генетичния код, тялото може да не се промени (ако се е случило промяната в генетичния код да бъде синонимична).

Информацията в човешкия геном


Един практически пример. На следващия сайт се намират всички файлове с цифровото копие на генетичния код на представителен човешки геном - секвенцираната (разчетена с машина) последователност от нуклеотиди в цялата ДНК: http://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes/ .

Секвенциите са представени в отделни файлове с формат FASTA и ZIP-компресия. Общият обем на информацията в цялата директория с компресираните файлове е 948 746 377 байта, или приблизително 905 мегабайта.
Файловете се декомпресират с WinRAR, след което се вижда съдържанието им, представено в текстовия формат FASTA. Общият обем на декомпресираните файлове става 2.97 гигабайта.

Човешкият геном в основата си се състои от 22 автосомни хромозоми, чието съдържание (генетичен ДНК-код) е дадено във файловете:

chr1.fa.gz   70M
chr2.fa.gz   75M
...
chr21.fa.gz  11M
chr22.fa.gz  11M

Съдържанието на митохондриалната ДНК (mtDNA) е във файла:

chrM.fa.gz   5.4K

И накрая, съдържанието на половите хромозоми X и Y:

chrX.fa.gz   47M
chrY.fa.gz   7.9M

Тъй като в този конкретен геном има X и Y хромозома, значи това е мъжки геном  (в един женски геном би трябвало да ЛИПСВА Y хромозома). От автосомните хромозоми (1 - 22) най-големи са хромозомите 1 и 2 (70 и 75 мегабайта съответно), а най-малки - 21 и 22 (по около 11 мегабайта). "Женската" хромозома X също е твърде голяма (47M), а "мъжката" Y е изключително малка - 7.9M. Най-малко информация се съдържа в митохондриалната ДНК - едва 5.4 килобайта.

Форматът за данни FASTA


За представянето на генетичните последователности в биоинформатиката се използва форматът за данни FASTA: http://en.wikipedia.org/wiki/FASTA_format .

Пример. Един ген представлява част от ДНК (последователност от нуклеотиди), която кодира образуването на верига от аминокиселини - полипептид или белтък. Например генът на човешкия миоглобин във FASTA формат изглежда така:

>ENA|CAA25109|CAA25109.1 Homo sapiens (human) myoglobin : Location:1..465
ATGGGGCTCAGCGACGGGGAATGGCAGTTGGTGCTGAACGTCTGGGGGAAGGTGGAGGCT
GACATCCCAGGCCATGGGCAGGAAGTCCTCATCAGGCTCTTTAAGGGTCACCCAGAGACT
CTGGAGAAGTTTGACAAGTTCAAGCACCTGAAGTCAGAGGACGAGATGAAGGCATCTGAG
GACTTAAAGAAGCATGGTGCCACTGTGCTCACCGCCCTGGGTGGCATCCTTAAGAAGAAG
GGGCATCATGAGGCAGAGATTAAGCCCCTGGCACAGTCGCATGCCACCAAGCACAAGATC
CCCGTGAAGTACCTGGAGTTCATCTCGGAATGCATCATCCAGGTTCTGCAGAGCAAGCAT
CCCGGGGACTTTGGTGCTGATGCCCAGGGGGCCATGAACAAGGCCCTGGAGCTGTTCCGG
AAGGACATGGCCTCCAACTACAAGGAGCTGGGCTTCCAGGGCTAG

(Източник: http://www.ebi.ac.uk/ena/data/view/CAA25109)

Във формата за данни FASTA първият ред е служебен и започва със символа ">". Следва последователността (секвенцията, Sequence) от нуклеотиди, изграждаща тази част от ДНК. Всеки един от нуклеотидите (от общо 4 възможни) се означава така:

A - adenosine
C - cytidine
G - guanosine
T - thymidine

Синтезът на белтъци


Всяка аминокиселина (от всичките 20, които изграждат човешкото тяло) се кодира в ДНК с последователност от 3 нуклеотида (кодон) по следната кодова таблица на обратния ДНК-код:

Ala/A -> GCT, GCC, GCA, GCG
Arg/R -> CGT, CGC, CGA, CGG, AGA, AGG
Asn/N -> AAT, AAC
Asp/D -> GAT, GAC
Cys/C -> TGT, TGC
Gln/Q -> CAA, CAG
Glu/E -> GAA, GAG
Gly/G -> GGT, GGC, GGA, GGG
His/H -> CAT, CAC
Ile/I -> ATT, ATC, ATA
START -> ATG
Leu/L -> TTA, TTG, CTT, CTC, CTA, CTG
Lys/K -> AAA, AAG
Met/M -> ATG
Phe/F -> TTT, TTC
Pro/P -> CCT, CCC, CCA, CCG
Ser/S -> TCT, TCC, TCA, TCG, AGT, AGC
Thr/T -> ACT, ACC, ACA, ACG
Trp/W -> TGG
Tyr/Y -> TAT, TAC
Val/V -> GTT, GTC, GTA, GTG
STOP  -> TAA, TGA, TAG

Например, редът "Ala/A -> GCT, GCC, GCA, GCG" означава, че аминокиселината Alanine се кодира в генетичния код с една от последователностите от нуклеотиди GCT, GCC, GCA или GCG, които са СИНОНИМИ. Съответно, аминокиселината Tyrosine (Tyr/Y) се кодира с кодона TAT или TAC. Аминокиселината Tryptophan (Trp/W) може да се кодира с една единствена кодова дума - TGG, без възможност за СИНОНИМИЧНА замяна.

Генът започва с кодона ATG (START) и завършва с кодона TAG (STOP). Общата дължина на гена на човешкия миоглобин от примера е 465 символа и е кратна на 3:  465/3 = 155. Значи, първичната структура на този миоглобин е верига от 153 аминокиселинни остатъка:

Gly/G - Leu/L - Ser/S - ... - Gly/G

Така генетичният код представлява програма (последователност от команди) за синтезиране на белтъци, които образуват човешкото тяло.
Ако настъпи мутация (случайна промяна на някои букви), която е СИНОНИМИЧНА, като например ако TAT се превърне в TAC, това ще си остане пак кодът на аминокиселината Tyr/Y при което тялото няма да се промени, но генетичният код ще запази промяната, която може да се прояви при някакви труднопредсказуеми условия в бъдещето.

вторник, 19 февруари 2013 г.

Откриване на подпрагови сигнали

При системите за измерване, в които съществува праг, възникват проблеми с измерването на величини, по-малки от прага. Такива системи с прагова характеристика са много разпространени - електронни устройства, различни измервателни инструменти, както и биологични органи за възприемане.

Заинтересувах се от тези проблеми, тъй като разработвам система за работа със свръхслаби сигнали (електроенцефалограма):  Инструментални усилватели .

Системата се състои от аналогова част (усилвател на биоелектрични сигнали, комбиниран с филтри) и цифрова част. Сигналът от изхода на аналоговата част се подава на аналого-цифров преобразувател, който има изразена прагова характеристика.

При аналого-цифровото преобразуване съществува праг, равен на стойността на най-младшия бит. Когато входният сигнал има по-малка стойност от този праг, аналого-цифровият преобразувател не реагира по никакъв начин.

Това са много общи проблеми, които възникват винаги, когато се извършва квантуване. Изглежда невъзможно да се работи със стойности, по-малки от един квант, но все пак съществуват методи, с които положението може да се подобри.

Собственият шум на канала обикновено се счита за вреден фактор, ограничаващ възможността за работа със слаби сигнали: Собственият шум на входа . Но в някои случаи шумът може да се използва за повишаване на чувствителността, например чрез използване на стохастичен резонанс.

Стохастичен резонанс


Да разгледаме подпраговия синусоидален сигнал A sin ωt . Неговата амплитуда е недостатъчна за пресичане на прага Δ. Ако към този сигнал добавим адитивен шум ξ(t), сумарният сигнал започва да пресича прага в случайни моменти, когато е изпълнено условието:

[ A sin ωt + ξ(t) ] > Δ

Нека във всеки момент, когато сигналът пресича прага (в една посока), се генерира игловиден импулс (с константна, малка ширина и константна височина):

Система със стохастичен резонанс

Сигналът на графиката е получен чрез числено моделиране на синусоида, сумирана с гаусов шум. Така се получава случайна последователност от импулси. При определени условия по тази случайна последователност може да се възстанови подпраговия синусоидален сигнал. Когато шумът е слаб, сумарният сигнал пресича твърде рядко прага. При увеличаване на интензивността на шума прагът се пресича все по-често.

Същността на явлението стохастичен резонанс (stochastic resonance, SR) се състои в това, че при строго определена, оптимална интензивност на шума отношението сигнал/шум достига максимална стойност.

Зависимостта на отношението сигнал/шум (SNR) за сигнала с основна честота ω от стандартното отклонение σ на гаусовия шум ξ(t) достига максимум при възникването на стохастичен резонанс:

Стохастичен резонанс

Получил съм тази графика чрез математическо моделиране на сигнала
[ A sin ωt + ξ(t) ] > Δ
при следните параметри:
  •  стандартно отклонение на гаусовия шум ξ(t):  0.0 < σ < 24.0
  •  горна гранична честота на шума ξ(t):  fc= 100000Hz
  •  амплитуда на синусоидалния сигнал:  A = 1.0
  •  праг:  Δ = 3.0
От тази графика се вижда, че отношението сигнал/шум (SNR) достига максимална стойност 27.3dB при стандартно отклонение на шума σ=4.3 . Това именно е интензивността на шума, при която възниква стохастичен резонанс.

При намаляване на стойността на σ отношението сигнал/шум рязко спада до 0.0dB, а при увеличаване на стойността на σ спада плавно до стойност 5.0dB при σ=23.9.

събота, 9 февруари 2013 г.

Преместване на файлове

Методът renameTo на класа File в езика Java извършва преименуване на файл. Това може да се използва за преместване на файл от една директория в друга.

В една програма на Java, работеща под Linux, срещнах проблеми с реализираното по този начин преместване на файл от една директория в друга.

В следващата конструкция, с оператор if, методът renameTo упорито връщаше резултат false и файлът просто не се появяваше в целевата директория:

if(srcFile.renameTo(dstFile))

Когато замених предишния ред със следващата конструкция, всичко тръгна нормално и файлът се преместваше успешно от едната директория в другата:

if(patchMoveFile(srcFile.getAbsolutePath(),
                 dstFile.getAbsolutePath()))

Тук новонаписаният допълнителен метод patchMoveFile премества файл по най-прост начин, като чете файла, записва го в друг файл и след това изтрива първия файл:

private boolean patchMoveFile(String srcFileName,
                              String dstFileName)
{
  InputStream inStream = null;
  OutputStream outStream = null;
  boolean r = false;

  try
  {
    File inFile = new File(srcFileName);
    File outFile = new File(dstFileName);     
    inStream = new FileInputStream(inFile);
    outStream = new FileOutputStream(outFile);
    byte[] buffer = new byte[1024];
    int length;
  
    while ((length = inStream.read(buffer)) > 0)
    {
      outStream.write(buffer, 0, length);
    }
    inStream.close();
    outStream.close();
    inFile.delete();
    r = true;
  }
  catch(IOException e)
  {
    e.printStackTrace();
  }
  return r;
} // patchMoveFile

Значи, конструкцията с метода renameTo не искаше да работи, а с метода patchMoveFile заработи правилно в съвсем същия контекст на програмата/системата.

Това ми напомня, че за постигането на надеждност на програмите трябва да се използват конструкции, които работят без проблеми в различни възможни контексти/условия/системи/ситуации.