wtdbg-cns.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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. #include "kswx.h"
  20. #include "dbgcns.h"
  21. #include "dagcns.h"
  22. #include "filereader.h"
  23. static int cns_debug = 0;
  24. #define MCNS_TASK_DBGCNS 1
  25. #define MCNS_TASK_DAGCNS 2
  26. #define MCNS_TASK_OVERLAP 3
  27. thread_beg_def(mcns);
  28. uint32_t eid;
  29. CNS *cns;
  30. u1v *seq1, *seq2;
  31. u4i node1, node2;
  32. int reglen;
  33. int W, M, X, I, D, E;
  34. int candidate_mode;
  35. int corr_struct;
  36. f4i pM, pX, pI, pD;
  37. kswx_t ret;
  38. u32list *cigars;
  39. int task;
  40. thread_end_def(mcns);
  41. thread_beg_func(mcns);
  42. CNS *cns;
  43. DAGCNS *dag;
  44. GEGraph *g;
  45. bdpnodev *bnodes;
  46. bdpedgev *bedges;
  47. bdplinkv *linkstack;
  48. u8list *mem_cache;
  49. u1v *mem_buffer;
  50. u32list *cigars[2];
  51. kswx_t *xs[2];
  52. u4i i, nbeg;
  53. blk_t *blk;
  54. int qb, qe, tb, te;
  55. mem_cache = init_u8list(1024);
  56. cigars[0] = mcns->cigars;
  57. cigars[1] = NULL;
  58. xs[0] = malloc(sizeof(kswx_t));
  59. xs[1] = NULL;
  60. cns = mcns->cns;
  61. dag = init_dagcns(mcns->W, mcns->M, mcns->X, mcns->I, mcns->D, mcns->E, mcns->pM, mcns->pX, mcns->pI, mcns->pD);
  62. g = init_gegraph();
  63. bnodes = init_bdpnodev(32);
  64. bedges = init_bdpedgev(32);
  65. linkstack = init_bdplinkv(32);
  66. mem_buffer = init_u1v(1024);
  67. thread_beg_loop(mcns);
  68. if(mcns->task == MCNS_TASK_DBGCNS){
  69. ready_cns(cns);
  70. run_cns(cns, mcns->candidate_mode, mcns->corr_struct);
  71. } else if(mcns->task == MCNS_TASK_DAGCNS){
  72. // force mcns->candidate_mode to 2
  73. // use data from DBGCNS struct
  74. ready_cns(cns);
  75. clear_u8list(dag->cns);
  76. blk = ref_blkv(cns->qblks, 0);
  77. append_array_u8list(dag->cns, cns->qseqs->buffer + blk->off, blk->len);
  78. gen_pregraph_dagcns(dag);
  79. for(i=1;i<cns->qblks->size;i++){
  80. blk = ref_blkv(mcns->cns->qblks, i);
  81. nbeg = branched_dynamic_programming_alignment(dag, mcns->cns->qseqs->buffer + blk->off, blk->len, g, bnodes, bedges, mem_buffer);
  82. if(nbeg == 0){
  83. fprintf(stderr, " -- something wrong in %s -- %s:%d --\n", __FUNCTION__, __FILE__, __LINE__); fflush(stderr);
  84. continue;
  85. }
  86. bdpgraph2dagcns(dag, g, bnodes, bedges, nbeg, linkstack);
  87. }
  88. merge_nodes_dagcns(dag);
  89. gen_consensus_dagcns(dag, NULL);
  90. if(cns_debug){
  91. fprintf(stderr, "DAG%d\t%d\t", mcns->eid, (int)dag->cns->size);
  92. print_seq_dagcns(dag, stderr);
  93. fprintf(stderr, "\n");
  94. }
  95. clear_u1v(mcns->cns->cns);
  96. append_u1v(mcns->cns->cns, (u1v*)dag->cns);
  97. clear_string(mcns->cns->seq);
  98. for(i=0;i<dag->cns->size;i++) add_char_string(mcns->cns->seq, bit_base_table[dag->cns->buffer[i]]);
  99. } else if(mcns->task == MCNS_TASK_OVERLAP){
  100. if(mcns->seq2->size == 0){
  101. mcns->ret = KSWX_NULL;
  102. continue;
  103. }
  104. qb = 0; qe = mcns->seq1->size;
  105. tb = 0; te = mcns->seq2->size;
  106. if(qe > mcns->reglen) qb = qe - mcns->reglen;
  107. if(te > mcns->reglen) te = mcns->reglen;
  108. kswx_overlap_align_core(xs, cigars, qe - qb, mcns->seq1->buffer + qb, te - tb, mcns->seq2->buffer + tb, 1, mcns->M, mcns->X, mcns->I, mcns->D, mcns->E, mem_cache);
  109. xs[0]->qb += qb;
  110. xs[0]->qe += qb;
  111. xs[0]->tb += tb;
  112. xs[0]->te += tb;
  113. mcns->ret = *xs[0];
  114. }
  115. thread_end_loop(mcns);
  116. free(xs[0]);
  117. free_u8list(mem_cache);
  118. free_u1v(mem_buffer);
  119. free_dagcns(dag);
  120. free_gegraph(g);
  121. free_bdpnodev(bnodes);
  122. free_bdpedgev(bedges);
  123. free_bdplinkv(linkstack);
  124. thread_end_func(mcns);
  125. int revise_joint_point(u32list *cigars, int *qe, int *te){
  126. u4i i, op, ln, max;
  127. int qq, q, tt, t;
  128. q = t = 0;
  129. qq = tt = 0;
  130. max = 0;
  131. for(i=1;i<=cigars->size;i++){
  132. op = cigars->buffer[cigars->size - i] & 0xF;
  133. ln = cigars->buffer[cigars->size - i] >> 4;
  134. if(op == 0){
  135. if(ln > max){
  136. qq = q; tt = t;
  137. max = ln;
  138. }
  139. q += ln;
  140. t += ln;
  141. } else if(op == 1){
  142. q += ln;
  143. } else {
  144. t += ln;
  145. }
  146. }
  147. if(cns_debug){
  148. fprintf(stderr, "qe = %d -> %d\n", *qe, (*qe) - qq);
  149. fprintf(stderr, "te = %d -> %d\n", *te, (*te) - tt);
  150. fflush(stderr);
  151. }
  152. *qe -= qq;
  153. *te -= tt;
  154. return 1;
  155. }
  156. int revise_joint_point2(u32list *cigars, int *qe, int *te, int overhang){
  157. u4i i, op, ln;
  158. int qq, q, tt, t;
  159. q = t = 0;
  160. qq = tt = 0;
  161. for(i=1;i<=cigars->size;i++){
  162. op = cigars->buffer[cigars->size - i] & 0xF;
  163. ln = cigars->buffer[cigars->size - i] >> 4;
  164. switch(op){
  165. case 1: q += ln; break;
  166. case 2: t += ln; break;
  167. default: qq = q; tt = t; q += ln; t += ln;
  168. }
  169. if(q >= overhang && t >= overhang){
  170. if(cns_debug){
  171. fprintf(stderr, "qe = %d -> %d\n", *qe, (*qe) - qq);
  172. fprintf(stderr, "te = %d -> %d\n", *te, (*te) - tt);
  173. fflush(stderr);
  174. }
  175. *qe -= qq;
  176. *te -= tt;
  177. return 1;
  178. }
  179. }
  180. return 0;
  181. }
  182. uint32_t run(int reglen, int ksize, int Z, int W, int M, int X, int I, int D, int E, int H, int L, int XX, int OO, int EE, int cns_model, f4i pM, f4i pX, f4i pI, f4i pD, int candidate_mode, int corr_struct, uint32_t ncpu, FileReader *fr, FILE *out){
  183. String *tag, *seq;
  184. u1v *cseqs;
  185. u4v *cxs, *cys, *tes, *qes;
  186. uint32_t i, m, eid, beg, end;
  187. int c, j, sl, b, e;
  188. char *ss;
  189. thread_preprocess(mcns);
  190. tag = init_string(32);
  191. seq = init_string(32);
  192. cseqs = init_u1v(32);
  193. cxs = init_u4v(32);
  194. cys = init_u4v(32);
  195. tes = init_u4v(32);
  196. qes = init_u4v(32);
  197. thread_beg_init(mcns, ncpu);
  198. mcns->eid = 0;
  199. mcns->cns = init_cns(ksize, Z, W, 0, X, I, D, E, H, L);
  200. mcns->seq1 = init_u1v(32);
  201. mcns->seq2 = init_u1v(32);
  202. mcns->node1 = 0;
  203. mcns->node2 = 0;
  204. mcns->reglen = reglen;
  205. mcns->W = 128;
  206. mcns->M = M;
  207. mcns->X = XX;
  208. mcns->I = OO;
  209. mcns->D = OO;
  210. mcns->E = EE;
  211. mcns->pM = pM;
  212. mcns->pX = pX;
  213. mcns->pI = pI;
  214. mcns->pD = pD;
  215. mcns->candidate_mode = candidate_mode;
  216. mcns->corr_struct = corr_struct;
  217. mcns->ret = KSWX_NULL;
  218. mcns->cigars = init_u32list(16);
  219. mcns->task = 0;
  220. thread_end_init(mcns);
  221. eid = 0;
  222. thread_wait_one(mcns);
  223. while(1){
  224. c = readtable_filereader(fr);
  225. if(c == -1 || fr->line->string[0] == 'E' || fr->line->string[0] == '>'){
  226. thread_wake(mcns);
  227. thread_wait_one(mcns);
  228. if(mcns->task == cns_model && mcns->cns->seq->size){
  229. if(cns_debug){
  230. fprintf(stderr, "%s_%d_N%u_N%u\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%s\n", tag->string, mcns->eid, mcns->node1, mcns->node2, mcns->cns->qlen, mcns->cns->seq->size, mcns->cns->max_score, mcns->cns->alns[0], mcns->cns->alns[1], mcns->cns->alns[2], mcns->cns->alns[3], mcns->cns->seq->string);
  231. }
  232. cxs->buffer[mcns->eid] = cseqs->size;
  233. for(j=0;j<mcns->cns->seq->size;j++) push_u1v(cseqs, base_bit_table[(int)mcns->cns->seq->string[j]]);
  234. cys->buffer[mcns->eid] = cseqs->size;
  235. }
  236. reset_cns(mcns->cns);
  237. clear_string(mcns->cns->seq);
  238. mcns->task = cns_model;
  239. mcns->eid = eid ++;
  240. push_u4v(cxs, 0);
  241. push_u4v(cys, 0);
  242. if(fr->line->string[0] == 'E'){
  243. mcns->node1 = atoll(get_col_str(fr, 2) + 1);
  244. mcns->node2 = atoll(get_col_str(fr, 4) + 1);
  245. continue;
  246. }
  247. if(tag->size){
  248. thread_beg_iter(mcns);
  249. thread_wait(mcns);
  250. if(mcns->task == cns_model && mcns->cns->seq->size){
  251. if(cns_debug){
  252. //fprintf(stderr, "%s_%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%s\n", tag->string, mcns->eid, mcns->cns->qlen, mcns->cns->seq->size, mcns->cns->max_score, mcns->cns->alns[0], mcns->cns->alns[1], mcns->cns->alns[2], mcns->cns->alns[3], mcns->cns->seq->string);
  253. fprintf(stderr, "%s_%d_N%u_N%u\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%s\n", tag->string, mcns->eid, mcns->node1, mcns->node2, mcns->cns->qlen, mcns->cns->seq->size, mcns->cns->max_score, mcns->cns->alns[0], mcns->cns->alns[1], mcns->cns->alns[2], mcns->cns->alns[3], mcns->cns->seq->string);
  254. if(0){
  255. u4i j, x;
  256. for(j=x=0;j<mcns->cns->cigars->size;j++){
  257. if(mcns->cns->cigars->buffer[j] == DBGCNS_PATH_I){
  258. fputc('-', stderr);
  259. } else {
  260. fputc("ACGT"[mcns->cns->cns->buffer[x]], stderr); x ++;
  261. }
  262. }
  263. fputc('\n', stderr);
  264. for(j=0;j<mcns->cns->cigars->size;j++){
  265. fputc("MXID"[mcns->cns->cigars->buffer[j]], stderr);
  266. }
  267. fputc('\n', stderr);
  268. }
  269. }
  270. cxs->buffer[mcns->eid] = cseqs->size;
  271. for(j=0;j<mcns->cns->seq->size;j++) push_u1v(cseqs, base_bit_table[(int)mcns->cns->seq->string[j]]);
  272. cys->buffer[mcns->eid] = cseqs->size;
  273. }
  274. reset_cns(mcns->cns);
  275. clear_string(mcns->cns->seq);
  276. mcns->eid = 0;
  277. mcns->task = 0;
  278. mcns->node1 = 0;
  279. mcns->node2 = 0;
  280. thread_end_iter(mcns);
  281. push_u4v(qes, 0);
  282. push_u4v(tes, 0);
  283. for(i=1;i<eid;i++){
  284. thread_wait_one(mcns);
  285. if(mcns->task == MCNS_TASK_OVERLAP && mcns->ret.aln > 0){
  286. if(cns_debug){
  287. fprintf(stderr, "#%s_%d\t%d\t%d\t%d", tag->string, mcns->eid - 1, (int)mcns->seq1->size, mcns->ret.qb, mcns->ret.qe);
  288. fprintf(stderr, "\t%s_%d\t%d\t%d\t%d", tag->string, mcns->eid, (int)mcns->seq2->size, mcns->ret.tb, mcns->ret.te);
  289. fprintf(stderr, "\t%d\t%d\t%d\t%d\t%d\n", mcns->ret.aln, mcns->ret.mat, mcns->ret.mis, mcns->ret.ins, mcns->ret.del);
  290. }
  291. {
  292. b = mcns->ret.qe;
  293. e = mcns->ret.te;
  294. if(1){
  295. revise_joint_point(mcns->cigars, &b, &e);
  296. }
  297. qes->buffer[mcns->eid] = b;
  298. tes->buffer[mcns->eid] = e;
  299. }
  300. }
  301. mcns->task = MCNS_TASK_OVERLAP;
  302. mcns->eid = i;
  303. clear_u1v(mcns->seq1); append_array_u1v(mcns->seq1, cseqs->buffer + cxs->buffer[i-1], cys->buffer[i-1] - cxs->buffer[i-1]);
  304. clear_u1v(mcns->seq2); append_array_u1v(mcns->seq2, cseqs->buffer + cxs->buffer[i], cys->buffer[i] - cxs->buffer[i]);
  305. mcns->ret = KSWX_NULL;
  306. push_u4v(qes, mcns->seq1->size);
  307. push_u4v(tes, 0);
  308. thread_wake(mcns);
  309. }
  310. push_u4v(qes, cys->buffer[eid-1] - cxs->buffer[eid-1]);
  311. push_u4v(tes, 0);
  312. thread_beg_iter(mcns);
  313. thread_wait(mcns);
  314. if(mcns->task == MCNS_TASK_OVERLAP && mcns->ret.aln > 0){
  315. if(cns_debug){
  316. fprintf(stderr, "#%s_%d\t%d\t%d\t%d", tag->string, mcns->eid - 1, (int)mcns->seq1->size, mcns->ret.qb, mcns->ret.qe);
  317. fprintf(stderr, "\t%s_%d\t%d\t%d\t%d", tag->string, mcns->eid, (int)mcns->seq2->size, mcns->ret.tb, mcns->ret.te);
  318. fprintf(stderr, "\t%d\t%d\t%d\t%d\t%d\n", mcns->ret.aln, mcns->ret.mat, mcns->ret.mis, mcns->ret.ins, mcns->ret.del);
  319. }
  320. {
  321. b = mcns->ret.qe;
  322. e = mcns->ret.te;
  323. if(1){
  324. revise_joint_point(mcns->cigars, &b, &e);
  325. }
  326. qes->buffer[mcns->eid] = b;
  327. tes->buffer[mcns->eid] = e;
  328. }
  329. }
  330. mcns->ret = KSWX_NULL;
  331. mcns->eid = 0;
  332. mcns->task = 0;
  333. thread_end_iter(mcns);
  334. // generate contig seq
  335. clear_string(seq);
  336. for(i=0;i<eid;i++){
  337. beg = cxs->buffer[i] + tes->buffer[i];
  338. end = cxs->buffer[i] + qes->buffer[i + 1];
  339. for(m=beg;m<end;m++){
  340. push_string(seq, bit_base_table[cseqs->buffer[m]]);
  341. }
  342. if(cns_debug){
  343. fprintf(stderr, "=%s_%d\t%d\t%d\n", tag->string, i, seq->size - (end - beg), seq->size);
  344. }
  345. }
  346. fprintf(out, ">%s len=%d\n", tag->string, seq->size);
  347. for(j=0;j<seq->size;j+=100){
  348. sl = num_min(j + 100, seq->size);
  349. char ch = seq->string[sl];
  350. seq->string[sl] = 0;
  351. fprintf(out, "%s\n", seq->string + j);
  352. seq->string[sl] = ch;
  353. }
  354. }
  355. if(c == -1) break;
  356. clear_string(tag);
  357. ss = get_col_str(fr, 0) + 1;
  358. sl = get_col_len(fr, 0) - 1;
  359. for(j=0;j<sl;j++){
  360. if(ss[j] == ' ') break;
  361. push_string(tag, ss[j]);
  362. }
  363. clear_string(seq);
  364. eid = 0;
  365. clear_u1v(cseqs);
  366. clear_u4v(cxs);
  367. clear_u4v(cys);
  368. clear_u4v(tes);
  369. clear_u4v(qes);
  370. thread_wait_one(mcns);
  371. } else if(fr->line->string[0] == 'S' || fr->line->string[0] == 's'){
  372. ss = get_col_str(fr, 5);
  373. sl = get_col_len(fr, 5);
  374. add_seq_cns(mcns->cns, ss, sl, (fr->line->string[0] == 'S'));
  375. }
  376. }
  377. thread_beg_close(mcns);
  378. free_cns(mcns->cns);
  379. free_u1v(mcns->seq1);
  380. free_u1v(mcns->seq2);
  381. free_u32list(mcns->cigars);
  382. thread_end_close(mcns);
  383. free_u1v(cseqs);
  384. free_u4v(cxs);
  385. free_u4v(cys);
  386. free_u4v(tes);
  387. free_u4v(qes);
  388. free_string(tag);
  389. free_string(seq);
  390. return 0;
  391. }
  392. int usage(){
  393. printf(
  394. "WTDBG-CNS: Consensuser for wtdbg\n"
  395. "Author: Jue Ruan <ruanjue@gmail.com>\n"
  396. "Version: 1.1\n"
  397. "Usage: wtdbg-cns [options]\n"
  398. "Options:\n"
  399. " -t <int> Number of threads, [1]\n"
  400. " -i <string> Input file(s) *.utg.cns from wtdbg, +, [STDIN]\n"
  401. " -o <string> Output files, [STDOUT]\n"
  402. " -f Force overwrite\n"
  403. " -j <int> Expected length of node, or say the overlap length of two adject units in layout file, [1000] bp\n"
  404. "-----------------BEG DBG options---------------------------------\n"
  405. " -k <int> Kmer size for long reads, [15]\n"
  406. " -Z <int> Z-cutoff, drop the lower (score / <-X>), [4]\n"
  407. " -W <int> W-cutoff, drop the lagger (position), [48]\n"
  408. " In DAG correction, -W set the bandwidth of alignment\n"
  409. " -H <int> High coverage bonus, [1]\n"
  410. " -L <int> High coverage cutoff = avg_cov / <-L> [10]\n"
  411. " -c <int> Candidate strategy, 0: best-kmers, 1: median length, 2: first (include), 3: first (exclude), 4: longest, 5, shortest, [0]\n"
  412. " In DAG correction, force to use strategy 2\n"
  413. "-----------------END DBG options---------------------------------\n"
  414. " -M <int> Match score, [2]\n"
  415. " -X <int> Mismatch score, [-7]\n"
  416. " -I <int> Insertion score, [-3]\n"
  417. " -D <int> Deletion score, [-4]\n"
  418. " -E <int> Gap extension score, [-2]\n"
  419. " -m <int> 1: DBG correction; 2: DAG correction, [1]\n"
  420. " -S <int> whether to correct structure before error correction, [1]\n"
  421. " -v Verbose\n"
  422. " -V Print version information and then exit\n"
  423. "\n");
  424. return 1;
  425. }
  426. int main(int argc, char **argv){
  427. FileReader *fr;
  428. cplist *infs;
  429. FILE *out;
  430. char *outf;
  431. int c, ncpu, overwrite, reglen, ksize, Z, W, C, M, X, I, D, E, H, L, XX, OO, EE;
  432. int candidate_mode, cns_model, corr_struct;
  433. f4i pM, pX, pI, pD;
  434. ncpu = 1;
  435. reglen = 1000;
  436. ksize = 15;
  437. Z = 4;
  438. W = 48;
  439. C = 1;
  440. M = 2;
  441. X = -7;
  442. I = -3;
  443. D = -4;
  444. E = -2;
  445. H = 1;
  446. L = 10;
  447. XX = -4;
  448. OO = -2;
  449. EE = -1;
  450. candidate_mode = 0;
  451. cns_model = 1;
  452. corr_struct = 1;
  453. pM = log(0.85);
  454. pX = log(0.10);
  455. pI = log(0.03);
  456. pD = log(0.02);
  457. infs = init_cplist(4);
  458. outf = NULL;
  459. overwrite = 0;
  460. while((c = getopt(argc, argv, "hvVt:k:i:o:fj:Z:W:C:M:X:I:D:E:H:L:m:c:S:")) != -1){
  461. switch(c){
  462. case 'h': return usage();
  463. case 't': ncpu = atoi(optarg); break;
  464. case 'k': ksize = atoi(optarg); break;
  465. case 'i': push_cplist(infs, optarg); break;
  466. case 'o': outf = optarg; break;
  467. case 'f': overwrite = 1; break;
  468. case 'j': reglen = atoi(optarg); break;
  469. case 'Z': Z = atoi(optarg); break;
  470. case 'W': W = atoi(optarg); break;
  471. case 'C': C = atoi(optarg); break;
  472. case 'M': M = atoi(optarg); break;
  473. case 'X': X = atoi(optarg); break;
  474. case 'I': I = atoi(optarg); break;
  475. case 'D': D = atoi(optarg); break;
  476. case 'E': E = atoi(optarg); break;
  477. case 'H': H = atoi(optarg); break;
  478. case 'L': L = atoi(optarg); break;
  479. case 'm': cns_model = atoi(optarg); break;
  480. case 'c': candidate_mode = atoi(optarg); break;
  481. case 'S': corr_struct = atoi(optarg); break;
  482. case 'v': cns_debug ++; break;
  483. case 'V': fprintf(stdout, "wtdbg-cns 1.1\n"); return 0;
  484. default: return usage();
  485. }
  486. }
  487. BEG_STAT_PROC_INFO(stderr, argc, argv);
  488. if(cns_model != MCNS_TASK_DBGCNS && cns_model != MCNS_TASK_DAGCNS){
  489. return usage();
  490. }
  491. if(ncpu <= 0 && _sig_proc_deamon) ncpu = _sig_proc_deamon->ncpu;
  492. if(ncpu <= 0){
  493. fprintf(stderr, " -- Invalid cpu number '%d' in %s -- %s:%d --\n", ncpu, __FUNCTION__, __FILE__, __LINE__); fflush(stderr);
  494. return 1;
  495. }
  496. if(outf && !overwrite && file_exists(outf)){
  497. fprintf(stderr, "File exists! '%s'\n\n", outf);
  498. return usage();
  499. }
  500. if(cns_debug > 1) DBGCNS_DEBUG = 1;
  501. if(infs->size) fr = open_all_filereader(infs->size, infs->buffer, 1);
  502. else fr = open_filereader(NULL, 1);
  503. if(outf){
  504. out = open_file_for_write(outf, NULL, 1);
  505. } else out = stdout;
  506. run(reglen, ksize, Z, W, M, X, I, D, E, H, L, XX, OO, EE, cns_model, pM, pX, pI, pD, candidate_mode, corr_struct, ncpu, fr, out);
  507. close_filereader(fr);
  508. if(outf) fclose(out);
  509. free_cplist(infs);
  510. END_STAT_PROC_INFO(stderr);
  511. return 0;
  512. }