comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/bloom/IndexCounter.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
comparison
equal deleted inserted replaced
67:0e9998148a16 68:5028fdace37b
1 package bloom;
2
3 import java.lang.Thread.State;
4 import java.util.concurrent.atomic.AtomicInteger;
5
6 import dna.AminoAcid;
7 import dna.ChromosomeArray;
8 import dna.Data;
9 import shared.Shared;
10 import shared.Tools;
11
12 public class IndexCounter extends KmerCountAbstract {
13
14 public IndexCounter(final int k_, final boolean rcomp_){
15 k=k_;
16 rcomp=rcomp_;
17
18 final int bitsPerChar=2;
19 shift=bitsPerChar*k;
20 shift2=shift-bitsPerChar;
21 mask=(shift>63 ? -1L : ~((-1L)<<shift)); //Conditional allows K=32
22 assert(k>=1 && k<33) : k;
23 }
24
25 public KCountArray makeKcaFromIndex(long cells, int cbits, int hashes){
26 KCountArray kca=KCountArray.makeNew(cells, cbits, hashes, null, 0);
27 try {
28 countFromIndex(kca);
29 } catch (Exception e) {
30 // TODO Auto-generated catch block
31 e.printStackTrace();
32 }
33 kca.shutdown();
34 return kca;
35 }
36
37 public KCountArray countFromIndex(KCountArray counts) throws Exception{
38
39 final CountThread[] cta=new CountThread[Tools.min(Data.numChroms*THREADS_PER_CHROM, Shared.threads())];
40 final AtomicInteger nextChrom=new AtomicInteger(0);
41 for(int i=0; i<cta.length; i++){
42 cta[i]=new CountThread(counts, nextChrom);
43 cta[i].start();
44 }
45 // System.out.println("~1");
46 for(int i=0; i<cta.length; i++){
47 // System.out.println("~2");
48 CountThread ct=cta[i];
49 synchronized(ct){
50 // System.out.println("~3");
51 while(ct.getState()!=State.TERMINATED){
52 // System.out.println("~4");
53 try {
54 ct.join(2000);
55 } catch (InterruptedException e) {
56 // TODO Auto-generated catch block
57 e.printStackTrace();
58 }
59 // System.out.println("~5");
60 }
61 }
62 }
63
64 return counts;
65 }
66
67 private class CountThread extends Thread{
68
69 CountThread(final KCountArray counts_, AtomicInteger nextChrom_){
70 counts=counts_;
71 nextChrom=nextChrom_;
72 }
73
74 @Override
75 public void run(){
76 count(counts);
77
78 synchronized(getClass()){
79 keysCounted+=keysCountedLocal;
80 readsProcessed+=readsProcessedLocal;
81
82 if(verbose){System.err.println(keysCounted+", "+keysCountedLocal);}
83 if(verbose){System.err.println(readsProcessed+", "+readsProcessedLocal);}
84 }
85 }
86
87 private final void count(KCountArray counts){
88 assert(k>=1 && counts!=null);
89 final int maxCount=THREADS_PER_CHROM*Data.numChroms;
90 for(int cnum=nextChrom.getAndIncrement(); cnum<maxCount; cnum=nextChrom.getAndIncrement()){
91 ChromosomeArray ca=Data.getChromosome(cnum/THREADS_PER_CHROM+1);
92 processChrom(ca, cnum%THREADS_PER_CHROM);
93 }
94 }
95
96 private final void processChrom(ChromosomeArray ca, int segNum){
97 assert(k<=maxShortKmerLength);
98 assert(CANONICAL);
99
100 final byte[] bases=ca.array;
101 if(bases==null || bases.length<k){return;}
102 final int segLength=bases.length/4;
103 final int start=Tools.max(0, segNum*segLength-k);
104 final int stop=Tools.min(bases.length, (segNum+1)*segLength);
105
106 long kmer=0;
107 long rkmer=0;
108 int len=0;
109
110 for(int i=start; i<stop; i++){
111 final byte b=bases[i];
112 long x=AminoAcid.baseToNumber[b];
113 long x2=AminoAcid.baseToComplementNumber[b];
114 kmer=((kmer<<2)|x)&mask;
115 rkmer=((rkmer>>>2)|(x2<<shift2))&mask;
116
117 if(x<0){
118 len=0;
119 kmer=rkmer=0;
120 }else{
121 len++;
122 if(len>=k){
123 long key=(rcomp ? Tools.max(kmer, rkmer) : kmer);
124 counts.increment(key);
125 readsProcessedLocal++;
126 }
127 }
128 }
129 }
130 private final KCountArray counts;
131 private final AtomicInteger nextChrom;
132 private long keysCountedLocal=0;
133 private long readsProcessedLocal=0;
134 }
135
136 private final int k;
137 // private final int cbits;
138 private final int shift;
139 private final int shift2;
140 private final long mask;
141 private final boolean rcomp;
142
143 private static final int THREADS_PER_CHROM=4;
144
145 }