cutoff += 0.005;
string outputFile;
-
+
if (output == "lt") { //does the user want lower triangle phylip formatted file
outputFile = outputDir + getRootName(getSimpleName(fastafile)) + "phylip.dist";
remove(outputFile.c_str());
outputFile = outputDir + getRootName(getSimpleName(fastafile)) + "square.dist";
remove(outputFile.c_str());
}
+
+
+#ifdef USE_MPI
+
+ int pid, start, end;
+ int tag = 2001;
-#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ MPI_Status status;
+ MPI_Comm_size(MPI_COMM_WORLD, &processors); //set processors to the number of mpi processes running
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
+
+ //each process gets where it should start and stop in the file
+ start = int (sqrt(float(pid)/float(processors)) * numSeqs);
+ end = int (sqrt(float(pid+1)/float(processors)) * numSeqs);
+
+ if (pid == 0) { //you are the root process
+ //do your part
+ string outputMyPart;
+ driverMPI(start, end, outputMyPart, cutoff);
+
+ ofstream out;
+ openOutputFile(outputFile, out);
+
+ out << outputMyPart;
+
+ //get the childrens parts
+ for(int i = 1; i < processors; i++) {
+ int length;
+ MPI_Recv(&length, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);
+
+ char buf[length];
+
+ MPI_Recv(buf, length, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status);
+
+ outputMyPart = buf;
+ out << outputMyPart;
+ }
+
+ out.close();
+
+ }else { //you are a child process
+ //do your part
+ string outputMyPart;
+ driverMPI(start, end, outputMyPart, cutoff);
+
+ //send results to parent
+ int length = outputMyPart.length();
+ char buf[length];
+ strcpy(buf, outputMyPart.c_str());
+
+ MPI_Send( &length, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
+ MPI_Send(buf, length, MPI_CHAR, 0, tag, MPI_COMM_WORLD);
+ }
+
+
+#else
+
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
//if you don't need to fork anything
if(processors == 1){
driver(0, numSeqs, outputFile, cutoff);
remove((outputFile + toString(it->second) + ".temp").c_str());
}
}
-#else
+ #else
ifstream inFASTA;
driver(0, numSeqs, outputFile, cutoff);
+ #endif
+
#endif
if (m->control_pressed) { delete distCalculator; remove(outputFile.c_str()); return 0; }
+ #ifdef USE_MPI
+ MPI_Comm_rank(MPI_COMM_WORLD, &pid);
+
+ if (pid == 0) { //only one process should output to screen
+ #endif
+
if (output == "square") { convertMatrix(outputFile); }
+ #ifdef USE_MPI
+ }
+ #endif
+
if (m->control_pressed) { delete distCalculator; remove(outputFile.c_str()); return 0; }
delete distCalculator;
exit(1);
}
}
+/**************************************************************************************************/
+/////// need to fix to work with calcs and sequencedb
+int DistanceCommand::driverMPI(int startLine, int endLine, string& outputString, float cutoff){
+ try {
+
+ int startTime = time(NULL);
+
+ outputString = "";
+
+ if((output == "lt") && startLine == 0){ outputString += (toString(alignDB.getNumSeqs()) + '\n'); }
+
+ for(int i=startLine;i<endLine;i++){
+
+ if(output == "lt") {
+ string name = alignDB.get(i).getName();
+ if (name.length() < 10) { //pad with spaces to make compatible
+ while (name.length() < 10) { name += " "; }
+ }
+ outputString += (name + '\t');
+ }
+ for(int j=0;j<i;j++){
+
+ if (m->control_pressed) { return 0; }
+
+ distCalculator->calcDist(alignDB.get(i), alignDB.get(j));
+ double dist = distCalculator->getDist();
+
+ if(dist <= cutoff){
+ if (output == "column") { outputString += (alignDB.get(i).getName() + ' ' + alignDB.get(j).getName() + ' ' + toString(dist) + '\n'); }
+ }
+ if (output == "lt") { outputString += (toString(dist) + '\t'); }
+
+ if (output == "square") { //make a square column you can convert to square phylip
+ outputString += (alignDB.get(i).getName() + ' ' + alignDB.get(j).getName() + ' ' + toString(dist) + '\n');
+ outputString += (alignDB.get(j).getName() + ' ' + alignDB.get(i).getName() + ' ' + toString(dist) + '\n');
+ }
+
+ }
+
+ if (output == "lt") { outputString += '\n'; }
+
+ if(i % 100 == 0){
+ m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ }
+
+ }
+ m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+
+ return 1;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "DistanceCommand", "driver");
+ exit(1);
+ }
+}
+
/**************************************************************************************************/
int DistanceCommand::convertMatrix(string outputFile) {
try{
mout->mothurOutEndLine();
input = getCommand();
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) {
- #endif
mout->mothurOutEndLine();
- #ifdef USE_MPI
- }
- #endif
-
if (mout->control_pressed) { input = "quit()"; }
//allow user to omit the () on the quit command
if(nextCommand != NULL) { add_history(nextCommand); }
else{ //^D causes null string and we want it to quit mothur
nextCommand = "quit";
- cout << nextCommand << endl;
+ mout->mothurOut(nextCommand);
}
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
mout->mothurOutJustToLog("mothur > " + toString(nextCommand));
-
- #ifdef USE_MPI
- }
- #endif
-
return nextCommand;
#else
string nextCommand = "";
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
mout->mothurOut("mothur > ");
-
- #ifdef USE_MPI
- }
- #endif
-
getline(cin, nextCommand);
-
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
mout->mothurOutJustToLog("mothur > " + toString(nextCommand));
- #ifdef USE_MPI
- }
- #endif
-
return nextCommand;
#endif
#else
- string nextCommand = "";
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
- mout->mothurOut("mothur > ");
-
- #ifdef USE_MPI
- }
- #endif
+ string nextCommand = "";
+ mout->mothurOut("mothur > ");
getline(cin, nextCommand);
-
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
mout->mothurOutJustToLog(toString(nextCommand));
- #ifdef USE_MPI
- }
- #endif
-
return nextCommand;
#endif
if (input[0] != '#') {
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) { //only one process should output to screen
- #endif
-
mout->mothurOutEndLine();
mout->mothurOut("mothur > " + input);
mout->mothurOutEndLine();
-
- #ifdef USE_MPI
- }
- #endif
-
+
if (mout->control_pressed) { input = "quit()"; }
//allow user to omit the () on the quit command
if (input == "") { input = "quit()"; }
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) {
- #endif
-
mout->mothurOutEndLine();
mout->mothurOut("mothur > " + input);
mout->mothurOutEndLine();
- #ifdef USE_MPI
- }
- #endif
-
if (mout->control_pressed) { input = "quit()"; }
//allow user to omit the () on the quit command
void FilterSeqsCommand::help(){
try {
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) {
- #endif
-
+
m->mothurOut("The filter.seqs command reads a file containing sequences and creates a .filter and .filter.fasta file.\n");
m->mothurOut("The filter.seqs command parameters are fasta, trump, soft, hard and vertical. \n");
m->mothurOut("The fasta parameter is required. You may enter several fasta files to build the filter from and filter, by separating their names with -'s.\n");
m->mothurOut("Example filter.seqs(fasta=abrecovery.fasta, trump=..., soft=..., hard=..., vertical=T).\n");
m->mothurOut("Note: No spaces between parameter labels (i.e. fasta), '=' and parameters (i.e.yourFasta).\n\n");
- #ifdef USE_MPI
- }
- #endif
-
}
catch(exception& e) {
m->errorOut(e, "FilterSeqsCommand", "help");
if (m->control_pressed) { for(int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; }
- #ifdef USE_MPI
- int pid;
- MPI_Comm_rank(MPI_COMM_WORLD, &pid);
-
- if (pid == 0) {
- #endif
-
+
m->mothurOutEndLine();
m->mothurOut("Length of filtered alignment: " + toString(filteredLength)); m->mothurOutEndLine();
m->mothurOut("Number of columns removed: " + toString((alignmentLength-filteredLength))); m->mothurOutEndLine();
for(int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); }
m->mothurOutEndLine();
- #ifdef USE_MPI
- }
- #endif
-
return 0;
}
#ifdef USE_MPI
int pid, rc, ierr;
- char* buf;
int Atag = 1; int Ttag = 2; int Ctag = 3; int Gtag = 4; int Gaptag = 5;
+ int tag = 2001;
MPI_Status status;
MPI_File in;
rc = MPI_Comm_rank(MPI_COMM_WORLD, &pid);
- char* tempFileName = &(fastafileNames[s][0]);
+ char* tempFileName = new char(fastafileNames[s].length());
+ tempFileName = &(fastafileNames[s][0]);
+
MPI_File_open(MPI_COMM_WORLD, tempFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &in); //comm, filename, mode, info, filepointer
-
+
if (pid == 0) { //you are the root process
setLines(fastafileNames[s]);
for (int j = 0; j < lines.size(); j++) { //each process
if (j != 0) { //don't send to yourself
- MPI_Send(&lines[j]->start, 1, MPI_INT, j, 2001, MPI_COMM_WORLD); //start position in file
- MPI_Send(&lines[j]->numSeqs, 1, MPI_INT, j, 2001, MPI_COMM_WORLD); //how many sequences we are sending
- MPI_Send(&bufferSizes[j], 1, MPI_INT, j, 2001, MPI_COMM_WORLD); //how bytes for the read
+ MPI_Send(&lines[j]->start, 1, MPI_INT, j, tag, MPI_COMM_WORLD); //start position in file
+ MPI_Send(&lines[j]->numSeqs, 1, MPI_INT, j, tag, MPI_COMM_WORLD); //how many sequences we are sending
+ MPI_Send(&bufferSizes[j], 1, MPI_INT, j, tag, MPI_COMM_WORLD); //how bytes for the read
}
}
- cout << "done sending" << endl;
- cout << "parent = " << pid << " lines = " << lines[pid]->start << '\t' << lines[pid]->numSeqs << " size = " << lines.size() << endl;
-
- buf = new char(bufferSizes[0]);
- cout << pid << '\t' << bufferSizes[0] << " line 1 start pos = " << lines[1]->start << " buffer size 0 " << bufferSizes[0] << " buffer size 1 " << bufferSizes[1] << endl;
+ //cout << "done sending" << endl;
+ //cout << "parent = " << pid << " lines = " << lines[pid]->start << '\t' << lines[pid]->numSeqs << " size = " << lines.size() << endl;
+
+ cout << "parent = " << pid << " address of Filter " << &F << " address of FilterString " << &filterString << " address of numSeqs = " << &numSeqs << " address of soft = " << &soft << endl;
+
+ char* buf = new char(bufferSizes[0]);
+ //cout << pid << '\t' << bufferSizes[0] << " line 1 start pos = " << lines[1]->start << " buffer size 0 " << bufferSizes[0] << " buffer size 1 " << bufferSizes[1] << endl;
MPI_File_read_at(in, 0, buf, bufferSizes[0], MPI_CHAR, &status);
- cout << pid << " done reading " << endl;
+ cout << pid << " done reading " << &buf << endl;
string tempBuf = buf;
- cout << pid << '\t' << (tempBuf.substr(0, 10)) << endl;
+ delete buf;
+ //cout << pid << '\t' << (tempBuf.substr(0, 10)) << endl;
+
+ //parse buffer
+ istringstream iss (tempBuf,istringstream::in);
+ string name, seqstring;
+ vector<string> seqs;
+
+ while (iss) {
+
+ if (m->control_pressed) { return filterString; }
+ cout << "here" << endl;
+ Sequence seq(iss);
+ cout << "here1" << endl;
+ gobble(iss);
+ cout << seq.getName() << endl;
+ if (seq.getName() != "") {
+ seqs.push_back(seq.getAligned());
+ }
+
+ }
+
+ for(int i=0;i<seqs.size();i++){
+
+ if (m->control_pressed) { return filterString; }
+
+ Sequence seq("", seqs[i]);
+
+ if(trump != '*'){ F.doTrump(seq); }
+ if(isTrue(vertical) || soft != 0){ F.getFreqs(seq); }
+ cout.flush();
+
+ //report progress
+ if((i+1) % 100 == 0){ m->mothurOut(toString(i+1)); m->mothurOutEndLine(); }
+ }
+
+ //report progress
+ if((seqs.size()) % 100 != 0){ m->mothurOut(toString(seqs.size())); m->mothurOutEndLine(); }
+
//do your part
- MPICreateFilter(F, tempBuf);
+ //MPICreateFilter(F, seqs);
- vector<int> temp; temp.resize(numSeqs);
+ vector<int> temp; temp.resize(alignmentLength);
//get the frequencies from the child processes
for(int i = 0; i < ((processors-1)*5); i++) {
cout << "i = " << i << endl;
- int ierr = MPI_Recv(&temp, numSeqs, MPI_INT, MPI_ANY_SOURCE, 2001, MPI_COMM_WORLD, &status);
+ int ierr = MPI_Recv(&temp, alignmentLength, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status);
int receiveTag = temp[temp.size()-1]; //child process added a int to the end to indicate what letter count this is for
}else { //i am the child process
int startPos, numLines, bufferSize;
- cout << "child = " << pid << endl;
- ierr = MPI_Recv(&startPos, 1, MPI_INT, 0, 2001, MPI_COMM_WORLD, &status);
- ierr = MPI_Recv(&numLines, 1, MPI_INT, 0, 2001, MPI_COMM_WORLD, &status);
- ierr = MPI_Recv(&bufferSize, 1, MPI_INT, 0, 2001, MPI_COMM_WORLD, &status);
- cout << "child = " << pid << " done recv messages startpos = " << startPos << " numLines = " << numLines << " buffersize = " << bufferSize << endl;
+ cout << "child = " << pid << " address of Filter " << &F << " address of FilterString " << &filterString << " address of numSeqs = " << &numSeqs << " address of soft = " << &soft<< endl;
+ ierr = MPI_Recv(&startPos, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
+ ierr = MPI_Recv(&numLines, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
+ ierr = MPI_Recv(&bufferSize, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
+ //cout << "child = " << pid << " done recv messages startpos = " << startPos << " numLines = " << numLines << " buffersize = " << bufferSize << endl;
//send freqs
char* buf2 = new char(bufferSize);
MPI_File_read_at( in, startPos, buf2, bufferSize, MPI_CHAR, &status);
- cout << pid << " done reading " << endl;
+ cout << pid << " done reading " << &buf2 << endl;
string tempBuf = buf2;
- cout << pid << '\t' << (tempBuf.substr(0, 10)) << endl;
- MPICreateFilter(F, tempBuf);
+ delete buf2;
+ // cout << pid << '\t' << (tempBuf.substr(0, 10)) << endl;
+ istringstream iss (tempBuf,istringstream::in);
+
+ string name, seqstring;
+ vector<string> seqs;
+
+ while (iss) {
+
+ if (m->control_pressed) { return filterString; }
+ cout << "here" << endl;
+ Sequence seq(iss);
+ cout << "here1" << endl;
+ gobble(iss);
+ cout << seq.getName() << endl;
+
+ if (seq.getName() != "") {
+ seqs.push_back(seq.getAligned());
+ }
+ }
+
+ for(int i=0;i<seqs.size();i++){
+
+ if (m->control_pressed) { return filterString; }
+
+ Sequence seq("", seqs[i]);
+
+ if(trump != '*'){ F.doTrump(seq); }
+ if(isTrue(vertical) || soft != 0){ F.getFreqs(seq); }
+ cout.flush();
+
+ //report progress
+ if((i+1) % 100 == 0){ m->mothurOut(toString(i+1)); m->mothurOutEndLine(); }
+ }
+
+ //report progress
+ if((seqs.size()) % 100 != 0){ m->mothurOut(toString(seqs.size())); m->mothurOutEndLine(); }
+
+ //MPICreateFilter(F, seqs);
//send my fequency counts
F.a.push_back(Atag);
- int ierr = MPI_Send( &F.a[0], alignmentLength, MPI_INT, 0, 2001, MPI_COMM_WORLD);
+ int ierr = MPI_Send( &F.a[0], alignmentLength, MPI_INT, 0, tag, MPI_COMM_WORLD);
F.t.push_back(Ttag);
- ierr = MPI_Send( &F.t[0], alignmentLength, MPI_INT, 0, 2001, MPI_COMM_WORLD);
+ ierr = MPI_Send( &F.t[0], alignmentLength, MPI_INT, 0, tag, MPI_COMM_WORLD);
F.c.push_back(Ctag);
- ierr = MPI_Send( &F.c[0], alignmentLength, MPI_INT, 0, 2001, MPI_COMM_WORLD);
+ ierr = MPI_Send( &F.c[0], alignmentLength, MPI_INT, 0, tag, MPI_COMM_WORLD);
F.g.push_back(Gtag);
- ierr = MPI_Send( &F.g[0], alignmentLength, MPI_INT, 0, 2001, MPI_COMM_WORLD);
+ ierr = MPI_Send( &F.g[0], alignmentLength, MPI_INT, 0, tag, MPI_COMM_WORLD);
F.gap.push_back(Gaptag);
- ierr = MPI_Send( &F.gap[0], alignmentLength, MPI_INT, 0, 2001, MPI_COMM_WORLD);
+ ierr = MPI_Send( &F.gap[0], alignmentLength, MPI_INT, 0, tag, MPI_COMM_WORLD);
cout << "child " << pid << " done sending counts" << endl;
}
}
}
/**************************************************************************************/
-int FilterSeqsCommand::MPICreateFilter(Filters& F, string temp) {
+int FilterSeqsCommand::MPICreateFilter(Filters& F, vector<string>& seqStrings) {
try {
- vector<string> seqStrings;
- parseBuffer(temp, seqStrings);
-
for(int i=0;i<seqStrings.size();i++){
if (m->control_pressed) { return 1; }
istringstream iss (file,istringstream::in);
string name, seqstring;
-
+int pid;
+MPI_Comm_rank(MPI_COMM_WORLD, &pid);
+ Sequence* seq34 = new Sequence();
+cout << "address of new sequence " << pid << '\t' << seq34 << endl;
+cout << "address of seqStrings " << pid << '\t' << &seqs << endl;
+
while (iss) {
if (m->control_pressed) { return 0; }
cout << "here" << endl;
- Sequence seq(iss);
+ Sequence* seq = new Sequence(iss);
cout << "here1" << endl;
gobble(iss);
- cout << seq.getName() << endl;
- if (seq.getName() != "") {
- seqs.push_back(seq.getAligned());
+ cout << seq->getName() << endl;
+ if (seq->getName() != "") {
+ seqs.push_back(seq->getAligned());
}
+ delete seq;
}
return 0;