X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=chimera.cpp;h=ae9ad9a46ef1ce5634c867219904857731bf3d6e;hb=9f4c08cab5a7a9a0e156bd4a5a3a478b476162dc;hp=83d40fe8342558eacb598525862364dba0f7e5ca;hpb=813f0516e9c7533859f57ebe6d7b8854896bf009;p=mothur.git diff --git a/chimera.cpp b/chimera.cpp index 83d40fe..ae9ad9a 100644 --- a/chimera.cpp +++ b/chimera.cpp @@ -31,6 +31,8 @@ string Chimera::createFilter(vector seqs, float t) { if (m->control_pressed) { return filterString; } string seqAligned = seqs[i]->getAligned(); + + if (seqAligned.length() != filterString.length()) { m->mothurOut(seqs[i]->getName() + " is not the same length as the template sequences. Aborting!\n"); exit(1); } for (int j = 0; j < seqAligned.length(); j++) { //if this spot is a gap @@ -101,30 +103,37 @@ vector Chimera::readSeqs(string file) { m->mothurOut("Reading sequences from " + file + "..."); cout.flush(); #ifdef USE_MPI - int pid; - vector positions; + int pid, processors; + vector positions; int numSeqs; + int tag = 2001; MPI_Status status; MPI_File inMPI; MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are + MPI_Comm_size(MPI_COMM_WORLD, &processors); - char* inFileName = new char[file.length()]; - memcpy(inFileName, file.c_str(), file.length()); + //char* inFileName = new char[file.length()]; + //memcpy(inFileName, file.c_str(), file.length()); + + char inFileName[1024]; + strcpy(inFileName, file.c_str()); MPI_File_open(MPI_COMM_WORLD, inFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI); //comm, filename, mode, info, filepointer - delete inFileName; + //delete inFileName; if (pid == 0) { - positions = setFilePosFasta(file, numSeqs); //fills MPIPos, returns numSeqs + positions = m->setFilePosFasta(file, numSeqs); //fills MPIPos, returns numSeqs //send file positions to all processes - MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //send numSeqs - MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //send file pos + for(int i = 1; i < processors; i++) { + MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD); + MPI_Send(&positions[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD); + } }else{ - MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //get numSeqs + MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); positions.resize(numSeqs+1); - MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //get file positions + MPI_Recv(&positions[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status); } //read file @@ -154,17 +163,18 @@ vector Chimera::readSeqs(string file) { } MPI_File_close(&inMPI); + MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case #else ifstream in; - openInputFile(file, in); + m->openInputFile(file, in); //read in seqs and store in vector while(!in.eof()){ if (m->control_pressed) { return container; } - Sequence* current = new Sequence(in); gobble(in); + Sequence* current = new Sequence(in); m->gobble(in); if (count == 0) { length = current->getAligned().length(); count++; } //gets first seqs length else if (length != current->getAligned().length()) { unaligned = true; } @@ -199,13 +209,16 @@ void Chimera::setMask(string filename) { MPI_Offset size; MPI_Status status; - char* inFileName = new char[filename.length()]; - memcpy(inFileName, filename.c_str(), filename.length()); + //char* inFileName = new char[filename.length()]; + //memcpy(inFileName, filename.c_str(), filename.length()); + + char inFileName[1024]; + strcpy(inFileName, filename.c_str()); MPI_File_open(MPI_COMM_WORLD, inFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI); //comm, filename, mode, info, filepointer MPI_File_get_size(inMPI, &size); - delete inFileName; + //delete inFileName; char* buffer = new char[size]; MPI_File_read(inMPI, buffer, size, MPI_CHAR, &status); @@ -228,7 +241,7 @@ void Chimera::setMask(string filename) { #else ifstream infile; - openInputFile(filename, infile); + m->openInputFile(filename, infile); if (!infile.eof()) { Sequence temp(infile);