X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=treegroupscommand.cpp;h=8ee11d3421f19a19b49ad9d797dfb25db0abc405;hb=16f9c4ab6f39769856b13e048eae2c8eaa413c02;hp=c26199d673088b5b64872b672ab8e64ca780e616;hpb=0caf3fbabaa3ece404f8ce77f4c883dc5b1bf1dc;p=mothur.git diff --git a/treegroupscommand.cpp b/treegroupscommand.cpp index c26199d..8ee11d3 100644 --- a/treegroupscommand.cpp +++ b/treegroupscommand.cpp @@ -16,8 +16,9 @@ vector TreeGroupCommand::setParameters(){ try { CommandParameter pshared("shared", "InputTypes", "", "", "PhylipColumnShared", "PhylipColumnShared", "none",false,false); parameters.push_back(pshared); CommandParameter pphylip("phylip", "InputTypes", "", "", "PhylipColumnShared", "PhylipColumnShared", "none",false,false); parameters.push_back(pphylip); - CommandParameter pname("name", "InputTypes", "", "", "none", "none", "ColumnName",false,false); parameters.push_back(pname); - CommandParameter pcolumn("column", "InputTypes", "", "", "PhylipColumnShared", "PhylipColumnShared", "ColumnName",false,false); parameters.push_back(pcolumn); + CommandParameter pname("name", "InputTypes", "", "", "NameCount", "none", "ColumnName",false,false); parameters.push_back(pname); + CommandParameter pcount("count", "InputTypes", "", "", "NameCount", "none", "countcolumn",false,false); parameters.push_back(pcount); + CommandParameter pcolumn("column", "InputTypes", "", "", "PhylipColumnShared", "PhylipColumnShared", "ColumnName-countcolumn",false,false); parameters.push_back(pcolumn); CommandParameter piters("iters", "Number", "", "1000", "", "", "",false,false); parameters.push_back(piters); CommandParameter psubsample("subsample", "String", "", "", "", "", "",false,false); parameters.push_back(psubsample); CommandParameter pcutoff("cutoff", "Number", "", "10", "", "", "",false,false); parameters.push_back(pcutoff); @@ -70,6 +71,26 @@ string TreeGroupCommand::getHelpString(){ } } //********************************************************************************************************************** +string TreeGroupCommand::getOutputFileNameTag(string type, string inputName=""){ + try { + string outputFileName = ""; + map >::iterator it; + + //is this a type this command creates + it = outputTypes.find(type); + if (it == outputTypes.end()) { m->mothurOut("[ERROR]: this command doesn't create a " + type + " output file.\n"); } + else { + if (type == "tree") { outputFileName = "tre"; } + else { m->mothurOut("[ERROR]: No definition for type " + type + " output file tag.\n"); m->control_pressed = true; } + } + return outputFileName; + } + catch(exception& e) { + m->errorOut(e, "TreeGroupCommand", "getOutputFileNameTag"); + exit(1); + } +} +//********************************************************************************************************************** TreeGroupCommand::TreeGroupCommand(){ try { abort = true; calledHelp = true; @@ -140,6 +161,14 @@ TreeGroupCommand::TreeGroupCommand(string option) { //if the user has not given a path then, add inputdir. else leave path alone. if (path == "") { parameters["name"] = inputDir + it->second; } } + + it = parameters.find("count"); + //user has given a template file + if(it != parameters.end()){ + path = m->hasPath(it->second); + //if the user has not given a path then, add inputdir. else leave path alone. + if (path == "") { parameters["count"] = inputDir + it->second; } + } } //check for required parameters @@ -162,6 +191,11 @@ TreeGroupCommand::TreeGroupCommand(string option) { if (namefile == "not open") { abort = true; } else if (namefile == "not found") { namefile = ""; } else { m->setNameFile(namefile); } + + countfile = validParameter.validFile(parameters, "count", true); + if (countfile == "not open") { abort = true; countfile = ""; } + else if (countfile == "not found") { countfile = ""; } + else { m->setCountTableFile(countfile); } if ((phylipfile == "") && (columnfile == "") && (sharedfile == "")) { //is there are current file available for either of these? @@ -184,15 +218,20 @@ TreeGroupCommand::TreeGroupCommand(string option) { else if ((phylipfile != "") && (columnfile != "")) { m->mothurOut("When running the tree.shared command with a distance file you may not use both the column and the phylip parameters."); m->mothurOutEndLine(); abort = true; } if (columnfile != "") { - if (namefile == "") { + if ((namefile == "") && (countfile == "")){ namefile = m->getNameFile(); if (namefile != "") { m->mothurOut("Using " + namefile + " as input file for the name parameter."); m->mothurOutEndLine(); } else { - m->mothurOut("You need to provide a namefile if you are going to use the column format."); m->mothurOutEndLine(); - abort = true; + countfile = m->getCountTableFile(); + if (countfile != "") { m->mothurOut("Using " + countfile + " as input file for the count parameter."); m->mothurOutEndLine(); } + else { + m->mothurOut("You need to provide a namefile or countfile if you are going to use the column format."); m->mothurOutEndLine(); + abort = true; + } } } } + //check for optional parameter and set defaults // ...at some point should added some additional type checking... @@ -266,8 +305,8 @@ TreeGroupCommand::TreeGroupCommand(string option) { TreeGroupCommand::~TreeGroupCommand(){ if (abort == false) { if (format == "sharedfile") { delete input; } - else { delete readMatrix; delete matrix; delete list; } - delete tmap; + else { delete list; } + delete ct; } } @@ -380,8 +419,16 @@ int TreeGroupCommand::execute(){ m->runParse = false; //create treemap class from groupmap for tree class to use - tmap = new TreeMap(); - tmap->makeSim(m->getAllGroups()); + ct = new CountTable(); + set nameMap; + map groupMap; + set gps; + for (int i = 0; i < m->getAllGroups().size(); i++) { + nameMap.insert(m->getAllGroups()[i]); + gps.insert(m->getAllGroups()[i]); + groupMap[m->getAllGroups()[i]] = m->getAllGroups()[i]; + } + ct->createTable(nameMap, groupMap, gps); //clear globaldatas old tree names if any m->Treenames.clear(); @@ -398,37 +445,50 @@ int TreeGroupCommand::execute(){ }else{ //read in dist file filename = inputfile; - + + ReadMatrix* readMatrix; if (format == "column") { readMatrix = new ReadColumnMatrix(filename); } else if (format == "phylip") { readMatrix = new ReadPhylipMatrix(filename); } readMatrix->setCutoff(cutoff); - if(namefile != ""){ - nameMap = new NameAssignment(namefile); - nameMap->readMap(); - } - else{ - nameMap = NULL; - } - - readMatrix->read(nameMap); + ct = NULL; + nameMap = NULL; + if(namefile != ""){ + nameMap = new NameAssignment(namefile); + nameMap->readMap(); + readMatrix->read(nameMap); + }else if (countfile != "") { + ct = new CountTable(); + ct->readTable(countfile); + readMatrix->read(ct); + }else { + readMatrix->read(nameMap); + } + list = readMatrix->getListVector(); - matrix = readMatrix->getMatrix(); + SparseDistanceMatrix* dMatrix = readMatrix->getDMatrix(); //make treemap - tmap = new TreeMap(); - - if (m->control_pressed) { return 0; } - - tmap->makeSim(list); + if (ct != NULL) { delete ct; } + ct = new CountTable(); + set nameMap; + map groupMap; + set gps; + for (int i = 0; i < list->getNumBins(); i++) { + string bin = list->get(i); + nameMap.insert(bin); + gps.insert(bin); + groupMap[bin] = bin; + } + ct->createTable(nameMap, groupMap, gps); - vector namesGroups = tmap->getNamesOfGroups(); + vector namesGroups = ct->getNamesOfGroups(); m->setGroups(namesGroups); //clear globaldatas old tree names if any m->Treenames.clear(); - + //fills globaldatas tree names m->Treenames = m->getGroups(); @@ -437,12 +497,14 @@ int TreeGroupCommand::execute(){ if (m->control_pressed) { return 0; } - vector< vector > matrix = makeSimsDist(); + vector< vector > matrix = makeSimsDist(dMatrix); + delete readMatrix; + delete dMatrix; if (m->control_pressed) { return 0; } //create a new filename - string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + "tre"; + string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + getOutputFileNameTag("tree"); outputNames.push_back(outputFile); outputTypes["tree"].push_back(outputFile); Tree* newTree = createTree(matrix); @@ -482,13 +544,12 @@ int TreeGroupCommand::execute(){ Tree* TreeGroupCommand::createTree(vector< vector >& simMatrix){ try { //create tree - t = new Tree(tmap, simMatrix); + t = new Tree(ct, simMatrix); if (m->control_pressed) { delete t; t = NULL; return t; } //assemble tree - map empty; - t->assembleTree(empty); + t->assembleTree(); return t; } @@ -534,7 +595,7 @@ void TreeGroupCommand::printSims(ostream& out, vector< vector >& simMatr } } /***********************************************************/ -vector< vector > TreeGroupCommand::makeSimsDist() { +vector< vector > TreeGroupCommand::makeSimsDist(SparseDistanceMatrix* matrix) { try { numGroups = list->size(); @@ -549,13 +610,17 @@ vector< vector > TreeGroupCommand::makeSimsDist() { //go through sparse matrix and fill sims //go through each cell in the sparsematrix - for(MatData currentCell = matrix->begin(); currentCell != matrix->end(); currentCell++){ - //similairity = -(distance-1) - simMatrix[currentCell->row][currentCell->column] = -(currentCell->dist -1.0); - simMatrix[currentCell->column][currentCell->row] = -(currentCell->dist -1.0); - - if (m->control_pressed) { return simMatrix; } + for (int i = 0; i < matrix->seqVec.size(); i++) { + for (int j = 0; j < matrix->seqVec[i].size(); j++) { + + //already checked everyone else in row + if (i < matrix->seqVec[i][j].index) { + simMatrix[i][matrix->seqVec[i][j].index] = -(matrix->seqVec[i][j].dist -1.0); + simMatrix[matrix->seqVec[i][j].index][i] = -(matrix->seqVec[i][j].dist -1.0); + if (m->control_pressed) { return simMatrix; } + } + } } return simMatrix; @@ -896,7 +961,7 @@ int TreeGroupCommand::process(vector thisLookup) { } //create a new filename - string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".ave.tre"; + string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".ave." + getOutputFileNameTag("tree"); outputNames.push_back(outputFile); outputTypes["tree"].push_back(outputFile); //creates tree from similarity matrix and write out file @@ -909,7 +974,7 @@ int TreeGroupCommand::process(vector thisLookup) { if (m->control_pressed) { break; } //create a new filename - string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".all.tre"; + string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".all." + getOutputFileNameTag("tree"); outputNames.push_back(outputFile); outputTypes["tree"].push_back(outputFile); ofstream outAll; @@ -950,7 +1015,7 @@ int TreeGroupCommand::process(vector thisLookup) { Tree* conTree = consensus.getTree(trees); //create a new filename - string conFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".cons.tre"; + string conFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".cons." + getOutputFileNameTag("tree"); outputNames.push_back(conFile); outputTypes["tree"].push_back(conFile); ofstream outTree; m->openOutputFile(conFile, outTree); @@ -978,7 +1043,7 @@ int TreeGroupCommand::process(vector thisLookup) { } //create a new filename - string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + ".tre"; + string outputFile = outputDir + m->getRootName(m->getSimpleName(inputfile)) + treeCalculators[i]->getName() + "." + thisLookup[0]->getLabel() + "." + getOutputFileNameTag("tree"); outputNames.push_back(outputFile); outputTypes["tree"].push_back(outputFile); //creates tree from similarity matrix and write out file