> For the complete documentation index, see [llms.txt](https://scls-cs.gitbook.io/scls-apcs-lab/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://scls-cs.gitbook.io/scls-apcs-lab/lab5-dna.md).

# Lab5: DNA

### 什么是DNA？

DNA是Deoxyribonucleic Acid（脱氧核醣核酸）的缩写，存在于人体细胞之中。它的结构由两螺旋长链组成（如下图），长链上有四种像英文字母一样的「代码」，分别是：A、T、C和G。我们的身体，便是依靠这四种DNA代码（碱基）以不同排序传递遗传讯息。

<img src="/files/1aQCmo7b3m5RJOYIJxIe" alt="" data-size="original">

四种DNA代码A、T、C、G环环相扣，形成DNA长链。不过在整条长链中，只有部分片段携带了遗传讯息，这些片段称为基因(gene)。

基因是遗传的基本单元。在基因中三个代码为一组，称为密码子（codon）。密码子可以编码氨基酸，例如GCU编码丙氨酸，GAA编码谷氨酸。氨基酸是构成蛋白质的基本单位。

基因片段有一个起点，就像程序从main()开始执行一样。基因片段是从**ATG**这个密码子开始的，称作**起始密码子（start codon)**；基因片段以**终止密码子(stop codon)**&#x7ED3;束，终止密码子可以是**TAA, TAG, 或者TGA中的任意一个**。

计算生物学家通过扫描生物的DNA来记录一些特殊指标，其中一个指标叫做**GC含量**。GC含量是指DNA片段中G和C质量之和所占的比率。高GC含量的DNA片段通常意味着携带重要的遗传信息。

### 你的任务

<mark style="color:green;">你有两个任务，完成任务一才可以解锁任务二。</mark>

**任务一**：

你需要读取一个文件（见dna.txt)，该文件包含多条DNA片段。对于每个片段，你的程序需要统计A、T、C、G分别出现的次数。此外，程序还需要计算四种碱基的质量占比。

片段中可能会存在"-"。它们不携带遗传信息，但是它们具有质量。

另外，程序需要记录DNA片段中密码子的信息，来预测该序列是否是可以编码蛋白质的基因(**protein-coding gene**)。在本次任务中，protein-coding gene是一个具有下列特征的字符串：

* 以起始密码子开始（ATG）
* 以终止密码子结束（TAA，TAG或TGA任意一种）
* 包含至少5个密码子（包括起始密码子和终止密码子）
* GC含量不低于30%

（注：上述特征只是为了本次实验而做的近似假设，并非生物学中真实的限定条件）

DNA.txt中包含10个DNA片段。第一行是片段名，第二行为DNA序列。序列中包含A、T、C、G和-。

**注意：碱基可以用大写字母，或者小写字母表示。**

**dna.txt(部分)**

```
protein 1
ATGCTACCATGGTAG
protein 2
ATgCCATGgACAATGGATCCcAtGGATTgA
protein 3
CCATT-AATGATCA-CAGTT
...
```

-代表没有编码功能的片段。绝大部分情况下程序可以忽视它，但是它仍然具有一定质量。

四种碱基，以及“-”的摩尔质量(grams/mol)分别为：

* A: 135.128
* C: 111.103
* G: 151.128
* T：125.107
* -：100.000

{% file src="/files/sQqwDLtTHM3pDuecOB4d" %}

#### 程序输出

程序运行开始后，需要用户提供输入文件和输出文件的名称（或者路径）。你的程序需要读入输入文件，将处理后的结果保存在输出文件里。

程序运行后的结果应该如下所示：

```
This program reports information about DNA
nucleotide sequences that may encode proteins.
Input file name? dna.txt
Output file name? output.txt
```

程序生成的output.txt结果如下所示（部分）：

```
Region Name: protein 1
Nucleotides: ATGCTACCATGGTAG
Nuc. Counts: [4, 3, 4, 4]
Total Mass%: [27.3, 16.8, 30.6, 25.3] of 1978.8
Codons List: [ATG, CTA, CCA, TGG, TAG]
Is Protein?: YES

Region Name: protein 2
Nucleotides: ATGCCATGGACAATGGATCCCATGGATTGA
Nuc. Counts: [9, 6, 8, 7]
Total Mass%: [30.7, 16.8, 30.5, 22.1] of 3967.5
Codons List: [ATG, CCA, TGG, ACA, ATG, GAT, CCC, ATG, GAT, TGA]
Is Protein?: YES

Region Name: protein 3
Nucleotides: CCATTA-ATCATGACA-GTT
Nuc. Counts: [6, 4, 2, 6]
Total Mass%: [32.3, 17.7, 12.1, 29.9] of 2508.1
Codons List: [CCA, TTA, ATC, ATG, ACA, GTT]
Is Protein?: NO
```

* 第一行：片段名
* 第二行：DNA片段（全部为大写字母）
* 第三行：A、C、G、T分别出现的次数
* 第四行：A、C、G、T的质量占比（取一位小数）
* 第五行：片段中出现的所有密码子
* 第六行：是否为protein-coding gene

{% hint style="info" %}
常见问题：

**Q：有没有可能起始密码子（ATG）和终止密码子中间，存在另外的ATG？**

A：有可能，但新的ATG不是起始密码子，而是基因片段的一部分。

**Q：是否可能出现ATG和终止密码子之间只有两个碱基的情况？**

A：从起始密码子开始，每3个碱基为一组。例如ATG-CA-TAG-A...的前三个密码子为ATG，CAT, AGA，这里TAG并不是这个序列的终止密码子。

**Q：我可以用OnlineGDB完成这个Lab吗？**

A：可以。你需要将输入文件放在同一个project下。可以参考下面链接：

<https://www.onlinegdb.com/Hyvi2l-_f>
{% endhint %}

将output.txt生成之后，可以来401办公室验证结果并领取奖品。验证成功可以开始完成任务二。

#### 任务二

果蝇作为遗传学研究的经典模式动物，主要用来研究真核生物遗传学的基本原理以及概念。1910年，摩尔根发现白眼果蝇并将其用于遗传学研究，摩尔根验证了孟德尔学说，发现并解释了伴性遗传，提出了连锁遗传，绘制了果蝇遗传图谱。因此1933年的诺贝尔医学奖授予了摩尔根，以表彰他在研究染色体在遗传方面的功能中所做出的贡献。1946年，摩尔根的学生，被誉为“果蝇的突变大师”的米勒，证明X射线能使果蝇的突变率提高150倍，因而成为诺贝尔奖获得者。

本次任务，你需要下载果蝇的染色体DNA序列，选取Y染色体进行扫描。

果蝇Y染色体DNA序列文件（数据来源：NCBI）：

{% file src="/files/tNauTOp0oVYwAh5oBORx" %}

序列中除了A,T,C,G以外，还有其它字符（例如N），这些非碱基的字符当作"-"来处理。

你的程序需要包含DNA序列中所有可能的protein-encoding gene，每条片段包含：

* 片段的起始位置和结束位置
* GC含量

<pre><code><strong>/*Below is the example output template*/
</strong><strong>Section1: 
</strong>Start Codon Index: 1006
Stop Codon Index: 1895
GC Mass%: 45% 

Section2: 
Start Codon Index: 3948
Stop Codon Index: 4652
GC Mass%: 32% 

...
</code></pre>

将结果保存到output\_y.txt中，可以来401办公室验证结果并领取奖品。

### 提交方式：

* 可以个人参加，也可以组队，最多三人一组。
* 所有任务提交的截止时间为11月25日中午十二点。
