SSRFinder.java
上传用户:reomax
上传日期:2010-03-14
资源大小:5k
文件大小:4k
源码类别:

生物技术

开发平台:

Java

  1. /*
  2.  * Author: ruanjue
  3.  * Created: 11/29/2003 15:12:16
  4.  * Modified: 11/29/2003 15:12:16
  5.  */
  6. package org.genomics.ssr;
  7. import java.io.*;
  8. import java.util.*;
  9. /**
  10.  *@author 阮珏
  11.  */
  12. public class SSRFinder
  13. {
  14. /**
  15.  *the minimum of total repeat region length
  16.  */
  17. public static int MIN_LENGTH=12;
  18. /**
  19.  *we use 2-8 nt repeat unit,however there is another criterion 1-5,if you will use 1-5 please change those tow static parameter
  20.  *to (1,5).
  21.  */
  22. public static int MIN_REPEAT=2;
  23. public static int MAX_REPEAT=8;
  24. /**
  25.  *set the number of the length of the left and right sequence of ssr.
  26.  */
  27. public static int LEFT_SEQ_LENGTH=15;
  28. public static int RIGHT_SEQ_LENGTH=15;
  29. /**
  30.  *call this method to find ssr
  31.  *@reader must be genbank fasta style,the sequence can't suffer space character
  32.  */
  33. public static SSR[] find(Reader reader)throws IOException{
  34. BufferedReader in=new BufferedReader(reader);
  35. String str=null;
  36. StringBuffer sb=new StringBuffer(512);
  37. String header=null;
  38. Vector v=new Vector();
  39. //int lineNum=0;
  40. while((str=in.readLine())!=null){
  41. //System.out.println(++lineNum);
  42. if(str.startsWith(">")){
  43. if(sb.length()>0){
  44. find(header,sb.toString(),v);
  45. sb.delete(0,sb.length());
  46. }
  47. int i=1;
  48. for(;i<str.length();i++){
  49. if(str.charAt(i)==' '||str.charAt(i)=='t'){
  50. break;
  51. }
  52. }
  53. header=str.substring(1,i);
  54. }
  55. else {
  56. sb.append(str);
  57. }
  58. }
  59. find(header,sb.toString(),v);
  60. sb.delete(0,sb.length());
  61. in.close();
  62. SSR[] ssrs=new SSR[v.size()];
  63. for(int i=0;i<ssrs.length;i++){
  64. ssrs[i]=(SSR)v.get(i);
  65. }
  66. return ssrs;
  67. }
  68. protected static int find(String header,String seq,Vector v)throws IOException{
  69. if(seq.length()<MIN_LENGTH){
  70. return 0;
  71. }
  72. int count=0;
  73. int pointer=0;
  74. int ptr=0;
  75. char[] repeat=new char[MAX_REPEAT];
  76. for(int i=0;i<seq.length()-MIN_REPEAT;i++){
  77. if(i-ptr>=MAX_REPEAT-1){
  78. ptr++;
  79. }
  80. //scan repeat
  81. for(int t=MIN_REPEAT;t<=(i-ptr+1);t++){
  82. int num=0;
  83. for(int m=t+i;m<seq.length();m+=t){
  84. int n=0;
  85. for(;n<t;n++){
  86. if(seq.charAt(i-n)!=seq.charAt(m-n)){
  87. break;
  88. }
  89. }
  90. if(n!=t){
  91. break;
  92. }
  93. else {
  94. num++;
  95. }
  96. }
  97. if((num+1)*t>=MIN_LENGTH){//notice:num should add one
  98. boolean ok=false;
  99. char c=seq.charAt(i-t+1);
  100. for(int k=i-t+2;k<=i;k++){
  101. if(seq.charAt(k)!=c){
  102. ok=true;
  103. break;
  104. }
  105. }
  106. if(ok){
  107. SSR ssr=new SSR();
  108. ssr.seq=seq.substring(i-t+1,i+1);
  109. ssr.src=seq;
  110. if(header==null||header.length()==0){
  111. ssr.name="undefined_"+count;
  112. }
  113. else {
  114. ssr.name=header+"_"+count;
  115. }
  116. int left=i-t-LEFT_SEQ_LENGTH+1;
  117. if(left<0){
  118. left=0;
  119. }
  120. ssr.left_seq=seq.substring(left,i-t+1);
  121. ssr.left_pos=i-t+1;
  122. int right=i+num*t+RIGHT_SEQ_LENGTH+1;
  123. if(right>=seq.length()){
  124. right=seq.length()-1;
  125. }
  126. int right_start=i+num*t+1;
  127. if(right_start>=seq.length()){
  128. right_start=seq.length()-1;
  129. }
  130. ssr.right_seq=seq.substring(right_start,right);
  131. ssr.right_pos=i+num*t;
  132. ssr.repeat=num+1;
  133. v.add(ssr);
  134. count++;
  135. //skip the repeat region ,continue scan at new pot
  136. }
  137. i+=num*t-1;
  138. ptr=i;
  139. break;
  140. }
  141. else {
  142. continue;
  143. }
  144. }
  145. }
  146. return count;
  147. }
  148. public static void main(String[] args)throws Exception{
  149. FileReader reader=new FileReader(args[0]);
  150. long time=System.currentTimeMillis();
  151. SSR[] ssrs=find(reader);
  152. System.out.println("find "+ssrs.length+"t"+( System.currentTimeMillis()-time)+" ms");
  153. for(int i=0;i<ssrs.length;i++){
  154. System.out.println(">"+(i+1));
  155. System.out.println(ssrs[i]);
  156. }
  157. }
  158. }