File: MotifSimple.java

package info (click to toggle)
bbmap 39.20%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 26,024 kB
  • sloc: java: 312,743; sh: 18,099; python: 5,247; ansic: 2,074; perl: 96; makefile: 39; xml: 38
file content (96 lines) | stat: -rwxr-xr-x 2,007 bytes parent folder | download | duplicates (4)
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;
	
}