From 4f4070ac3fbb5da75f834b48062e9123364b006e Mon Sep 17 00:00:00 2001 From: westcott Date: Fri, 5 Jun 2009 13:05:11 +0000 Subject: [PATCH] line and label no longer persist between commands. Added phylip formated output to dist.seqs command. --- distancecommand.cpp | 152 +++++++++++++++++++++++++++------------ distancecommand.h | 4 +- globaldata.cpp | 2 + summarysharedcommand.cpp | 5 ++ 4 files changed, 117 insertions(+), 46 deletions(-) diff --git a/distancecommand.cpp b/distancecommand.cpp index 6eb7d57..e2ca937 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -80,30 +80,43 @@ int DistanceCommand::execute(){ cutoff += 0.005; string distFile = getRootName(globaldata->getFastaFile()) + "dist"; + string phylipFile = getRootName(globaldata->getFastaFile()) + "phylip.dist"; + remove(phylipFile.c_str()); remove(distFile.c_str()); + //output numSeqs to phylip formatted dist file + openOutputFile(phylipFile, phylipOut); + phylipOut << numSeqs << endl; + phylipOut.close(); + //# if defined (_WIN32) //figure out how to implement the fork and wait commands in windows - // driver(distCalculator, seqDB, 0, numSeqs, distFile, cutoff); + // driver(distCalculator, seqDB, 0, numSeqs, distFile, phylipFile, cutoff); //# endif #if defined (__APPLE__) || (__MACH__) if(processors == 1){ - driver(distCalculator, seqDB, 0, numSeqs, distFile, cutoff); + driver(distCalculator, seqDB, 0, numSeqs, distFile, phylipFile + "tempPhylipA", cutoff); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((phylipFile + "tempPhylipA").c_str()); } else if(processors == 2){ int pid = fork(); if(pid > 0){ - driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", cutoff); + driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", phylipFile + "tempPhylipA", cutoff); appendFiles((distFile+"tempa"), distFile); - remove((distFile + "tempa").c_str()); + remove((distFile + "tempa").c_str()); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((phylipFile + "tempPhylipA").c_str()); } else{ - driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", cutoff); + driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", phylipFile + "tempPhylipB", cutoff); appendFiles((distFile+"tempb"), distFile); - remove((distFile + "tempb").c_str()); + remove((distFile + "tempb").c_str()); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((phylipFile + "tempPhylipB").c_str()); } wait(NULL); @@ -113,21 +126,27 @@ int DistanceCommand::execute(){ if(pid1 > 0){ int pid2 = fork(); if(pid2 > 0){ - driver(distCalculator, seqDB, 0, sqrt(3) * numSeqs / 3, distFile + "tempa", cutoff); + driver(distCalculator, seqDB, 0, sqrt(3) * numSeqs / 3, distFile + "tempa", phylipFile + "tempPhylipA", cutoff); appendFiles(distFile+"tempa", distFile); - remove((distFile + "tempa").c_str()); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((distFile + "tempa").c_str()); + remove((phylipFile + "tempPhylipA").c_str()); } else{ - driver(distCalculator, seqDB, sqrt(3) * numSeqs / 3, sqrt(6) * numSeqs / 3, distFile + "tempb", cutoff); + driver(distCalculator, seqDB, sqrt(3) * numSeqs / 3, sqrt(6) * numSeqs / 3, distFile + "tempb", phylipFile + "tempPhylipB", cutoff); appendFiles(distFile+"tempb", distFile); - remove((distFile + "tempb").c_str()); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((distFile + "tempb").c_str()); + remove((phylipFile + "tempPhylipB").c_str()); } wait(NULL); } else{ - driver(distCalculator, seqDB, sqrt(6) * numSeqs / 3, numSeqs, distFile + "tempc", cutoff); + driver(distCalculator, seqDB, sqrt(6) * numSeqs / 3, numSeqs, distFile + "tempc", phylipFile + "tempPhylipC", cutoff); appendFiles(distFile+"tempc", distFile); - remove((distFile + "tempc").c_str()); + appendFiles((phylipFile + "tempPhylipC"), phylipFile); + remove((distFile + "tempc").c_str()); + remove((phylipFile + "tempPhylipC").c_str()); } wait(NULL); } @@ -136,28 +155,37 @@ int DistanceCommand::execute(){ if(pid1 > 0){ int pid2 = fork(); if(pid2 > 0){ - driver(distCalculator, seqDB, 0, numSeqs / 2, distFile + "tempa", cutoff); + driver(distCalculator, seqDB, 0, numSeqs / 2, distFile + "tempa", phylipFile + "tempPhylipA", cutoff); appendFiles(distFile+"tempa", distFile); - remove((distFile + "tempa").c_str()); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((distFile + "tempa").c_str()); + remove((phylipFile + "tempPhylipA").c_str()); } else{ - driver(distCalculator, seqDB, numSeqs / 2, (numSeqs/sqrt(2)), distFile + "tempb", cutoff); + driver(distCalculator, seqDB, numSeqs / 2, (numSeqs/sqrt(2)), distFile + "tempb", phylipFile + "tempPhylipB", cutoff); appendFiles(distFile+"tempb", distFile); - remove((distFile + "tempb").c_str()); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((distFile + "tempb").c_str()); + remove((phylipFile + "tempPhylipB").c_str()); } wait(NULL); } else{ int pid3 = fork(); if(pid3 > 0){ - driver(distCalculator, seqDB, (numSeqs/sqrt(2)), (sqrt(3) * numSeqs / 2), distFile + "tempc", cutoff); + driver(distCalculator, seqDB, (numSeqs/sqrt(2)), (sqrt(3) * numSeqs / 2), distFile + "tempc", phylipFile + "tempPhylipC", cutoff); appendFiles(distFile+"tempc", distFile); - remove((distFile + "tempc").c_str()); + appendFiles((phylipFile + "tempPhylipC"), phylipFile); + remove((distFile + "tempc").c_str()); + remove((phylipFile + "tempPhylipC").c_str()); + } else{ - driver(distCalculator, seqDB, (sqrt(3) * numSeqs / 2), numSeqs, distFile + "tempd", cutoff); + driver(distCalculator, seqDB, (sqrt(3) * numSeqs / 2), numSeqs, distFile + "tempd", phylipFile + "tempPhylipD", cutoff); appendFiles(distFile+"tempd", distFile); - remove((distFile + "tempd").c_str()); + appendFiles((phylipFile + "tempPhylipD"), phylipFile); + remove((distFile + "tempd").c_str()); + remove((phylipFile + "tempPhylipD").c_str()); } wait(NULL); } @@ -166,20 +194,27 @@ int DistanceCommand::execute(){ wait(NULL); #elif (linux) || (__linux) if(processors == 1){ - driver(distCalculator, seqDB, 0, numSeqs, distFile, cutoff); + driver(distCalculator, seqDB, 0, numSeqs, distFile, phylipFile + "tempPhylipA", cutoff); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((phylipFile + "tempPhylipA").c_str()); } else if(processors == 2){ int pid = fork(); if(pid > 0){ - driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", cutoff); + driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", phylipFile + "tempPhylipA", cutoff); appendFiles((distFile+"tempa"), distFile); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); remove((distFile + "tempa").c_str()); + remove((phylipFile + "tempPhylipA").c_str()); + } else{ - driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", cutoff); + driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", phylipFile + "tempPhylipB", cutoff); appendFiles((distFile+"tempb"), distFile); - remove((distFile + "tempb").c_str()); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((distFile + "tempb").c_str()); + remove((phylipFile + "tempPhylipB").c_str()); } wait(); @@ -189,21 +224,28 @@ int DistanceCommand::execute(){ if(pid1 > 0){ int pid2 = fork(); if(pid2 > 0){ - driver(distCalculator, seqDB, 0, sqrt(3) * numSeqs / 3, distFile + "tempa", cutoff); - appendFiles(distFile+"tempa", distFile); + driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", phylipFile + "tempPhylipA", cutoff); + appendFiles((distFile+"tempa"), distFile); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); remove((distFile + "tempa").c_str()); + remove((phylipFile + "tempPhylipA").c_str()); + } else{ - driver(distCalculator, seqDB, sqrt(3) * numSeqs / 3, sqrt(6) * numSeqs / 3, distFile + "tempb", cutoff); - appendFiles(distFile+"tempb", distFile); - remove((distFile + "tempb").c_str()); + driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", phylipFile + "tempPhylipB", cutoff); + appendFiles((distFile+"tempb"), distFile); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((distFile + "tempb").c_str()); + remove((phylipFile + "tempPhylipB").c_str()); } wait(); } else{ - driver(distCalculator, seqDB, sqrt(6) * numSeqs / 3, numSeqs, distFile + "tempc", cutoff); + driver(distCalculator, seqDB, sqrt(6) * numSeqs / 3, numSeqs, distFile + "tempc", phylipFile + "tempPhylipC", cutoff); appendFiles(distFile+"tempc", distFile); - remove((distFile + "tempc").c_str()); + appendFiles((phylipFile + "tempPhylipC"), phylipFile); + remove((distFile + "tempc").c_str()); + remove((phylipFile + "tempPhylipC").c_str()); } wait(); } @@ -212,28 +254,36 @@ int DistanceCommand::execute(){ if(pid1 > 0){ int pid2 = fork(); if(pid2 > 0){ - driver(distCalculator, seqDB, 0, numSeqs / 2, distFile + "tempa", cutoff); - appendFiles(distFile+"tempa", distFile); - remove((distFile + "tempa").c_str()); + driver(distCalculator, seqDB, 0, (numSeqs/sqrt(2)), distFile + "tempa", phylipFile + "tempPhylipA", cutoff); + appendFiles((distFile+"tempa"), distFile); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((distFile + "tempa").c_str()); + remove((phylipFile + "tempPhylipA").c_str()); } else{ - driver(distCalculator, seqDB, numSeqs / 2, (numSeqs/sqrt(2)), distFile + "tempb", cutoff); - appendFiles(distFile+"tempb", distFile); - remove((distFile + "tempb").c_str()); + driver(distCalculator, seqDB, (numSeqs/sqrt(2)), numSeqs, distFile + "tempb", phylipFile + "tempPhylipB", cutoff); + appendFiles((distFile+"tempb"), distFile); + appendFiles((phylipFile + "tempPhylipB"), phylipFile); + remove((distFile + "tempb").c_str()); + remove((phylipFile + "tempPhylipB").c_str()); } wait(); } else{ int pid3 = fork(); if(pid3 > 0){ - driver(distCalculator, seqDB, (numSeqs/sqrt(2)), (sqrt(3) * numSeqs / 2), distFile + "tempc", cutoff); + driver(distCalculator, seqDB, sqrt(6) * numSeqs / 3, numSeqs, distFile + "tempc", phylipFile + "tempPhylipC", cutoff); appendFiles(distFile+"tempc", distFile); - remove((distFile + "tempc").c_str()); + appendFiles((phylipFile + "tempPhylipC"), phylipFile); + remove((distFile + "tempc").c_str()); + remove((phylipFile + "tempPhylipC").c_str()); } else{ - driver(distCalculator, seqDB, (sqrt(3) * numSeqs / 2), numSeqs, distFile + "tempd", cutoff); + driver(distCalculator, seqDB, (sqrt(3) * numSeqs / 2), numSeqs, distFile + "tempd", phylipFile + "tempPhylipD", cutoff); appendFiles(distFile+"tempd", distFile); - remove((distFile + "tempd").c_str()); + appendFiles((phylipFile + "tempPhylipD"), phylipFile); + remove((distFile + "tempd").c_str()); + remove((phylipFile + "tempPhylipD").c_str()); } wait(); } @@ -242,7 +292,9 @@ int DistanceCommand::execute(){ wait(); #else - driver(distCalculator, seqDB, 0, numSeqs, distFile, cutoff); + driver(distCalculator, seqDB, 0, numSeqs, distFile, phylipFile + "tempPhylipA", cutoff); + appendFiles((phylipFile + "tempPhylipA"), phylipFile); + remove((phylipFile + "tempPhylipA").c_str()); #endif delete distCalculator; @@ -262,14 +314,20 @@ int DistanceCommand::execute(){ /**************************************************************************************************/ /////// need to fix to work with calcs and sequencedb -int DistanceCommand::driver(Dist* distCalculator, SequenceDB* align, int startLine, int endLine, string dFileName, float cutoff){ +int DistanceCommand::driver(Dist* distCalculator, SequenceDB* align, int startLine, int endLine, string dFileName, string pFilename, float cutoff){ try { int startTime = time(NULL); + //column file ofstream distFile(dFileName.c_str(), ios::trunc); distFile.setf(ios::fixed, ios::showpoint); distFile << setprecision(4); + //column file + ofstream philFile(pFilename.c_str(), ios::trunc); + philFile.setf(ios::fixed, ios::showpoint); + philFile << setprecision(4); + for(int i=startLine;iget(i)->getName() << ' ' << align->get(j)->getName() << ' ' << dist << endl; } - + philFile << dist << '\t'; } + + philFile << endl; + if(i % 100 == 0){ cout << i << '\t' << time(NULL) - startTime << endl; } @@ -288,6 +349,9 @@ int DistanceCommand::driver(Dist* distCalculator, SequenceDB* align, int startLi } cout << endLine-1 << '\t' << time(NULL) - startTime << endl; + //philFile.close(); + //distFile.close(); + return 1; } catch(exception& e) { diff --git a/distancecommand.h b/distancecommand.h index c99e5c2..1f43856 100644 --- a/distancecommand.h +++ b/distancecommand.h @@ -29,7 +29,7 @@ private: ValidCalculators* validCalculator; Dist* distCalculator; SequenceDB* seqDB; - ofstream out; + ofstream out, phylipOut; ifstream in; string outputFileName; string countends; @@ -37,7 +37,7 @@ private: float cutoff; void appendFiles(string, string); - int driver(Dist*, SequenceDB*, int, int, string, float); + int driver(Dist*, SequenceDB*, int, int, string, string, float); }; diff --git a/globaldata.cpp b/globaldata.cpp index b446d67..6138e2c 100644 --- a/globaldata.cpp +++ b/globaldata.cpp @@ -424,6 +424,8 @@ void GlobalData::clear() { /******************************************************/ void GlobalData::reset() { + label = ""; + line = ""; cutoff = "10.00"; precision = "100"; iters = "1000"; diff --git a/summarysharedcommand.cpp b/summarysharedcommand.cpp index 0a742ea..6a09ada 100644 --- a/summarysharedcommand.cpp +++ b/summarysharedcommand.cpp @@ -164,6 +164,11 @@ int SummarySharedCommand::execute(){ outputFileHandle.close(); remove(outputFileName.c_str()); if (mult == true) { outAll.close(); remove(outAllFileName.c_str()); } return 0; + //if you only have 2 groups you don't need a .sharedmultiple file + }else if ((lookup.size() == 2) && (mult == true)) { + mult = false; + outAll.close(); + remove(outAllFileName.c_str()); } //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label. -- 2.39.2