Mercurial > repos > rliterman > csp2
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 } |