dna.h 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295
  1. /*
  2. *
  3. * Copyright (c) 2011, Jue Ruan <ruanjue@gmail.com>
  4. *
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef __DNA_RJ_H
  20. #define __DNA_RJ_H
  21. #include <stdint.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <stdio.h>
  25. #include "list.h"
  26. #include "bitvec.h"
  27. #include "hashset.h"
  28. #include "thread.h"
  29. static const u1i base_bit_table[256] = {
  30. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  31. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  32. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  33. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  34. 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4,
  35. 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  36. 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4,
  37. 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  38. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  39. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  40. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  41. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  42. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  43. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  44. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  45. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
  46. };
  47. static const u1i base_bit4_table[256] = {
  48. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  49. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  50. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  51. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  52. 15, 1, 14, 2, 13, 15, 15, 4, 11, 15, 15, 12, 15, 3, 15, 15,
  53. 15, 15, 5, 6, 8, 15, 7, 9, 15, 10, 15, 15, 15, 15, 15, 15,
  54. 15, 1, 14, 2, 13, 15, 15, 4, 11, 15, 15, 12, 15, 3, 15, 15,
  55. 15, 15, 5, 6, 8, 15, 7, 9, 15, 10, 15, 15, 15, 15, 15, 15,
  56. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  57. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  58. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  59. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  60. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  61. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  62. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
  63. 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15
  64. };
  65. static const u1i bit4_bit_table[16] = { 4, 0, 1, 4, 2, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4 };
  66. static const char bit_base_table[12] = "ACGTN-acgtn*";
  67. static const char bit4_base_table[16] = "-ACMGRSVTWYHKDBN";
  68. // u8i = 0|1|2|3|4|5|6|...
  69. #define bits2bit(bits, off) (((bits)[(off) >> 5] >> (((~(off)) & 0x1FU) << 1)) & 0x03U)
  70. #define bits2revbit(bits, off) ((~((bits)[(off) >> 5] >> (((~(off)) & 0x1FU) << 1))) & 0x03U)
  71. static inline u8i dna_xor2ones(u8i seq){
  72. return ((seq & 0xAAAAAAAAAAAAAAAALLU) >> 1) | (seq & 0x5555555555555555LLU);
  73. }
  74. static inline u8i dna_rev_seq32(u8i seq){
  75. seq = ~seq;
  76. seq = ((seq & 0x3333333333333333LLU)<< 2) | ((seq & 0xCCCCCCCCCCCCCCCCLLU)>> 2);
  77. seq = ((seq & 0x0F0F0F0F0F0F0F0FLLU)<< 4) | ((seq & 0xF0F0F0F0F0F0F0F0LLU)>> 4);
  78. #if 0
  79. seq = ((seq & 0x00FF00FF00FF00FFLLU)<< 8) | ((seq & 0xFF00FF00FF00FF00LLU)>> 8);
  80. seq = ((seq & 0x0000FFFF0000FFFFLLU)<<16) | ((seq & 0xFFFF0000FFFF0000LLU)>>16);
  81. seq = ((seq & 0x00000000FFFFFFFFLLU)<<32) | ((seq & 0xFFFFFFFF00000000LLU)>>32);
  82. #else
  83. seq = __builtin_bswap64(seq);
  84. #endif
  85. return seq;
  86. }
  87. static inline u8i dna_rev_seq(u8i seq, u1i seq_size){
  88. return dna_rev_seq32(seq) >> (64 - (seq_size<<1));
  89. }
  90. // order of 2-bit in this->seqs is different with that in dna_rev_seq->seq
  91. static inline void dna_rev_seqs(u8i *seqs, u8i seq_size){
  92. register u8i t;
  93. int i, j;
  94. register u1i d, e;
  95. j = (seq_size + 31) >> 5;
  96. // Swap within 64bit
  97. for(i=0;i<j;i++){
  98. seqs[i] = ~seqs[i];
  99. seqs[i] = ((seqs[i] & 0x3333333333333333LLU)<< 2) | ((seqs[i] & 0xCCCCCCCCCCCCCCCCLLU)>> 2);
  100. seqs[i] = ((seqs[i] & 0x0F0F0F0F0F0F0F0FLLU)<< 4) | ((seqs[i] & 0xF0F0F0F0F0F0F0F0LLU)>> 4);
  101. seqs[i] = __builtin_bswap64(seqs[i]);
  102. }
  103. // Swap 64bit blocks
  104. for(i=0;i<j>>1;i++){
  105. t = seqs[i]; seqs[i] = seqs[j - i - 1]; seqs[j - i - 1] = t;
  106. }
  107. // left-align seqs
  108. if((d = ((j << 5) - seq_size) << 1)){
  109. e = 64 - d;
  110. for(i=0;i<j-1;i++){
  111. seqs[i] = (seqs[i] << d) | (seqs[i+1] >> e);
  112. }
  113. seqs[i] = (seqs[i] << d) | 0;
  114. }
  115. }
  116. //shift one base, and append one base, useful to build big-kmer
  117. static inline void dna_shl_seqs(u8i *seqs, u8i seq_size, u1i base_val){
  118. const u1i d = 2;
  119. const u1i e = 62;
  120. int i, j;
  121. j = (seq_size + 31) >> 5;
  122. for(i=0;i<j-1;i++){
  123. seqs[i] = (seqs[i] << d) | (seqs[i+1] >> e);
  124. }
  125. seqs[i] = (seqs[i] << d) | (((u8i)(base_val & 0x03U)) << ((32 - (seq_size & 0x1FU)) << 1));
  126. }
  127. static inline int dna_cmp_seqs(u8i *seqs1, u8i *seqs2, u8i seq_size){
  128. int i, j;
  129. j = (seq_size + 31) >> 5;
  130. for(i=0;i<j;i++){
  131. if(seqs1[i] < seqs2[i]) return -1;
  132. if(seqs1[i] > seqs2[i]) return 1;
  133. }
  134. return 0;
  135. }
  136. static inline int dna_cmpx_seqs(u8i *seqs, u8i seq_size){
  137. register int i, j;
  138. register u1i a, b;
  139. j = (seq_size + 1) >> 1;
  140. for(i=0;i<j;i++){
  141. a = bits2bit(seqs, i);
  142. b = (~bits2bit(seqs, seq_size - 1 - i)) & 0x03U;
  143. if(a < b) return -1;
  144. if(a > b) return 1;
  145. }
  146. return 0;
  147. }
  148. static inline u8i seq2kmer(char *seq, u4i ksize){
  149. u8i kmer;
  150. u4i i;
  151. kmer = 0;
  152. for(i=0;i<ksize;i++) kmer = (kmer << 2) | base_bit_table[(int)seq[i]];
  153. return kmer;
  154. }
  155. static inline u8i seq2revkmer(char *seq, u4i ksize){
  156. u8i kmer;
  157. u4i i;
  158. kmer = 0;
  159. for(i=0;i<ksize;i++) kmer = (kmer << 2) | ((~base_bit_table[(int)seq[ksize - 1 - i]]) & 0x03);
  160. return kmer;
  161. }
  162. static inline void kmer2seq(char *seq, u8i kmer, u4i ksize){
  163. u4i i;
  164. for(i=0;i<ksize;i++){
  165. seq[i] = bit_base_table[(kmer >> ((ksize - 1 - i) << 1)) & 0x03];
  166. }
  167. seq[i] = 0;
  168. }
  169. static inline void kmer2revseq(char *seq, u8i kmer, u4i ksize){
  170. u4i i;
  171. kmer = ~kmer;
  172. for(i=0;i<ksize;i++){
  173. seq[i] = bit_base_table[(kmer >> (i << 1)) & 0x03];
  174. }
  175. seq[i] = 0;
  176. }
  177. static inline void print_kmer_seq(u8i kmer, u4i ksize, FILE *out){
  178. char seq[33];
  179. kmer2seq(seq, kmer, ksize);
  180. fputs(seq, out);
  181. }
  182. static inline void print_kmer_revseq(u8i kmer, u4i ksize, FILE *out){
  183. char seq[33];
  184. kmer2revseq(seq, kmer, ksize);
  185. fputs(seq, out);
  186. }
  187. #define kmer_mask(ksize) (0xFFFFFFFFFFFFFFFFLLU >> ((32 - (ksize)) * 2))
  188. #define beg_seq2kmers(seq, seqlen, ksize, kmask, kmer, idx) { \
  189. u1i beg_seq2kmers_v; \
  190. kmer = 0; \
  191. for(idx=0;(int)idx+1<(int)ksize;idx++){ \
  192. beg_seq2kmers_v = base_bit_table[(int)(seq)[idx]]; \
  193. if(beg_seq2kmers_v == 4) beg_seq2kmers_v = lrand48() & 0x03; \
  194. kmer = (((kmer) << 2) | beg_seq2kmers_v); \
  195. } \
  196. for(idx=0;(int)idx<=(int)(seqlen-ksize);idx++){ \
  197. beg_seq2kmers_v = base_bit_table[(int)(seq)[idx + (ksize) - 1]]; \
  198. if(beg_seq2kmers_v == 4) beg_seq2kmers_v = lrand48() & 0x03; \
  199. kmer = ((kmer << 2) | beg_seq2kmers_v) & kmask;
  200. #define end_seq2kmers } }
  201. #define beg_seq2revkmers(seq, seqlen, ksize, kmask, kmer, idx) { \
  202. u1i beg_seq2revkmers_v; \
  203. kmer = 0; \
  204. for(idx=0;(int)idx+1<(int)ksize;idx++){ \
  205. beg_seq2revkmers_v = base_bit_table[(int)(seq)[seqlen - 1 - idx]]; \
  206. if(beg_seq2revkmers_v == 4) beg_seq2revkmers_v = lrand48() & 0x03; \
  207. kmer = (((kmer) << 2) | beg_seq2revkmers_v); \
  208. } \
  209. for(idx=0;(int)idx<=(int)seqlen-ksize;idx++){ \
  210. beg_seq2revkmers_v = base_bit_table[(int)(seq)[seqlen - idx - (ksize)]]; \
  211. if(beg_seq2revkmers_v == 4) beg_seq2revkmers_v = lrand48() & 0x03; \
  212. kmer = ((kmer << 2) | beg_seq2revkmers_v) & kmask;
  213. #define end_seq2revkmers } }
  214. static inline char reverse_dna_base(char b){
  215. switch(b){
  216. case 'a': return 't';
  217. case 'A': return 'T';
  218. case 'c': return 'g';
  219. case 'C': return 'G';
  220. case 'g': return 'c';
  221. case 'G': return 'C';
  222. case 't': return 'a';
  223. case 'T': return 'A';
  224. default: return 'N';
  225. }
  226. }
  227. static inline void reverse_dna(char *seq, int len){
  228. int i, j;
  229. char c;
  230. i = 0;
  231. j = len - 1;
  232. while(i < j){
  233. c = seq[i]; seq[i] = seq[j]; seq[j] = c;
  234. i ++; j --;
  235. }
  236. for(i=0;i<len;i++){
  237. switch(seq[i]){
  238. case 'a': seq[i] = 't'; break;
  239. case 'A': seq[i] = 'T'; break;
  240. case 'c': seq[i] = 'g'; break;
  241. case 'C': seq[i] = 'G'; break;
  242. case 'g': seq[i] = 'c'; break;
  243. case 'G': seq[i] = 'C'; break;
  244. case 't': seq[i] = 'a'; break;
  245. case 'T': seq[i] = 'A'; break;
  246. }
  247. }
  248. }
  249. #define reverse_dna_coord(x, y, tot_len) { x = x ^ y; y = x ^ y; x = x ^ y; x = tot_len - x; y = tot_len - y; }
  250. #define old_bit2bits(bits, off, bit) { if(((off) & 0x1FU) == 0) (bits)[(off) >> 5] = 0; (bits)[(off) >> 5] |= ((u8i)(bit)) << (((~(off)) & 0x1FU) << 1); }
  251. #define bit2bits(bits, off, bit) { \
  252. u8i __off1; \
  253. u4i __off2; \
  254. __off1 = (off) >> 5; \
  255. __off2 = (((~(off)) & 0x1FU) << 1); \
  256. (bits)[__off1] = ((bits)[__off1] & (~(0x3LLU << __off2))) | (((u8i)(bit)) << __off2); \
  257. }
  258. static inline void seq2bits(u8i *bits, u8i bitoff, char *seq, u4i seqlen){
  259. u8i i, c;
  260. for(i=0;i<seqlen;i++){
  261. c = base_bit_table[(int)seq[i]];
  262. if(c == 4) c = lrand48() & 0x03;
  263. bit2bits(bits, bitoff + i, c);
  264. }
  265. }
  266. static inline void revseq2bits(u8i *bits, u8i bitoff, char *seq, u4i seqlen){
  267. u8i i, c;
  268. for(i=0;i<seqlen;i++){
  269. c = base_bit_table[(int)seq[seqlen - i - 1]];
  270. if(c == 4) c = lrand48();
  271. c = (~c) & 0x03;
  272. bit2bits(bits, bitoff + i, c);
  273. }
  274. }
  275. static inline void bits2seq(char *seq, u8i *bits, u8i off, u4i len){
  276. u4i i, c;
  277. for(i=0;i<len;i++){
  278. c = bits2bit(bits, off + i);
  279. seq[i] = bit_base_table[c];
  280. }
  281. seq[i] = 0;
  282. }
  283. static inline void bits2revseq(char *seq, u8i *bits, u8i off, u4i len){
  284. u4i i, c;
  285. for(i=0;i<len;i++){
  286. c = (bits[(off + i)>>5] >> (((~(off + i)) & 0x1FU) << 1)) & 0x03;
  287. seq[len - i - 1] = bit_base_table[(~c)&0x03];
  288. }
  289. seq[i] = 0;
  290. }
  291. static inline u8i sub32seqbits(u8i *src, u8i off){
  292. u8i m;
  293. u4i n;
  294. m = off >> 5;
  295. n = (off & 0x1F) << 1;
  296. return (src[m] << n) | (((src[m + 1] >> (62 - n)) >> 2));
  297. //n = off & 0x1F;
  298. //if(n){
  299. //return (src[m] << (n << 1)) | (src[m + 1] >> ((32 - n) << 1));
  300. //} else {
  301. //return src[m];
  302. //}
  303. }
  304. static inline u8i sub8seqbits(u8i *src, u8i off){
  305. u8i off1;
  306. u4i off2;
  307. off1 = off >> 5;
  308. off2 = (off & 0x1FU) << 1;
  309. return ((src[off1] << off2) | (((src[off1 + 1] >> (62 - off2)) >> 2))) >> 48;
  310. }
  311. static inline u8i sub4seqbits(u8i *src, u8i off){
  312. u8i off1;
  313. u4i off2;
  314. off1 = off >> 5;
  315. off2 = (off & 0x1FU) << 1;
  316. return ((src[off1] << off2) | (((src[off1 + 1] >> (62 - off2)) >> 2))) >> 56;
  317. }
  318. static inline u8i sub2seqbits(u8i *src, u8i off){
  319. u8i off1;
  320. u4i off2;
  321. off1 = off >> 5;
  322. off2 = (off & 0x1FU) << 1;
  323. return ((src[off1] << off2) | (((src[off1 + 1] >> (62 - off2)) >> 2))) >> 60;
  324. }
  325. static inline u8i sub_seqbits(u8i *src, u8i off, u1i len){
  326. u8i off1;
  327. u4i off2;
  328. off1 = off >> 5;
  329. off2 = (off & 0x1FU) << 1;
  330. return ((src[off1] << off2) | (((src[off1 + 1] >> (62 - off2)) >> 2))) >> ((32 - len) << 1);
  331. }
  332. #define subseqbits(src, off, len) sub_seqbits(src, off, len)
  333. static inline int cmpgt_seqbits(u8i *bits, u8i off1, u8i off2, u4i _len){
  334. u8i idxs[2], v[2];
  335. u4i offs[2], i, len;
  336. idxs[0] = off1 >> 5;
  337. idxs[1] = off2 >> 5;
  338. offs[0] = (off1 & 0x1FU) << 1;
  339. offs[1] = (off2 & 0x1FU) << 1;
  340. len = roundup_times(_len, 32);
  341. for(i=0;i<len;i+=32){
  342. v[0] = (bits[idxs[0]] << offs[0]) | (((bits[idxs[0] + 1] >> (62 - offs[0])) >> 2));
  343. v[1] = (bits[idxs[1]] << offs[1]) | (((bits[idxs[1] + 1] >> (62 - offs[1])) >> 2));
  344. if(v[0] > v[1]){
  345. return 1;
  346. } else if(v[0] < v[1]){
  347. return 0;
  348. }
  349. idxs[0] ++;
  350. idxs[1] ++;
  351. }
  352. return 0;
  353. }
  354. #if __BYTE_ORDER == 1234
  355. static const u4i spare_2bits_table[256] = {
  356. 0, 16777216, 33554432, 50331648, 65536, 16842752, 33619968, 50397184,
  357. 131072, 16908288, 33685504, 50462720, 196608, 16973824, 33751040, 50528256,
  358. 256, 16777472, 33554688, 50331904, 65792, 16843008, 33620224, 50397440,
  359. 131328, 16908544, 33685760, 50462976, 196864, 16974080, 33751296, 50528512,
  360. 512, 16777728, 33554944, 50332160, 66048, 16843264, 33620480, 50397696,
  361. 131584, 16908800, 33686016, 50463232, 197120, 16974336, 33751552, 50528768,
  362. 768, 16777984, 33555200, 50332416, 66304, 16843520, 33620736, 50397952,
  363. 131840, 16909056, 33686272, 50463488, 197376, 16974592, 33751808, 50529024,
  364. 1, 16777217, 33554433, 50331649, 65537, 16842753, 33619969, 50397185,
  365. 131073, 16908289, 33685505, 50462721, 196609, 16973825, 33751041, 50528257,
  366. 257, 16777473, 33554689, 50331905, 65793, 16843009, 33620225, 50397441,
  367. 131329, 16908545, 33685761, 50462977, 196865, 16974081, 33751297, 50528513,
  368. 513, 16777729, 33554945, 50332161, 66049, 16843265, 33620481, 50397697,
  369. 131585, 16908801, 33686017, 50463233, 197121, 16974337, 33751553, 50528769,
  370. 769, 16777985, 33555201, 50332417, 66305, 16843521, 33620737, 50397953,
  371. 131841, 16909057, 33686273, 50463489, 197377, 16974593, 33751809, 50529025,
  372. 2, 16777218, 33554434, 50331650, 65538, 16842754, 33619970, 50397186,
  373. 131074, 16908290, 33685506, 50462722, 196610, 16973826, 33751042, 50528258,
  374. 258, 16777474, 33554690, 50331906, 65794, 16843010, 33620226, 50397442,
  375. 131330, 16908546, 33685762, 50462978, 196866, 16974082, 33751298, 50528514,
  376. 514, 16777730, 33554946, 50332162, 66050, 16843266, 33620482, 50397698,
  377. 131586, 16908802, 33686018, 50463234, 197122, 16974338, 33751554, 50528770,
  378. 770, 16777986, 33555202, 50332418, 66306, 16843522, 33620738, 50397954,
  379. 131842, 16909058, 33686274, 50463490, 197378, 16974594, 33751810, 50529026,
  380. 3, 16777219, 33554435, 50331651, 65539, 16842755, 33619971, 50397187,
  381. 131075, 16908291, 33685507, 50462723, 196611, 16973827, 33751043, 50528259,
  382. 259, 16777475, 33554691, 50331907, 65795, 16843011, 33620227, 50397443,
  383. 131331, 16908547, 33685763, 50462979, 196867, 16974083, 33751299, 50528515,
  384. 515, 16777731, 33554947, 50332163, 66051, 16843267, 33620483, 50397699,
  385. 131587, 16908803, 33686019, 50463235, 197123, 16974339, 33751555, 50528771,
  386. 771, 16777987, 33555203, 50332419, 66307, 16843523, 33620739, 50397955,
  387. 131843, 16909059, 33686275, 50463491, 197379, 16974595, 33751811, 50529027
  388. };
  389. #else
  390. static const u4i spare_2bits_table[256] = {
  391. 0, 1, 2, 3, 256, 257, 258, 259,
  392. 512, 513, 514, 515, 768, 769, 770, 771,
  393. 65536, 65537, 65538, 65539, 65792, 65793, 65794, 65795,
  394. 66048, 66049, 66050, 66051, 66304, 66305, 66306, 66307,
  395. 131072, 131073, 131074, 131075, 131328, 131329, 131330, 131331,
  396. 131584, 131585, 131586, 131587, 131840, 131841, 131842, 131843,
  397. 196608, 196609, 196610, 196611, 196864, 196865, 196866, 196867,
  398. 197120, 197121, 197122, 197123, 197376, 197377, 197378, 197379,
  399. 16777216, 16777217, 16777218, 16777219, 16777472, 16777473, 16777474, 16777475,
  400. 16777728, 16777729, 16777730, 16777731, 16777984, 16777985, 16777986, 16777987,
  401. 16842752, 16842753, 16842754, 16842755, 16843008, 16843009, 16843010, 16843011,
  402. 16843264, 16843265, 16843266, 16843267, 16843520, 16843521, 16843522, 16843523,
  403. 16908288, 16908289, 16908290, 16908291, 16908544, 16908545, 16908546, 16908547,
  404. 16908800, 16908801, 16908802, 16908803, 16909056, 16909057, 16909058, 16909059,
  405. 16973824, 16973825, 16973826, 16973827, 16974080, 16974081, 16974082, 16974083,
  406. 16974336, 16974337, 16974338, 16974339, 16974592, 16974593, 16974594, 16974595,
  407. 33554432, 33554433, 33554434, 33554435, 33554688, 33554689, 33554690, 33554691,
  408. 33554944, 33554945, 33554946, 33554947, 33555200, 33555201, 33555202, 33555203,
  409. 33619968, 33619969, 33619970, 33619971, 33620224, 33620225, 33620226, 33620227,
  410. 33620480, 33620481, 33620482, 33620483, 33620736, 33620737, 33620738, 33620739,
  411. 33685504, 33685505, 33685506, 33685507, 33685760, 33685761, 33685762, 33685763,
  412. 33686016, 33686017, 33686018, 33686019, 33686272, 33686273, 33686274, 33686275,
  413. 33751040, 33751041, 33751042, 33751043, 33751296, 33751297, 33751298, 33751299,
  414. 33751552, 33751553, 33751554, 33751555, 33751808, 33751809, 33751810, 33751811,
  415. 50331648, 50331649, 50331650, 50331651, 50331904, 50331905, 50331906, 50331907,
  416. 50332160, 50332161, 50332162, 50332163, 50332416, 50332417, 50332418, 50332419,
  417. 50397184, 50397185, 50397186, 50397187, 50397440, 50397441, 50397442, 50397443,
  418. 50397696, 50397697, 50397698, 50397699, 50397952, 50397953, 50397954, 50397955,
  419. 50462720, 50462721, 50462722, 50462723, 50462976, 50462977, 50462978, 50462979,
  420. 50463232, 50463233, 50463234, 50463235, 50463488, 50463489, 50463490, 50463491,
  421. 50528256, 50528257, 50528258, 50528259, 50528512, 50528513, 50528514, 50528515,
  422. 50528768, 50528769, 50528770, 50528771, 50529024, 50529025, 50529026, 50529027
  423. };
  424. #endif
  425. static inline void spare_2bits(u1i bs[32], u8i v){
  426. ((u4i*)bs)[0] = spare_2bits_table[((v >> 56) & 0xFF)];
  427. ((u4i*)bs)[1] = spare_2bits_table[((v >> 48) & 0xFF)];
  428. ((u4i*)bs)[2] = spare_2bits_table[((v >> 40) & 0xFF)];
  429. ((u4i*)bs)[3] = spare_2bits_table[((v >> 32) & 0xFF)];
  430. ((u4i*)bs)[4] = spare_2bits_table[((v >> 24) & 0xFF)];
  431. ((u4i*)bs)[5] = spare_2bits_table[((v >> 16) & 0xFF)];
  432. ((u4i*)bs)[6] = spare_2bits_table[((v >> 8) & 0xFF)];
  433. ((u4i*)bs)[7] = spare_2bits_table[((v >> 0) & 0xFF)];
  434. }
  435. typedef struct {
  436. u8i *bits;
  437. u8i size;
  438. u8i cap;
  439. } BaseBank;
  440. static inline size_t basebank_obj_desc_cnt(void *obj, int idx){ return ((((BaseBank*)obj)->size + 31) / 32 + 1) * 8; idx = idx; }
  441. static inline void basebank_obj_desc_post_load(void *obj, size_t aux_data){
  442. BaseBank *bnk;
  443. UNUSED(aux_data);
  444. bnk = (BaseBank*)obj;
  445. bnk->cap = ((bnk->size + 31) / 32) * 32;
  446. }
  447. static const obj_desc_t basebank_obj_desc = {"BaseBank", sizeof(BaseBank), 1, {1}, {offsetof(BaseBank, bits)}, {(obj_desc_t*)&OBJ_DESC_DATA}, basebank_obj_desc_cnt, basebank_obj_desc_post_load};
  448. static inline BaseBank* init_basebank(){
  449. BaseBank *bnk;
  450. bnk = malloc(sizeof(BaseBank));
  451. bnk->size = 0;
  452. bnk->cap = 256;
  453. bnk->bits = calloc(bnk->cap / 32 + 1, 8);
  454. return bnk;
  455. }
  456. static inline void free_basebank(BaseBank *bnk){
  457. free(bnk->bits);
  458. free(bnk);
  459. }
  460. static inline void encap_basebank(BaseBank *bnk, u8i inc){
  461. u8i old;
  462. u8i *bits;
  463. if(bnk->cap - bnk->size >= inc) return;
  464. old = bnk->cap;
  465. if(MAX_U8 - inc <= bnk->size){
  466. fprintf(stderr, " -- Overflow(64bits) %llu + %llu, in %s -- %s:%d --\n", (u8i)bnk->size, (u8i)inc, __FUNCTION__, __FILE__, __LINE__);
  467. print_backtrace(stderr, 20);
  468. abort();
  469. }
  470. if(MAX_U8 - inc < 0x3FFFFFFFLLU){
  471. fprintf(stderr, " -- Overflow(64bits) %llu + %llu, in %s -- %s:%d --\n", (u8i)bnk->size, (u8i)inc, __FUNCTION__, __FILE__, __LINE__);
  472. print_backtrace(stderr, 20);
  473. abort();
  474. }
  475. if(bnk->size + inc <= 0x3FFFFFFFLLU){
  476. bnk->cap = roundup_times(2 * (bnk->size + inc), 32);
  477. } else {
  478. //bnk->cap = ((bnk->size + inc + 0xFFFFFFFLLU - 1LLU) / 0xFFFFFFFLLU) * 0xFFFFFFFLLU;
  479. bnk->cap = (bnk->size + inc + 0x3FFFFFFFLLU) & (MAX_U8 << 30);
  480. }
  481. if(bnk->cap < 32) bnk->cap = 32;
  482. bits = realloc(bnk->bits, ((bnk->cap >> 5) + 1) << 3);
  483. if(bits == NULL){
  484. fprintf(stderr, " -- Out of memory, try to allocate %llu bytes, old size %llu, in %s -- %s:%d --\n", (u8i)bnk->cap >> 2, old >> 2, __FUNCTION__, __FILE__, __LINE__);
  485. print_backtrace(stderr, 20);
  486. abort();
  487. }
  488. bnk->bits = bits;
  489. memset(bnk->bits + (old / 32), 0, (bnk->cap + 32 - old) / 4);
  490. }
  491. static inline void clear_basebank(BaseBank *bnk){
  492. //memset(bnk->bits, 0, ((bnk->size + 31) / 32) * 8);
  493. bnk->size = 0;
  494. }
  495. static inline void normalize_basebank(BaseBank *bnk){
  496. if(bnk->size < bnk->cap){
  497. if(bnk->size & 0x1FU){
  498. bnk->bits[bnk->size>>5] = bnk->bits[bnk->size>>5] & (MAX_U8 << (64 - ((bnk->size & 0x1FU) << 1)));
  499. }
  500. }
  501. }
  502. static inline void pack_basebank(BaseBank *bnk){
  503. u8i size;
  504. size = (bnk->size + 31) & (~0x1FLLU);
  505. if(size == 0) size = 32;
  506. if(size >= bnk->cap) return;
  507. bnk->cap = ((size + 31) / 32) * 32;
  508. bnk->bits = realloc(bnk->bits, ((bnk->cap >> 5) + 1) << 3);
  509. memset(bnk->bits + (bnk->cap >> 5), 0, 8);
  510. }
  511. static inline void bit2basebank(BaseBank *bnk, u1i v){
  512. encap_basebank(bnk, 1);
  513. bit2bits(bnk->bits, bnk->size, (v & 0x03));
  514. bnk->size ++;
  515. }
  516. static inline void bits2basebank(BaseBank *bnk, u8i *bits, u8i off, u8i len){
  517. u8i offset;
  518. encap_basebank(bnk, len);
  519. for(offset=off;offset<off+len;offset++){
  520. bit2bits(bnk->bits, bnk->size, bits2bit(bits, offset));
  521. bnk->size ++;
  522. }
  523. }
  524. #define fwdbits2basebank(bnk, bits, off, len) bits2basebank(bnk, bits, off, len)
  525. static inline void fast_bits2basebank(BaseBank *bnk, u8i *bits, u8i off, u8i len){
  526. u8i end, dat;
  527. u4i gap;
  528. encap_basebank(bnk, len);
  529. if(len == 0) return;
  530. if(bnk->size & 0x1FU){
  531. gap = 32 - (bnk->size & 0x1FU);
  532. if(len <= gap){
  533. dat = subseqbits(bits, off, len);
  534. bnk->bits[bnk->size >> 5] |= dat << ((gap - len) << 1);
  535. bnk->size += len;
  536. return;
  537. } else {
  538. dat = subseqbits(bits, off, gap);
  539. bnk->bits[bnk->size >> 5] |= dat;
  540. bnk->size += gap;
  541. off += gap;
  542. len -= gap;
  543. }
  544. }
  545. end = off + len;
  546. for(;off+32<=end;off+=32){
  547. dat = sub32seqbits(bits, off);
  548. bnk->bits[bnk->size >> 5] = dat;
  549. bnk->size += 32;
  550. }
  551. if(off < end){
  552. dat = sub32seqbits(bits, off);
  553. bnk->bits[bnk->size >> 5] = dat & (MAX_U8 << ((32 - (end - off)) << 1));
  554. bnk->size += end - off;
  555. } else {
  556. bnk->bits[bnk->size >> 5] = 0;
  557. }
  558. }
  559. #define fast_fwdbits2basebank(bnk, bits, off, len) fast_bits2basebank(bnk, bits, off, len)
  560. static inline void revbits2basebank(BaseBank *bnk, u8i *bits, u8i off, u8i len){
  561. u8i i;
  562. encap_basebank(bnk, len);
  563. for(i=1;i<=len;i++){
  564. bit2bits(bnk->bits, bnk->size, bits2revbit(bits, (off + len - i)));
  565. bnk->size ++;
  566. }
  567. }
  568. static inline void fast_revbits2basebank(BaseBank *bnk, u8i *bits, u8i off, u8i len){
  569. u8i end, dat;
  570. u4i gap;
  571. if(len == 0) return;
  572. encap_basebank(bnk, len);
  573. if(bnk->size & 0x1FU){
  574. gap = 32 - (bnk->size & 0x1FU);
  575. if(len <= gap){
  576. dat = subseqbits(bits, off, len);
  577. dat = dna_rev_seq(dat, len);
  578. bnk->bits[bnk->size >> 5] |= dat << ((gap - len) << 1);
  579. bnk->size += len;
  580. return;
  581. } else {
  582. dat = subseqbits(bits, off + len - gap, gap);
  583. dat = dna_rev_seq(dat, gap);
  584. bnk->bits[bnk->size >> 5] |= dat;
  585. bnk->size += gap;
  586. //off += gap;
  587. len -= gap;
  588. }
  589. }
  590. end = off + len;
  591. for(;off+32<=end;){
  592. end -= 32;
  593. dat = sub32seqbits(bits, end);
  594. dat = dna_rev_seq32(dat);
  595. bnk->bits[bnk->size >> 5] = dat;
  596. bnk->size += 32;
  597. }
  598. if(off < end){
  599. dat = sub32seqbits(bits, off);
  600. dat = dna_rev_seq32(dat);
  601. //bnk->bits[bnk->size >> 5] = dat & (MAX_U8 << ((32 - (end - off)) << 1));
  602. bnk->bits[bnk->size >> 5] = dat << ((32 - (end - off)) << 1);
  603. bnk->size += end - off;
  604. } else {
  605. bnk->bits[bnk->size >> 5] = 0;
  606. }
  607. }
  608. static inline void seq2basebank(BaseBank *bnk, char *seq, u8i len){
  609. u8i idx1, i, c;
  610. u1i idx2;
  611. encap_basebank(bnk, len);
  612. idx1 = bnk->size >> 5;
  613. idx2 = ((bnk->size) & 0x1FU) << 1;
  614. bnk->size += len;
  615. if(idx2 == 0) bnk->bits[idx1] = 0;
  616. for(i=0;i<len;i++){
  617. c = base_bit_table[(int)seq[i]] & 0x03;
  618. bnk->bits[idx1] |= c << (62 - idx2);
  619. idx2 = (idx2 + 2) & 0x3F;
  620. if(idx2 == 0){
  621. bnk->bits[++idx1] = 0;
  622. }
  623. }
  624. }
  625. #define fwdseq2basebank(bnk, seq, len) seq2basebank(bnk, seq, len)
  626. static inline void revseq2basebank(BaseBank *bnk, char *seq, u8i len){
  627. char *p;
  628. u1i c;
  629. p = seq + len;
  630. encap_basebank(bnk, len);
  631. while(p > seq){
  632. p --;
  633. c = base_bit_table[(int)*p];
  634. c = (~c) & 0x03;
  635. bit2bits(bnk->bits, bnk->size, c);
  636. bnk->size ++;
  637. }
  638. }
  639. static inline void seq2basebank2(BaseBank *bnk, char *seq, u8i len){
  640. char *p;
  641. u1i c;
  642. p = seq;
  643. seq = seq + len;
  644. encap_basebank(bnk, len);
  645. while(p < seq){
  646. c = base_bit_table[(int)*p];
  647. if(c == 4) c = lrand48() & 0x03;
  648. bit2bits(bnk->bits, bnk->size, c);
  649. bnk->size ++;
  650. p ++;
  651. }
  652. }
  653. static inline void revseq2basebank2(BaseBank *bnk, char *seq, u8i len){
  654. char *p;
  655. u1i c;
  656. p = seq + len;
  657. encap_basebank(bnk, len);
  658. while(p > seq){
  659. p --;
  660. c = base_bit_table[(int)*p];
  661. if(c == 4) c = lrand48() & 0x03;
  662. c = (~c) & 0x03;
  663. bit2bits(bnk->bits, bnk->size, c);
  664. bnk->size ++;
  665. }
  666. }
  667. static inline u1i get_basebank(BaseBank *bnk, u8i off){ return bits2bit(bnk->bits, off); }
  668. static inline void seq_basebank(BaseBank *bnk, u8i off, u8i len, char *seq){
  669. u8i i;
  670. for(i=0;i<len;i++){
  671. seq[i] = bit_base_table[bits2bit(bnk->bits, off + i)];
  672. }
  673. seq[i] = 0;
  674. }
  675. #define fwdseq_basebank(bnk, off, len, seq) seq_basebank(bnk, off, len, seq)
  676. static inline void bitseq_basebank(BaseBank *bnk, u8i off, u8i len, u1i *seq){
  677. u8i i;
  678. for(i=0;i<len;i++){
  679. seq[i] = bits2bit(bnk->bits, off + i);
  680. }
  681. }
  682. static inline void revseq_basebank(BaseBank *bnk, u8i off, u8i len, char *seq){
  683. u8i i;
  684. for(i=0;i<len;i++){
  685. seq[i] = bit_base_table[(~bits2bit(bnk->bits, off + len - 1 - i)) & 0x03];
  686. }
  687. seq[i] = 0;
  688. }
  689. static inline void revbitseq_basebank(BaseBank *bnk, u8i off, u8i len, u1i *seq){
  690. u8i i;
  691. for(i=0;i<len;i++){
  692. seq[i] = (~bits2bit(bnk->bits, off + len - 1 - i)) & 0x03;
  693. }
  694. }
  695. static inline void reverse_basebank(BaseBank *bnk){
  696. u8i size, rsize;
  697. size = bnk->size;
  698. rsize = (bnk->size + 31) & (~0x1FLLU);
  699. encap_basebank(bnk, rsize + 32);
  700. memcpy(bnk->bits + (rsize >> 5), bnk->bits + 0, (rsize >> 5) << 3);
  701. bnk->size = 0;
  702. fast_revbits2basebank(bnk, bnk->bits, rsize, size);
  703. }
  704. static inline void print_seq_basebank(BaseBank *bnk, u8i off, u8i len, FILE *out){
  705. u8i i, b, e;
  706. char buf[101];
  707. for(b=off;b<off+len;){
  708. e = num_min(b + 100, off + len);
  709. for(i=b;i<e;i++){
  710. buf[i - b] = bit_base_table[bits2bit(bnk->bits, i)];
  711. }
  712. buf[e - b] = '\0';
  713. fputs(buf, out);
  714. //fputc('\n', out);
  715. b = e;
  716. }
  717. }
  718. static inline void print_lines_basebank(BaseBank *bnk, u8i off, u8i len, FILE *out, int linewidth){
  719. u8i i, b, e;
  720. char *buf;
  721. if(linewidth < 1) linewidth = 100;
  722. buf = malloc(linewidth + 1);
  723. for(b=off;b<off+len;){
  724. e = num_min(b + linewidth, off + len);
  725. for(i=b;i<e;i++){
  726. buf[i - b] = bit_base_table[bits2bit(bnk->bits, i)];
  727. }
  728. buf[e - b] = '\0';
  729. fputs(buf, out);
  730. fputc('\n', out);
  731. b = e;
  732. }
  733. free(buf);
  734. }
  735. #define print_fwdseq_basebank(bnk, off, len, out) print_seq_basebank(bnk, off, len, out)
  736. static inline void println_seq_basebank(BaseBank *bnk, u8i off, u8i len, FILE *out){
  737. print_seq_basebank(bnk, off, len, out);
  738. fputc('\n', out);
  739. }
  740. #define println_fwdseq_basebank(bnk, off, len, out) println_seq_basebank(bnk, off, len, out)
  741. static inline void print_revseq_basebank(BaseBank *bnk, u8i off, u8i len, FILE *out){
  742. u8i i;
  743. char buf[65];
  744. buf[64] = '\0';
  745. for(i=0;i<len;){
  746. buf[i & 0x3F] = bit_base_table[bits2revbit(bnk->bits, off + len - 1 - i)];
  747. i ++;
  748. if((i & 0x3F) == 0){
  749. fprintf(out, "%s", buf);
  750. }
  751. }
  752. if(i & 0x3F){
  753. buf[i & 0x3F] = '\0';
  754. fprintf(out, "%s", buf);
  755. }
  756. }
  757. static inline u8i sub32_basebank(BaseBank *bnk, u8i off){ return sub32seqbits(bnk->bits, off); }
  758. static inline u8i sub4_basebank(BaseBank *bnk, u8i off){ return sub4seqbits(bnk->bits, off); }
  759. // assert(len > 0 && len <= 32)
  760. static inline u8i subbits_basebank(BaseBank *bnk, u8i off, u1i len){ return sub_seqbits(bnk->bits, off, len); }
  761. static inline void println_revseq_basebank(BaseBank *bnk, u8i off, u8i len, FILE *out){
  762. print_revseq_basebank(bnk, off, len, out);
  763. fputc('\n', out);
  764. }
  765. static inline u8i hzsubbits_basebank(BaseBank *bnk, u8i off, u1i len){
  766. u8i k;
  767. u1i i, b, c;
  768. k = 0;
  769. b = 4;
  770. for(i=0;i<len;off++){
  771. c = bits2bit(bnk->bits, off);
  772. if(c == b) continue;
  773. i ++;
  774. b = c;
  775. k = (k << 2) | b;
  776. }
  777. return k;
  778. }
  779. static inline int bitsearch_basebank(BaseBank *bnk, u8i *_off, u8i len, u8i bits, u1i size, int max_occ){
  780. u8i off, end, k, mask;
  781. u1i b;
  782. int ret;
  783. off = *_off;
  784. end = off + len;
  785. mask = MAX_U8 >> ((32 - size) << 1);
  786. k = subbits_basebank(bnk, off, size - 1);
  787. off += size - 1;
  788. ret = 0;
  789. for(;off<end;off++){
  790. b = bits2bit(bnk->bits, off);
  791. k = ((k << 2) | b) & mask;
  792. if(k == bits){
  793. _off[ret++] = off - (size - 1);
  794. if(ret >= max_occ) break;
  795. }
  796. }
  797. return ret;
  798. }
  799. static inline int hzbitsearch_basebank(BaseBank *bnk, u8i *_off, u8i len, u8i bits, u1i size, int max_occ){
  800. u8i off, h, end, k, mask;
  801. u1i b, c;
  802. int ret;
  803. off = *_off;
  804. end = off + len;
  805. mask = MAX_U8 >> ((32 - size) << 1);
  806. k = 0;
  807. h = 0;
  808. b = 4;
  809. ret = 0;
  810. for(;off<end;off++){
  811. c = bits2bit(bnk->bits, off);
  812. if(c == b) continue;
  813. b = c;
  814. h ++;
  815. k = ((k << 2) | b) & mask;
  816. if(h >= size && k == bits){
  817. _off[ret++] = off - (size - 1);
  818. if(ret >= max_occ) break;
  819. }
  820. }
  821. return ret;
  822. }
  823. static inline u4i mismatch_basebank(BaseBank *bnk, u8i off1, u8i off2, u4i len){
  824. u8i seq1, seq2;
  825. u4i mm, i;
  826. mm = 0;
  827. for(i=0;i+32<=len;i+=32){
  828. seq1 = sub32seqbits(bnk->bits, off1 + i);
  829. seq2 = sub32seqbits(bnk->bits, off2 + i);
  830. mm += count_ones_bit64(dna_xor2ones(seq1 ^ seq2));
  831. }
  832. if(i < len){
  833. seq1 = sub32seqbits(bnk->bits, off1 + i);
  834. seq2 = sub32seqbits(bnk->bits, off2 + i);
  835. mm += count_ones_bit64((dna_xor2ones(seq1 ^ seq2)) >> ((32 - (len - i)) << 1));
  836. }
  837. return mm;
  838. }
  839. thread_beg_def(_mradix);
  840. BaseBank *bb;
  841. u4i *counts[2];
  842. u4i *offs;
  843. u1v *lcps;
  844. u4i size, klen;
  845. int task;
  846. FILE *log;
  847. thread_end_def(_mradix);
  848. thread_beg_func(_mradix);
  849. BaseBank *bb;
  850. u4i *offs, *counts[2];
  851. u4i i, j, size, klen, m, n, v, t;
  852. u4i ncpu, tidx;
  853. bb = _mradix->bb;
  854. counts[0] = calloc((MAX_U2 + 1), sizeof(u4i)); // used in twice
  855. counts[1] = calloc((MAX_U2 + 1), sizeof(u4i));
  856. ncpu = _mradix->n_cpu;
  857. tidx = _mradix->t_idx;
  858. thread_beg_loop(_mradix);
  859. if(_mradix->task == 1){
  860. size = _mradix->size;
  861. for(i=_mradix->t_idx;i<size;i+=_mradix->n_cpu){
  862. v = sub8seqbits(bb->bits, i);
  863. counts[1][v] ++;
  864. }
  865. _mradix->counts[0] = counts[0];
  866. _mradix->counts[1] = counts[1];
  867. } else if(_mradix->task == 11){
  868. offs = _mradix->offs;
  869. size = _mradix->size;
  870. for(i=0;i<size;i++){
  871. v = sub8seqbits(bb->bits, i);
  872. if((v % _mradix->n_cpu) == (u4i)_mradix->t_idx){
  873. offs[_mradix->counts[0][v]++] = i;
  874. }
  875. if(_mradix->t_idx == 0 && _mradix->log && (i % 1000000) == 0){
  876. fprintf(_mradix->log, "\r%u", i); fflush(_mradix->log);
  877. }
  878. }
  879. if(_mradix->t_idx == 0 && _mradix->log){
  880. fprintf(_mradix->log, "\r%u\n", size);
  881. }
  882. } else if(_mradix->task == 2) {
  883. offs = _mradix->offs;
  884. size = _mradix->size;
  885. klen = _mradix->klen - 8;
  886. if(size <= MAX_U1){
  887. sort_array(offs, size, u4i, cmpgt_seqbits(bb->bits, a + 8, b + 8, klen)); // 8 bp already sorted
  888. } else {
  889. memset(counts[1], 0, (MAX_U1 + 1) * sizeof(u4i));
  890. for(i=0;i<size;i++){
  891. v = sub4seqbits(bb->bits, offs[i] + 8);
  892. counts[1][v] ++;
  893. }
  894. m = 0;
  895. for(i=0;i<=MAX_U1;i++){
  896. counts[0][i] = m;
  897. m += counts[1][i];
  898. counts[1][i] = m;
  899. }
  900. for(m=0;m<=MAX_U1;m++){
  901. while(counts[0][m] < counts[1][m]){
  902. v = offs[counts[0][m]];
  903. n = sub4seqbits(bb->bits, v + 8);
  904. while(n > m){
  905. t = offs[counts[0][n]];
  906. offs[counts[0][n]] = v;
  907. counts[0][n] ++;
  908. v = t;
  909. n = sub4seqbits(bb->bits, v + 8);
  910. }
  911. offs[counts[0][m]++] = v;
  912. }
  913. }
  914. n = 0;
  915. klen -= 4;
  916. for(m=0;m<=MAX_U1;m++){
  917. if(counts[0][m] - n < 2){
  918. // nothing to do
  919. } else {
  920. sort_array(offs + n, counts[0][m] - n, u4i, cmpgt_seqbits(bb->bits, a + 8 + 4, b + 8 + 4, klen));
  921. }
  922. n = counts[0][m];
  923. }
  924. }
  925. } else if(_mradix->task == 3){
  926. u1v *lcps;
  927. u8i mask;
  928. u4i beg, end;
  929. u1i lcp;
  930. offs = _mradix->offs;
  931. lcps = _mradix->lcps;
  932. beg = ((_mradix->size + ncpu - 1) / ncpu) * tidx;
  933. end = ((_mradix->size + ncpu - 1) / ncpu) * (tidx + 1);
  934. if(end > _mradix->size) end = _mradix->size;
  935. klen = _mradix->klen;
  936. if(beg == 0){
  937. lcps->buffer[0] = 0;
  938. beg = 1;
  939. }
  940. for(i=beg;i<end;i++){
  941. lcp = 0;
  942. for(j=0;j<klen;j+=32){
  943. mask = sub32seqbits(bb->bits, offs[i - 1] + j) ^ sub32seqbits(bb->bits, offs[i] + j);
  944. if(mask == 0){
  945. lcp += 32;
  946. } else {
  947. lcp += __builtin_clzll(mask) >> 1;
  948. break;
  949. }
  950. }
  951. lcps->buffer[i] = lcp;
  952. }
  953. }
  954. thread_end_loop(_mradix);
  955. free(counts[0]);
  956. free(counts[1]);
  957. thread_end_func(_mradix);
  958. // bullet size = 4^8 = (MAX_U2 + 1)
  959. static inline void msd_radix_sort_u4_basebank(BaseBank *bb, u4v *offs, u1v *lcps, u1i _klen, u4i ncpu, FILE *log){
  960. u4i *counts[3]; // off, end, off
  961. u4i klen, i, j, size, m, n;
  962. thread_preprocess(_mradix);
  963. klen = roundup_times(_klen, 32);
  964. size = num_max(bb->size, klen) - klen;
  965. clear_u4v(offs);
  966. encap_u4v(offs, size);
  967. offs->size = size;
  968. counts[0] = calloc(MAX_U2 + 1, sizeof(u4i));
  969. counts[1] = calloc(MAX_U2 + 1, sizeof(u4i));
  970. if(log) fprintf(log, "[%s] msd_radix_sort length=%u depth=%u\n", date(), (u4i)bb->size, klen);
  971. thread_beg_init(_mradix, ncpu);
  972. _mradix->bb = bb;
  973. _mradix->counts[0] = NULL;
  974. _mradix->counts[1] = NULL;
  975. _mradix->size = size;
  976. _mradix->offs = NULL;
  977. _mradix->klen = klen;
  978. _mradix->task = 0;
  979. _mradix->log = log;
  980. thread_end_init(_mradix);
  981. thread_apply_all(_mradix, _mradix->task = 1);
  982. thread_beg_iter(_mradix);
  983. for(j=0;j<=MAX_U2;j++){
  984. counts[1][j] += _mradix->counts[1][j];
  985. }
  986. thread_end_iter(_mradix);
  987. m = 0;
  988. for(i=0;i<=MAX_U2;i++){
  989. counts[0][i] = m;
  990. m += counts[1][i];
  991. counts[1][i] = m;
  992. }
  993. thread_beg_iter(_mradix);
  994. _mradix->offs = offs->buffer;
  995. _mradix->counts[0] = counts[0];
  996. _mradix->counts[1] = counts[1];
  997. _mradix->task = 11;
  998. thread_wake(_mradix);
  999. thread_end_iter(_mradix);
  1000. thread_wait_all(_mradix);
  1001. if(log) fprintf(log, "[%s] msd_radix_sort sorted by first 8 bp\n", date());
  1002. n = 0;
  1003. for(m=0;m<=MAX_U2;m++){
  1004. if(log && (m % 100) == 0){
  1005. fprintf(log, "\r%u", counts[0][m]); fflush(log);
  1006. }
  1007. if(counts[0][m] - n < 2){
  1008. // nothing to do
  1009. } else {
  1010. thread_wait_one(_mradix);
  1011. _mradix->offs = offs->buffer + n;
  1012. _mradix->size = counts[0][m] - n;
  1013. _mradix->task = 2;
  1014. thread_wake(_mradix);
  1015. }
  1016. n = counts[0][m];
  1017. }
  1018. thread_wait_all(_mradix);
  1019. if(log) fprintf(log, "\r%u\n", n);
  1020. if(log) fprintf(log, "[%s] msd_radix_sort sorted %u bases\n", date(), klen - 8);
  1021. free(counts[0]);
  1022. free(counts[1]);
  1023. if(lcps){
  1024. clear_u1v(lcps);
  1025. encap_u1v(lcps, size);
  1026. lcps->size = size;
  1027. thread_beg_iter(_mradix);
  1028. _mradix->offs = offs->buffer;
  1029. _mradix->size = size;
  1030. _mradix->lcps = lcps;
  1031. _mradix->task = 3;
  1032. thread_wake(_mradix);
  1033. thread_end_iter(_mradix);
  1034. thread_wait_all(_mradix);
  1035. if(log) fprintf(log, "[%s] msd_radix_sort calculated LCP\n", date());
  1036. }
  1037. thread_beg_close(_mradix);
  1038. thread_end_close(_mradix);
  1039. }
  1040. /*
  1041. * Sequence DB
  1042. */
  1043. typedef struct {
  1044. u4i nseq;
  1045. BaseBank *rdseqs;
  1046. cplist *rdtags;
  1047. u8v *rdoffs;
  1048. u4v *rdlens;
  1049. cuhash *rdhash;
  1050. } SeqBank;
  1051. static inline void rebuild_rdhash_seqbank(void *sb, size_t aux);
  1052. static const obj_desc_t seqbank_obj_desc = {"SeqBank", sizeof(SeqBank), 5, {1, 1, 1, 1, 1},
  1053. {offsetof(SeqBank, rdseqs), offsetof(SeqBank, rdtags), offsetof(SeqBank, rdoffs), offsetof(SeqBank, rdlens), offsetof(SeqBank, rdhash)},
  1054. {&basebank_obj_desc, &cplist_deep_obj_desc, &u8v_obj_desc, &u4v_obj_desc, &cuhash_obj_desc},
  1055. NULL, rebuild_rdhash_seqbank};
  1056. static inline SeqBank* init_seqbank(){
  1057. SeqBank *sb;
  1058. sb = malloc(sizeof(SeqBank));
  1059. sb->nseq = 0;
  1060. sb->rdseqs = init_basebank();
  1061. sb->rdtags = init_cplist(16);
  1062. sb->rdoffs = init_u8v(16);
  1063. sb->rdlens = init_u4v(16);
  1064. sb->rdhash = init_cuhash(1023);
  1065. return sb;
  1066. }
  1067. static inline void free_seqbank(SeqBank *sb){
  1068. u4i i;
  1069. for(i=0;i<sb->rdtags->size;i++) if(sb->rdtags->buffer[i]) free(sb->rdtags->buffer[i]);
  1070. free_basebank(sb->rdseqs);
  1071. free_cplist(sb->rdtags);
  1072. free_u8v(sb->rdoffs);
  1073. free_u4v(sb->rdlens);
  1074. free_cuhash(sb->rdhash);
  1075. free(sb);
  1076. }
  1077. static inline void clear_seqbank(SeqBank *sb){
  1078. u4i i;
  1079. for(i=0;i<sb->rdtags->size;i++) if(sb->rdtags->buffer[i]) free(sb->rdtags->buffer[i]);
  1080. clear_basebank(sb->rdseqs);
  1081. clear_cplist(sb->rdtags);
  1082. clear_u8v(sb->rdoffs);
  1083. clear_u4v(sb->rdlens);
  1084. clear_cuhash(sb->rdhash);
  1085. sb->nseq = 0;
  1086. }
  1087. // SeqBank's rdhash is wrongly loaded, need to be corrected
  1088. static inline void rebuild_rdhash_seqbank(void *_sb, size_t aux){
  1089. SeqBank *sb;
  1090. u4i i;
  1091. UNUSED(aux);
  1092. sb = (SeqBank*)_sb;
  1093. clear_cuhash(sb->rdhash); // hash size is not changed, thus there won't have hash re-size
  1094. for(i=0;i<sb->rdtags->size;i++){
  1095. put_cuhash(sb->rdhash, (cuhash_t){get_cplist(sb->rdtags, i), i});
  1096. }
  1097. }
  1098. static inline void push_seqbank(SeqBank *sb, char *tag, int tag_len, char *seq, int seq_len){
  1099. char *ptr;
  1100. if(tag && tag_len){
  1101. ptr = malloc(tag_len + 1);
  1102. memcpy(ptr, tag, tag_len);
  1103. ptr[tag_len] = 0;
  1104. } else {
  1105. ptr = NULL;
  1106. }
  1107. push_cplist(sb->rdtags, ptr);
  1108. push_u8v(sb->rdoffs, sb->rdseqs->size);
  1109. seq2basebank(sb->rdseqs, seq, seq_len);
  1110. push_u4v(sb->rdlens, seq_len);
  1111. if(ptr) put_cuhash(sb->rdhash, (cuhash_t){ptr, sb->nseq});
  1112. sb->nseq ++;
  1113. }
  1114. static inline void fwdbitpush_seqbank(SeqBank *sb, char *tag, int tag_len, u8i *bits, u8i off, u4i len){
  1115. char *ptr;
  1116. if(tag && tag_len){
  1117. ptr = malloc(tag_len + 1);
  1118. memcpy(ptr, tag, tag_len);
  1119. ptr[tag_len] = 0;
  1120. } else {
  1121. ptr = NULL;
  1122. }
  1123. push_cplist(sb->rdtags, ptr);
  1124. push_u8v(sb->rdoffs, sb->rdseqs->size);
  1125. fast_fwdbits2basebank(sb->rdseqs, bits, off, len);
  1126. push_u4v(sb->rdlens, len);
  1127. if(ptr) put_cuhash(sb->rdhash, (cuhash_t){ptr, sb->nseq});
  1128. sb->nseq ++;
  1129. }
  1130. static inline void revbitpush_seqbank(SeqBank *sb, char *tag, int tag_len, u8i *bits, u8i off, u4i len){
  1131. char *ptr;
  1132. if(tag && tag_len){
  1133. ptr = malloc(tag_len + 1);
  1134. memcpy(ptr, tag, tag_len);
  1135. ptr[tag_len] = 0;
  1136. } else {
  1137. ptr = NULL;
  1138. }
  1139. push_cplist(sb->rdtags, ptr);
  1140. push_u8v(sb->rdoffs, sb->rdseqs->size);
  1141. fast_revbits2basebank(sb->rdseqs, bits, off, len);
  1142. push_u4v(sb->rdlens, len);
  1143. if(ptr) put_cuhash(sb->rdhash, (cuhash_t){ptr, sb->nseq});
  1144. sb->nseq ++;
  1145. }
  1146. static inline u4i find_seqbank(SeqBank *sb, char *tag){ cuhash_t *e; if((e = get_cuhash(sb->rdhash, tag))) return e->val; else return MAX_U4; }
  1147. static inline u4i off2idx_seqbank(SeqBank *sb, u8i off){
  1148. u4i ret;
  1149. bsearch_array(sb->rdoffs->buffer, sb->rdoffs->size, u8i, ret, a < off);
  1150. return ret? ret - 1 : 0;
  1151. }
  1152. static inline u4i num_n50(u4v *lens, FILE *out){
  1153. u8i tot, cum;
  1154. u4i i, max, min, n50, l50, n90, l90, avg;
  1155. if(lens->size == 0) return 0;
  1156. sort_array(lens->buffer, lens->size, u4i, num_cmpgt(b, a));
  1157. tot = 0;
  1158. max = lens->buffer[0];
  1159. min = lens->buffer[lens->size - 1];
  1160. for(i=0;i<lens->size;i++){
  1161. tot += lens->buffer[i];
  1162. }
  1163. avg = (tot + lens->size - 1) / lens->size;
  1164. cum = 0;
  1165. i = 0;
  1166. while(i < lens->size){
  1167. cum += lens->buffer[i];
  1168. if((b8i)cum >= tot * 0.5) break;
  1169. i ++;
  1170. }
  1171. n50 = i < lens->size? lens->buffer[i] : min;
  1172. l50 = i < lens->size? i + 1 : i;
  1173. i ++;
  1174. while(i < lens->size){
  1175. cum += lens->buffer[i];
  1176. if((b8i)cum >= tot * 0.9) break;
  1177. i ++;
  1178. }
  1179. n90 = i < lens->size? lens->buffer[i] : min;
  1180. l90 = i < lens->size? i + 1 : i;
  1181. if(out){
  1182. fprintf(out, "TOT %llu, CNT %u, AVG %u, MAX %u, N50 %u, L50 %u, N90 %u, L90 %u, Min %u", tot, (u4i)lens->size, avg, max, n50, l50, n90, l90, min);
  1183. fflush(out);
  1184. }
  1185. return n50;
  1186. }
  1187. #endif