TÓM TẮT
Hiện nay với sự phát triển của khoa học kỹ thuật cùng với sự kết hợp liên thông
giữa các ngành khoa học đã mở ra những thuận lợi to lớn cho việc nghiên cứu và phát
triển. Tin sinh học – một ngành khoa học mới ra đời với mục đích hỗ trợ, cung cấp
thông tin dữ liệu sẽ là một công cụ hữu ích giúp giải quyết những vấn đề khó khăn
trong nghiên cứu sinh học trên thực tế.
Cây xoài là loại cây ăn quả nhiệt đới quan trọng ở Việt Nam có giá trị kinh tế
cao. Chính vì thế việc xác định các giống xoài, phân tích sự đa dạng di truyền, lập bản
đồ các gen trong bộ gen là mục tiêu hiện nay. Với các ưu điểm của một marker rất hữu
dụng trong nghiên cứu di truyền, chúng tôi đã tiến hành xây dựng phương pháp phát
hiện marker microsatellite từ nguồn cơ sở dữ liệu EST hiện có.
Phương pháp: chúng tôi đã sử dụng các chương trình Perl est_trimmer.pl,
misa.pl, phần mềm BioEdit với công cụ CAP contig assembly program, phần mềm
Primer3 và gói công cụ ssrfinder_1_0.
Kết quả đạt được:
Tải được các trình tự EST của cây xoài có trong nguồn cơ sở dữ liệu của
NCBI
Xác định được 267 microsatellite bao gồm các dạng dinucleotide
(4.12%), trinucleotide (95.51%) và tetranucleotide (0.37%)
Xác định vùng bảo tồn và thiết kế primer cho 6 loại microsatellite là các
loại microsatellite sau CAA, CCA, CAT, TCA, TCT, TGA
MỤC LỤC
CHưƠNG TRANG
Trang tựa
Lời cảm tạ iii
Tóm tắt iv
Summary .v
Mục lục vi
Danh sách các chữ viết tắt x
Danh sách các bảng xi
Danh sách các hình .xii
1. MỞ ĐẦU 1
1.1. Đặt vấn đề 1
1.2. Mục đích và yêu cầu 1
1.2.1. Mục đích 1
1.2.2. Yêu cầu 2
1.3. Giới hạn .2
2. TỔNG QUAN TÀI LIỆU .3
2.1. Giới thiệu về tin sinh học 3
2.1.1. Định nghĩa .3
2.1.2. Mối quan hệ giữa sinh học và tin học 3
2.1.3. Tầm quan trọng của tin sinh học .4
2.1.4. Mục tiêu của tin sinh học 5
2.1.5. Vai trò của tin sinh học 5
2.1.6. Một số bài toán lớn trong tin sinh học .6
2.2. Khái quát về dữ liệu trình tự 7
2.2.1. Lịch sử .7
2.2.2. Một số cơ sở dữ liệu trên thế giới 8
2.2.2.1. NCBI .8
2.2.2.2. EBI .8
2.2.2.3. DDBJ và PDBj 9
2.3. Ngôn ngữ lập trình Perl .9
2.3.1. Giới thiệu về Perl và lịch sử phát triển 9
2.3.2. Ứng dụng .10
2.3.3. Perl và tin sinh học 10
2.3.4. Các thành phần cơ bản trong Perl 11
2.3.4.1. Dữ liệu vô hướng .11
2.3.4.2. Các cấu trúc điều khiển .13
2.3.4.3. Mảng 14
2.3.4.4. Bảng băm .17
2.3.4.5. Thao tác với tập tin 17
2.3.4.6. Chương trình con .19
2.3.4.7. Regular expression 21
2.4. Giới thiệu về cây xoài 21
2.4.1. Vị trí phân loại .21
2.4.2. Nguồn gốc .22
2.4.3. Giá trị dinh dưỡng và lợi ích .22
2.4.4. Đặc điểm hình thái 23
2.4.4.1. Rễ .23
2.4.4.2. Thân và tán cây 23
2.4.4.3. Lá .23
2.4.4.4. Hoa . 23
2.4.4.5. Quả 24
2.4.4.6. Hạt .24
2.4.4.7. Phôi 25
2.4.5. Yêu cầu sinh thái .25
2.4.5.1. Nhiệt độ .25
2.4.5.2. Đất .25
2.4.5.3. Lượng mưa 26
2.4.6. Một số giống xoài trồng phổ biến ở Việt Nam 26
2.4.6.1. Xoài cát Hòa Lộc .26
2.4.6.2. Xoài cát Cần Thơ .26
2.4.6.3. Xoài thơm 26
2.4.6.4. Xoài bưởi .26
2.4.6.5. Xoài tượng .27
2.4.6.6. Xoài Thanh Ca .27
2.5. Khái quát về EST .27
2.5.1. Định nghĩa .27
2.5.2. Nguyên nhân hình thành và ứng dụng của EST 27
2.5.3. Sự hình thành EST 29
2.6. Giới thiệu về microsatellite 30
2.6.1. Khái niệm 30
2.6.2. Đặc điểm 30
2.6.3. Cơ chế hình thành microsatellite .31
2.6.3.1. Sự trượt lỗi của polymerase .31
2.6.3.2. Sự bắt cặp không đồng đều trong giảm phân 32
2.6.4. Mô hình sự đột biến của microsatellite .32
2.6.4.1. Mô hình đột biến bậc thang .32
2.6.4.2. Mô hình “K” alen 33
2.6.4.3. Mô hình alen vô hạn 34
2.6.5. Nguyên nhân tồn tại của microsatellite .34
2.6.6. Các cách phân lập microsatellite .35
2.6.6.1. Microsatellite có nguồn gốc từ thư viện 35
2.6.6.2. Microsatellite từ thư viện BAC/YAC 35
2.6.6.3. Microsatellite từ thư viện cDNA .36
2.6.6.4. Microsatellite có nguồn gốc từ dữ liệu 36
2.6.6.5. Kiểm tra microsatellite từ một loài có liên quan .38
2.6.7. ưu điểm và hạn chế .38
2.6.7.1. ưu điểm .38
2.6.7.2. Hạn chế 39
3. PHưƠNG TIỆN VÀ PHưƠNG PHÁP TIẾN HÀNH .40
3.1. Thời gian và địa điểm 40
3.2. Phương tiện 40
3.3. Phương pháp 40
3.3.1. Thu nhận trình tự EST của cây xoài 41
3.3.1.1. NCBI và EST .41
3.3.1.2. Truy cập cơ sở dữ liệu và thu nhận trình tự 41
3.3.2. Sắp xếp các trình tự EST .42
3.3.3. Tìm kiếm microsatellite .44
3.3.3.1. Công cụ SSRIT 44
3.3.3.2. Công cụ MISA .45
3.3.4. Xác định vùng bảo tồn .46
3.3.5. Thiết kế primer 47
3.3.5.1. Primer3 49
3.3.5.2. Chương trình Perl ssrfinder_1_0 .50
4. KẾT QUẢ VÀ THẢO LUẬN 53
4.1. Thu nhận trình tự EST của cây xoài 53
4.2. Sắp xếp các trình tự .54
4.3. Kết quả tìm kiếm microsatellite 54
4.3.1. Công cụ SSRIT 54
4.3.2. Công cụ MISA .55
4.4. Xác định vùng bảo tồn .58
4.5. Thiết kế primer đối với 6 microsatellite 59
4.5.1. Chương trình Primer3 59
4.5.2. Chương trình Perl script ssrfinder_1_0 .60
5. KẾT LUẬN VÀ ĐỀ NGHỊ 62
5.1. Kết luận .62
5.2. Đề nghị 63
6. TÀI LIỆU THAM KHẢO 64
7. PHỤ LỤC .66 .
Phát hiện marker microsatellite từ cơ sở dữ liệu trình tự est (Expressed Sequence Tags) của cây xoài (Mangifera indica)
95 trang |
Chia sẻ: maiphuongtl | Lượt xem: 2036 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Khóa luận Phát hiện marker microsatellite từ cơ sở dữ liệu trình tự EST (Expressed Sequence Tags) của cây xoài (Mangifera indica), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
0 trình
tự) trong một lần chạy chƣơng trình và không có sự thống kê kết quả tìm kiếm
3.3.3.2. Công cụ MISA (Microsatellite Identification Tool)
Công cụ này cho phép sự xác định và định vị microsatellite cũng nhƣ các
microsatellite ghép (compound microsatellite) mà bị ngắt quãng bởi một số
base nhất định. Công cụ này đƣợc viết từ ngôn ngữ lập trình Perl và có thể tải
về máy sử dụng từ địa chỉ internet sau
gatersleben.de/misa/misa.html
Cú pháp
misa.pl với là file chứa trình tự ở
định dạng FASTA
Công cụ này cần thêm một file chứa các thông số cho quá trình xác định
microsatellite, file này có định dạng “misa.ini”.
46
File misa.ini có cấu trúc nhƣ sau
Hình 3.8. File misa.ini
Trong đó hàng đầu tiên xác định dạng và số lần lặp lại tối thiểu của
microsatellite. Hàng thứ hai là số nucleotide tối đa chèn vào giữa hai
microsatellite.
Kết quả của việc tìm kiếm microsatellite sẽ đƣợc lƣu trong hai file
File “.misa” lƣu các giá trị sự định vị và sự xác định
các microsatellite
File “.statistics” thống kê kết quả của quá trình tìm
kiếm
3.3.4. Xác định vùng bảo tồn
Vùng bảo tồn là vùng ở hai bên trình tự microsatellite, những trình tự này
thƣờng giống nhau đối với mỗi một dạng microsatellite. Vùng bảo tồn rất quan trọng
trong phân tích microsatellite bởi đây chính là cơ sở cho việc thiết kế primer.
Để xác định đƣợc vùng bảo tồn, chúng tôi tiến hành việc sắp gióng cột
(alignment) các trình tự.
Sắp gióng cột dựa vào microsatellite, chúng tôi lấy trình tự microsatellite làm
điểm tập trung, sau đó tạo trình tự bảo tồn (consensus sequence) đối với mỗi dạng
microsatellite bằng công cụ “CAP Contig Assembly Program” có trong phần mềm
BioEdit.
47
Hình 3.9. Sắp gióng cột trình tự
3.3.5. Thiết kế primer
Primer là những đoạn nucleotide ngắn, bắt cặp bổ sung với đầu 5‟ hay đầu 3‟
của mạch DNA khuôn mẫu. Primer đƣợc thiết kế dựa vào vùng trình tự đã đƣợc biết,
nằm ở hai đầu của đoạn gen cần khuếch đại.
Thông số quyết định sự thành công của phản ứng PCR là việc thiết kế primer.
Một primer đƣợc thiết kế không tốt có thể sẽ cho kết quả ít hay không có sản phẩm do
sự khuếch đại không chuyên biệt và/hay sự hình thành cấu trúc thứ cấp, các cấu trúc
này sẽ cạnh tranh và ngăn chặn sự tạo thành sản phẩm mong muốn.
Việc thiết kế và chọn lựa primer phải thỏa mãn một số yêu cầu sau
- Chiều dài primer: chiều dài tốt là 18 đến 24 base. Chiều dài này đủ
dài để đảm ảo tính chuyên biệt và đủ ngắn để primer bám vào mạch
mẫu dễ dàng ở nhiệt độ bắt cặp.
- Nhiệt độ nóng chảy (Tm) là nhiệt độ mà một nửa sợi đôi DNA tách ra
trở thành sợi đơn và cho biết tính ổn định của sợi đôi. Thành phần
(G+C) trong DNA cao sẽ dẫn tới nhiệt độ Tm cao vì liên kết H trong
DNA cao hơn. Có nhiều công thức tính T, hai trong những công thức
đƣợc nhiều ngƣời sử dụng là
Tm = 59.9 + 0.41 * (%GC) – 675 / chiều dài
48
Tm = 2 (A+C) + 4 (G+C) (công thức Wallace)
Primer với nhiệt độ nóng chảy trong phạm vi 55 oC đến 72 oC
thƣờng cho kết quả tốt nhất.
- Tính chuyên biệt: primer phải đƣợc lựa chọn sao cho chỉ có một trình
tự duy nhất trong DNA mẫu đƣợc khuếch đại. Vì Taq polymerase có
hoạt tính trong một phạm vi nhiệt độ rộng, sự kéo dài primer sẽ xảy
ra ở nhiệt độ thấp hơn nhiệt độ bắt cặp. Nếu sự thay đổi nhiệt độ quá
chậm sự không chuyên biệt sẽ xảy ra và enzyme sẽ xúc tác sự kéo dài
nếu có một sự tƣơng đồng ngắn ở đầu 3‟.
- Thành phần base: ảnh hƣởng đến độ đặc hiệu của quá trình bắt cặp,
nhiệt độ nóng chảy, nhiệt độ bắt cặp và sự ổn định của cấu trúc phân
tử. Các base đƣợc sắp xếp ngẫu nhiên thì thích hợp hơn là những
vùng (A+T) dài hay là những vùng giàu (G+C). Thành phần (G+C)
trung bình khoảng từ 50% đến 60% sẽ cho nhiệt độ nóng chảy, nhiệt
độ bắt cặp thích hợp trong một phản ứng PCR bình thƣờng.
- Trình tự primer đầu 3‟ quyết định tính chuyên biệt và tính tƣơng
thích của phản ứng PCR. Các trình tự đầu 3‟ không nên có
+ G hay C không có nhiều hơn 3 tại vị trí này vì sẽ làm cho
primer bắt cặp không chuyên biệt.
+ 3‟ thymidine, nó làm cho sự bắt cặp sai dễ xảy ra hơn so với
những nucleotide khác.
Các cặp primer nên đƣợc kiểm tra sự bổ sung ở đầu 3‟ vì nó
thƣờng dẫn đến sự hình thành cấu trúc thứ cấp.
- Trình tự primer đầu 5‟: các base ở đầu 5‟ ít quyết định đến sự bắt cặp
của primer. Do đó có thể thêm các yếu tố trình tự nhƣ vị trí giới hạn
(restriction site) - những vị trí này có thể giống nhau hoặc có cùng
đầu dính (đầu bằng) với enzyme giới hạn trong MCS (Multiple
Cloning Site) của vector chọn để dòng hóa gen quan tâm. NcoI
(CCATGG) hay NdeI (CATATG) thƣờng đƣợc sử dụng vì có thể tạo
ra codon mở đầu ATG.
- Cấu trúc thứ cấp: nếu sự bắt cặp giữa forward primer với reverse
primer (hình thành dimer, hetero-dimer), forward primer với forward
49
primer hay reverse primer với reverse primer (self-dimer, homo-
dimer), hay primer tự tạo thành cấu trúc hairpin (kẹp tóc) xảy ra
nhiều hơn so với sự bắt cặp của primer với DNA mẫu thì hiệu quả
nhân bản của phản ứng PCR sẽ giảm một cách rõ rệt. Nhƣ vậy, nên
tránh những trƣờng hợp này.
3.3.5.1. Primer3
Chƣơng trình Primer3 là một trong những chƣơng trình thiết kế primer
miễn phí đƣợc biết đến nhiều nhất. Chƣơng trình này đƣợc tạo ra bởi các nhà
khoa học thuộc Viện Nghiên cứu Sinh Y học Whitehead và Trung Tâm Nghiên
cứu Genome của MIT (Whitehead Institute for Biomedical Research and MIT
Center for Genome Research). Chƣơng trình này có thể đƣợc sử dụng hoàn toàn
miễn phí tại địa chỉ internet
bin/primer/primer3_www.cgi
Chƣơng trình Primer3 thiết kế primer cho một trình tự DNA đƣa vào,
thỏa mãn nhiều tùy chọn khác nhau, chủ yếu là các điều kiện về %GC, về nhiệt
độ bắt cặp của primer, kích thƣớc sản phẩm… Đây là chƣơng trình lớn với gần
100 tùy chọn khác nhau tƣơng ứng với các điều kiện mà primer đƣợc tạo ra
phải thỏa mãn. Có một thuận lợi là hầu hết các tùy chọn này đều có giá trị mặc
định của nó, và ngƣời dùng có thể không thay đổi các thông số này nếu họ
không có nhu cầu đặc biệt.
Khi muốn thiết kế primer cho một gen hay một đoạn trình tự nào đó,
trƣớc tiên ngƣời sử dụng phải đƣa đoạn trình tự DNA của mình vào chƣơng
trình và xác định các thông số về trình tự primer, nhiệt độ nóng chảy cua primer,
kích thƣớc sản phẩm cần… Các thông số chi tiết khác có thể giữ mặc định.
50
Hình 3.10. Chƣơng trình Primer3
Dựa trên những yêu cầu cho việc thiết kế primer đã xác định nhƣ trên
chúng tôi thiết lập các thông số cho chƣơng trình Primer3 nhƣ sau
+ Targets(mục tiêu): m, n với m là vị trí bắt đầu có microsatllite
và n là chiều dài microsatellite
+Primer size (kích thƣớc primer)
Min: 18; Max: 24
+ Primer Tm (nhiệt độ nóng chảy của pimer)
Min: 55.0; Max: 72.0; Max Tm difference: 2.0
+ Primer %GC
Min: 50.0; Max: 60%
+ Các thông số khác vẫn giữ mặc định.
3.3.5.2. Chƣơng trình Perl ssrfinder_1_0
Đây là một chƣơng trình của tác giả Steven Schroeder thuộc trƣờng Đại
học Missouri – Michigan. Chƣơng trình gồm 6 Perl scripts có chức năng xác
định SSR và thiết kế primer thích hợp cho mỗi SSR tìm đƣợc
51
- 1_ssr_repeat_finder.pl: tìm SSR, lấy ra trình tự SSR và vùng flanking
cho những phân tích sau.
- 2_ssr_primer_designer.pl: thiết kế primer mà mục tiêu là khuếch đại
vùng trình tự chứa SSR.
- 3_ssr_primer_rep_check.pl: sàng lọc lại các primer đã thiết kế để loại
bỏ những primer có chứa trình tự lặp lại
- 4_ssr_primer_blast.pl: so sánh các primer đã thiết kế với cơ sở dữ liệu
primer
- 5_ssr_order_filter.pl: tạo 1 file chỉ chứa SSR mà có primer duy nhất
- 6_ssr_primer_formatter.pl: tạo 1 file chỉ chứa SSR có primer duy nhất
– file này đƣợc tạo đơn giản chỉ chứa những thông tin cần thiết cho việc chọn
lựa primer.
Yêu cầu: vì chƣơng trình này đƣợc viết cho hệ điều hành Unix hay
Linux nên cần phải thực hiện sửa đổi một số lệnh lập trình cơ bản để có thể
chạy trên môi trƣờng Window.
Chƣơng trình cần sự kết hợp với 3 phần mềm khác là Primer3, blastall
và formatdb để thực thi. Ba phần mềm này có thể tải hoàn toàn miễn phí (có
phiên bản dành cho Window) từ trang Primer3
và trang Blast của NCBI
Các thông số của chƣơng trình thiết kế primer đều đƣợc mặc định nhƣ
sau
TARGET= m, n với m là vị trí bắt đầu có microsatllite và n là chiều dài
microsatellite (mục tiêu)
PRIMER_PRODUCT_SIZE_RANGE=80-160 80-240 80-300 (kích
thƣớc sản phẩm)
PRIMER_OPT_SIZE=24 (kích thƣớc tối ƣu của primer)
PRIMER_MIN_SIZE=20 (kích thƣớc tối thiểu của primer)
PRIMER_MAX_SIZE=28 (kích thƣớc tối đa của primer)
PRIMER_OPT_TM=63 (nhiệt độ nóng chảy tối ƣu của primer)
PRIMER_MIN_TM=60 (nhiệt độ nóng chảy tối thiểu của primer)
PRIMER_MAX_TM=65 (nhiệt độ nóng chảy tối đa của primer)
52
PRIMER_MAX_DIFF_TM=1 (độ chênh lệch nhiệt độ nóng chảy tối đa)
Với các thông số mặc định trên chƣơng trình hoàn toàn có thể sử dụng
cho mục tiêu của đề tài.
53
Phần 4
KẾT QUẢ VÀ THẢO LUẬN
4.1. Thu nhận trình tự EST của cây xoài
Khi sử dụng từ khóa và phƣơng pháp nhƣ mục 3.3.1.2 chúng tôi đã tải đƣợc
toàn bộ 15966 trình tự EST của cây xoài. Các trình tự này ở định dạng FASTA, mỗi
trình tự có cấu trúc nhƣ hình 4.1
Hình 4.1 Trình tự EST ở định dạng FASTA
Đây là kiểu định dạng phổ biến trong cơ sở dữ liệu của GenBank gồm 2 phần
chủ yếu. Phần 1 bắt đầu bằng một dấu “>”, theo sau là các thông tin về trình tự đó nhƣ
tên trình tự, số gi, accession number…Phần 2 là các nucleotide của trình tự. Định dạng
FASTA có ƣu điểm là chỉ chứa trình tự và những thông tin thiết yếu về trình tự đó.
Hơn nữa trong một file trình tự ở định dạng FASTA có thể có nhiều trình tự so với
dạng Plain format chỉ chứa một trình tự.
Mặc khác việc lựa chọn kiểu định dạng trình tự để tải về ở dạng FASTA là sự
thuận lợi cho các nghiên cứu sau vì phần lớn các chƣơng trình, phần mềm của tin sinh
học đều sử dụng định dạng FASTA.
54
Do mục tiêu của đề tài là tìm kiếm tất cả các microsatellite có trong toàn bộ
nguồn dữ liệu EST của cây xoài nên việc tải tất cả 15966 trình tự thuộc cùng một file
là điều hợp lý, dễ dàng cho các công việc phân tích sau này.
4.2. Sắp xếp các trình tự
Sau khi chạy chƣơng trình est_trimmer.pl với các thông số nhƣ mục 3.3.2 đã
trình bày, kết quả đã đƣợc lƣu trong 2 file
mango.results: chứa tất cả các trình tự thỏa mãn các thông số của bƣớc
kiểm tra với est_trimmer.pl
mango.txt: file này ghi nhận tất cả các tiến trình thực thi trên mỗi trình tự
không đạt yêu cầu đề ra nhƣ loại bỏ trình tự có kích thƣớc bé hơn 100 bp, loại
bỏ đuôi poly A, poly T…
Hình 4.2. Tiến trình thực thi của est_trimmer.pl
4.3. Kết quả tìm kiếm microsatellite
4.3.1. Công cụ SSRIT
SSRIT cho phép tìm kiếm một lần là 500 trình tự và tốn khoảng 5 phút. Chính
vì công cụ SSRIT không có khả năng tìm kiếm SSR với một số lƣợng quá lớn trình tự
55
(15966) nên phải chạy chƣơng trình nhiều lần, tốn nhiều thời gian và phải lặp lại tiến
trình. Hơn nữa bảng kết quả của SSRIT không lƣu thành file để truy cập, phải xem kết
quả trực tuyến, không có sự thống kê về các dạng microsatellite. Do đó chúng tôi xác
định rằng công cụ này không phù hợp với mục đích nghiên cứu của đề tài.
4.3.2. Công cụ MISA
Thực thi chƣơng trình MISA cho kết quả rất nhanh và có 2 file đƣợc tạo thành
mango.fasta.misa: chứa các thông tin về tên trình tự, dạng SSR, kích
thƣớc, vị trí bắt đầu và kết thúc của SSR…
Hình 4.3 Nội dung file mango.fasta.misa
mango.fasta.stastistics: là file thống kê kết quả tìm kiếm microsatellite
Dựa vào file mango.fasta.statistics này chúng tôi xác định đƣợc số lƣợng trình
tự không đáp ứng yêu cầu mà khi chạy với est_trimmer.pl đã chƣa thống kê đƣợc: ban
đầu chúng tôi có 15966 trình tự, sau khi chạy est_trimmer thì có 231 trình tự không
thỏa mãn yêu cầu do đó tổng số trình tự đƣợc kiểm tra là 15735.
Kết quả của việc tìm kiếm microsatellite đƣợc liệt kê ở bảng 4.1, số lƣợng SSR
đƣợc xác định chiếm tỷ lệ 1.7% tổng số trình tự EST đƣợc kiểm tra, phân bố tƣơng đối
nhiều trong bộ gen. Với nghiên cứu trên đối tƣợng là cây nho (Scott và ctv, 2000),
56
SSR chiếm 2.5% và trên cây bông vải (Qureshi, 2004) SSR chiếm 1.34% tổng số trình
tự EST.
Bảng 4.1. Kết quả tìm kiếm microsatellite
Kết quả Số lƣợng
Tổng số trình tự kiểm tra 15735
Tổng kích thƣớc của trình tự đã kiểm tra (bp) 7400551
Tổng số SSR đƣợc xác định 267
Tổng số trình tự có SSR 265
Số trình tự có nhiều hơn 1 SSR 2
Số SSR hiện diện ở dạng SSR ghép 1
Sự phân bố các dạng lặp lại có số lƣợng khác nhau theo bảng 4.2.
Bảng 4.2. Sự phân bố các dạng lặp lại của SSR
Đơn vị lặp lại Số SSR Tỷ lệ %
2 (dinucleotide) 11 4.12
3 (trinucleotide) 255 95.51
4 (tetranucleotide) 1 0.37
Bảng trên cho thấy phần lớn các microsatellite của cây xoài là dạng
trinucleotide (95.51%). Các dạng khác xuất hiện rất ít, điều này tƣơng tự đối với
microsatllite ghép (compound microsatellite). Trong các nghiên cứu khác trên đối
tƣợng cây nho dạng trinucleotide là chỷ yếu chiếm tỷ lệ là 62.90%. Trên cây mía dạng
dinucleotide có tỷ lệ 38.19%, trong khi dạng trinucleotide có tỷ lệ 31.49%. Sự phân bố
các dạng lặp lại của microsatellite có sự khác biệt giữa các đối tƣợng nghiên cứu khác
nhau.
Ƣu điểm của MISA so với các phƣơng pháp khác là kết quả tìm kiếm của
MISA đƣợc lƣu thành file, có sự thống kê các dạng microsatellite, chƣơng trình thực
thi nhanh, máy tính không cần nối mạng internet chỉ cần tải mã (code) của chƣơng
trình về máy tính sau đó có thể áp dụng đơn giản và hiệu quả.
57
Nhƣợc điểm của chƣơng trình này là không có chức năng phân loại các trình tự
theo dạng microsatellite đã tìm kiếm. Do đó chúng tôi phải tiến hành phân nhóm trình
tự bằng cách thủ công dựa theo các dạng microsatellite đã xác định đƣợc
Kết quả đạt đƣợc cho thấy
Có tất cả 31 loại SSR trong đó dạng dinucleotide có 5 loại, dạng
trinucleotide có 25 loại và tetranucleotide có 1 loại.
Bảng 4.3. Các loại SSR
Dạng
dinucleotide
Dạng trinucleotide Dạng
tetranucleotide
AT; CA;
CT; TC;
GA
AAC; AAG; ACC;
AGA; AGC; AGT;
ATC; ATT; CAA;
CAG; CAT; CCA;
CGA; CTT; GAA;
GCC; GCT; GGA;
GGT; GTG; TCA;
TCT; TGA; TGG; TTC
TAAT
Hình 4.4 Các file trình tự sau khi phân nhóm
58
Vì các dạng dinucleotide và tetranucleotide chiếm tỷ lệ và tần suất xuất hiện
thấp nên chúng tôi chỉ tiếp tục nghiên cứu đối với dạng trinucleotide.
4.4. Xác định vùng bảo tồn
Để kết quả align (sắp gióng cột) và xác định vùng bảo tồn đƣợc chính xác,
chúng tôi loại bỏ các loại microsatellite có tần suất xuất hiện thấp (<2.5%)
Sau quá trình sàng lọc chúng tôi còn lại 7 loại microsatellite
Bảng 4.4. Các loại microsatellite nghiên cứu
Số thự tự Loại microsatellite Số trình tự Tần suất xuất hiện
1 AGA 31 11.61%
2 CAA 14 5.24%
3 CAT 24 8.99%
4 CCA 73 27.34%
5 TCA 7 2.62%
6 TCT 32 11.99%
7 TGA 16 5.99%
Thực hiện việc sắp gióng cột và tạo trình tự bảo tồn dựa trên công cụ CAP
contig assembly program chúng tôi có đƣợc 6 loại microsatellite, microsatellite AGA
sau khi thực hiện 2 tiến trình nói trên cho thấy sự khác biệt về trình tự ở vùng flanking
nên không thể thiết kế đƣợc primer chung cho tất cả 31 trình tự.
59
Hình 4.5. Xác định vùng bảo tồn của microsatellite CAA
4.5. Thiết kế primer đối với 6 microsatellite
4.5.1. Primer3
Việc thiết kế primer và chọn lựa các thông số phải thỏa các yêu cầu đã nêu
trong mục 3.3.5.1.
Kết quả của chƣơng trình Primer3 của 6 microsatellite
Hình 4.6. Kết quả thiết kế primer của microsatellite TCA
Chúng tôi đã thiết kế đƣợc 6 cặp primer cho 6 loại microsatellite. Theo bảng 4.5,
chúng tôi liệt kê loại SSR, forward primer, reverve primer và nhiệt độ nóng chảy (Tm)
Bảng 4.5 Kết quả thiết kế primer từ chƣơng trình Primer3
Loại SSR Forward primer (5’ - 3’) Reverse primer (5’ - 3’)
CAA GTCTCAAACCCCAAATCC TGTCCACCAGAACCAGAG
CAT ACCGCCAGTCTATGGAACAC TACTTAGCGGCCATCAAACC
CCA TTCCAAGAAGCACTGTGTGG TTGTGGTTGAGGTTGCTCAG
TCA GCATATGCAACTCCACCAG GTTGTTGTGGTGGTCCAA
TCT TGCTGCAATCGAACCAAG GCAGGAGGCACAAATAGTAGTC
60
TGA AGCAGTGAATCCGGTGATCT GGTTTCAGCGCCTTATCAAC
4.5.2. Chƣơng trình Perl script ssrfinder_1_0
Lần lƣợt thực thi từng file từ 1 đến 6 của gói công cụ này, chúng tôi có đƣợc kết
quả sau
1_ssr_repeat_finder.pl có 3 file kết quả
new_id20060715.txt: liệt kê các số truy cập, tên trình tự có SSR
labdout20060715.txt: liệt kê dạng SSR, vị trí và chiều dài SSR, trình tự
ssrout20060715.txt: liệt kê SSR, trình tự có chứa SSR và vùng flanking
2_ssr_primer_designer.pl có 3 file kết quả
primerin.txt: liệt kê các thông số mặc định cho quy trình thiết kế primer
(xem mục 3.3.5.3)
raw_primer20060715.out: liệt kê các kết quả tính toán cho mỗi primer
đƣợc thiết kế
primer_result20060715.txt: liệt kê SSR, trình tự, cặp primer đã thiết kế,
nhiệt độ nóng chảy và chiều dài sản phẩm của primer.
Hình 4.7 Nội dung file primer_result20060715.txt
3_ssr_primer_check.pl tạo file rescreened20060715.txt có nội dung giống file
primer_result20060715.txt vì không có primer đƣợc thiết kế có nhiều trình tự
lặp lại nên bƣớc kiểm tra này vẫn giữ nguyên giá trị cũ.
4_ssr_primer_blast20060715.pl cũng cho kết quả giống
primer_result20060715.txt vì cơ sở dữ liệu primer hiện tại không có.
5_ssr_order_filter.pl: chƣơng trình này tạo file filter20060715.txt có chứa dạng
SSR, trình tự primer, và các thông số của primer khác
6_ssr_order_formatter tạo file cuối cùng là order20060715.txt, file này chỉ chứa
các thông tin cần thiết cho việc thiết kế mồi nhƣ dạng microsatellite, forward
primer và reverse primer.
61
* Kết quả của chƣơng trình thiết kế primer
Hình 4.8. Kết quả thiết kế primer
Trong hình 4.8 cột A là loại SSR, cột B là forward primer, cột C và E là nhiệt
độ nóng chảy, cột D là reverse primer, cột F là chiều dài sản phẩm tạo thành.
Từ kết quả thiết kế primer thu đƣợc từ 2 chƣơng trình khác nhau, chúng tôi
nhận thấy các primer trên đều thích hợp cho phản ứng PCR tùy vào yêu cầu, mục đích
thực nghiệm. Primer ở 2 chƣơng trình có kết quả khác nhau là do việc lựa chọn các
thông số cho tiến trình thiết kế mồi khác nhau.
62
Phần 5
KẾT LUẬN VÀ ĐỀ NGHỊ
5.1. Kết luận
Từ quá trình thực hiện đề tài chúng tôi rút ra kết luận nhƣ sau
Xây dựng phƣơng pháp phát hiện microsatellite đối với cây xoài từ nguồn cơ sở
dữ liệu EST hiện có, đó là sử dụng các chƣơng trình và công cụ est_trimmer.pl,
misa.pl, CAP contig assembly program, Primer3 hay gói công cụ ssrfinder_1_0.
Cơ sở dữ liệu EST của
NCBI
Sử dụng công cụ tải dữ liệu Truy cập
của NCBI Thu nhận
Xử lý với chƣơng trình est_trimmer.pl Sắp xếp các trình tự EST
Xử lý với chƣơng trình misa.pl Xác định microsatellite
Xử lý với phần mềm BioEdit Align, xác định vùng bảo tồn
Xử lý với chƣơng trình Primer3, Thiết kế primer
gói công cụ ssrfinder_1_0
Hình 5.1. Sơ đồ phƣơng pháp thực hiện
Trình tự EST của
cây xoài
Các trình tự EST
đã đƣợc sắp xếp
Các trình tự EST có
chứa microsatellite
Align và xác định
vùng bảo tồn
Primer đã thiết kế
63
Kết quả đạt đƣợc
Đã tải đƣợc 15966 trình tự EST của cây xoài
Xác định và định vị đƣợc 267 microsatellite trong đó dạng trinucleotide chiếm
tỉ lệ cao nhất (95.51%)
Xác định đƣợc vùng bảo tồn của 6 loại microsatellite và thiết kế đƣợc primer
cho 6 loại microsatellite bao gồm các loại sau: CAA, CAT, CCA, TCA, TCT và TGA.
5.2 Đề nghị
Đề tài nên đƣợc tiếp tục phân tích bằng thực nghiệm để kiểm tra hiệu quả của
việc thiết kế primer.
Viết và sử dụng chƣơng trình hay phần mềm có khả năng phân loại các trình tự
đã xác định SSR.
Áp dụng quy trình xác định microsatellite cho các đối tƣợng thí nghiệm khác
nếu đối tƣợng thí nghiệm đó có sẵn nguồn dữ liệu từ các cơ sở dữ liệu.
Xây dựng cơ sở dữ liệu trình tự, microsatellite và các primer đã thiết kế.
Tăng cƣờng việc đào tạo, phát triển ngành tin sinh học vì đó là một ngành hỗ
trợ đắc lực cho công tác nghiên cứu.
64
Phần 6
TÀI LIỆU THAM KHẢO
TIẾNG VIỆT
1. Phạm Văn Duệ, 2005. Giáo trình kỹ thuật trồng cây ăn quả. Nhà xuất bản Hà
Nội. Trang 105.
2. Phạm Thị Hƣơng, Trần Thế Tục, Nguyễn Quang Thạch, 2003. Cây xoài và
những điều cần biết. Nhà xuất bản Nông Nghiệp Hà Nội. 95 trang.
3. Trần Thế Tục, 1994. Kỹ thuật trồng và chăm sóc Xoài Na Hồng Xiêm. Nhà xuất
bản Nông Nghiệp Hà Nội. Trang 25.
4. Lê Minh Trung, Quốc Bình, 2002. Ngôn ngữ lập trình Perl cho người mới học.
Nhà xuất bản Thống kê. 426 trang.
5. Trần Văn Lăng, 2003. Một số tổng quan về sinh tin học. Phân viện Công nghệ
Thông tin tại TP Hồ Chí Minh.
6. Trần Linh Thƣớc, 2004. Thực tập bioinformatics. Đại học Khoa học Tự nhiên
TP Hồ Chí Minh.
7. Lƣu Phúc Lợi, 2005. Giáo trình sinh tin học ứng dụng. Bộ môn Công nghệ Sinh
học – Đại học Nông Lâm TP Hồ Chí Minh.
TIẾNG NƢỚC NGOÀI
8. Andreas D. Baxevanis, B. F. Francis Ouellette, 2005. Bioinformatics a practical
guide to the analysis of genes and proteins. 3
rd
edition, A John Wiley & Sons,
Inc., Publication.
9. James Tisdall, 2001. Beginning Perl for Bioinformatics. 1st edition, O‟Reilly,
Publication.
10. Lorenzo Cerutti, 2002. EST clustering. Swiss Institute of Bioinformatics
11. Scott K. D., 2001. Microsatellites derived from ESTs, and their comparison
with those derived by other methods. Centre for plant conservation genetics,
Southern Cross University, Lismore, Australia.
12. Scott K. D., P. Eggler, G. Seaton, M. Rossetto, E. M. Ablett, L. S. Lee, R. J.
Henry, 2000. Analysis of SSRs derived from grape ESTs.
65
13. Samina N. Qureshi, Sukumar Saha, Ramesh V. Kantety, and J. N. Jenkins, 2004.
EST-SSR: A New Class of Genetic Markers in Cotton. The journal of cotton
science 8:112 – 123. The cotton foundation.
TÀI LIỆU TỪ CÁC TRANG WEB
14. Julian P. Robinson, Stephen A. Harris, 1999. Amplified Fragment Length
Polymorphisms and Microsatellites: A phylogenetic perspective. Department of
Plant Sciences, University of Oxford, South Parks Road, Oxford OX1 3RB,
Great Britain
15. Vincent R. Prezioso. General notes on Primer Design in PCR. Biosystems
Laboratory, Brinkmann Instruments Inc., Westbury, New York.
16.
17.
18.
19.
20.
21.
22.
23.
66
PHỤ LỤC
1. Mã chƣơng trình est_trimmer.pl
#!/usr/bin/perl –w
# Check for arguments. If none display syntax #
if (@ARGV == 0)
{open (IN,"<$0");
while () {if (/^\#\# (.*)/) {$message .= "$1\n"}};
close (IN);
die $message;}
# Check if help is required #
if ($ARGV[0] =~ /-help/i)
{open (IN,"<$0");
while () {if (/^\#\#\#(.*)/) {$message .= "$1\n"}};
close (IN);
die $message;}
# Open FASTA file #
open (IN,"<$ARGV[0]") || die ("\nError: File doesn't exist !\n\n");
# Checking arguments #
$arg = @ARGV;
$arg > 1 || die ("\nError: No arguments determined !\n\n");
for ($i = 1; $i < $arg; $i++)
{if (($amb_n,$amb_win) = ($ARGV[$i] =~ /-amb=(\d+),(\d+)/i))
{$message .= "$i. Check for ambiguous bases (search for $amb_n
ambiguous bases in a $amb_win bp window).\n";}
elsif (($tr3_b,$tr3_n,$tr3_win) = ($ARGV[$i] =~ /-
tr3=([ACGT]),(\d+),(\d+)/i))
{$message .= "$i. Trim 3' end: Remove \"$tr3_b\" tails.";
if ($tr3_win > 0) {$message .= " Check for $tr3_n x $tr3_b in a
$tr3_win bp window.\n"} else {$message .= "\n"};}
elsif (($tr5_b,$tr5_n,$tr5_win) = ($ARGV[$i] =~ /-
tr5=([ACGT]),(\d+),(\d+)/i))
{$message .= "$i. Trim 5' end: Remove \"$tr5_b\" tails.";
if ($tr5_win > 0) {$message .= " Check for $tr5_n x $tr5_b in a
$tr5_win bp window.\n"} else {$message .= "\n"};}
elsif (($cut_min,$cut_max) = ($ARGV[$i] =~ /-cut=(\d+),(\d+)/i))
{$message .= "$i. Size restrictions: Size cutoff is $cut_min bp.
Restrict sequence size to $cut_max bp.\n";}
elsif (($file) = ($ARGV[$i] =~ /-id=(.*)/i))
{}
67
else {die ("\nError: Argument nr. ",++$i," is invalid !\n\n")}};
# Open results & log file#
if ($file) {open (OUT,">$file.results") || die ("\nError: Output file
name not valid !\n\n");open (LOG,">$file.log")}
else {open (OUT,">$ARGV[0].results");open (LOG,">$ARGV[0].log")};
print "\nEST TRIMMER\n===========\n\nPerforming following steps:\n\n";
print LOG "\nLOG FILE OF ALL PERFORMED MODIFICATIONS\n";
print LOG "=======================================\n\n";
print LOG "\nPerforming following steps:\n---------------------------
\n\n";
print $message;
print LOG $message;
print LOG "\n\nProcessing steps for each sequence:\n--------------------
---------------\n";
# core #
$/ = ">";
while ()
{next unless (($seqname,$seq) = /(.*?)\n(.*)/s);
$seq =~ s/[\d\s>]//g;
$seq =~ s/[^ACGTN]/N/gi; # only "acgtn" characters allowed
$message = '';
$discard = 'nö';
for ($i = 1; $i < $arg; $i++)
{if (($amb_n,$amb_win) = ($ARGV[$i] =~ /-amb=(\d+),(\d+)/i))
{&Trim_5_n;
&Trim_3_n;}
elsif (($tr3_b,$tr3_n,$tr3_win) = ($ARGV[$i] =~ /-
tr3=([ACGT]),(\d+),(\d+)/i))
{ &Trim_3_oligoN }
elsif (($tr5_b,$tr5_n,$tr5_win) = ($ARGV[$i] =~ /-
tr5=([ACGT]),(\d+),(\d+)/i))
{&Trim_5_oligoN }
elsif (($cut_min,$cut_max) = ($ARGV[$i] =~ /-cut=(\d+),(\d+)/i))
{if ($cut_max < length $seq)
{$seq = substr $seq,0,$cut_max;
$message .= "Restrict sequence size to $cut_max bp.\n"};
if ($cut_min and (length $seq < $cut_min))
{$message .= "Discard sequence (below $cut_min bp cutoff).\n";
$discard = "yo;}
if ($discard eq 'nö')
{$seq = join ("\n",grep($_,split(/(.{70})/,$seq)));
print OUT ">$seqname\n$seq\n"};
68
if ($message ne '') {print LOG "\n>$seqname\n$message"} };
print "\nDONE\n";
close (IN);
close (OUT);
close (LOG);
# subroutines #
sub Trim_5_n
# trim 5' end until specified window contains less than n ambiguous
bases
{$check = '0';
while ((length $seq > $amb_win) and !($check eq '1'))
{$window = substr $seq,0,$amb_win;
if ($window =~ /^(([^N]*N){$amb_n})/i)
{$seq =~ s/^($1N*)//i;
$message .= "Ambiguous sequence at 5' side: $1.\n" }
else {$check = '1'};};
sub Trim_3_n
# trim 3' end until specified window contains less than n ambiguous
bases
{$check = '0';
while ((length $seq > $amb_win) and !($check eq '1'))
{$window = substr $seq,-$amb_win;
if ($window =~ /.*((N[^N]*){$amb_n})/i)
{ $seq =~ s/(N*$1)$//i;
$message .= "Ambiguous sequence at 3' side: $1.\n" }
else {$check = '1'}; };
sub Trim_5_oligoN
# remove oligoN stretches from 5' side
{$check = '0';
if ($seq =~ s/^($tr5_b+)//i) {$message .= "Remove \"$tr5_b\" tail at
5' side: $1.\n"};
while (!($check eq '1'))
{ if (length $seq > $tr5_win) {$window = substr $seq,0,$tr5_win}
else {$window = $seq};
if ($window =~ /^(.*?($tr5_b){$tr5_n})/i)
{ $seq =~ s/^($1$tr5_b*)//i;
$message .= "Remove \"$tr5_b\" stretch at 5' side: $1.\n" }
else {$check = '1'}; };
sub Trim_3_oligoN
# remove oligoN stretches from 3'side
{$check = '0';
69
if ($seq =~ s/($tr3_b+)$//i) {$message .= "Remove \"$tr3_b\" tail at
3' side: $1.\n"};
while (!($check eq '1'))
{if (length $seq > $tr3_win) {$window = substr $seq,-$tr3_win} else
{$window = $seq};
if ($window =~ /.*(($tr3_b){$tr3_n}.*)/i)
{ $seq =~ s/($tr3_b*$1)$//i;
$message .= "Remove \"$tr3_b\" stretch at 3' side: $1.\n"}
else {$check = '1'};}
};
2. Mã chƣơng trình misa.pl
#!/usr/bin/perl –w
#§§§§§ DECLARATION §§§§§#
# Check for arguments. If none display syntax #
if (@ARGV == 0)
{open (IN,"<$0");
while () {if (/^\#\# (.*)/) {$message .= "$1\n"}};
close (IN);
die $message;};
# Check if help is required #
if ($ARGV[0] =~ /-help/i)
{open (IN,"<$0");
while () {if (/^\#\#\#(.*)/) {$message .= "$1\n"}};
close (IN);
die $message;};
# Open FASTA file #
open (IN,"<$ARGV[0]") || die ("\nError: FASTA file doesn't exist !\n\n");
open (OUT,">$ARGV[0].misa");
print OUT "ID\tSSR nr.\tSSR type\tSSR\tsize\tstart\tend\n";
# Reading arguments #
open (SPECS,"misa.ini") || die ("\nError: Specifications file doesn't
exist !\n\n");
my %typrep;
my $amb = 0;
while ()
{ %typrep = $1 =~ /(\d+)/gi if (/^def\S*\s+(.*)/i);
if (/^int\S*\s+(\d+)/i) {$amb = $1}};
my @typ = sort { $a $b } keys %typrep;
#§§§§§ CORE §§§§§#
$/ = ">";
my $max_repeats = 1; #count repeats
70
my $min_repeats = 1000; #count repeats
my (%count_motif,%count_class); #count
my ($number_sequences,$size_sequences,%ssr_containing_seqs); #stores number
and size of all sequences examined
my $ssr_in_compound = 0;
my ($id,$seq);
while ()
{next unless (($id,$seq) = /(.*?)\n(.*)/s);
my ($nr,%start,@order,%end,%motif,%repeats); # store info of all SSRs
from each sequence
$seq =~ s/[\d\s>]//g; #remove digits, spaces, line breaks,...
$id =~ s/^\s*//g; $id =~ s/\s*$//g;$id =~ s/\s/_/g; #replace whitespace
with "_"
$number_sequences++;
$size_sequences += length $seq;
for ($i=0; $i < scalar(@typ); $i++) #check each motif class
{ my $motiflen = $typ[$i];
my $minreps = $typrep{$typ[$i]} - 1;
if ($min_repeats > $typrep{$typ[$i]}) {$min_repeats =
$typrep{$typ[$i]}}; #count repeats
my $search = "(([acgt]{$motiflen})\\2{$minreps,})";
while ( $seq =~ /$search/ig ) #scan whole sequence for that class
{ my $motif = uc $2;
my $redundant; #reject false type motifs [e.g. (TT)6 or (ACAC)5]
for ($j = $motiflen - 1; $j > 0; $j--)
{ my $redmotif = "([ACGT]{$j})\\1{".($motiflen/$j-1)."}";
$redundant = 1 if ( $motif =~ /$redmotif/ )};
next if $redundant;
$motif{++$nr} = $motif;
my $ssr = uc $1;
$repeats{$nr} = length($ssr) / $motiflen;
$end{$nr} = pos($seq);
$start{$nr} = $end{$nr} - length($ssr) + 1;
# count repeats
$count_motifs{$motif{$nr}}++; #counts occurrence of individual motifs
$motif{$nr}->{$repeats{$nr}}++; #counts occurrence of specific SSR in
its appearing repeat
$count_class{$typ[$i]}++; #counts occurrence in each motif class
if ($max_repeats < $repeats{$nr}) {$max_repeats = $repeats{$nr}};};
};
next if (!$nr); #no SSRs
$ssr_containing_seqs{$nr}++;
71
@order = sort { $start{$a} $start{$b} } keys %start; #put SSRs in
right order
$i = 0;
my $count_seq; #counts
my ($start,$end,$ssrseq,$ssrtype,$size);
while ($i < $nr)
{ my $space = $amb + 1;
if (!$order[$i+1]) #last or only SSR
{$count_seq++;
my $motiflen = length ($motif{$order[$i]});
$ssrtype = "p".$motiflen;
$ssrseq = "($motif{$order[$i]})$repeats{$order[$i]}";
$start = $start{$order[$i]}; $end = $end{$order[$i++]};
next};
if (($start{$order[$i+1]} - $end{$order[$i]}) > $space)
{ $count_seq++;
my $motiflen = length ($motif{$order[$i]});
$ssrtype = "p".$motiflen;
$ssrseq = "($motif{$order[$i]})$repeats{$order[$i]}";
$start = $start{$order[$i]}; $end = $end{$order[$i++]};
next };
my ($interssr);
if (($start{$order[$i+1]} - $end{$order[$i]}) < 1)
{ $count_seq++; $ssr_in_compound++;
$ssrtype = 'c*';
$ssrseq =
"($motif{$order[$i]})$repeats{$order[$i]}($motif{$order[$i+1]})$repeats{$or
der[$i+1]}*";
$start = $start{$order[$i]}; $end = $end{$order[$i+1]} }
else
{$count_seq++; $ssr_in_compound++;
$interssr = lc substr($seq,$end{$order[$i]},($start{$order[$i+1]} -
$end{$order[$i]}) - 1);
$ssrtype = 'c';
$ssrseq =
"($motif{$order[$i]})$repeats{$order[$i]}$interssr($motif{$order[$i+1]})$re
peats{$order[$i+1]}";
$start = $start{$order[$i]}; $end = $end{$order[$i+1]};
#$space -= length $interssr };
while ($order[++$i + 1] and (($start{$order[$i+1]} - $end{$order[$i]})
<= $space))
{ if (($start{$order[$i+1]} - $end{$order[$i]}) < 1)
72
{ $ssr_in_compound++;
$ssrseq .= "($motif{$order[$i+1]})$repeats{$order[$i+1]}*";
$ssrtype = 'c*';
$end = $end{$order[$i+1]}}
else
{ $ssr_in_compound++;
$interssr = lc substr($seq,$end{$order[$i]},($start{$order[$i+1]} -
$end{$order[$i]}) - 1);
$ssrseq .= "$interssr($motif{$order[$i+1]})$repeats{$order[$i+1]}";
$end = $end{$order[$i+1]};
#$space -= length $interssr}};
$i++;}
continue
{print OUT "$id\t$count_seq\t$ssrtype\t$ssrseq\t",($end - $start +
1),"\t$start\t$end\n"};};
close (OUT);
open (OUT,">$ARGV[0].statistics");
#§§§§§ INFO §§§§§#
#§§§ Specifications §§§#
print OUT "Specifications\n==============\n\nSequence source file:
\"$ARGV[0]\"\n\nDefinement of microsatellites (unit size / minimum number
of repeats):\n";
for ($i = 0; $i < scalar (@typ); $i++) {print OUT
"($typ[$i]/$typrep{$typ[$i]}) "};print OUT "\n";
if ($amb > 0) {print OUT "\nMaximal number of bases interrupting 2 SSRs in
a compound microsatellite: $amb\n"};
print OUT "\n\n\n";
#§§§ OCCURRENCE OF SSRs §§§#
#small calculations
my @ssr_containing_seqs = values %ssr_containing_seqs;
my $ssr_containing_seqs = 0;
for ($i = 0; $i < scalar (@ssr_containing_seqs); $i++)
{$ssr_containing_seqs += $ssr_containing_seqs[$i]};
my @count_motifs = sort {length ($a) length ($b) || $a cmp $b }
keys %count_motifs;
my @count_class = sort { $a $b } keys %count_class;
for ($i = 0; $i < scalar (@count_class); $i++) {$total +=
$count_class{$count_class[$i]}};
#§§§ Overview §§§#
print OUT "RESULTS OF MICROSATELLITE
SEARCH\n================================\n\n";
73
print OUT "Total number of sequences examined:
$number_sequences\n";
print OUT "Total size of examined sequences (bp):
$size_sequences\n";
print OUT "Total number of identified SSRs: $total\n";
print OUT "Number of SSR containing sequences:
$ssr_containing_seqs\n";
print OUT "Number of sequences containing more than 1 SSR:
",$ssr_containing_seqs - ($ssr_containing_seqs{1} || 0),"\n";
print OUT "Number of SSRs present in compound formation:
$ssr_in_compound\n\n\n";
#§§§ Frequency of SSR classes §§§#
print OUT "Distribution to different repeat type classes\n-----------------
----------------------------\n\n";
print OUT "Unit size\tNumber of SSRs\n";
my $total = undef;
for ($i = 0; $i < scalar (@count_class); $i++) {print OUT
"$count_class[$i]\t$count_class{$count_class[$i]}\n"};
print OUT "\n";
#§§§ Frequency of SSRs: per motif and number of repeats §§§#
print OUT "Frequency of identified SSR motifs\n----------------------------
------\n\nRepeats";
for ($i = $min_repeats;$i <= $max_repeats; $i++) {print OUT "\t$i"};
print OUT "\ttotal\n";
for ($i = 0; $i < scalar (@count_motifs); $i++)
{my $typ = length ($count_motifs[$i]);
print OUT $count_motifs[$i];
for ($j = $min_repeats; $j <= $max_repeats; $j++)
{if ($j < $typrep{$typ}) {print OUT "\t-";next};
if ($count_motifs[$i]->{$j}) {print OUT "\t$count_motifs[$i]->{$j}"}
else {print OUT "\t"}; };
print OUT "\t$count_motifs{$count_motifs[$i]}\n";};
print OUT "\n";
#§§§ Frequency of SSRs: summarizing redundant and reverse motifs §§§#
# Eliminates %count_motifs !
print OUT "Frequency of classified repeat types (considering sequence
complementary)\n-----------------------------------------------------------
--------------\n\nRepeats";
my (%red_rev,@red_rev); # groups
for ($i = 0; $i < scalar (@count_motifs); $i++)
{ next if ($count_motifs{$count_motifs[$i]} eq 'X');
my (%group,@group,$red_rev); # store redundant/reverse motifs
74
my $reverse_motif = $actual_motif = $actual_motif_a = $count_motifs[$i];
$reverse_motif =~ tr/ACGT/TGCA/;
my $reverse_motif_a = $reverse_motif;
for ($j = 0; $j < length ($count_motifs[$i]); $j++)
{if ($count_motifs{$actual_motif}) {$group{$actual_motif} = "1";
$count_motifs{$actual_motif}='X'};
if ($count_motifs{$reverse_motif}) {$group{$reverse_motif} = "1";
$count_motifs{$reverse_motif}='X'};
$actual_motif =~ s/(.)(.*)/$2$1/;
$reverse_motif =~ s/(.)(.*)/$2$1/;
$actual_motif_a = $actual_motif if ($actual_motif lt $actual_motif_a);
$reverse_motif_a = $reverse_motif if ($reverse_motif lt
$reverse_motif_a) };
if ($actual_motif_a lt $reverse_motif_a) {$red_rev =
"$actual_motif_a/$reverse_motif_a"}
else {$red_rev = "$reverse_motif_a/$actual_motif_a"}; # group name
$red_rev{$red_rev}++;
@group = keys %group;
for ($j = 0; $j < scalar (@group); $j++)
{for ($k = $min_repeats; $k <= $max_repeats; $k++)
{ if ($group[$j]->{$k}) {$red_rev->{"total"} += $group[$j]-
>{$k};$red_rev->{$k} += $group[$j]->{$k}} } };
for ($i = $min_repeats; $i <= $max_repeats; $i++) {print OUT "\t$i"};
print OUT "\ttotal\n";
@red_rev = sort {length ($a) length ($b) || $a cmp $b } keys %red_rev;
for ($i = 0; $i < scalar (@red_rev); $i++)
{my $typ = (length ($red_rev[$i])-1)/2;
print OUT $red_rev[$i];
for ($j = $min_repeats; $j <= $max_repeats; $j++)
{if ($j < $typrep{$typ}) {print OUT "\t-";next};
if ($red_rev[$i]->{$j}) {print OUT "\t",$red_rev[$i]->{$j}}
else {print OUT "\t"}};
print OUT "\t",$red_rev[$i]->{"total"},"\n"; };
3. Mã chƣơng trình ssrfinder_1_0
1_ssr_repeat_finder.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
$runtype = 1; # 1 = genbank fasta, 0 = local (fasta header differences)
75
# no need to change anything below this point
$seqcount = 0;
$ssr_count = 0;
@ssr_label = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab
ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az);
# set the flanking length here ( in bases )
$flank_length = 150; # i.e. 150 bp
# set the minimum length of the repeat
$min_pattern_length = 12; # i.e. 12 bp
# open the input sequence file - fasta format 3rd field of header is the
accession number
open (SEQFILE, "../$datename/sequence$datename.txt") || die "file not found:
$!";
# open the output file for the sequence ids
open (IDFILE, ">>../$datename/new_ids$datename.txt") || die "couldn't
create file";
# open the ouput file for the ssr results
open (SSROUTFILE, ">>../$datename/ssrout$datename.txt") || die "couldn't
create file";
#open the output file for the overall output for loading into labdb
open (LABDBTXT, ">>../$datename/labdbout$datename.txt") || die "couldn't
create file";
# read in file of previously checked IDs
$CheckedIDs = `cat ../$datename/CheckedIDs.txt`;
# parse the sequence file and process
if ($runtype == 1) {
while (defined ($line = )) {
chomp $line;
if ($line =~ /^>/) {
if (defined ($Seq)) {
# check if genbank id has been done before
if ($CheckedIDs !~ /$SeqHead[3]/) {
&SSRSearch;
print "new seq\n";
} else {
print "old seq\n";} }
$seqcount++;
print $seqcount;
$HeadLine = $line;
undef $Seq;
@SeqHead = split(/\|/,$HeadLine);
print IDFILE "$SeqHead[3]\t$SeqHead[4]\n";
76
} else {
$Seq = "$Seq" . "$line"; }
if (defined ($Seq)) {
# check if genbank id has been done before
if ($CheckedIDs !~ /$SeqHead[3]/) {
&SSRSearch;
print "new seq\n";
} else {
print "old seq\n"; } }
} elsif ($runtype == 2) {
while (defined ($line = )) {
chomp ($line);
@LineIn = split(/\t/, $line);
$SeqHead[3] = $LineIn[0];
print $SeqHead[3];
$Seq = $LineIn[1];
if (defined ($Seq)) {
&SSRSearch;}
$seqcount++;
print $seqcount;
if ( ($seqcount%5) == 0 ) {
print "\n";
} else {
print "\t"; }
undef $Seq;
@SeqHead = split(/\|/,$HeadLine) }
} elsif ($runtype == 3) {
while (defined ($line = )) {
chomp ($line);
if ($line =~ /^>/) {
if (defined ($Seq)) {
&SSRSearch;
} $seqcount++;
print $seqcount;
if ( ($seqcount%5) == 0 ) {
print "\n";
} else {
print "\t";}
undef $Seq;
$HeadLine = $line;
@templine1 = split(/>/,$HeadLine);
@templine2 = split(/\./, $templine1[1]);
77
$SeqHead[3] = $templine2[0]."_".$templine2[3];
print IDFILE "$SeqHead[3]\n";
} else {
$Seq = "$Seq" . "$line"; }
if (defined ($Seq)) {
&SSRSearch; }
close (SEQFILE);
close (IDFILE);
close (SSROUTFILE);
close (LABDBTXT);
print "Number of sequences in input file = $seqcount \n";
print "Number of Repeats found = $ssr_count \n";
exit 0;
# subroutines
sub SSRSearch() {
print "*";
$suffix = -1;
while ( $Seq =~ /(([ATGC]{2,})\2{3,})/gi ) {
print "+";
$fullmatch = $1;
$minmatch = $2;
# minimum matches: di-nt 6 repeats, tri-nt 4 repeats, tetra-nt 4 repeats
# check that repeat is greater than minimum total length of match
# and that it is not a single nt repeat - AAAAAAA, TTTTTTTT, etc.
if ( (( $length_sub = length($fullmatch)) >= $min_pattern_length )
&& !( $fullmatch =~ /([ATGC])\1{8,}/ ) ) {
print "-";
$ssr_count++;
$suffix++;
$Accession = "$SeqHead[3]" . "$ssr_label[$suffix]";
print SSROUTFILE "$Accession\t$fullmatch\t$minmatch\t";
print LABDBTXT "$SeqHead[3]\t$Accession\t$fullmatch\t$minmatch\t";
$pos2 = index($Seq,$fullmatch);
$pos3 = $pos2 + $length_sub;
if ($pos2 < $flank_length) {
$pos1 = 0;
} else {
$pos1 = $pos2 - $flank_length; }
if ( ( ( $max = length($Seq)) - $pos3 ) < $flank_length ) {
$pos4 = $max;
} else {
$pos4 = $pos3 + $flank_length; }
78
$seqleft = substr($Seq,$pos1,$pos2-$pos1);
$seqcenter = substr($Seq,$pos2,$pos3-$pos2);
$seqright = substr($Seq,$pos3,$pos4-$pos3);
print SSROUTFILE $seqleft, "[", $seqcenter,"]",$seqright,"\n";
print LABDBTXT $pos2,",",$length_sub,"\t",$seqleft, "[",
$seqcenter,"]",$seqright,"\n"; }
print "\n";}
2_ssr_primer_designer.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
$primer3app = 'd:\\detai\\ssrfinder_1_0\\primer3'; # full path to the
primer3 command
# no need to change anything below this point
# open the ouput file with the ssr results
open (SSRINFILE, "../$datename/ssrout$datename.txt") || die "couldn't open
file";
open (RAWPRIMER, ">../$datename/raw_primer3$datename.out") || die "couldn't
open file: $!";
open (PRIMEROUT, ">../$datename/primer_results$datename.txt") || die
"couldn't open file: $!";
$counter = 0;
while (defined($line = )) {
chomp ($line);
@columns = split(/\t/,$line);
@seq = split(/\[|\]/,$columns[3]);
$length_left = length($seq[0]);
$length_mask = length($seq[1]);
$length_right = length($seq[2]);
$t1 = $length_left+1;
$t2 = $length_mask;
open (PRIMERIN, ">../$datename/primerin.txt") || die "couldn't open file:
$!";
print PRIMERIN "PRIMER_SEQUENCE_ID=",$columns[1],"\n";
print PRIMERIN "SEQUENCE=",$seq[0],$seq[1],$seq[2],"\n";
print PRIMERIN "TARGET=", $t1, ",", $t2, "\n";
print PRIMERIN "PRIMER_PRODUCT_SIZE_RANGE=80-160 80-240 80-300\n";
print PRIMERIN "PRIMER_OPT_SIZE=24\n";
print PRIMERIN "PRIMER_MIN_SIZE=20\n";
print PRIMERIN "PRIMER_MAX_SIZE=28\n";
print PRIMERIN "PRIMER_OPT_TM=63\n";
79
print PRIMERIN "PRIMER_MIN_TM=60\n";
print PRIMERIN "PRIMER_MAX_TM=65\n";
print PRIMERIN "PRIMER_MAX_DIFF_TM=1\n";
print PRIMERIN "=\n";
close (PRIMERIN);
# $primer3 = `../devel/primer/primer3_0_9_test/src/primer3_core
< ../$datename/primerin.txt`;
$primer3 = `$primer3app < ../$datename/primerin.txt`;
print RAWPRIMER "######## $columns[1] #########\n";
print RAWPRIMER $primer3, "\n";
@prime_out = split(/\n/, $primer3);
foreach $i (0..$#prime_out) {
($varname,$varvalue) = split(/=/, $prime_out[$i]);
$primehash{$varname} = $varvalue;}
if ($primehash{'PRIMER_LEFT_SEQUENCE'}) {
$counter++;
print PRIMEROUT "$columns[0]\t$columns[1]\t$columns[2]";
print PRIMEROUT "\t$seq[0]$seq[1]$seq[2]";
print PRIMEROUT "\t", $primehash{'PRIMER_LEFT_SEQUENCE'};
print PRIMEROUT "\t", $primehash{'PRIMER_LEFT_TM'};
print PRIMEROUT "\t", $primehash{'PRIMER_RIGHT_SEQUENCE'};
print PRIMEROUT "\t", $primehash{'PRIMER_RIGHT_TM'};
print PRIMEROUT "\t", $primehash{'PRIMER_PRODUCT_SIZE'};
print PRIMEROUT "\n"; }
undef %primehash;}
close (PRIMEROUT);
close (SSRINFILE);
close (RAWPRIMER);
print "repeats primed: ", $counter, "\n";
exit 0;
3_ssr_primer_rep_check.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
# no need to change anything below this point
open (OUTFILE, ">rescreened$datename.txt");
$good = 0;
$bad = 0;
$temp = `type primer_results$datename.txt`;
@temp1 = split(/\n/, $temp);
foreach $i (0..$#temp1) {
80
@temp2 = split(/\t/, $temp1[$i]);
print $temp2[0],"\t",$temp2[1],"\t",$temp2[2],"\t",$temp2[3];
print
"\t",$temp2[4],"\t",$temp2[5],"\t",$temp2[6],"\t",$temp2[7],"\t",$temp2[8],
"\t";
if (( $temp2[4] =~ /(([ATGC]{2,3})\2{3,})/gi ) || ( $temp2[6] =~
/(([ATGC]{2,3})\2{3,})/gi )) {
print "bad\n";
$bad++;
} else {
print "good\n";
$good++;
print OUTFILE
$temp2[0],"\t",$temp2[1],"\t",$temp2[2],"\t",$temp2[3],"\t";
print OUTFILE
$temp2[4],"\t",$temp2[5],"\t",$temp2[6],"\t",$temp2[7],"\t",$temp2[8],"\n" }
print "good: $good\nbad: $bad\n";
close (OUTFILE);
exit(0);
4_ssr_primer_blast.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
$blastapp = 'd:\\detai\\ssrfinder_1_0\\blastall'; # full path to the
blastall command
$blastdbdir = 'd:\\detai\\ssrfinder_1_0\\db'; #full path to the blast
database directory
$blastdbname = 'AllPrimers.nt'; # name of the blast database to use
$formatdbapp = 'd:\\detai\\ssrfinder_1_0\\formatdb'; # full path to the
formatdb command
# no need to change anything below this point
open (PRIMERSIN, "../$datename/rescreened$datename.txt") || die;
open (BLASTOUTFILE, ">../$datename/blastout$datename.txt") || die;
open (FULLBLASTOUT, ">../$datename/fullblastoutput$datename.txt") || die;
$counter = 0;
$b0hit = 0;
while (defined($line=)) {
chomp ($line);
@columns = split(/\t/,$line);
$Accession = $columns[0];
$sequence = $columns[3];
81
$forward = $columns[4];
$reverse = $columns[6];
$counter++;
print $counter, "\n";
print BLASTOUTFILE $Accession, "\t", $columns[1], "\t", $columns[2];
print BLASTOUTFILE "\t", $sequence, "\t", $forward, "\t", $columns[5],
"\t";
print BLASTOUTFILE $reverse, "\t", $columns[7], "\t", $columns[8], "\t";
&BlastIt;
print "Blasted Sequences= ",$counter,"\n";
print "Blast NON-Hits= ",$b0hit,"\n";
close (PRIMERSIN);
close (BLASTOUTFILE);
close (FULLBLASTOUT);
exit 0;
sub BlastIt() {
open (TMPSEQFILE, ">../$datename/repeats/$Accession.fasta");
print TMPSEQFILE "> ",$Accession,"\n",$sequence,"\n";
close (TMPSEQFILE);
# $blastout = `blastall -p blastn -d db/AllPrimers.nt -e 0.01 -
i ../$datename/repeats/$Accession.fasta`;
$blastout = `$blastapp -p blastn -d $blastdbdir/$blastdbname -e 0.01
-i ../$datename/repeats/$Accession.fasta`;
print FULLBLASTOUT
"XXXXX\t",$Accession,"\tXXXXXXXXXXXXXXXXXXXXXXXXX\n\n";
print FULLBLASTOUT $blastout;
&ParseBlast;
sub DBup() {
# open (BLASTDBFASTA, ">>../blast/db/AllPrimers.nt");
open (BLASTDBFASTA, ">>$blastdbdir/$blastdbname");
print BLASTDBFASTA "> ",$Accession,"_f\n",$forward,"\n";
print BLASTDBFASTA "> ",$Accession,"_r\n",$reverse,"\n";
close (BLASTDBFASTA);
# $formatdbstatus = system("formatdb -i db/AllPrimers.nt -p F -o T");
$formatdbstatus = system("$formatdbapp -i $blastdbdir/$blastdbname -p
F -o T");}
sub ParseBlast() {
# split the blast output into records (splits at blank lines)
@blastrecs = split(/\n\n/, $blastout);
# the record that contains the hit results SHOULD be in record 6 - WATCH
OUT
if ($blastrecs[5] =~ /Sequence/) {
82
@blastmatch = split(/\n/, $blastrecs[6]);
print BLASTOUTFILE $#blastmatch-1, "\t";
for $entry (0 .. $#blastmatch) {
($name,$score, $E) = split(/[ ]+ /, $blastmatch[$entry]);
print $name,"\t",$score,"\t",$E,"\n";
print BLASTOUTFILE "\t",$name,"\t",$score,"\t",$E;}
} else {
print BLASTOUTFILE "0\t";
$b0hit++;
print "No Hits found\n";
print BLASTOUTFILE "\tnone\tnull\tnull";
&DBup; }
print BLASTOUTFILE "\n";}
5_ssr_order_filter.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
# no need to change anything below this point
open (OUTFILE, ">filter$datename.txt");
$infile = `cat blastout$datename.txt`;
$count = 0;
@temp1 = split(/\n/, $infile);
foreach $f (0..$#temp1) {
@temp2 = split(/\t/, $temp1[$f]);
if ($temp2[11] eq 'none') {
print OUTFILE $temp2[0],"\t",$temp2[1],"\t";
print OUTFILE $temp2[2],"\t",$temp2[3],"\t";
print OUTFILE $temp2[4],"\t",$temp2[5],"\t";
print OUTFILE $temp2[6],"\t",$temp2[7],"\t";
print OUTFILE $temp2[8],"\n";
print $temp2[0],"\t",$temp2[10],"\t",$temp2[11],"\n";
$count++;}
print "non-hits: ",$count,"\n";
close (OUTFILE);
exit (0);
6_ssr_order_formatter.pl
#!/usr/bin/perl –w
# change these parameters for each run!!!!!!!!
$datename = '20060715'; # date for directory name and datafile info
83
# no need to change anything below this point
open (OUTFILE, ">order$datename.txt");
$infile = `cat blastout$datename.txt`;
$count = 0;
@temp1 = split(/\n/, $infile);
foreach $f (0..$#temp1) {
@temp2 = split(/\t/, $temp1[$f]);
if ($temp2[11] eq 'none') {
print OUTFILE $temp2[0],"\t";
print OUTFILE $temp2[4],"\t",$temp2[5],"\t";
print OUTFILE $temp2[6],"\t",$temp2[7],"\t";
print OUTFILE $temp2[8],"\n";
print $temp2[0],"\t",$temp2[10],"\t",$temp2[11],"\n";
$count++; }}
print "non-hits: ",$count,"\n";
close (OUTFILE);
exit (0);
Các file đính kèm theo tài liệu này:
- NGUYEN MINH HIEN - 02126139.pdf