--- /dev/null
+/*
+ * readphylipvector.cpp
+ * mothur
+ *
+ * Created by westcott on 1/11/11.
+ * Copyright 2011 Schloss Lab. All rights reserved.
+ *
+ */
+
+#include "readphylipvector.h"
+
+/***********************************************************************/
+ReadPhylipVector::ReadPhylipVector(string d) {
+ try {
+ m = MothurOut::getInstance();
+ distFile = d;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "ReadPhylipVector", "ReadPhylipVector");
+ exit(1);
+ }
+}
+/***********************************************************************/
+vector<string> ReadPhylipVector::read(vector< vector<double> >& matrix) {
+ try {
+ vector<string> names;
+
+ ifstream in;
+ m->openInputFile(distFile, in);
+
+ //check whether matrix is square
+ char d;
+ int square = 1;
+ int numSeqs;
+ string name;
+
+ string numTest;
+ in >> numTest >> name;
+
+ if (!m->isContainingOnlyDigits(numTest)) { m->mothurOut("[ERROR]: expected a number and got " + numTest + ". I suspect you entered a column formatted file as a phylip file, quitting."); m->mothurOutEndLine(); exit(1); }
+ else { convert(numTest, numSeqs); }
+
+ while((d=in.get()) != EOF){
+
+ //is d a number meaning its square
+ if(isalnum(d)){
+ square = 1;
+ break;
+ }
+
+ //is d a line return meaning its lower triangle
+ if(d == '\n'){
+ square = 2;
+ break;
+ }
+ }
+ in.close();
+
+
+ //reopen and read now that you know whether you are square
+ ifstream f;
+ m->openInputFile(distFile, f);
+
+ int rank;
+ f >> rank;
+
+ names.resize(rank);
+ matrix.resize(rank);
+ if(square == 1){
+ for(int i=0;i<rank;i++)
+ matrix[i].resize(rank);
+ for(int i=0;i<rank;i++) {
+ f >> names[i];
+ for(int j=0;j<rank;j++) {
+ if (m->control_pressed) { return names; }
+
+ f >> matrix[i][j];
+ if (matrix[i][j] == -0.0000)
+ matrix[i][j] = 0.0000;
+ }
+ }
+ }
+ else if(square == 2){
+ for(int i=0;i<rank;i++){
+ matrix[i].resize(rank);
+ }
+ matrix[0][0] = 0.0000;
+ f >> names[0];
+ for(int i=1;i<rank;i++){
+ f >> names[i];
+ matrix[i][i]=0.0000;
+ for(int j=0;j<i;j++){
+ if (m->control_pressed) { return names; }
+ f >> matrix[i][j];
+ if (matrix[i][j] == -0.0000)
+ matrix[i][j] = 0.0000;
+ matrix[j][i]=matrix[i][j];
+ }
+ }
+ }
+ f.close();
+
+ return names;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "ReadPhylipVector", "read");
+ exit(1);
+ }
+}
+/***********************************************************************/
+vector<string> ReadPhylipVector::read(vector<seqDist>& matrix) {
+ try {
+ vector<string> names;
+
+ ifstream in;
+ m->openInputFile(distFile, in);
+
+ //check whether matrix is square
+ char d;
+ int square = 1;
+ int numSeqs;
+ string name;
+
+ in >> numSeqs >> name;
+
+ while((d=in.get()) != EOF){
+
+ //is d a number meaning its square
+ if(isalnum(d)){
+ square = 1;
+ break;
+ }
+
+ //is d a line return meaning its lower triangle
+ if(d == '\n'){
+ square = 2;
+ break;
+ }
+ }
+ in.close();
+
+
+ //reopen and read now that you know whether you are square
+ ifstream f;
+ m->openInputFile(distFile, f);
+
+ int rank;
+ float temp;
+ f >> rank;
+
+ names.resize(rank);
+ if(square == 1){
+ for(int i=0;i<rank;i++) {
+ f >> names[i];
+ for(int j=0;j<rank;j++) {
+ if (m->control_pressed) { return names; }
+
+ f >> temp;
+
+ if (j < i) { //only save lt
+ seqDist dist(i, j, temp);
+ matrix.push_back(dist);
+ }
+ }
+ }
+ }
+ else if(square == 2){
+ f >> names[0];
+ for(int i=1;i<rank;i++){
+ f >> names[i];
+ for(int j=0;j<i;j++){
+ if (m->control_pressed) { return names; }
+ f >> temp;
+ seqDist dist(i, j, temp);
+ matrix.push_back(dist);
+ }
+ }
+ }
+ f.close();
+
+ return names;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "ReadPhylipVector", "read");
+ exit(1);
+ }
+}
+/***********************************************************************/
+
+