2 * chimerapintailcommand.cpp
5 * Created by westcott on 4/1/10.
6 * Copyright 2010 Schloss Lab. All rights reserved.
10 #include "chimerapintailcommand.h"
13 //**********************************************************************************************************************
14 vector<string> ChimeraPintailCommand::getValidParameters(){
16 string AlignArray[] = {"fasta","filter","processors","window" ,"increment","template","conservation","quantile","mask","outputdir","inputdir"};
17 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
21 m->errorOut(e, "ChimeraPintailCommand", "getValidParameters");
25 //**********************************************************************************************************************
26 ChimeraPintailCommand::ChimeraPintailCommand(){
28 vector<string> tempOutNames;
29 outputTypes["chimera"] = tempOutNames;
30 outputTypes["accnos"] = tempOutNames;
33 m->errorOut(e, "ChimeraPintailCommand", "ChimeraPintailCommand");
37 //**********************************************************************************************************************
38 vector<string> ChimeraPintailCommand::getRequiredParameters(){
40 string AlignArray[] = {"template","fasta"};
41 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
45 m->errorOut(e, "ChimeraPintailCommand", "getRequiredParameters");
49 //**********************************************************************************************************************
50 vector<string> ChimeraPintailCommand::getRequiredFiles(){
52 vector<string> myArray;
56 m->errorOut(e, "ChimeraPintailCommand", "getRequiredFiles");
60 //***************************************************************************************************************
61 ChimeraPintailCommand::ChimeraPintailCommand(string option) {
65 //allow user to run help
66 if(option == "help") { help(); abort = true; }
69 //valid paramters for this command
70 string Array[] = {"fasta","filter","processors","window" ,"increment","template","conservation","quantile","mask","outputdir","inputdir"};
71 vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
73 OptionParser parser(option);
74 map<string,string> parameters = parser.getParameters();
76 ValidParameters validParameter("chimera.pintail");
77 map<string,string>::iterator it;
79 //check to make sure all parameters are valid for command
80 for (it = parameters.begin(); it != parameters.end(); it++) {
81 if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; }
84 vector<string> tempOutNames;
85 outputTypes["chimera"] = tempOutNames;
86 outputTypes["accnos"] = tempOutNames;
88 //if the user changes the input directory command factory will send this info to us in the output parameter
89 inputDir = validParameter.validFile(parameters, "inputdir", false);
90 if (inputDir == "not found"){ inputDir = ""; }
93 it = parameters.find("template");
94 //user has given a template file
95 if(it != parameters.end()){
96 path = m->hasPath(it->second);
97 //if the user has not given a path then, add inputdir. else leave path alone.
98 if (path == "") { parameters["template"] = inputDir + it->second; }
101 it = parameters.find("conservation");
102 //user has given a template file
103 if(it != parameters.end()){
104 path = m->hasPath(it->second);
105 //if the user has not given a path then, add inputdir. else leave path alone.
106 if (path == "") { parameters["conservation"] = inputDir + it->second; }
109 it = parameters.find("quantile");
110 //user has given a template file
111 if(it != parameters.end()){
112 path = m->hasPath(it->second);
113 //if the user has not given a path then, add inputdir. else leave path alone.
114 if (path == "") { parameters["quantile"] = inputDir + it->second; }
119 //check for required parameters
120 fastafile = validParameter.validFile(parameters, "fasta", false);
121 if (fastafile == "not found") { fastafile = ""; m->mothurOut("fasta is a required parameter for the chimera.pintail command."); m->mothurOutEndLine(); abort = true; }
123 m->splitAtDash(fastafile, fastaFileNames);
125 //go through files and make sure they are good, if not, then disregard them
126 for (int i = 0; i < fastaFileNames.size(); i++) {
127 if (inputDir != "") {
128 string path = m->hasPath(fastaFileNames[i]);
129 //if the user has not given a path then, add inputdir. else leave path alone.
130 if (path == "") { fastaFileNames[i] = inputDir + fastaFileNames[i]; }
136 ableToOpen = m->openInputFile(fastaFileNames[i], in, "noerror");
138 //if you can't open it, try default location
139 if (ableToOpen == 1) {
140 if (m->getDefaultPath() != "") { //default path is set
141 string tryPath = m->getDefaultPath() + m->getSimpleName(fastaFileNames[i]);
142 m->mothurOut("Unable to open " + fastaFileNames[i] + ". Trying default " + tryPath); m->mothurOutEndLine();
144 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
146 fastaFileNames[i] = tryPath;
150 if (ableToOpen == 1) {
151 if (m->getOutputDir() != "") { //default path is set
152 string tryPath = m->getOutputDir() + m->getSimpleName(fastaFileNames[i]);
153 m->mothurOut("Unable to open " + fastaFileNames[i] + ". Trying output directory " + tryPath); m->mothurOutEndLine();
155 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
157 fastaFileNames[i] = tryPath;
163 if (ableToOpen == 1) {
164 m->mothurOut("Unable to open " + fastaFileNames[i] + ". It will be disregarded."); m->mothurOutEndLine();
165 //erase from file list
166 fastaFileNames.erase(fastaFileNames.begin()+i);
171 //make sure there is at least one valid file left
172 if (fastaFileNames.size() == 0) { m->mothurOut("no valid files."); m->mothurOutEndLine(); abort = true; }
176 temp = validParameter.validFile(parameters, "filter", false); if (temp == "not found") { temp = "F"; }
177 filter = m->isTrue(temp);
179 temp = validParameter.validFile(parameters, "processors", false); if (temp == "not found") { temp = "1"; }
180 convert(temp, processors);
182 temp = validParameter.validFile(parameters, "window", false); if (temp == "not found") { temp = "0"; }
183 convert(temp, window);
185 temp = validParameter.validFile(parameters, "increment", false); if (temp == "not found") { temp = "25"; }
186 convert(temp, increment);
188 maskfile = validParameter.validFile(parameters, "mask", false);
189 if (maskfile == "not found") { maskfile = ""; }
190 else if (maskfile != "default") {
191 if (inputDir != "") {
192 string path = m->hasPath(maskfile);
193 //if the user has not given a path then, add inputdir. else leave path alone.
194 if (path == "") { maskfile = inputDir + maskfile; }
198 int ableToOpen = m->openInputFile(maskfile, in, "no error");
199 if (ableToOpen == 1) {
200 if (m->getDefaultPath() != "") { //default path is set
201 string tryPath = m->getDefaultPath() + m->getSimpleName(maskfile);
202 m->mothurOut("Unable to open " + maskfile + ". Trying default " + tryPath); m->mothurOutEndLine();
204 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
210 if (ableToOpen == 1) {
211 if (m->getOutputDir() != "") { //default path is set
212 string tryPath = m->getOutputDir() + m->getSimpleName(maskfile);
213 m->mothurOut("Unable to open " + maskfile + ". Trying output directory " + tryPath); m->mothurOutEndLine();
215 ableToOpen = m->openInputFile(tryPath, in2, "noerror");
223 if (ableToOpen == 1) {
224 m->mothurOut("Unable to open " + maskfile + "."); m->mothurOutEndLine();
230 //if the user changes the output directory command factory will send this info to us in the output parameter
231 outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ outputDir = ""; }
233 templatefile = validParameter.validFile(parameters, "template", true);
234 if (templatefile == "not open") { abort = true; }
235 else if (templatefile == "not found") { templatefile = ""; m->mothurOut("template is a required parameter for the chimera.pintail command."); m->mothurOutEndLine(); abort = true; }
237 consfile = validParameter.validFile(parameters, "conservation", true);
238 if (consfile == "not open") { abort = true; }
239 else if (consfile == "not found") {
242 string tempConsFile = m->getRootName(inputDir + m->getSimpleName(templatefile)) + "freq";
243 ifstream FileTest(tempConsFile.c_str());
245 bool GoodFile = m->checkReleaseVersion(FileTest, m->getVersion());
247 m->mothurOut("I found " + tempConsFile + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); consfile = tempConsFile; FileTest.close();
250 string tempConsFile = m->getDefaultPath() + m->getRootName(m->getSimpleName(templatefile)) + "freq";
251 ifstream FileTest2(tempConsFile.c_str());
253 bool GoodFile = m->checkReleaseVersion(FileTest2, m->getVersion());
255 m->mothurOut("I found " + tempConsFile + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); consfile = tempConsFile; FileTest2.close();
261 quanfile = validParameter.validFile(parameters, "quantile", true);
262 if (quanfile == "not open") { abort = true; }
263 else if (quanfile == "not found") { quanfile = ""; }
266 catch(exception& e) {
267 m->errorOut(e, "ChimeraPintailCommand", "ChimeraPintailCommand");
271 //**********************************************************************************************************************
273 void ChimeraPintailCommand::help(){
276 m->mothurOut("The chimera.pintail command reads a fastafile and templatefile and outputs potentially chimeric sequences.\n");
277 m->mothurOut("This command was created using the algorythms described in the 'At Least 1 in 20 16S rRNA Sequence Records Currently Held in the Public Repositories is Estimated To Contain Substantial Anomalies' paper by Kevin E. Ashelford 1, Nadia A. Chuzhanova 3, John C. Fry 1, Antonia J. Jones 2 and Andrew J. Weightman 1.\n");
278 m->mothurOut("The chimera.pintail command parameters are fasta, template, filter, mask, processors, window, increment, conservation and quantile.\n");
279 m->mothurOut("The fasta parameter allows you to enter the fasta file containing your potentially chimeric sequences, and is required. \n");
280 m->mothurOut("You may enter multiple fasta files by separating their names with dashes. ie. fasta=abrecovery.fasta-amzon.fasta \n");
281 m->mothurOut("The template parameter allows you to enter a template file containing known non-chimeric sequences, and is required. \n");
282 m->mothurOut("The filter parameter allows you to specify if you would like to apply a vertical and 50% soft filter. \n");
283 m->mothurOut("The mask parameter allows you to specify a file containing one sequence you wish to use as a mask for the your sequences, by default no mask is applied. You can apply an ecoli mask by typing, mask=default. \n");
284 m->mothurOut("The processors parameter allows you to specify how many processors you would like to use. The default is 1. \n");
286 m->mothurOut("When using MPI, the processors parameter is set to the number of MPI processes running. \n");
288 m->mothurOut("The window parameter allows you to specify the window size for searching for chimeras, default=300. \n");
289 m->mothurOut("The increment parameter allows you to specify how far you move each window while finding chimeric sequences, default=25.\n");
290 m->mothurOut("The conservation parameter allows you to enter a frequency file containing the highest bases frequency at each place in the alignment.\n");
291 m->mothurOut("The quantile parameter allows you to enter a file containing quantiles for a template files sequences, if you use the filter the quantile file generated becomes unique to the fasta file you used.\n");
292 m->mothurOut("The chimera.pintail command should be in the following format: \n");
293 m->mothurOut("chimera.pintail(fasta=yourFastaFile, template=yourTemplate) \n");
294 m->mothurOut("Example: chimera.pintail(fasta=AD.align, template=silva.bacteria.fasta) \n");
295 m->mothurOut("Note: No spaces between parameter labels (i.e. fasta), '=' and parameters (i.e.yourFastaFile).\n\n");
297 catch(exception& e) {
298 m->errorOut(e, "ChimeraPintailCommand", "help");
303 //***************************************************************************************************************
305 ChimeraPintailCommand::~ChimeraPintailCommand(){ /* do nothing */ }
307 //***************************************************************************************************************
309 int ChimeraPintailCommand::execute(){
312 if (abort == true) { return 0; }
314 for (int s = 0; s < fastaFileNames.size(); s++) {
316 m->mothurOut("Checking sequences from " + fastaFileNames[s] + " ..." ); m->mothurOutEndLine();
318 int start = time(NULL);
321 if (maskfile == "default") { m->mothurOut("I am using the default 236627 EU009184.1 Shigella dysenteriae str. FBD013."); m->mothurOutEndLine(); }
323 //check for quantile to save the time
324 string tempQuan = "";
325 if ((!filter) && (maskfile == "")) {
326 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.quan";
327 }else if ((!filter) && (maskfile != "")) {
328 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.masked.quan";
329 }else if ((filter) && (maskfile != "")) {
330 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "masked.quan";
331 }else if ((filter) && (maskfile == "")) {
332 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "quan";
335 ifstream FileTest(tempQuan.c_str());
337 bool GoodFile = m->checkReleaseVersion(FileTest, m->getVersion());
339 m->mothurOut("I found " + tempQuan + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); quanfile = tempQuan; FileTest.close();
342 string tryPath = m->getDefaultPath();
343 string tempQuan = "";
344 if ((!filter) && (maskfile == "")) {
345 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.quan";
346 }else if ((!filter) && (maskfile != "")) {
347 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.masked.quan";
348 }else if ((filter) && (maskfile != "")) {
349 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "masked.quan";
350 }else if ((filter) && (maskfile == "")) {
351 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "quan";
354 ifstream FileTest2(tempQuan.c_str());
356 bool GoodFile = m->checkReleaseVersion(FileTest2, m->getVersion());
358 m->mothurOut("I found " + tempQuan + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); quanfile = tempQuan; FileTest2.close();
363 chimera = new Pintail(fastaFileNames[s], templatefile, filter, processors, maskfile, consfile, quanfile, window, increment, outputDir);
365 if (outputDir == "") { outputDir = m->hasPath(fastaFileNames[s]); }//if user entered a file with a path then preserve it
366 string outputFileName, accnosFileName;
367 if (maskfile != "") {
368 outputFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + m->getSimpleName(m->getRootName(maskfile)) + ".pintail.chimeras";
369 accnosFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + m->getSimpleName(m->getRootName(maskfile)) + ".pintail.accnos";
371 outputFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + "pintail.chimeras";
372 accnosFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + "pintail.accnos";
375 if (m->control_pressed) { delete chimera; for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } return 0; }
377 if (chimera->getUnaligned()) {
378 m->mothurOut("Your template sequences are different lengths, please correct."); m->mothurOutEndLine();
382 templateSeqsLength = chimera->getLength();
385 int pid, numSeqsPerProcessor;
387 vector<unsigned long int> MPIPos;
390 MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
391 MPI_Comm_size(MPI_COMM_WORLD, &processors);
395 MPI_File outMPIAccnos;
397 int outMode=MPI_MODE_CREATE|MPI_MODE_WRONLY;
398 int inMode=MPI_MODE_RDONLY;
400 char outFilename[1024];
401 strcpy(outFilename, outputFileName.c_str());
403 char outAccnosFilename[1024];
404 strcpy(outAccnosFilename, accnosFileName.c_str());
406 char inFileName[1024];
407 strcpy(inFileName, fastaFileNames[s].c_str());
409 MPI_File_open(MPI_COMM_WORLD, inFileName, inMode, MPI_INFO_NULL, &inMPI); //comm, filename, mode, info, filepointer
410 MPI_File_open(MPI_COMM_WORLD, outFilename, outMode, MPI_INFO_NULL, &outMPI);
411 MPI_File_open(MPI_COMM_WORLD, outAccnosFilename, outMode, MPI_INFO_NULL, &outMPIAccnos);
413 if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&inMPI); MPI_File_close(&outMPI); MPI_File_close(&outMPIAccnos); for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } delete chimera; return 0; }
415 if (pid == 0) { //you are the root process
417 MPIPos = m->setFilePosFasta(fastaFileNames[s], numSeqs); //fills MPIPos, returns numSeqs
419 //send file positions to all processes
420 for(int i = 1; i < processors; i++) {
421 MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
422 MPI_Send(&MPIPos[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);
425 //figure out how many sequences you have to align
426 numSeqsPerProcessor = numSeqs / processors;
427 int startIndex = pid * numSeqsPerProcessor;
428 if(pid == (processors - 1)){ numSeqsPerProcessor = numSeqs - pid * numSeqsPerProcessor; }
431 driverMPI(startIndex, numSeqsPerProcessor, inMPI, outMPI, outMPIAccnos, MPIPos);
433 if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&inMPI); MPI_File_close(&outMPI); MPI_File_close(&outMPIAccnos); remove(outputFileName.c_str()); remove(accnosFileName.c_str()); for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } delete chimera; return 0; }
435 }else{ //you are a child process
436 MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
437 MPIPos.resize(numSeqs+1);
438 MPI_Recv(&MPIPos[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);
440 //figure out how many sequences you have to align
441 numSeqsPerProcessor = numSeqs / processors;
442 int startIndex = pid * numSeqsPerProcessor;
443 if(pid == (processors - 1)){ numSeqsPerProcessor = numSeqs - pid * numSeqsPerProcessor; }
446 driverMPI(startIndex, numSeqsPerProcessor, inMPI, outMPI, outMPIAccnos, MPIPos);
448 if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&inMPI); MPI_File_close(&outMPI); MPI_File_close(&outMPIAccnos); for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } delete chimera; return 0; }
452 MPI_File_close(&inMPI);
453 MPI_File_close(&outMPI);
454 MPI_File_close(&outMPIAccnos);
455 MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
457 vector<unsigned long int> positions = m->divideFile(fastaFileNames[s], processors);
459 for (int i = 0; i < (positions.size()-1); i++) {
460 lines.push_back(new linePair(positions[i], positions[(i+1)]));
464 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
467 numSeqs = driver(lines[0], outputFileName, fastaFileNames[s], accnosFileName);
469 if (m->control_pressed) { outputTypes.clear(); remove(outputFileName.c_str()); remove(accnosFileName.c_str()); for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear(); delete chimera; return 0; }
472 processIDS.resize(0);
474 numSeqs = createProcesses(outputFileName, fastaFileNames[s], accnosFileName);
476 rename((outputFileName + toString(processIDS[0]) + ".temp").c_str(), outputFileName.c_str());
477 rename((accnosFileName + toString(processIDS[0]) + ".temp").c_str(), accnosFileName.c_str());
479 //append output files
480 for(int i=1;i<processors;i++){
481 m->appendFiles((outputFileName + toString(processIDS[i]) + ".temp"), outputFileName);
482 remove((outputFileName + toString(processIDS[i]) + ".temp").c_str());
485 //append output files
486 for(int i=1;i<processors;i++){
487 m->appendFiles((accnosFileName + toString(processIDS[i]) + ".temp"), accnosFileName);
488 remove((accnosFileName + toString(processIDS[i]) + ".temp").c_str());
491 if (m->control_pressed) {
492 remove(outputFileName.c_str());
493 remove(accnosFileName.c_str());
494 for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } outputTypes.clear();
495 for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear();
502 numSeqs = driver(lines[0], outputFileName, fastaFileNames[s], accnosFileName);
504 if (m->control_pressed) { outputTypes.clear(); remove(outputFileName.c_str()); remove(accnosFileName.c_str()); for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear(); delete chimera; return 0; }
510 for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear();
512 outputNames.push_back(outputFileName); outputTypes["chimera"].push_back(outputFileName);
513 outputNames.push_back(accnosFileName); outputTypes["accnos"].push_back(accnosFileName);
515 m->mothurOutEndLine();
516 m->mothurOutEndLine(); m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(numSeqs) + " sequences."); m->mothurOutEndLine();
519 m->mothurOutEndLine();
520 m->mothurOut("Output File Names: "); m->mothurOutEndLine();
521 for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); }
522 m->mothurOutEndLine();
527 catch(exception& e) {
528 m->errorOut(e, "ChimeraPintailCommand", "execute");
532 //**********************************************************************************************************************
534 int ChimeraPintailCommand::driver(linePair* filePos, string outputFName, string filename, string accnos){
537 m->openOutputFile(outputFName, out);
540 m->openOutputFile(accnos, out2);
543 m->openInputFile(filename, inFASTA);
545 inFASTA.seekg(filePos->start);
552 if (m->control_pressed) { return 1; }
554 Sequence* candidateSeq = new Sequence(inFASTA); m->gobble(inFASTA);
556 if (candidateSeq->getName() != "") { //incase there is a commented sequence at the end of a file
558 if (candidateSeq->getAligned().length() != templateSeqsLength) { //chimeracheck does not require seqs to be aligned
559 m->mothurOut(candidateSeq->getName() + " is not the same length as the template sequences. Skipping."); m->mothurOutEndLine();
562 chimera->getChimeras(candidateSeq);
564 if (m->control_pressed) { delete candidateSeq; return 1; }
567 chimera->print(out, out2);
573 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
574 unsigned long int pos = inFASTA.tellg();
575 if ((pos == -1) || (pos >= filePos->end)) { break; }
577 if (inFASTA.eof()) { break; }
581 if((count) % 100 == 0){ m->mothurOut("Processing sequence: " + toString(count)); m->mothurOutEndLine(); }
584 if((count) % 100 != 0){ m->mothurOut("Processing sequence: " + toString(count)); m->mothurOutEndLine(); }
592 catch(exception& e) {
593 m->errorOut(e, "ChimeraPintailCommand", "driver");
597 //**********************************************************************************************************************
599 int ChimeraPintailCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_File& outMPI, MPI_File& outAccMPI, vector<unsigned long int>& MPIPos){
604 MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
606 for(int i=0;i<num;i++){
608 if (m->control_pressed) { return 1; }
611 int length = MPIPos[start+i+1] - MPIPos[start+i];
613 char* buf4 = new char[length];
614 MPI_File_read_at(inMPI, MPIPos[start+i], buf4, length, MPI_CHAR, &status);
616 string tempBuf = buf4;
617 if (tempBuf.length() > length) { tempBuf = tempBuf.substr(0, length); }
618 istringstream iss (tempBuf,istringstream::in);
621 Sequence* candidateSeq = new Sequence(iss); m->gobble(iss);
623 if (candidateSeq->getName() != "") { //incase there is a commented sequence at the end of a file
625 if (candidateSeq->getAligned().length() != templateSeqsLength) { //chimeracheck does not require seqs to be aligned
626 m->mothurOut(candidateSeq->getName() + " is not the same length as the template sequences. Skipping."); m->mothurOutEndLine();
629 chimera->getChimeras(candidateSeq);
631 if (m->control_pressed) { delete candidateSeq; return 1; }
634 chimera->print(outMPI, outAccMPI);
640 if((i+1) % 100 == 0){ cout << "Processing sequence: " << (i+1) << endl; m->mothurOutJustToLog("Processing sequence: " + toString(i+1) + "\n"); }
643 if(num % 100 != 0){ cout << "Processing sequence: " << num << endl; m->mothurOutJustToLog("Processing sequence: " + toString(num) + "\n"); }
648 catch(exception& e) {
649 m->errorOut(e, "ChimeraPintailCommand", "driverMPI");
655 /**************************************************************************************************/
657 int ChimeraPintailCommand::createProcesses(string outputFileName, string filename, string accnos) {
659 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
663 //loop through and create all the processes you want
664 while (process != processors) {
668 processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later
671 num = driver(lines[process], outputFileName + toString(getpid()) + ".temp", filename, accnos + toString(getpid()) + ".temp");
673 //pass numSeqs to parent
675 string tempFile = outputFileName + toString(getpid()) + ".num.temp";
676 m->openOutputFile(tempFile, out);
682 m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine();
683 for (int i = 0; i < processIDS.size(); i++) { kill (processIDS[i], SIGINT); }
688 //force parent to wait until all the processes are done
689 for (int i=0;i<processors;i++) {
690 int temp = processIDS[i];
694 for (int i = 0; i < processIDS.size(); i++) {
696 string tempFile = outputFileName + toString(processIDS[i]) + ".num.temp";
697 m->openInputFile(tempFile, in);
698 if (!in.eof()) { int tempNum = 0; in >> tempNum; num += tempNum; }
699 in.close(); remove(tempFile.c_str());
705 catch(exception& e) {
706 m->errorOut(e, "ChimeraPintailCommand", "createProcesses");
711 /**************************************************************************************************/