1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
package dna;
public class MotifSimple extends Motif {
public static void main(String args[]){
String s1="ATN";
String s2="ATGCCCATCTGATG";
if(args.length>0){s1=args[0];}
if(args.length>1){s2=args[1];}
MotifSimple m=new MotifSimple(s1, 0);
String source=s2;
int x=m.countExtended(source);
System.out.println(x+" matches.");
}
public MotifSimple(String s, int cen){
super(s, s.length(), cen);
commonLetters=s;
lettersUpper=commonLetters.toUpperCase().getBytes();
lettersLower=commonLetters.toLowerCase().getBytes();
boolean x=false;
for(int i=0; i<lettersUpper.length; i++){
if(lettersUpper[i]!='A' && lettersUpper[i]!='C' && lettersUpper[i]!='G' && lettersUpper[i]!='T'){
x=true;
}
}
extended=x;
numbers=new byte[s.length()];
numbersExtended=new byte[s.length()];
for(int i=0; i<lettersUpper.length; i++){
byte b=lettersUpper[i];
numbers[i]=baseToNumber[b];
numbersExtended[i]=baseToNumberExtended[b];
}
}
@Override
public boolean matchesExactly(byte[] source, int a){
assert(!extended);
a=a-center;
if(a<0 || a+length>source.length){return false;}
for(int i=0; i<lettersUpper.length; i++){
int x=i+a;
if(source[x]!=lettersUpper[i] && source[x]!=lettersLower[i]){
return false;
}
}
return true;
}
@Override
public boolean matchesExtended(byte[] source, int a){
a=a-center;
if(a<0 || a+length>source.length){return false;}
for(int i=0; i<lettersUpper.length; i++){
int x=i+a;
byte s=source[x];
byte n=baseToNumberExtended[s];
if((n&numbersExtended[i])!=n){
return false;
}
}
return true;
}
@Override
public int numBases() {
return numbers.length;
}
public final byte[] lettersUpper;
public final byte[] lettersLower;
public final byte[] numbers;
public final byte[] numbersExtended;
public final boolean extended;
}
|