+/////// need to fix to work with calcs and sequencedb
+int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, float cutoff){
+ try {
+
+ ValidCalculators validCalculator;
+ Dist* distCalculator;
+ if (m->isTrue(countends) == true) {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap") { distCalculator = new eachGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapDist(); }
+ }
+ }
+ }else {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap"){ distCalculator = new eachGapIgnoreTermGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapIgnoreTermGapDist(); }
+ }
+ }
+ }
+
+
+ MPI_Status status;
+ int startTime = time(NULL);
+
+ string outputString = "";
+
+ for(int i=startLine;i<endLine;i++){
+
+ for(int j=0;j<i;j++){
+
+ if (m->control_pressed) { delete distCalculator; return 0; }
+
+ //if there was a column file given and we are appending, we don't want to calculate the distances that are already in the column file
+ //the alignDB contains the new sequences and then the old, so if i an oldsequence and j is an old sequence then break out of this loop
+ if ((i >= numNewFasta) && (j >= numNewFasta)) { break; }
+
+ distCalculator->calcDist(alignDB.get(i), alignDB.get(j));
+ double dist = distCalculator->getDist();
+
+ if(dist <= cutoff){
+ outputString += (alignDB.get(i).getName() + ' ' + alignDB.get(j).getName() + ' ' + toString(dist) + '\n');
+ }
+ }
+
+ if(i % 100 == 0){
+ m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << i << '\t' << (time(NULL) - startTime) << endl;
+ }
+
+
+ //send results to parent
+ int length = outputString.length();
+
+ char* buf = new char[length];
+ memcpy(buf, outputString.c_str(), length);
+
+ MPI_File_write_shared(outMPI, buf, length, MPI_CHAR, &status);
+ outputString = "";
+ delete buf;
+
+ }
+
+ m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl;
+ delete distCalculator;
+ return 1;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "DistanceCommand", "driverMPI");
+ exit(1);
+ }
+}
+/**************************************************************************************************/
+/////// need to fix to work with calcs and sequencedb
+int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long long& size){
+ try {
+ ValidCalculators validCalculator;
+ Dist* distCalculator;
+ if (m->isTrue(countends) == true) {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap") { distCalculator = new eachGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapDist(); }
+ }
+ }
+ }else {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap"){ distCalculator = new eachGapIgnoreTermGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapIgnoreTermGapDist(); }
+ }
+ }
+ }
+
+
+ MPI_Status status;
+
+ MPI_File outMPI;
+ int amode=MPI_MODE_CREATE|MPI_MODE_WRONLY;
+
+ //char* filename = new char[file.length()];
+ //memcpy(filename, file.c_str(), file.length());
+
+ char filename[1024];
+ strcpy(filename, file.c_str());
+
+ MPI_File_open(MPI_COMM_SELF, filename, amode, MPI_INFO_NULL, &outMPI);
+ //delete filename;
+
+ int startTime = time(NULL);
+
+ string outputString = "";
+ size = 0;
+
+ if(startLine == 0){ outputString += toString(alignDB.getNumSeqs()) + "\n"; }
+
+ for(int i=startLine;i<endLine;i++){
+
+ 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) { delete distCalculator; return 0; }
+
+ distCalculator->calcDist(alignDB.get(i), alignDB.get(j));
+ double dist = distCalculator->getDist();
+
+ outputString += toString(dist) + "\t";
+ }
+
+ outputString += "\n";
+
+
+ if(i % 100 == 0){
+ m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << i << '\t' << (time(NULL) - startTime) << endl;
+ }
+
+
+ //send results to parent
+ int length = outputString.length();
+ char* buf = new char[length];
+ memcpy(buf, outputString.c_str(), length);
+
+ MPI_File_write(outMPI, buf, length, MPI_CHAR, &status);
+ size += outputString.length();
+ outputString = "";
+ delete buf;
+ }
+
+ m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl;
+ MPI_File_close(&outMPI);
+ delete distCalculator;
+
+ return 1;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "DistanceCommand", "driverMPI");
+ exit(1);
+ }
+}
+/**************************************************************************************************/
+/////// need to fix to work with calcs and sequencedb
+int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long long& size, string square){
+ try {
+ ValidCalculators validCalculator;
+ Dist* distCalculator;
+ if (m->isTrue(countends) == true) {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap") { distCalculator = new eachGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapDist(); }
+ }
+ }
+ }else {
+ for (int i=0; i<Estimators.size(); i++) {
+ if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) {
+ if (Estimators[i] == "nogaps") { distCalculator = new ignoreGaps(); }
+ else if (Estimators[i] == "eachgap"){ distCalculator = new eachGapIgnoreTermGapDist(); }
+ else if (Estimators[i] == "onegap") { distCalculator = new oneGapIgnoreTermGapDist(); }
+ }
+ }
+ }
+
+ MPI_Status status;
+
+ MPI_File outMPI;
+ int amode=MPI_MODE_CREATE|MPI_MODE_WRONLY;
+
+ //char* filename = new char[file.length()];
+ //memcpy(filename, file.c_str(), file.length());
+
+ char filename[1024];
+ strcpy(filename, file.c_str());
+
+ MPI_File_open(MPI_COMM_SELF, filename, amode, MPI_INFO_NULL, &outMPI);
+ //delete filename;
+
+ int startTime = time(NULL);
+
+ string outputString = "";
+ size = 0;
+
+ if(startLine == 0){ outputString += toString(alignDB.getNumSeqs()) + "\n"; }
+
+ for(int i=startLine;i<endLine;i++){
+
+ 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<alignDB.getNumSeqs();j++){
+
+ if (m->control_pressed) { delete distCalculator; return 0; }
+
+ distCalculator->calcDist(alignDB.get(i), alignDB.get(j));
+ double dist = distCalculator->getDist();
+
+ outputString += toString(dist) + "\t";
+ }
+
+ outputString += "\n";
+
+
+ if(i % 100 == 0){
+ m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << i << '\t' << (time(NULL) - startTime) << endl;
+ }
+
+
+ //send results to parent
+ int length = outputString.length();
+ char* buf = new char[length];
+ memcpy(buf, outputString.c_str(), length);
+
+ MPI_File_write(outMPI, buf, length, MPI_CHAR, &status);
+ size += outputString.length();
+ outputString = "";
+ delete buf;
+ }
+
+ m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine();
+ cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl;
+ MPI_File_close(&outMPI);
+ delete distCalculator;
+ return 1;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "DistanceCommand", "driverMPI");
+ exit(1);
+ }
+}
+#endif
+/**************************************************************************************************
+int DistanceCommand::convertMatrix(string outputFile) {