Chuột chia thành khoảng 35 họ. Mỗi họ có khoảng 350 loài. Trong những loài này có cả chuột nhắt hay chuột nhà và chuột cống. Xã hội chuột trong tự nhiên được tổ chức theo kiểu phân tán để tồn tại. Nhờ có chuột, hàng loạt loại thuốc đã ra đời để trị bệnh cho con người.
Về di truyền học, chuột cống có 22 cặp nhiễm sắc thể với 2,75 triệu cặp bazơ nitơ trong khi chuột nhắt chỉ có 20 cặp nhiễm sắc thể với 2,6 triệu cặp (người có 2,9 triệu). Cặp nhiễm sắc thể cuối cùng là cặp nhiễm sắc thể giới tính. Khoảng 90% gen của chuột cống có các gen tương ứng trên chuột nhắt [6].
Tiến hành chạy thử chương trình với dữ liệu vào là hai tập dữ liệu hệ gen chuột nhắt và chuột cống, tính số lượng gen giao nhau theo từng nhiễm sắc thể, quan sát thời gian thực hiện chương trình cho kết quả như trong bảng 3.3. Mục đích thử nghiệm: đánh giá thời gian, hiệu năng chạy chương trình.
Bảng 3.3. Thời gian (s) trung bình chạy chương trình Hệ gen chuột nhắt Hệ gen chuột cống Số lượng đoạn gen giao nhau Thời gian (s) chạy thuật toán dùng cây quản lí
đoạn
Thời gian (s) chạy thuật toán tìm kiếm tuần tự chr1 1697 chr1 3893 1769 0.453 chr2 2782 chr2 1877 936 0.593 chr3 1508 chr3 2237 1238 0.449 chr4 1950 chr4 1754 661 0.353 chr5 1736 chr5 1763 1187 0.250 chr6 1634 chr6 1278 1091 0.460 chr7 2808 chr7 1646 1698 0.182 chr8 1490 chr8 1542 1288 0.154 chr9 1645 chr9 1085 1009 0.228 chr10 1506 chr10 2193 1709 0.209 chr11 2344 chr11 770 931 0.106 chr12 1019 chr12 849 342 0.020 chr13 1160 chr13 949 681 0.094 chr14 1116 chr14 948 593 0.059 chr15 1075 chr15 986 525 0.033 chr16 970 chr16 792 555 0.040 chr17 1501 chr17 862 936 0.076 chr18 745 chr18 693 539 0.040 chr19 908 chr19 701 513 0.192 Tổng cộng 18201 3.991 31.918
3.4. Đánh giá độ phức tạp và kết quả thực hiện chƣơng trình
Tuy trong trường hợp xấu nhất, khi mà đoạn cần tìm giao bao cả cây, chương trình có độ phức tạp tương đương với việc duyệt thông thường. Nhưng với các bộ dữ liệu thực tế, chương trình nhanh chóng loại các tập đoạn không phù hợp và trả về kết quả trong thời gian cho phép.
Việc đọc dữ liệu từ tệp tiêu tốn thời gian bởi tốc độ đọc tệp chậm hơn khả năng xử lý, độ phức tạp O(n).
Việc thêm một đoạn vào cây như chương trước đã đề cập mất O(lgn), vì thế thao tác xây dựng cây mất O(nlg(n)), và xây dựng rừng các cây quản lí đoạn itContainer mất O(n.k.lg(n)) với k là số nhiễm sắc thể khác nhau trong
một tập gen hay là số cây quản lí đoạn khác nhau dựng được từ tệp ban đầu. Tốc độ xử lý chương trình: đối với dữ liệu gen hiện có việc tìm giao hai đoạn không quá 3s là kết quả chấp nhận được, điều này có ý nghĩa thực tiễn cao trong việc đưa ra được một công cụ lượng hóa mối quan hệ có ý nghĩa thống kê giữa các đặc tính di truyền, giải mã các đầu mối tiến hóa, chẩn đoán cấu trúc và chức năng của các gen.Việc so sánh các bộ dữ liệu đa dạng di truyền là căn bản để hiểu hệ gen sinh học. Các nhà nghiên cứu có thể sử dụng công cụ này để khám phá nhiều bộ dữ liệu lớn về các đoạn gen, để đặt các kết quả thí nghiệm của họ trong một bối cảnh rộng hơn, tìm lời giải cho các giả thuyết khoa học, từ đó thực hiện những khám phá mới.
Mối quan hệ giữa các tập hợp dữ liệu về gen thường được đo bằng cách xác định các đoạn giao nhau, nghĩa là, chúng chồng lên nhau và do đó chia sẻ một đoạn gen chung. Việc tìm ra phương pháp hiệu quả để đo mối quan hệ có ý nghĩa thống kê giữa nhiều bộ tính năng di truyền là rất quan trọng đối với những phát hiện trong tương lai.
3.4. Mở rộng hƣớng nghiên cứu
Chương trình thử nghiệm mới chỉ áp dụng hai trường hợp tìm giao các đoạn gen và đưa ra đoạn gen giao nhau giữa các tập này. Ta có thể sử dụng câu trúc cây quản lí đoạn trong cài đặt này để thực hiện thêm một số công việc sau:
Tìm ra các đoạn gen trong tập A không giao với bất kì đoạn gen nào trong tập B.
Tìm ra các đoạn gen trong tập B không giao với bất kì đoạn gen nào trong tập A.
Tìm số cặp ba zơ giao nhau của đoạn giao (độ dài đoạn gen giao nhau).
Tính xác suất các đoạn gen giao nhau trên tổng số đoạn gen. Con số này có ý nghĩa trong bài toán thống kê đặc tính di truyền.
Tìm đoạn gen trong tập các đoạn gen có vị trí gần nhất so với một đoạn gen biết trước.
Bài toán cũng có thể được mở rộng phạm vi trong trường hợp dữ liệu về các đoạn gen là phức tạp, người dùng có nhu cầu lưu trữ và tìm kiếm các thuộc tính là các chú giải gen.
Tìm giao của nhiều tập các đoạn gen một cách đồng thời. Chẳng hạn, nhu cầu tìm giao của tập các đoạn gen của virus sởi qua từng mùa bệnh khác nhau (các năm khác nhau, mỗi năm có một hệ gen khác nhau). Hay tìm giao các đoạn gen giữa các tập dữ liệu hệ gen của các chủng virus cúm (có tới hàng trăm loại virus cúm).v.v.
Ngành sinh tin học là một ngành mới và hấp dẫn rất nhiều nhà nghiên cứu trong và ngoài nước tham gia. Với các khám phá mới trong cấu trúc gen đã mở ra nhiều hướng nghiên cứu mới trong y sinh học, điều trị bệnh, phát
hiện tài năng, duy trì và bảo tồn, cải tạo nòi giống; trong giải mã lịch sử tiến hóa, v.v. Với nguồn dữ liệu trong tin sinh học tăng theo từng giờ. Việc tìm kiếm thông tin cũng như khai thác các thông tin chứa trong nguồn dữ liệu đó lúc nào cũng cần thiết. Vì thế, việc có thể tìm kiếm với ít thời gian nhất và có hiệu quả luôn được các nhà nghiên cứu tìm tòi và phát triển. Luận văn được thực hiện với mục tiêu nghiên cứu, áp dụng cấu trúc dữ liệu cây quản lí đoạn và thao tác trên cấu trúc này để giải quyết bài toán tìm giao của các đoạn gen và để tối ưu thời gian xử lý, giới hạn phạm vi nguồn dữ liệu tìm kiếm do nguồn dữ liệu lớn. Việc kiểm thử được ứng dụng tìm giao tập các đoạn gen trên nguồn dữ liệu về hệ gen người, hệ gen chuột, hệ gen virus Ebola cho kết quả đúng đắn, chính xác và nhanh chóng.
KẾT LUẬN
Luận văn đã thu được một số kết quả cơ bản sau:
Luận văn đã hệ thống hóa được các vấn đề xung quanh cấu trúc dữ liệu cây quản lí đoạn.
Luận văn cũng đã đưa ra được một số kỹ thuật được dùng để thực hiện các thao tác trên cây quản lí đoạn.
Luận văn đã đề cập đến một lĩnh vực nghiên cứu mới, hấp dẫn hiện nay là tin sinh học.
Luận văn được thực hiện với mục tiêu nghiên cứu, áp dụng cấu trúc dữ liệu cây quản lí đoạn và thao tác trên cấu trúc này để giải quyết bài toán tìm giao của các đoạn gen, tối ưu thời gian xử lý, giới hạn phạm vi nguồn dữ liệu tìm kiếm trên nguồn dữ liệu lớn.
Luận văn cũng đã đưa ra được các trường hợp ví dụ mẫu điển hình, các trường hợp kiểm thử tiêu biểu áp dụng chương trình cài đặt cấu trúc dữ liệu cây quản lí đoạn và thực hiện các thao tác trên nó.
Như vậy những vấn đề mà luận văn nêu ra là phù hợp với yêu cầu của thực tiễn, nghiên cứu trong giai đoạn hiện nay, các nhiệm vụ đặt ra đã hoàn thành. Luận văn đã đạt được mục đích đề ra.
TÀI LIỆU THAM KHẢO Tài liệu tiếng Việt
[1] Nguyễn Cường (2013), Các cơ sở dữ liệu sinh học,
http://www.tinsinhhoc.org/index.php/genomics/3-bio-database.html, truy cập ngày 13/01/2015.
[2] Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng (2009), Tài liệu chuyên tin học, NXB Giáo dục Việt Nam, Quyển
2.
[3] Hồ Sĩ Đàm (chủ biên), Nguyễn Thanh Tùng, Lê Minh Hoàng, Nguyễn Thanh Hùng, Đỗ Đức Đông (2011), Tài liệu tập huấn phát triển chuyên môn giáo viên Trường THPT Chuyên (tài liệu lưu hành nội bộ), Bộ giáo
dục và đào tạo.
[4] Vũ Đình Hoà, Giáo trình Toán rời rạc 5, NXB Giáo dục.
[5] Trần Văn Lăng, Ứng dụng Tin học trong việc giải quyết một số bài toán của Sinh học phân tử, NXB Giáo dục, 2008.
Tài liệu tiếng Anh
[6] Chaitanya R Sanna1, Wen-Hsiung Li, Liqing Zhang (2008), Overlapping
gens in the human and mouse genomes,
http://www.biomedcentral.com/1471-2164/9/169, 01/02/2015.
[7] F. P. Preparata and M. I. Shamos (1985), Computational Geometry: An Introduction, Springer-Verlag.
[8] Izabela Makalowska , Chiao-Feng Linb, Wojciech Makalowski (2005),
[9] M. de Berg, O. Cheong, M. van Kreveld, M. Overmars (2000),
Computational Geometry: algorithms and applications, third edition,
Springer.
[10] Paux E, Sourdille P, Salse J (2008), A Physical Map of the 1-Gigabase Bread Wheat Chromosome 3B, Science 322 (5898), p101–104.
[11] Ucsc genome browser website, bed format,
http://genome.ucsc.edu/FAQ/FAQformat.html#format1, 01/02/2015. [12] Ucsc genome browser website, table browser,
PHỤ LỤC A. Xây dựng lớp itContainer package intervaltreeinbios; import java.awt.Color; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; class itContainer {
List<ITtree> listIT = new ArrayList<>(); List<String> chromeName = new ArrayList<>(); public itContainer() {}
void clear() {
listIT = new ArrayList<>(); chromeName = new ArrayList<>(); }
int findChromeName(String chName) {
for (int i = 0; i < chromeName.size(); i++) { if (chromeName.get(i).equals(chName)) { return i; } } return -1; }
void loadFromFile(String pathFile) throws IOException, NumberFormatException {
BufferedReader br = null; try {
br= new BufferedReader(new FileReader(pathFile)); } catch (FileNotFoundException ex) {
Logger.getLogger(itContainer.class.getName()).log(Level.SEVER E, null, ex);
}
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) { String sTokens[] = sCurrentLine.split("\\s+"); if ("-1".equals(sTokens[0])) { break; } int t = findChromeName(sTokens[0]); if (t == -1) { chromeName.add(sTokens[0]); listIT.add(new ITtree()); t = chromeName.size() - 1; } int u = Integer.parseInt(sTokens[1]); int v = Integer.parseInt(sTokens[2]); listIT.get(t).addSegment(new Interval(u, v)); } } } B. Lớp ITTree package intervaltreeinbios; import java.util.ArrayList; import java.util.List;
class ITtree {
ITnode root;
public ITtree() {root = null;} void addSegment(Interval i) { if (root == null) {
root = new ITnode(i); return; } int l = root.i.low; if (i.low < l) { root.left.addSegment(i); } else { root.right.addSegment(i); } if (root.max < i.high) { root.max = i.high; } } List<Interval> overlapSearch(Interval i) { if (root == null) {
return new ArrayList<>(); }
List<Interval> tmp = new ArrayList<>();
if (doOverlap(root.i, i)) {tmp.add(root.i);} if (root.left.root != null) { if (root.left.root.max >= i.low) { tmp.addAll(root.left.overlapSearch(i)); } } return tmp; }
private boolean doOverlap(Interval i1, Interval i2) { return i1.low <= i2.high && i2.low <= i1.high; }
public void inorder() { if (root == null) { return; } root.left.inorder(); System.out.println("[" + root.i.low + ", " + root.i.high + "] max = " + root.max); root.right.inorder(); } List<Interval> inorderList(){
List<Interval> ans = new ArrayList<>(); if (root == null) { return ans; } ans.addAll(root.left.inorderList()); ans.add(root.i); ans.addAll(root.right.inorderList()); return ans; }
public String inorderS() {
if (root == null) {return "";}
return root.left.inorderS() + "[" + root.i.low + ", " +root.i.high + "]\n" + root.right.inorderS();
} }