+//This Function allows the user to run a batchfile containing several commands on mothur
+bool ScriptEngine::getInput(){
+ try {
+
+ string input = "";
+ string commandName = "";
+ string options = "";
+
+
+ //CommandFactory cFactory;
+ int quitCommandCalled = 0;
+
+ while(quitCommandCalled != 1){
+
+ #ifdef USE_MPI
+ int pid, processors;
+ MPI_Status status;
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid);
+ MPI_Comm_size(MPI_COMM_WORLD, &processors);
+
+ if (pid == 0) {
+
+ #endif
+
+ input = getNextCommand(listOfCommands);
+
+ if (input == "") { input = "quit()"; }
+
+ if (mout->changedSeqNames) { mout->mothurOut("[WARNING]: your sequence names contained ':'. I changed them to '_' to avoid problems in your downstream analysis.\n"); }
+
+ if (mout->gui) {
+ if ((input.find("quit") != string::npos) || (input.find("set.logfile") != string::npos)) {}
+ else if ((input.find("get.current") != string::npos) && (!mout->hasCurrentFiles())) {}
+ else { mout->mothurOutEndLine(); mout->mothurOut("mothur > " + input); mout->mothurOutEndLine(); }
+ }else{
+ mout->mothurOutEndLine(); mout->mothurOut("mothur > " + input); mout->mothurOutEndLine();
+ }
+
+ #ifdef USE_MPI
+ //send commandName
+ for(int i = 1; i < processors; i++) {
+ int length = input.length();
+ MPI_Send(&length, 1, MPI_INT, i, 2001, MPI_COMM_WORLD);
+ MPI_Send(&input[0], length, MPI_CHAR, i, 2001, MPI_COMM_WORLD);
+
+ }
+ }else {
+ int length;
+ MPI_Recv(&length, 1, MPI_INT, 0, 2001, MPI_COMM_WORLD, &status);
+ //recieve container
+ char* tempBuf = new char[length];
+ MPI_Recv(&tempBuf[0], length, MPI_CHAR, 0, 2001, MPI_COMM_WORLD, &status);
+
+ input = tempBuf;
+ if (input.length() > length) { input = input.substr(0, length); }
+ delete tempBuf;
+ }
+
+
+ #endif
+
+
+ if (mout->control_pressed) { input = "quit()"; }
+
+ //allow user to omit the () on the quit command
+ if (input == "quit") { input = "quit()"; }
+
+ CommandOptionParser parser(input);
+ commandName = parser.getCommandString();
+ options = parser.getOptionString();
+
+ if (commandName != "") {
+ mout->executing = true;
+ #ifdef USE_MPI
+ int pid, numProcesses;
+
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid);
+ MPI_Comm_size(MPI_COMM_WORLD, &numProcesses);
+
+//cout << pid << " is here " << commandName << endl;
+ if ((cFactory->MPIEnabled(commandName)) || (pid == 0)) {
+ //cout << pid << " is in execute" << endl;
+ #endif
+ //executes valid command
+ mout->changedSeqNames = false;
+ mout->runParse = true;
+ mout->clearGroups();
+ mout->clearAllGroups();
+ mout->Treenames.clear();
+ mout->saveNextLabel = "";
+ mout->commandInputsConvertError = false;
+ mout->printedSharedHeaders = false;
+ mout->currentSharedBinLabels.clear();
+ mout->sharedBinLabelsInFile.clear();
+ mout->printedListHeaders = false;
+ mout->listBinLabelsInFile.clear();
+
+ Command* command = cFactory->getCommand(commandName, options);
+ if (mout->commandInputsConvertError) { quitCommandCalled = 2; }
+ else { quitCommandCalled = command->execute(); }
+
+ //if we aborted command
+ if (quitCommandCalled == 2) { mout->mothurOut("[ERROR]: did not complete " + commandName + "."); mout->mothurOutEndLine(); }
+
+ mout->control_pressed = 0;
+ mout->executing = false;
+
+ #ifdef USE_MPI
+ //cout << pid << " is done in execute" << endl;
+ }
+ #endif
+ }else {
+ mout->mothurOut("Invalid.");
+ mout->mothurOutEndLine();
+ }