1 #ifndef CHIMERAUCHIMECOMMAND_H
2 #define CHIMERAUCHIMECOMMAND_H
6 * chimerauchimecommand.h
9 * Created by westcott on 5/13/11.
10 * Copyright 2011 Schloss Lab. All rights reserved.
15 #include "command.hpp"
16 #include "sequenceparser.h"
18 /***********************************************************/
20 class ChimeraUchimeCommand : public Command {
22 ChimeraUchimeCommand(string);
23 ChimeraUchimeCommand();
24 ~ChimeraUchimeCommand() {}
26 vector<string> setParameters();
27 string getCommandName() { return "chimera.uchime"; }
28 string getCommandCategory() { return "Sequence Processing"; }
29 string getHelpString();
30 string getCitation() { return "uchime by Robert C. Edgar\nhttp://drive5.com/uchime\nThis code is donated to the public domain.\nhttp://www.mothur.org/wiki/Chimera.uchime\nEdgar,R.C., Haas,B.J., Clemente,J.C., Quince,C. and Knight,R. (2011), UCHIME improves sensitivity and speed of chimera detection, Bioinformatics, in press.\n"; }
31 string getDescription() { return "detect chimeric sequences"; }
34 void help() { m->mothurOut(getHelpString()); }
40 linePair(int i, int j) : start(i), end(j) {}
43 vector<int> processIDS; //processid
44 int driver(string, string, string, string, int&);
45 int createProcesses(string, string, string, string, int&);
47 bool abort, useAbskew, chimealns, useMinH, useMindiv, useXn, useDn, useXa, useChunks, useMinchunk, useIdsmoothwindow, useMinsmoothid, useMaxp, skipgaps, skipgaps2, useMinlen, useMaxlen, ucl, useQueryfract;
48 string fastafile, groupfile, templatefile, outputDir, namefile, abskew, minh, mindiv, xn, dn, xa, chunks, minchunk, idsmoothwindow, minsmoothid, maxp, minlen, maxlen, queryfract;
52 vector<string> outputNames;
53 vector<string> fastaFileNames;
54 vector<string> nameFileNames;
55 vector<string> groupFileNames;
57 string getNamesFile(string&);
58 int readFasta(string, map<string, string>&);
59 int printFile(vector<seqPriorityNode>&, string);
60 int deconvoluteResults(SequenceParser&, string, string, string);
61 int driverGroups(SequenceParser&, string, string, string, string, int, int, vector<string>);
62 int createProcessesGroups(SequenceParser&, string, string, string, string, vector<string>);
67 /***********************************************************/
68 /**************************************************************************************************/
69 //custom data structure for threads to use.
70 // This is passed by void pointer so it can be any data type
71 // that can be passed using a single void pointer (LPVOID).
77 string accnos, alns, filename, templatefile;
81 int threadID, count, numChimeras;
82 vector<string> groups;
83 bool useAbskew, chimealns, useMinH, useMindiv, useXn, useDn, useXa, useChunks, useMinchunk, useIdsmoothwindow, useMinsmoothid, useMaxp, skipgaps, skipgaps2, useMinlen, useMaxlen, ucl, useQueryfract;
84 string abskew, minh, mindiv, xn, dn, xa, chunks, minchunk, idsmoothwindow, minsmoothid, maxp, minlen, maxlen, queryfract;
87 uchimeData(string o, string t, string file, string f, string n, string g, string ac, string al, vector<string> gr, MothurOut* mout, int st, int en, int tid) {
104 void setBooleans(bool Abskew, bool calns, bool MinH, bool Mindiv, bool Xn, bool Dn, bool Xa, bool Chunks, bool Minchunk, bool Idsmoothwindow, bool Minsmoothid, bool Maxp, bool skipgap, bool skipgap2, bool Minlen, bool Maxlen, bool uc, bool Queryfract) {
113 useMinchunk = Minchunk;
114 useIdsmoothwindow = Idsmoothwindow;
115 useMinsmoothid = Minsmoothid;
118 skipgaps2 = skipgap2;
122 useQueryfract = Queryfract;
125 void setVariables(string abske, string min, string mindi, string x, string d, string xa2, string chunk, string minchun, string idsmoothwindo, string minsmoothi, string max, string minle, string maxle, string queryfrac) {
134 idsmoothwindow = idsmoothwindo;
135 minsmoothid = minsmoothi;
139 queryfract = queryfrac;
143 /**************************************************************************************************/
144 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
146 static DWORD WINAPI MyUchimeThreadFunction(LPVOID lpParam){
147 uchimeData* pDataArray;
148 pDataArray = (uchimeData*)lpParam;
153 ofstream out, out1, out2;
154 pDataArray->m->openOutputFile(pDataArray->outputFName, out); out.close();
155 pDataArray->m->openOutputFile(pDataArray->accnos, out1); out1.close();
156 if (pDataArray->chimealns) { pDataArray->m->openOutputFile(pDataArray->alns, out2); out2.close(); }
158 //parse fasta and name file by group
159 SequenceParser* parser;
160 if (pDataArray->namefile != "") { parser = new SequenceParser(pDataArray->groupfile, pDataArray->fastafile, pDataArray->namefile); }
161 else { parser = new SequenceParser(pDataArray->groupfile, pDataArray->fastafile); }
166 for (int i = pDataArray->start; i < pDataArray->end; i++) {
167 int start = time(NULL); if (pDataArray->m->control_pressed) { delete parser; return 0; }
169 int error = parser->getSeqs(pDataArray->groups[i], pDataArray->filename, true); if ((error == 1) || pDataArray->m->control_pressed) { delete parser; return 0; }
171 //int numSeqs = driver((outputFName + groups[i]), filename, (accnos+ groups[i]), (alns+ groups[i]), numChimeras);
172 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
174 //to allow for spaces in the path
175 string outputFName = "\"" + pDataArray->outputFName+pDataArray->groups[i] + "\"";
176 string filename = "\"" + pDataArray->filename + "\"";
177 string alns = "\"" + pDataArray->alns+pDataArray->groups[i] + "\"";
178 string accnos = pDataArray->accnos+pDataArray->groups[i];
182 string path = pDataArray->m->argv;
183 string tempPath = path;
184 for (int i = 0; i < path.length(); i++) { tempPath[i] = tolower(path[i]); }
185 path = path.substr(0, (tempPath.find_last_of('m')));
187 string uchimeCommand = path;
188 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
189 uchimeCommand += "uchime ";
191 uchimeCommand += "uchime";
192 uchimeCommand = "\"" + uchimeCommand + "\"";
196 tempUchime= new char[uchimeCommand.length()+1];
198 strncat(tempUchime, uchimeCommand.c_str(), uchimeCommand.length());
199 cPara.push_back(tempUchime);
201 char* tempIn = new char[8];
202 *tempIn = '\0'; strncat(tempIn, "--input", 7);
203 //strcpy(tempIn, "--input");
204 cPara.push_back(tempIn);
205 char* temp = new char[filename.length()+1];
206 *temp = '\0'; strncat(temp, filename.c_str(), filename.length());
207 //strcpy(temp, filename.c_str());
208 cPara.push_back(temp);
210 char* tempO = new char[12];
211 *tempO = '\0'; strncat(tempO, "--uchimeout", 11);
212 //strcpy(tempO, "--uchimeout");
213 cPara.push_back(tempO);
214 char* tempout = new char[outputFName.length()+1];
215 //strcpy(tempout, outputFName.c_str());
216 *tempout = '\0'; strncat(tempout, outputFName.c_str(), outputFName.length());
217 cPara.push_back(tempout);
219 if (pDataArray->chimealns) {
220 char* tempA = new char[13];
221 *tempA = '\0'; strncat(tempA, "--uchimealns", 12);
222 //strcpy(tempA, "--uchimealns");
223 cPara.push_back(tempA);
224 char* tempa = new char[alns.length()+1];
225 //strcpy(tempa, alns.c_str());
226 *tempa = '\0'; strncat(tempa, alns.c_str(), alns.length());
227 cPara.push_back(tempa);
230 if (pDataArray->useAbskew) {
231 char* tempskew = new char[9];
232 *tempskew = '\0'; strncat(tempskew, "--abskew", 8);
233 //strcpy(tempskew, "--abskew");
234 cPara.push_back(tempskew);
235 char* tempSkew = new char[pDataArray->abskew.length()+1];
236 //strcpy(tempSkew, abskew.c_str());
237 *tempSkew = '\0'; strncat(tempSkew, pDataArray->abskew.c_str(), pDataArray->abskew.length());
238 cPara.push_back(tempSkew);
241 if (pDataArray->useMinH) {
242 char* tempminh = new char[7];
243 *tempminh = '\0'; strncat(tempminh, "--minh", 6);
244 //strcpy(tempminh, "--minh");
245 cPara.push_back(tempminh);
246 char* tempMinH = new char[pDataArray->minh.length()+1];
247 *tempMinH = '\0'; strncat(tempMinH, pDataArray->minh.c_str(), pDataArray->minh.length());
248 //strcpy(tempMinH, minh.c_str());
249 cPara.push_back(tempMinH);
252 if (pDataArray->useMindiv) {
253 char* tempmindiv = new char[9];
254 *tempmindiv = '\0'; strncat(tempmindiv, "--mindiv", 8);
255 //strcpy(tempmindiv, "--mindiv");
256 cPara.push_back(tempmindiv);
257 char* tempMindiv = new char[pDataArray->mindiv.length()+1];
258 *tempMindiv = '\0'; strncat(tempMindiv, pDataArray->mindiv.c_str(), pDataArray->mindiv.length());
259 //strcpy(tempMindiv, mindiv.c_str());
260 cPara.push_back(tempMindiv);
263 if (pDataArray->useXn) {
264 char* tempxn = new char[5];
265 //strcpy(tempxn, "--xn");
266 *tempxn = '\0'; strncat(tempxn, "--xn", 4);
267 cPara.push_back(tempxn);
268 char* tempXn = new char[pDataArray->xn.length()+1];
269 //strcpy(tempXn, xn.c_str());
270 *tempXn = '\0'; strncat(tempXn, pDataArray->xn.c_str(), pDataArray->xn.length());
271 cPara.push_back(tempXn);
274 if (pDataArray->useDn) {
275 char* tempdn = new char[5];
276 //strcpy(tempdn, "--dn");
277 *tempdn = '\0'; strncat(tempdn, "--dn", 4);
278 cPara.push_back(tempdn);
279 char* tempDn = new char[pDataArray->dn.length()+1];
280 *tempDn = '\0'; strncat(tempDn, pDataArray->dn.c_str(), pDataArray->dn.length());
281 //strcpy(tempDn, dn.c_str());
282 cPara.push_back(tempDn);
285 if (pDataArray->useXa) {
286 char* tempxa = new char[5];
287 //strcpy(tempxa, "--xa");
288 *tempxa = '\0'; strncat(tempxa, "--xa", 4);
289 cPara.push_back(tempxa);
290 char* tempXa = new char[pDataArray->xa.length()+1];
291 *tempXa = '\0'; strncat(tempXa, pDataArray->xa.c_str(), pDataArray->xa.length());
292 //strcpy(tempXa, xa.c_str());
293 cPara.push_back(tempXa);
296 if (pDataArray->useChunks) {
297 char* tempchunks = new char[9];
298 //strcpy(tempchunks, "--chunks");
299 *tempchunks = '\0'; strncat(tempchunks, "--chunks", 8);
300 cPara.push_back(tempchunks);
301 char* tempChunks = new char[pDataArray->chunks.length()+1];
302 *tempChunks = '\0'; strncat(tempChunks, pDataArray->chunks.c_str(), pDataArray->chunks.length());
303 //strcpy(tempChunks, chunks.c_str());
304 cPara.push_back(tempChunks);
307 if (pDataArray->useMinchunk) {
308 char* tempminchunk = new char[11];
309 //strcpy(tempminchunk, "--minchunk");
310 *tempminchunk = '\0'; strncat(tempminchunk, "--minchunk", 10);
311 cPara.push_back(tempminchunk);
312 char* tempMinchunk = new char[pDataArray->minchunk.length()+1];
313 *tempMinchunk = '\0'; strncat(tempMinchunk, pDataArray->minchunk.c_str(), pDataArray->minchunk.length());
314 //strcpy(tempMinchunk, minchunk.c_str());
315 cPara.push_back(tempMinchunk);
318 if (pDataArray->useIdsmoothwindow) {
319 char* tempidsmoothwindow = new char[17];
320 *tempidsmoothwindow = '\0'; strncat(tempidsmoothwindow, "--idsmoothwindow", 16);
321 //strcpy(tempidsmoothwindow, "--idsmoothwindow");
322 cPara.push_back(tempidsmoothwindow);
323 char* tempIdsmoothwindow = new char[pDataArray->idsmoothwindow.length()+1];
324 *tempIdsmoothwindow = '\0'; strncat(tempIdsmoothwindow, pDataArray->idsmoothwindow.c_str(), pDataArray->idsmoothwindow.length());
325 //strcpy(tempIdsmoothwindow, idsmoothwindow.c_str());
326 cPara.push_back(tempIdsmoothwindow);
329 /*if (useMinsmoothid) {
330 char* tempminsmoothid = new char[14];
331 //strcpy(tempminsmoothid, "--minsmoothid");
332 *tempminsmoothid = '\0'; strncat(tempminsmoothid, "--minsmoothid", 13);
333 cPara.push_back(tempminsmoothid);
334 char* tempMinsmoothid = new char[minsmoothid.length()+1];
335 *tempMinsmoothid = '\0'; strncat(tempMinsmoothid, minsmoothid.c_str(), minsmoothid.length());
336 //strcpy(tempMinsmoothid, minsmoothid.c_str());
337 cPara.push_back(tempMinsmoothid);
340 if (pDataArray->useMaxp) {
341 char* tempmaxp = new char[7];
342 //strcpy(tempmaxp, "--maxp");
343 *tempmaxp = '\0'; strncat(tempmaxp, "--maxp", 6);
344 cPara.push_back(tempmaxp);
345 char* tempMaxp = new char[pDataArray->maxp.length()+1];
346 *tempMaxp = '\0'; strncat(tempMaxp, pDataArray->maxp.c_str(), pDataArray->maxp.length());
347 //strcpy(tempMaxp, maxp.c_str());
348 cPara.push_back(tempMaxp);
351 if (!pDataArray->skipgaps) {
352 char* tempskipgaps = new char[13];
353 //strcpy(tempskipgaps, "--[no]skipgaps");
354 *tempskipgaps = '\0'; strncat(tempskipgaps, "--noskipgaps", 12);
355 cPara.push_back(tempskipgaps);
358 if (!pDataArray->skipgaps2) {
359 char* tempskipgaps2 = new char[14];
360 //strcpy(tempskipgaps2, "--[no]skipgaps2");
361 *tempskipgaps2 = '\0'; strncat(tempskipgaps2, "--noskipgaps2", 13);
362 cPara.push_back(tempskipgaps2);
365 if (pDataArray->useMinlen) {
366 char* tempminlen = new char[9];
367 *tempminlen = '\0'; strncat(tempminlen, "--minlen", 8);
368 //strcpy(tempminlen, "--minlen");
369 cPara.push_back(tempminlen);
370 char* tempMinlen = new char[pDataArray->minlen.length()+1];
371 //strcpy(tempMinlen, minlen.c_str());
372 *tempMinlen = '\0'; strncat(tempMinlen, pDataArray->minlen.c_str(), pDataArray->minlen.length());
373 cPara.push_back(tempMinlen);
376 if (pDataArray->useMaxlen) {
377 char* tempmaxlen = new char[9];
378 //strcpy(tempmaxlen, "--maxlen");
379 *tempmaxlen = '\0'; strncat(tempmaxlen, "--maxlen", 8);
380 cPara.push_back(tempmaxlen);
381 char* tempMaxlen = new char[pDataArray->maxlen.length()+1];
382 *tempMaxlen = '\0'; strncat(tempMaxlen, pDataArray->maxlen.c_str(), pDataArray->maxlen.length());
383 //strcpy(tempMaxlen, maxlen.c_str());
384 cPara.push_back(tempMaxlen);
387 if (pDataArray->ucl) {
388 char* tempucl = new char[5];
389 strcpy(tempucl, "--ucl");
390 cPara.push_back(tempucl);
393 if (pDataArray->useQueryfract) {
394 char* tempqueryfract = new char[13];
395 *tempqueryfract = '\0'; strncat(tempqueryfract, "--queryfract", 12);
396 //strcpy(tempqueryfract, "--queryfract");
397 cPara.push_back(tempqueryfract);
398 char* tempQueryfract = new char[pDataArray->queryfract.length()+1];
399 *tempQueryfract = '\0'; strncat(tempQueryfract, pDataArray->queryfract.c_str(), pDataArray->queryfract.length());
400 //strcpy(tempQueryfract, queryfract.c_str());
401 cPara.push_back(tempQueryfract);
405 char** uchimeParameters;
406 uchimeParameters = new char*[cPara.size()];
407 string commandString = "";
408 for (int j = 0; j < cPara.size(); j++) { uchimeParameters[j] = cPara[j]; commandString += toString(cPara[j]) + " "; }
409 //int numArgs = cPara.size();
411 //uchime_main(numArgs, uchimeParameters);
412 //cout << "commandString = " << commandString << endl;
413 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
415 commandString = "\"" + commandString + "\"";
417 system(commandString.c_str());
420 for(int j = 0; j < cPara.size(); j++) { delete cPara[j]; }
421 delete[] uchimeParameters;
423 //remove "" from filenames
424 outputFName = outputFName.substr(1, outputFName.length()-2);
425 filename = filename.substr(1, filename.length()-2);
426 alns = alns.substr(1, alns.length()-2);
428 if (pDataArray->m->control_pressed) { delete parser; return 0; }
430 //create accnos file from uchime results
432 pDataArray->m->openInputFile(outputFName, in);
435 pDataArray->m->openOutputFile(accnos, out);
441 if (pDataArray->m->control_pressed) { break; }
444 string chimeraFlag = "";
445 in >> chimeraFlag >> name;
448 name = name.substr(0, name.length()-1); //rip off last /
449 name = name.substr(0, name.find_last_of('/'));
451 for (int j = 0; j < 15; j++) { in >> chimeraFlag; }
452 pDataArray->m->gobble(in);
454 if (chimeraFlag == "Y") { out << name << endl; numChimeras++; }
461 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
463 pDataArray->numChimeras += numChimeras;
465 if (pDataArray->m->control_pressed) { delete parser; return 0; }
467 //remove file made for uchime
468 pDataArray->m->mothurRemove(filename);
471 pDataArray->m->appendFiles(outputFName, pDataArray->outputFName); pDataArray->m->mothurRemove(outputFName);
472 pDataArray->m->appendFiles(accnos, pDataArray->accnos); pDataArray->m->mothurRemove(accnos);
473 if (pDataArray->chimealns) { pDataArray->m->appendFiles(alns, pDataArray->alns); pDataArray->m->mothurRemove(alns); }
475 pDataArray->m->mothurOutEndLine(); pDataArray->m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(num) + " sequences from group " + pDataArray->groups[i] + "."); pDataArray->m->mothurOutEndLine();
479 pDataArray->count = totalSeqs;
484 catch(exception& e) {
485 pDataArray->m->errorOut(e, "ChimeraUchimeCommand", "MyUchimeThreadFunction");
489 /**************************************************************************************************/
491 static DWORD WINAPI MyUchimeSeqsThreadFunction(LPVOID lpParam){
492 uchimeData* pDataArray;
493 pDataArray = (uchimeData*)lpParam;
500 int start = time(NULL); if (pDataArray->m->control_pressed) { return 0; }
502 //to allow for spaces in the path
503 string outputFName = "\"" + pDataArray->outputFName + "\"";
504 string filename = "\"" + pDataArray->filename + "\"";
505 string alns = "\"" + pDataArray->alns+ "\"";
506 string templatefile = "\"" + pDataArray->templatefile + "\"";
507 string accnos = pDataArray->accnos;
512 tempUchime= new char[8];
514 strncat(tempUchime, "uchime ", 7);
515 cPara.push_back(tempUchime);
517 char* tempIn = new char[8];
518 *tempIn = '\0'; strncat(tempIn, "--input", 7);
519 //strcpy(tempIn, "--input");
520 cPara.push_back(tempIn);
521 char* temp = new char[filename.length()+1];
522 *temp = '\0'; strncat(temp, filename.c_str(), filename.length());
523 //strcpy(temp, filename.c_str());
524 cPara.push_back(temp);
527 char* tempRef = new char[5];
528 //strcpy(tempRef, "--db");
529 *tempRef = '\0'; strncat(tempRef, "--db", 4);
530 cPara.push_back(tempRef);
531 char* tempR = new char[templatefile.length()+1];
532 //strcpy(tempR, templatefile.c_str());
533 *tempR = '\0'; strncat(tempR, templatefile.c_str(), templatefile.length());
534 cPara.push_back(tempR);
536 char* tempO = new char[12];
537 *tempO = '\0'; strncat(tempO, "--uchimeout", 11);
538 //strcpy(tempO, "--uchimeout");
539 cPara.push_back(tempO);
540 char* tempout = new char[outputFName.length()+1];
541 //strcpy(tempout, outputFName.c_str());
542 *tempout = '\0'; strncat(tempout, outputFName.c_str(), outputFName.length());
543 cPara.push_back(tempout);
545 if (pDataArray->chimealns) {
546 char* tempA = new char[13];
547 *tempA = '\0'; strncat(tempA, "--uchimealns", 12);
548 //strcpy(tempA, "--uchimealns");
549 cPara.push_back(tempA);
550 char* tempa = new char[alns.length()+1];
551 //strcpy(tempa, alns.c_str());
552 *tempa = '\0'; strncat(tempa, alns.c_str(), alns.length());
553 cPara.push_back(tempa);
556 if (pDataArray->useAbskew) {
557 char* tempskew = new char[9];
558 *tempskew = '\0'; strncat(tempskew, "--abskew", 8);
559 //strcpy(tempskew, "--abskew");
560 cPara.push_back(tempskew);
561 char* tempSkew = new char[pDataArray->abskew.length()+1];
562 //strcpy(tempSkew, abskew.c_str());
563 *tempSkew = '\0'; strncat(tempSkew, pDataArray->abskew.c_str(), pDataArray->abskew.length());
564 cPara.push_back(tempSkew);
567 if (pDataArray->useMinH) {
568 char* tempminh = new char[7];
569 *tempminh = '\0'; strncat(tempminh, "--minh", 6);
570 //strcpy(tempminh, "--minh");
571 cPara.push_back(tempminh);
572 char* tempMinH = new char[pDataArray->minh.length()+1];
573 *tempMinH = '\0'; strncat(tempMinH, pDataArray->minh.c_str(), pDataArray->minh.length());
574 //strcpy(tempMinH, minh.c_str());
575 cPara.push_back(tempMinH);
578 if (pDataArray->useMindiv) {
579 char* tempmindiv = new char[9];
580 *tempmindiv = '\0'; strncat(tempmindiv, "--mindiv", 8);
581 //strcpy(tempmindiv, "--mindiv");
582 cPara.push_back(tempmindiv);
583 char* tempMindiv = new char[pDataArray->mindiv.length()+1];
584 *tempMindiv = '\0'; strncat(tempMindiv, pDataArray->mindiv.c_str(), pDataArray->mindiv.length());
585 //strcpy(tempMindiv, mindiv.c_str());
586 cPara.push_back(tempMindiv);
589 if (pDataArray->useXn) {
590 char* tempxn = new char[5];
591 //strcpy(tempxn, "--xn");
592 *tempxn = '\0'; strncat(tempxn, "--xn", 4);
593 cPara.push_back(tempxn);
594 char* tempXn = new char[pDataArray->xn.length()+1];
595 //strcpy(tempXn, xn.c_str());
596 *tempXn = '\0'; strncat(tempXn, pDataArray->xn.c_str(), pDataArray->xn.length());
597 cPara.push_back(tempXn);
600 if (pDataArray->useDn) {
601 char* tempdn = new char[5];
602 //strcpy(tempdn, "--dn");
603 *tempdn = '\0'; strncat(tempdn, "--dn", 4);
604 cPara.push_back(tempdn);
605 char* tempDn = new char[pDataArray->dn.length()+1];
606 *tempDn = '\0'; strncat(tempDn, pDataArray->dn.c_str(), pDataArray->dn.length());
607 //strcpy(tempDn, dn.c_str());
608 cPara.push_back(tempDn);
611 if (pDataArray->useXa) {
612 char* tempxa = new char[5];
613 //strcpy(tempxa, "--xa");
614 *tempxa = '\0'; strncat(tempxa, "--xa", 4);
615 cPara.push_back(tempxa);
616 char* tempXa = new char[pDataArray->xa.length()+1];
617 *tempXa = '\0'; strncat(tempXa, pDataArray->xa.c_str(), pDataArray->xa.length());
618 //strcpy(tempXa, xa.c_str());
619 cPara.push_back(tempXa);
622 if (pDataArray->useChunks) {
623 char* tempchunks = new char[9];
624 //strcpy(tempchunks, "--chunks");
625 *tempchunks = '\0'; strncat(tempchunks, "--chunks", 8);
626 cPara.push_back(tempchunks);
627 char* tempChunks = new char[pDataArray->chunks.length()+1];
628 *tempChunks = '\0'; strncat(tempChunks, pDataArray->chunks.c_str(), pDataArray->chunks.length());
629 //strcpy(tempChunks, chunks.c_str());
630 cPara.push_back(tempChunks);
633 if (pDataArray->useMinchunk) {
634 char* tempminchunk = new char[11];
635 //strcpy(tempminchunk, "--minchunk");
636 *tempminchunk = '\0'; strncat(tempminchunk, "--minchunk", 10);
637 cPara.push_back(tempminchunk);
638 char* tempMinchunk = new char[pDataArray->minchunk.length()+1];
639 *tempMinchunk = '\0'; strncat(tempMinchunk, pDataArray->minchunk.c_str(), pDataArray->minchunk.length());
640 //strcpy(tempMinchunk, minchunk.c_str());
641 cPara.push_back(tempMinchunk);
644 if (pDataArray->useIdsmoothwindow) {
645 char* tempidsmoothwindow = new char[17];
646 *tempidsmoothwindow = '\0'; strncat(tempidsmoothwindow, "--idsmoothwindow", 16);
647 //strcpy(tempidsmoothwindow, "--idsmoothwindow");
648 cPara.push_back(tempidsmoothwindow);
649 char* tempIdsmoothwindow = new char[pDataArray->idsmoothwindow.length()+1];
650 *tempIdsmoothwindow = '\0'; strncat(tempIdsmoothwindow, pDataArray->idsmoothwindow.c_str(), pDataArray->idsmoothwindow.length());
651 //strcpy(tempIdsmoothwindow, idsmoothwindow.c_str());
652 cPara.push_back(tempIdsmoothwindow);
655 if (pDataArray->useMaxp) {
656 char* tempmaxp = new char[7];
657 //strcpy(tempmaxp, "--maxp");
658 *tempmaxp = '\0'; strncat(tempmaxp, "--maxp", 6);
659 cPara.push_back(tempmaxp);
660 char* tempMaxp = new char[pDataArray->maxp.length()+1];
661 *tempMaxp = '\0'; strncat(tempMaxp, pDataArray->maxp.c_str(), pDataArray->maxp.length());
662 //strcpy(tempMaxp, maxp.c_str());
663 cPara.push_back(tempMaxp);
666 if (!pDataArray->skipgaps) {
667 char* tempskipgaps = new char[13];
668 //strcpy(tempskipgaps, "--[no]skipgaps");
669 *tempskipgaps = '\0'; strncat(tempskipgaps, "--noskipgaps", 12);
670 cPara.push_back(tempskipgaps);
673 if (!pDataArray->skipgaps2) {
674 char* tempskipgaps2 = new char[14];
675 //strcpy(tempskipgaps2, "--[no]skipgaps2");
676 *tempskipgaps2 = '\0'; strncat(tempskipgaps2, "--noskipgaps2", 13);
677 cPara.push_back(tempskipgaps2);
680 if (pDataArray->useMinlen) {
681 char* tempminlen = new char[9];
682 *tempminlen = '\0'; strncat(tempminlen, "--minlen", 8);
683 //strcpy(tempminlen, "--minlen");
684 cPara.push_back(tempminlen);
685 char* tempMinlen = new char[pDataArray->minlen.length()+1];
686 //strcpy(tempMinlen, minlen.c_str());
687 *tempMinlen = '\0'; strncat(tempMinlen, pDataArray->minlen.c_str(), pDataArray->minlen.length());
688 cPara.push_back(tempMinlen);
691 if (pDataArray->useMaxlen) {
692 char* tempmaxlen = new char[9];
693 //strcpy(tempmaxlen, "--maxlen");
694 *tempmaxlen = '\0'; strncat(tempmaxlen, "--maxlen", 8);
695 cPara.push_back(tempmaxlen);
696 char* tempMaxlen = new char[pDataArray->maxlen.length()+1];
697 *tempMaxlen = '\0'; strncat(tempMaxlen, pDataArray->maxlen.c_str(), pDataArray->maxlen.length());
698 //strcpy(tempMaxlen, maxlen.c_str());
699 cPara.push_back(tempMaxlen);
702 if (pDataArray->ucl) {
703 char* tempucl = new char[5];
704 strcpy(tempucl, "--ucl");
705 cPara.push_back(tempucl);
708 if (pDataArray->useQueryfract) {
709 char* tempqueryfract = new char[13];
710 *tempqueryfract = '\0'; strncat(tempqueryfract, "--queryfract", 12);
711 //strcpy(tempqueryfract, "--queryfract");
712 cPara.push_back(tempqueryfract);
713 char* tempQueryfract = new char[pDataArray->queryfract.length()+1];
714 *tempQueryfract = '\0'; strncat(tempQueryfract, pDataArray->queryfract.c_str(), pDataArray->queryfract.length());
715 //strcpy(tempQueryfract, queryfract.c_str());
716 cPara.push_back(tempQueryfract);
720 char** uchimeParameters;
721 uchimeParameters = new char*[cPara.size()];
722 string commandString = "";
723 for (int j = 0; j < cPara.size(); j++) { uchimeParameters[j] = cPara[j]; commandString += toString(cPara[j]) + " "; }
724 //int numArgs = cPara.size();
726 //uchime_main(numArgs, uchimeParameters);
727 //cout << "commandString = " << commandString << endl;
728 system(commandString.c_str());
731 for(int j = 0; j < cPara.size(); j++) { delete cPara[j]; }
732 delete[] uchimeParameters;
734 //remove "" from filenames
735 outputFName = outputFName.substr(1, outputFName.length()-2);
736 filename = filename.substr(1, filename.length()-2);
737 alns = alns.substr(1, alns.length()-2);
739 if (pDataArray->m->control_pressed) { return 0; }
741 //create accnos file from uchime results
743 pDataArray->m->openInputFile(outputFName, in);
746 pDataArray->m->openOutputFile(accnos, out);
751 if (pDataArray->m->control_pressed) { break; }
754 string chimeraFlag = "";
755 in >> chimeraFlag >> name;
757 for (int j = 0; j < 15; j++) { in >> chimeraFlag; }
758 pDataArray->m->gobble(in);
760 if (chimeraFlag == "Y") { out << name << endl; numChimeras++; }
766 if (pDataArray->m->control_pressed) { return 0; }
768 pDataArray->m->mothurOutEndLine(); pDataArray->m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(totalSeqs) + " sequences."); pDataArray->m->mothurOutEndLine();
770 pDataArray->count = totalSeqs;
771 pDataArray->numChimeras = numChimeras;
775 catch(exception& e) {
776 pDataArray->m->errorOut(e, "ChimeraUchimeCommand", "MyUchimeSeqsThreadFunction");
783 /**************************************************************************************************/