]> git.donarmstrong.com Git - mothur.git/blobdiff - unweighted.cpp
moved mothur's source into a folder to make grabbing just the source easier on github
[mothur.git] / unweighted.cpp
diff --git a/unweighted.cpp b/unweighted.cpp
deleted file mode 100644 (file)
index 864a9f8..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- *  unweighted.cpp
- *  Mothur
- *
- *  Created by Sarah Westcott on 2/9/09.
- *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
- *
- */
-
-#include "unweighted.h"
-
-/**************************************************************************************************/
-
-EstOutput Unweighted::getValues(Tree* t, int p, string o) {
-       try {
-               processors = p;
-               outputDir = o;
-        
-        TreeMap* tmap = t->getTreeMap();
-        
-               //if the users enters no groups then give them the score of all groups
-               int numGroups = m->getNumGroups();
-               
-               //calculate number of comparsions
-               int numComp = 0;
-               vector< vector<string> > namesOfGroupCombos;
-               for (int r=0; r<numGroups; r++) { 
-                       for (int l = 0; l < r; l++) {
-                               numComp++;
-                               vector<string> groups; groups.push_back((m->getGroups())[r]); groups.push_back((m->getGroups())[l]);
-                               namesOfGroupCombos.push_back(groups);
-                       }
-               }
-               
-               if (numComp != 1) {
-                       vector<string> groups;
-                       if (numGroups == 0) {
-                               //get score for all users groups
-                               for (int i = 0; i < (tmap->getNamesOfGroups()).size(); i++) {
-                                       if ((tmap->getNamesOfGroups())[i] != "xxx") {
-                                               groups.push_back((tmap->getNamesOfGroups())[i]);
-                                       }
-                               }
-                               namesOfGroupCombos.push_back(groups);
-                       }else {
-                               for (int i = 0; i < m->getNumGroups(); i++) {
-                                       groups.push_back((m->getGroups())[i]);
-                               }
-                               namesOfGroupCombos.push_back(groups);
-                       }
-               }
-
-               #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
-                       if(processors == 1){
-                               data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), tmap);
-                       }else{
-                               int numPairs = namesOfGroupCombos.size();
-                               
-                               int numPairsPerProcessor = numPairs / processors;
-                               
-                               for (int i = 0; i < processors; i++) {
-                                       int startPos = i * numPairsPerProcessor;
-                       
-                                       if(i == processors - 1){
-                                               numPairsPerProcessor = numPairs - i * numPairsPerProcessor;
-                                       }
-               
-                                       lines.push_back(linePair(startPos, numPairsPerProcessor));
-                               }
-                               data = createProcesses(t, namesOfGroupCombos, tmap);
-                               lines.clear();
-                       }
-               #else
-                       data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), tmap);
-               #endif
-               
-               return data;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "getValues");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-
-EstOutput Unweighted::createProcesses(Tree* t, vector< vector<string> > namesOfGroupCombos, TreeMap* tmap) {
-       try {
-#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
-               int process = 1;
-               vector<int> processIDS;
-               
-               EstOutput results;
-               
-               //loop through and create all the processes you want
-               while (process != processors) {
-                       int pid = fork();
-                       
-                       if (pid > 0) {
-                               processIDS.push_back(pid);  //create map from line number to pid so you can append files in correct order later
-                               process++;
-                       }else if (pid == 0){
-                               EstOutput myresults;
-                               myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num, tmap);
-                               
-                               if (m->control_pressed) { exit(0); }
-                               
-                               m->mothurOut("Merging results."); m->mothurOutEndLine();
-                               
-                               //pass numSeqs to parent
-                               ofstream out;
-                               string tempFile = outputDir + toString(getpid()) + ".unweighted.results.temp";
-                               m->openOutputFile(tempFile, out);
-                               out << myresults.size() << endl;
-                               for (int i = 0; i < myresults.size(); i++) {  out << myresults[i] << '\t';  } out << endl;
-                               out.close();
-                               
-                               exit(0);
-                       }else { 
-                               m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine(); 
-                               for (int i = 0; i < processIDS.size(); i++) { kill (processIDS[i], SIGINT); }
-                               exit(0); 
-                       }
-               }
-               
-               results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, tmap);
-               
-               //force parent to wait until all the processes are done
-               for (int i=0;i<(processors-1);i++) { 
-                       int temp = processIDS[i];
-                       wait(&temp);
-               }
-               
-               if (m->control_pressed) { return results; }
-               
-               //get data created by processes
-               for (int i=0;i<(processors-1);i++) { 
-                       ifstream in;
-                       string s = outputDir + toString(processIDS[i]) + ".unweighted.results.temp";
-                       m->openInputFile(s, in);
-                       
-                       //get quantiles
-                       if (!in.eof()) {
-                               int num;
-                               in >> num; m->gobble(in);
-                               
-                               if (m->control_pressed) { break; }
-                               
-                               double w; 
-                               for (int j = 0; j < num; j++) {
-                                       in >> w;
-                                       results.push_back(w);
-                               }
-                               m->gobble(in);
-                       }
-                       in.close();
-                       m->mothurRemove(s);
-               }
-               
-               m->mothurOut("DONE."); m->mothurOutEndLine(); m->mothurOutEndLine();
-               
-               return results;
-#endif         
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "createProcesses");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-EstOutput Unweighted::driver(Tree* t, vector< vector<string> > namesOfGroupCombos, int start, int num, TreeMap* tmap) { 
- try {
-       
-        
-               EstOutput results; results.resize(num);
-               
-               int count = 0;
-               int total = num;
-               int twentyPercent = (total * 0.20);
-               if (twentyPercent == 0) { twentyPercent = 1; }
-        
-                       
-               for (int h = start; h < (start+num); h++) {
-                               
-                       if (m->control_pressed) { return results; }
-               
-                       double UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
-                       double totalBL = 0.00;  //all branch lengths
-                       double UW = 0.00;               //Unweighted Value = UniqueBL / totalBL;
-                                               
-                       //find a node that belongs to one of the groups in this combo
-                       int nodeBelonging = -1;
-                       for (int g = 0; g < namesOfGroupCombos[h].size(); g++) {
-                               if (t->groupNodeInfo[namesOfGroupCombos[h][g]].size() != 0) { nodeBelonging = t->groupNodeInfo[namesOfGroupCombos[h][g]][0]; break; }
-                       }
-                       
-                       //sanity check
-                       if (nodeBelonging == -1) {
-                               m->mothurOut("[WARNING]: cannot find a nodes in the tree from grouping "); 
-                               for (int g = 0; g < namesOfGroupCombos[h].size()-1; g++) { m->mothurOut(namesOfGroupCombos[h][g] + "-"); }
-                               m->mothurOut(namesOfGroupCombos[h][namesOfGroupCombos[h].size()-1]);
-                               m->mothurOut(", skipping."); m->mothurOutEndLine(); results[count] = UW;
-                       }else{
-                               //cout << "trying to get root" << endl; 
-                               //if including the root this clears rootForGrouping[namesOfGroupCombos[h]]
-                               getRoot(t, nodeBelonging, namesOfGroupCombos[h]);
-                               //cout << "here" << endl;       
-                               for(int i=0;i<t->getNumNodes();i++){
-                                       
-                                       if (m->control_pressed) {  return data; }
-                                       //cout << i << endl;    
-                                       //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
-                                       //pcountSize = 2, not unique to one group
-                                       //pcountSize = 1, unique to one group
-                                       
-                                       int pcountSize = 0;
-                                       for (int j = 0; j < namesOfGroupCombos[h].size(); j++) {
-                                               map<string, int>::iterator itGroup = t->tree[i].pcount.find(namesOfGroupCombos[h][j]);
-                                               if (itGroup != t->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
-                                       }
-                                       
-                                       
-                                       //unique calc
-                                       if (pcountSize == 0) { }
-                                       else if ((t->tree[i].getBranchLength() != -1) && (pcountSize == 1) && (rootForGrouping[namesOfGroupCombos[h]].count(i) == 0)) { //you have a unique branch length and you are not the root 
-                                               UniqueBL += abs(t->tree[i].getBranchLength()); 
-                                       }
-                                               
-                                       //total calc
-                                       if (pcountSize == 0) { }
-                                       else if ((t->tree[i].getBranchLength() != -1) && (pcountSize != 0) && (rootForGrouping[namesOfGroupCombos[h]].count(i) == 0)) { //you have a branch length and you are not the root 
-                                               totalBL += abs(t->tree[i].getBranchLength()); 
-                                       }
-                               }
-       //cout << UniqueBL << '\t' << totalBL << endl;          
-                               UW = (UniqueBL / totalBL);  
-       
-                               if (isnan(UW) || isinf(UW)) { UW = 0; }
-       
-                               results[count] = UW;
-                       }
-                       count++;
-
-                       //report progress
-                       //if((count % twentyPercent) == 0) {    float tempOut = (count / (float)total); if (isnan(tempOut) || isinf(tempOut)) { tempOut = 0.0; } m->mothurOut("Percentage complete: " + toString((int(tempOut) * 100.0))); m->mothurOutEndLine();       }
-               }
-               
-               //report progress
-               //if((count % twentyPercent) != 0) {    float tempOut = (count / (float)total); if (isnan(tempOut) || isinf(tempOut)) { tempOut = 0.0; } m->mothurOut("Percentage complete: " + toString((int(tempOut) * 100.0))); m->mothurOutEndLine();       }
-               
-               return results; 
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "driver");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-
-EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB, int p, string o) { 
- try {
-               processors = p;
-               outputDir = o;
-               
-        TreeMap* tmap = t->getTreeMap();
-     
-               //if the users enters no groups then give them the score of all groups
-               int numGroups = m->getNumGroups();
-               
-               //calculate number of comparsions
-               int numComp = 0;
-               vector< vector<string> > namesOfGroupCombos;
-               for (int r=0; r<numGroups; r++) { 
-                       for (int l = 0; l < r; l++) {
-                               numComp++;
-                               vector<string> groups; groups.push_back((m->getGroups())[r]); groups.push_back((m->getGroups())[l]);
-                               namesOfGroupCombos.push_back(groups);
-                       }
-               }
-               
-               if (numComp != 1) {
-                       vector<string> groups;
-                       if (numGroups == 0) {
-                               //get score for all users groups
-                               for (int i = 0; i < (tmap->getNamesOfGroups()).size(); i++) {
-                                       if ((tmap->getNamesOfGroups())[i] != "xxx") {
-                                               groups.push_back((tmap->getNamesOfGroups())[i]);
-                                       }
-                               }
-                               namesOfGroupCombos.push_back(groups);
-                       }else {
-                               for (int i = 0; i < m->getNumGroups(); i++) {
-                                       groups.push_back((m->getGroups())[i]);
-                               }
-                               namesOfGroupCombos.push_back(groups);
-                       }
-               }
-
-               #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
-                       if(processors == 1){
-                               data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), true, tmap);
-                       }else{
-                               int numPairs = namesOfGroupCombos.size();
-                               
-                               int numPairsPerProcessor = numPairs / processors;
-                               
-                               for (int i = 0; i < processors; i++) {
-                                       int startPos = i * numPairsPerProcessor;
-                                       if(i == processors - 1){
-                                               numPairsPerProcessor = numPairs - i * numPairsPerProcessor;
-                                       }
-                                       lines.push_back(linePair(startPos, numPairsPerProcessor));
-                               }
-                                       
-                               data = createProcesses(t, namesOfGroupCombos, true, tmap);
-                               
-                               lines.clear();
-                       }
-               #else
-                       data = driver(t, namesOfGroupCombos, 0, namesOfGroupCombos.size(), true, tmap);
-               #endif
-       
-               return data;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "getValues");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-
-EstOutput Unweighted::createProcesses(Tree* t, vector< vector<string> > namesOfGroupCombos, bool usingGroups, TreeMap* tmap) {
-       try {
-#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
-               int process = 1;
-               vector<int> processIDS;
-               
-               EstOutput results;
-               
-               //loop through and create all the processes you want
-               while (process != processors) {
-                       int pid = fork();
-                       
-                       if (pid > 0) {
-                               processIDS.push_back(pid);  //create map from line number to pid so you can append files in correct order later
-                               process++;
-                       }else if (pid == 0){
-                               EstOutput myresults;
-                               myresults = driver(t, namesOfGroupCombos, lines[process].start, lines[process].num, usingGroups, tmap);
-                               
-                               if (m->control_pressed) { exit(0); }
-                               
-                               //pass numSeqs to parent
-                               ofstream out;
-                               string tempFile = outputDir + toString(getpid()) + ".unweighted.results.temp";
-                               m->openOutputFile(tempFile, out);
-                               out << myresults.size() << endl;
-                               for (int i = 0; i < myresults.size(); i++) {  out << myresults[i] << '\t';  } out << endl;
-                               out.close();
-                               
-                               exit(0);
-                       }else { 
-                               m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine(); 
-                               for (int i = 0; i < processIDS.size(); i++) { kill (processIDS[i], SIGINT); }
-                               exit(0); 
-                       }
-               }
-               
-               results = driver(t, namesOfGroupCombos, lines[0].start, lines[0].num, usingGroups, tmap);
-               
-               //force parent to wait until all the processes are done
-               for (int i=0;i<(processors-1);i++) { 
-                       int temp = processIDS[i];
-                       wait(&temp);
-               }
-               
-               if (m->control_pressed) { return results; }
-               
-               //get data created by processes
-               for (int i=0;i<(processors-1);i++) { 
-                       ifstream in;
-                       string s = outputDir + toString(processIDS[i]) + ".unweighted.results.temp";
-                       m->openInputFile(s, in);
-                       
-                       //get quantiles
-                       if (!in.eof()) {
-                               int num;
-                               in >> num; m->gobble(in);
-                                       
-                               if (m->control_pressed) { break; }
-                               
-                               double w; 
-                               for (int j = 0; j < num; j++) {
-                                       in >> w;
-                                       
-                                       results.push_back(w);
-                               }
-                               m->gobble(in);
-                       }
-                       in.close();
-                       m->mothurRemove(s);
-               }
-               
-               return results;
-#endif         
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "createProcesses");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-EstOutput Unweighted::driver(Tree* t, vector< vector<string> > namesOfGroupCombos, int start, int num, bool usingGroups, TreeMap* tmap) { 
- try {
-               
-               EstOutput results; results.resize(num);
-               
-               int count = 0;
-               
-               Tree* copyTree = new Tree(tmap);
-               
-               for (int h = start; h < (start+num); h++) {
-               
-                       if (m->control_pressed) { return results; }
-               
-                       //copy random tree passed in
-                       copyTree->getCopy(t);
-                               
-                       //swap labels in the groups you want to compare
-                       copyTree->assembleRandomUnifracTree(namesOfGroupCombos[h]);
-                       
-                       double UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
-                       double totalBL = 0.00;  //all branch lengths
-                       double UW = 0.00;               //Unweighted Value = UniqueBL / totalBL;
-                       //find a node that belongs to one of the groups in this combo
-                       int nodeBelonging = -1;
-                       for (int g = 0; g < namesOfGroupCombos[h].size(); g++) {
-                               if (copyTree->groupNodeInfo[namesOfGroupCombos[h][g]].size() != 0) { nodeBelonging = copyTree->groupNodeInfo[namesOfGroupCombos[h][g]][0]; break; }
-                       }
-                       
-                       //sanity check
-                       if (nodeBelonging == -1) {
-                               m->mothurOut("[WARNING]: cannot find a nodes in the tree from grouping "); 
-                               for (int g = 0; g < namesOfGroupCombos[h].size()-1; g++) { m->mothurOut(namesOfGroupCombos[h][g] + "-"); }
-                               m->mothurOut(namesOfGroupCombos[h][namesOfGroupCombos[h].size()-1]);
-                               m->mothurOut(", skipping."); m->mothurOutEndLine(); results[count] = UW;
-                       }else{
-                               
-                               //if including the root this clears rootForGrouping[namesOfGroupCombos[h]]
-                               getRoot(copyTree, nodeBelonging, namesOfGroupCombos[h]);
-                               
-                               for(int i=0;i<copyTree->getNumNodes();i++){
-                                       
-                                       if (m->control_pressed) {  return data; }
-                                       
-                                       //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
-                                       //pcountSize = 2, not unique to one group
-                                       //pcountSize = 1, unique to one group
-                                       
-                                       int pcountSize = 0;
-                                       for (int j = 0; j < namesOfGroupCombos[h].size(); j++) {
-                                               map<string, int>::iterator itGroup = copyTree->tree[i].pcount.find(namesOfGroupCombos[h][j]);
-                                               if (itGroup != copyTree->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
-                                       }
-                                       
-                                       //unique calc
-                                       if (pcountSize == 0) { }
-                                       else if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize == 1) && (rootForGrouping[namesOfGroupCombos[h]].count(i) == 0)) { //you have a unique branch length and you are not the root 
-                                               UniqueBL += abs(copyTree->tree[i].getBranchLength()); 
-                                       }
-                                       
-                                       //total calc
-                                       if (pcountSize == 0) { }
-                                       else if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize != 0) && (rootForGrouping[namesOfGroupCombos[h]].count(i) == 0)) { //you have a branch length and you are not the root 
-                                               totalBL += abs(copyTree->tree[i].getBranchLength()); 
-                                       }
-                                       
-                               }
-                               //cout << UniqueBL << '\t' << totalBL << endl;          
-                               UW = (UniqueBL / totalBL);  
-                               
-                               if (isnan(UW) || isinf(UW)) { UW = 0; }
-                               
-                               results[count] = UW;
-                       }
-                       count++;
-                       
-               }
-               
-               delete copyTree;
-               
-               return results; 
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "driver");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-int Unweighted::getRoot(Tree* t, int v, vector<string> grouping) { 
-       try {
-               //you are a leaf so get your parent
-               int index = t->tree[v].getParent();
-               
-               if (includeRoot) { 
-                       rootForGrouping[grouping].clear();
-               }else {
-                       
-                       //my parent is a potential root
-                       rootForGrouping[grouping].insert(index);
-                       
-                       //while you aren't at root
-                       while(t->tree[index].getParent() != -1){
-                               //cout << index << endl;        
-                               if (m->control_pressed) {  return 0; }
-                               
-                               //am I the root for this grouping? if so I want to stop "early"
-                               //does my sibling have descendants from the users groups? 
-                               //if so I am not the root
-                               int parent = t->tree[index].getParent();
-                               int lc = t->tree[parent].getLChild();
-                               int rc = t->tree[parent].getRChild();
-                               
-                               int sib = lc;
-                               if (lc == index) { sib = rc; }
-                               
-                               map<string, int>::iterator itGroup;
-                               int pcountSize = 0;
-                               for (int j = 0; j < grouping.size(); j++) {
-                                       map<string, int>::iterator itGroup = t->tree[sib].pcount.find(grouping[j]);
-                                       if (itGroup != t->tree[sib].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
-                               }
-                               
-                               //if yes, I am not the root
-                               if (pcountSize != 0) {
-                                       rootForGrouping[grouping].clear();
-                                       rootForGrouping[grouping].insert(parent);
-                               }
-                               
-                               index = parent; 
-                       }
-                       
-                       //get all nodes above the root to add so we don't add their u values above
-                       index = *(rootForGrouping[grouping].begin());
-                       while(t->tree[index].getParent() != -1){
-                               int parent = t->tree[index].getParent();
-                               rootForGrouping[grouping].insert(parent);
-                               //cout << parent << " in root" << endl;
-                               index = parent;
-                       }
-               }
-               
-               return 0;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "Unweighted", "getRoot");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-
-