2 * chimerapintailcommand.cpp
5 * Created by westcott on 4/1/10.
6 * Copyright 2010 Schloss Lab. All rights reserved.
10 #include "chimerapintailcommand.h"
13 //***************************************************************************************************************
15 ChimeraPintailCommand::ChimeraPintailCommand(string option) {
19 //allow user to run help
20 if(option == "help") { help(); abort = true; }
23 //valid paramters for this command
24 string Array[] = {"fasta","filter","processors","window" ,"increment","template","conservation","quantile","mask","outputdir","inputdir"};
25 vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
27 OptionParser parser(option);
28 map<string,string> parameters = parser.getParameters();
30 ValidParameters validParameter("chimera.pintail");
31 map<string,string>::iterator it;
33 //check to make sure all parameters are valid for command
34 for (it = parameters.begin(); it != parameters.end(); it++) {
35 if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; }
38 //if the user changes the input directory command factory will send this info to us in the output parameter
39 inputDir = validParameter.validFile(parameters, "inputdir", false);
40 if (inputDir == "not found"){ inputDir = ""; }
43 it = parameters.find("template");
44 //user has given a template file
45 if(it != parameters.end()){
46 path = m->hasPath(it->second);
47 //if the user has not given a path then, add inputdir. else leave path alone.
48 if (path == "") { parameters["template"] = inputDir + it->second; }
51 it = parameters.find("conservation");
52 //user has given a template file
53 if(it != parameters.end()){
54 path = m->hasPath(it->second);
55 //if the user has not given a path then, add inputdir. else leave path alone.
56 if (path == "") { parameters["conservation"] = inputDir + it->second; }
59 it = parameters.find("quantile");
60 //user has given a template file
61 if(it != parameters.end()){
62 path = m->hasPath(it->second);
63 //if the user has not given a path then, add inputdir. else leave path alone.
64 if (path == "") { parameters["quantile"] = inputDir + it->second; }
69 //check for required parameters
70 fastafile = validParameter.validFile(parameters, "fasta", false);
71 if (fastafile == "not found") { fastafile = ""; m->mothurOut("fasta is a required parameter for the chimera.pintail command."); m->mothurOutEndLine(); abort = true; }
73 m->splitAtDash(fastafile, fastaFileNames);
75 //go through files and make sure they are good, if not, then disregard them
76 for (int i = 0; i < fastaFileNames.size(); i++) {
78 string path = m->hasPath(fastaFileNames[i]);
79 //if the user has not given a path then, add inputdir. else leave path alone.
80 if (path == "") { fastaFileNames[i] = inputDir + fastaFileNames[i]; }
86 ableToOpen = m->openInputFile(fastaFileNames[i], in, "noerror");
88 //if you can't open it, try default location
89 if (ableToOpen == 1) {
90 if (m->getDefaultPath() != "") { //default path is set
91 string tryPath = m->getDefaultPath() + m->getSimpleName(fastaFileNames[i]);
92 m->mothurOut("Unable to open " + fastaFileNames[i] + ". Trying default " + tryPath); m->mothurOutEndLine();
93 ableToOpen = m->openInputFile(tryPath, in, "noerror");
94 fastaFileNames[i] = tryPath;
99 if (ableToOpen == 1) {
100 m->mothurOut("Unable to open " + fastaFileNames[i] + ". It will be disregarded."); m->mothurOutEndLine();
101 //erase from file list
102 fastaFileNames.erase(fastaFileNames.begin()+i);
107 //make sure there is at least one valid file left
108 if (fastaFileNames.size() == 0) { m->mothurOut("no valid files."); m->mothurOutEndLine(); abort = true; }
112 temp = validParameter.validFile(parameters, "filter", false); if (temp == "not found") { temp = "F"; }
113 filter = m->isTrue(temp);
115 temp = validParameter.validFile(parameters, "processors", false); if (temp == "not found") { temp = "1"; }
116 convert(temp, processors);
118 temp = validParameter.validFile(parameters, "window", false); if (temp == "not found") { temp = "0"; }
119 convert(temp, window);
121 temp = validParameter.validFile(parameters, "increment", false); if (temp == "not found") { temp = "25"; }
122 convert(temp, increment);
124 maskfile = validParameter.validFile(parameters, "mask", false);
125 if (maskfile == "not found") { maskfile = ""; }
126 else if (maskfile != "default") {
127 if (inputDir != "") {
128 string path = m->hasPath(maskfile);
129 //if the user has not given a path then, add inputdir. else leave path alone.
130 if (path == "") { maskfile = inputDir + maskfile; }
134 int ableToOpen = m->openInputFile(maskfile, in, "no error");
135 if (ableToOpen == 1) {
136 if (m->getDefaultPath() != "") { //default path is set
137 string tryPath = m->getDefaultPath() + m->getSimpleName(maskfile);
138 m->mothurOut("Unable to open " + maskfile + ". Trying default " + tryPath); m->mothurOutEndLine();
139 ableToOpen = m->openInputFile(tryPath, in, "noerror");
145 if (ableToOpen == 1) {
146 m->mothurOut("Unable to open " + maskfile + "."); m->mothurOutEndLine();
152 //if the user changes the output directory command factory will send this info to us in the output parameter
153 outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){
155 outputDir += m->hasPath(fastafile); //if user entered a file with a path then preserve it
158 templatefile = validParameter.validFile(parameters, "template", true);
159 if (templatefile == "not open") { abort = true; }
160 else if (templatefile == "not found") { templatefile = ""; m->mothurOut("template is a required parameter for the chimera.pintail command."); m->mothurOutEndLine(); abort = true; }
162 consfile = validParameter.validFile(parameters, "conservation", true);
163 if (consfile == "not open") { abort = true; }
164 else if (consfile == "not found") {
167 string tempConsFile = m->getRootName(inputDir + m->getSimpleName(templatefile)) + "freq";
168 ifstream FileTest(tempConsFile.c_str());
170 bool GoodFile = m->checkReleaseVersion(FileTest, m->getVersion());
172 m->mothurOut("I found " + tempConsFile + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); consfile = tempConsFile; FileTest.close();
175 string tempConsFile = m->getDefaultPath() + m->getRootName(m->getSimpleName(templatefile)) + "freq";
176 ifstream FileTest2(tempConsFile.c_str());
178 bool GoodFile = m->checkReleaseVersion(FileTest2, m->getVersion());
180 m->mothurOut("I found " + tempConsFile + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); consfile = tempConsFile; FileTest2.close();
186 quanfile = validParameter.validFile(parameters, "quantile", true);
187 if (quanfile == "not open") { abort = true; }
188 else if (quanfile == "not found") { quanfile = ""; }
191 catch(exception& e) {
192 m->errorOut(e, "ChimeraPintailCommand", "ChimeraPintailCommand");
196 //**********************************************************************************************************************
198 void ChimeraPintailCommand::help(){
201 m->mothurOut("The chimera.pintail command reads a fastafile and templatefile and outputs potentially chimeric sequences.\n");
202 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");
203 m->mothurOut("The chimera.pintail command parameters are fasta, template, filter, mask, processors, window, increment, conservation and quantile.\n");
204 m->mothurOut("The fasta parameter allows you to enter the fasta file containing your potentially chimeric sequences, and is required. \n");
205 m->mothurOut("You may enter multiple fasta files by separating their names with dashes. ie. fasta=abrecovery.fasta-amzon.fasta \n");
206 m->mothurOut("The template parameter allows you to enter a template file containing known non-chimeric sequences, and is required. \n");
207 m->mothurOut("The filter parameter allows you to specify if you would like to apply a vertical and 50% soft filter. \n");
208 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");
209 m->mothurOut("The processors parameter allows you to specify how many processors you would like to use. The default is 1. \n");
211 m->mothurOut("When using MPI, the processors parameter is set to the number of MPI processes running. \n");
213 m->mothurOut("The window parameter allows you to specify the window size for searching for chimeras, default=300. \n");
214 m->mothurOut("The increment parameter allows you to specify how far you move each window while finding chimeric sequences, default=25.\n");
215 m->mothurOut("The conservation parameter allows you to enter a frequency file containing the highest bases frequency at each place in the alignment.\n");
216 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");
217 m->mothurOut("The chimera.pintail command should be in the following format: \n");
218 m->mothurOut("chimera.pintail(fasta=yourFastaFile, template=yourTemplate) \n");
219 m->mothurOut("Example: chimera.pintail(fasta=AD.align, template=silva.bacteria.fasta) \n");
220 m->mothurOut("Note: No spaces between parameter labels (i.e. fasta), '=' and parameters (i.e.yourFastaFile).\n\n");
222 catch(exception& e) {
223 m->errorOut(e, "ChimeraPintailCommand", "help");
228 //***************************************************************************************************************
230 ChimeraPintailCommand::~ChimeraPintailCommand(){ /* do nothing */ }
232 //***************************************************************************************************************
234 int ChimeraPintailCommand::execute(){
237 if (abort == true) { return 0; }
239 for (int s = 0; s < fastaFileNames.size(); s++) {
241 m->mothurOut("Checking sequences from " + fastaFileNames[s] + " ..." ); m->mothurOutEndLine();
243 int start = time(NULL);
246 if (maskfile == "default") { m->mothurOut("I am using the default 236627 EU009184.1 Shigella dysenteriae str. FBD013."); m->mothurOutEndLine(); }
248 //check for quantile to save the time
249 string tempQuan = "";
250 if ((!filter) && (maskfile == "")) {
251 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.quan";
252 }else if ((!filter) && (maskfile != "")) {
253 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.masked.quan";
254 }else if ((filter) && (maskfile != "")) {
255 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "masked.quan";
256 }else if ((filter) && (maskfile == "")) {
257 tempQuan = inputDir + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "quan";
260 ifstream FileTest(tempQuan.c_str());
262 bool GoodFile = m->checkReleaseVersion(FileTest, m->getVersion());
264 m->mothurOut("I found " + tempQuan + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); quanfile = tempQuan; FileTest.close();
267 string tryPath = m->getDefaultPath();
268 string tempQuan = "";
269 if ((!filter) && (maskfile == "")) {
270 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.quan";
271 }else if ((!filter) && (maskfile != "")) {
272 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.masked.quan";
273 }else if ((filter) && (maskfile != "")) {
274 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "masked.quan";
275 }else if ((filter) && (maskfile == "")) {
276 tempQuan = tryPath + m->getRootName(m->getSimpleName(templatefile)) + "pintail.filtered." + m->getSimpleName(m->getRootName(fastaFileNames[s])) + "quan";
279 ifstream FileTest2(tempQuan.c_str());
281 bool GoodFile = m->checkReleaseVersion(FileTest2, m->getVersion());
283 m->mothurOut("I found " + tempQuan + " in your input file directory. I will use it to save time."); m->mothurOutEndLine(); quanfile = tempQuan; FileTest2.close();
288 chimera = new Pintail(fastaFileNames[s], templatefile, filter, processors, maskfile, consfile, quanfile, window, increment, outputDir);
290 string outputFileName, accnosFileName;
291 if (maskfile != "") {
292 outputFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + m->getSimpleName(m->getRootName(maskfile)) + ".pintail.chimeras";
293 accnosFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + m->getSimpleName(m->getRootName(maskfile)) + ".pintail.accnos";
295 outputFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + "pintail.chimeras";
296 accnosFileName = outputDir + m->getRootName(m->getSimpleName(fastaFileNames[s])) + "pintail.accnos";
299 if (m->control_pressed) { delete chimera; for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); } return 0; }
301 if (chimera->getUnaligned()) {
302 m->mothurOut("Your template sequences are different lengths, please correct."); m->mothurOutEndLine();
306 templateSeqsLength = chimera->getLength();
309 int pid, end, numSeqsPerProcessor;
311 vector<unsigned long int> MPIPos;
314 MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
315 MPI_Comm_size(MPI_COMM_WORLD, &processors);
319 MPI_File outMPIAccnos;
321 int outMode=MPI_MODE_CREATE|MPI_MODE_WRONLY;
322 int inMode=MPI_MODE_RDONLY;
324 char outFilename[1024];
325 strcpy(outFilename, outputFileName.c_str());
327 char outAccnosFilename[1024];
328 strcpy(outAccnosFilename, accnosFileName.c_str());
330 char inFileName[1024];
331 strcpy(inFileName, fastaFileNames[s].c_str());
333 MPI_File_open(MPI_COMM_WORLD, inFileName, inMode, MPI_INFO_NULL, &inMPI); //comm, filename, mode, info, filepointer
334 MPI_File_open(MPI_COMM_WORLD, outFilename, outMode, MPI_INFO_NULL, &outMPI);
335 MPI_File_open(MPI_COMM_WORLD, outAccnosFilename, outMode, MPI_INFO_NULL, &outMPIAccnos);
337 if (m->control_pressed) { 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; }
339 if (pid == 0) { //you are the root process
341 MPIPos = m->setFilePosFasta(fastaFileNames[s], numSeqs); //fills MPIPos, returns numSeqs
343 //send file positions to all processes
344 for(int i = 1; i < processors; i++) {
345 MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
346 MPI_Send(&MPIPos[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);
349 //figure out how many sequences you have to align
350 numSeqsPerProcessor = numSeqs / processors;
351 int startIndex = pid * numSeqsPerProcessor;
352 if(pid == (processors - 1)){ numSeqsPerProcessor = numSeqs - pid * numSeqsPerProcessor; }
355 driverMPI(startIndex, numSeqsPerProcessor, inMPI, outMPI, outMPIAccnos, MPIPos);
357 if (m->control_pressed) { 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; }
359 }else{ //you are a child process
360 MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
361 MPIPos.resize(numSeqs+1);
362 MPI_Recv(&MPIPos[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);
364 //figure out how many sequences you have to align
365 numSeqsPerProcessor = numSeqs / processors;
366 int startIndex = pid * numSeqsPerProcessor;
367 if(pid == (processors - 1)){ numSeqsPerProcessor = numSeqs - pid * numSeqsPerProcessor; }
370 driverMPI(startIndex, numSeqsPerProcessor, inMPI, outMPI, outMPIAccnos, MPIPos);
372 if (m->control_pressed) { 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; }
376 MPI_File_close(&inMPI);
377 MPI_File_close(&outMPI);
378 MPI_File_close(&outMPIAccnos);
379 MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
381 vector<unsigned long int> positions = m->divideFile(fastaFileNames[s], processors);
383 for (int i = 0; i < (positions.size()-1); i++) {
384 lines.push_back(new linePair(positions[i], positions[(i+1)]));
388 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
391 numSeqs = driver(lines[0], outputFileName, fastaFileNames[s], accnosFileName);
393 if (m->control_pressed) { 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; }
396 processIDS.resize(0);
398 numSeqs = createProcesses(outputFileName, fastaFileNames[s], accnosFileName);
400 rename((outputFileName + toString(processIDS[0]) + ".temp").c_str(), outputFileName.c_str());
401 rename((accnosFileName + toString(processIDS[0]) + ".temp").c_str(), accnosFileName.c_str());
403 //append output files
404 for(int i=1;i<processors;i++){
405 m->appendFiles((outputFileName + toString(processIDS[i]) + ".temp"), outputFileName);
406 remove((outputFileName + toString(processIDS[i]) + ".temp").c_str());
409 //append output files
410 for(int i=1;i<processors;i++){
411 m->appendFiles((accnosFileName + toString(processIDS[i]) + ".temp"), accnosFileName);
412 remove((accnosFileName + toString(processIDS[i]) + ".temp").c_str());
415 if (m->control_pressed) {
416 remove(outputFileName.c_str());
417 remove(accnosFileName.c_str());
418 for (int j = 0; j < outputNames.size(); j++) { remove(outputNames[j].c_str()); }
419 for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear();
426 numSeqs = driver(lines[0], outputFileName, fastaFileNames[s], accnosFileName);
428 if (m->control_pressed) { 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; }
434 for (int i = 0; i < lines.size(); i++) { delete lines[i]; } lines.clear();
436 outputNames.push_back(outputFileName);
437 outputNames.push_back(accnosFileName);
439 m->mothurOutEndLine();
440 m->mothurOutEndLine(); m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(numSeqs) + " sequences."); m->mothurOutEndLine();
443 m->mothurOutEndLine();
444 m->mothurOut("Output File Names: "); m->mothurOutEndLine();
445 for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); }
446 m->mothurOutEndLine();
451 catch(exception& e) {
452 m->errorOut(e, "ChimeraPintailCommand", "execute");
456 //**********************************************************************************************************************
458 int ChimeraPintailCommand::driver(linePair* filePos, string outputFName, string filename, string accnos){
461 m->openOutputFile(outputFName, out);
464 m->openOutputFile(accnos, out2);
467 m->openInputFile(filename, inFASTA);
469 inFASTA.seekg(filePos->start);
476 if (m->control_pressed) { return 1; }
478 Sequence* candidateSeq = new Sequence(inFASTA); m->gobble(inFASTA);
480 if (candidateSeq->getName() != "") { //incase there is a commented sequence at the end of a file
482 if (candidateSeq->getAligned().length() != templateSeqsLength) { //chimeracheck does not require seqs to be aligned
483 m->mothurOut(candidateSeq->getName() + " is not the same length as the template sequences. Skipping."); m->mothurOutEndLine();
486 chimera->getChimeras(candidateSeq);
488 if (m->control_pressed) { delete candidateSeq; return 1; }
491 chimera->print(out, out2);
497 unsigned long int pos = inFASTA.tellg();
498 if ((pos == -1) || (pos >= filePos->end)) { break; }
501 if((count) % 100 == 0){ m->mothurOut("Processing sequence: " + toString(count)); m->mothurOutEndLine(); }
504 if((count) % 100 != 0){ m->mothurOut("Processing sequence: " + toString(count)); m->mothurOutEndLine(); }
512 catch(exception& e) {
513 m->errorOut(e, "ChimeraPintailCommand", "driver");
517 //**********************************************************************************************************************
519 int ChimeraPintailCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_File& outMPI, MPI_File& outAccMPI, vector<unsigned long int>& MPIPos){
524 MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
526 for(int i=0;i<num;i++){
528 if (m->control_pressed) { return 1; }
531 int length = MPIPos[start+i+1] - MPIPos[start+i];
533 char* buf4 = new char[length];
534 MPI_File_read_at(inMPI, MPIPos[start+i], buf4, length, MPI_CHAR, &status);
536 string tempBuf = buf4;
537 if (tempBuf.length() > length) { tempBuf = tempBuf.substr(0, length); }
538 istringstream iss (tempBuf,istringstream::in);
541 Sequence* candidateSeq = new Sequence(iss); m->gobble(iss);
543 if (candidateSeq->getName() != "") { //incase there is a commented sequence at the end of a file
545 if (candidateSeq->getAligned().length() != templateSeqsLength) { //chimeracheck does not require seqs to be aligned
546 m->mothurOut(candidateSeq->getName() + " is not the same length as the template sequences. Skipping."); m->mothurOutEndLine();
549 chimera->getChimeras(candidateSeq);
551 if (m->control_pressed) { delete candidateSeq; return 1; }
554 bool isChimeric = chimera->print(outMPI, outAccMPI);
560 if((i+1) % 100 == 0){ cout << "Processing sequence: " << (i+1) << endl; m->mothurOutJustToLog("Processing sequence: " + toString(i+1) + "\n"); }
563 if(num % 100 != 0){ cout << "Processing sequence: " << num << endl; m->mothurOutJustToLog("Processing sequence: " + toString(num) + "\n"); }
568 catch(exception& e) {
569 m->errorOut(e, "ChimeraPintailCommand", "driverMPI");
575 /**************************************************************************************************/
577 int ChimeraPintailCommand::createProcesses(string outputFileName, string filename, string accnos) {
579 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
583 //loop through and create all the processes you want
584 while (process != processors) {
588 processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later
591 num = driver(lines[process], outputFileName + toString(getpid()) + ".temp", filename, accnos + toString(getpid()) + ".temp");
593 //pass numSeqs to parent
595 string tempFile = outputFileName + toString(getpid()) + ".num.temp";
596 m->openOutputFile(tempFile, out);
601 }else { m->mothurOut("unable to spawn the necessary processes."); m->mothurOutEndLine(); exit(0); }
604 //force parent to wait until all the processes are done
605 for (int i=0;i<processors;i++) {
606 int temp = processIDS[i];
610 for (int i = 0; i < processIDS.size(); i++) {
612 string tempFile = outputFileName + toString(processIDS[i]) + ".num.temp";
613 m->openInputFile(tempFile, in);
614 if (!in.eof()) { int tempNum = 0; in >> tempNum; num += tempNum; }
615 in.close(); remove(tempFile.c_str());
621 catch(exception& e) {
622 m->errorOut(e, "ChimeraPintailCommand", "createProcesses");
627 /**************************************************************************************************/