]> git.donarmstrong.com Git - mothur.git/blob - readseqsphylip.cpp
added distance command and filterseqs
[mothur.git] / readseqsphylip.cpp
1 /*
2  *  readphylip.cpp
3  *  Mothur
4  *
5  *  Created by Thomas Ryabin on 4/24/09.
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
7  *
8  */
9
10 #include "readseqsphylip.h"
11 #include <iostream>
12 #include <fstream>
13
14 /*******************************************************************************/
15 bool ReadPhylip::isSeq(string seq) {
16         string validChars[] = {"A","G","C","T","U","N","-"};
17         
18         for(int i = 0; i < seq.length(); i++) {
19                 bool valid = false;
20                 string c = seq.substr(i,1);
21                 for(int k = 0; k < 7; k++)
22                         if(c.compare(validChars[k]) == 0) {
23                                 valid = true;
24                                 k = 7;
25                         }
26                 if(!valid)
27                         return false;
28         }
29         
30         return true;
31 }
32
33 /*******************************************************************************/
34 ReadPhylip::ReadPhylip(string file) : ReadSeqs(file) {
35         try {
36         }
37         catch(exception& e) {
38                 cout << "Standard Error: " << e.what() << " has occurred in the ReadTree class Function ReadTree. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
39                 exit(1);
40         }
41         catch(...) {
42                 cout << "An unknown error has occurred in the ReadTree class function ReadTree. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
43                 exit(1);
44         }               
45 }
46 /*******************************************************************************/
47 ReadPhylip::~ReadPhylip(){
48 //      for(int i = 0; i < sequencedb.getNumSeqs(); i++)
49 //              delete sequencedb.get(i);
50 }
51 /*******************************************************************************/
52 void ReadPhylip::read() {
53         string temp;
54         string name;
55         string sequence;
56         
57         int count = 0;
58         int letterCount = 0;
59         int numCols = 0;
60         filehandle >> temp;
61         int numSeqs = atoi(temp.c_str());
62         filehandle >> temp;
63         int numLetters = atoi(temp.c_str());
64         
65         bool firstDone = false; 
66         bool last = false;
67         filehandle >> name;
68         
69         while(!filehandle.eof()) {
70                 if(!firstDone) {
71                         sequence = "";
72                         if(count == 0) {
73                                 filehandle >> temp;
74                                 while(isSeq(temp)) {
75                                         sequence += temp;
76                                         numCols++;
77                                         filehandle >> temp;
78                                 }
79                                 letterCount += sequence.length();
80                         }
81                         else {
82                                 for(int i = 0; i < numCols; i++) {
83                                         filehandle >> temp;
84                                         sequence += temp;
85                                 }
86                                 if(count < numSeqs-1)
87                                         filehandle >> temp;
88                         }
89                         Sequence newSeq(name, sequence);
90                         sequencedb.add(newSeq);
91                         if(count < numSeqs-1)
92                                 name = temp;
93                 }       
94                 else {
95                         sequence = "";
96                         for(int i = 0; i < numCols; i++) {
97                                 filehandle >> temp;
98                                 sequence += temp;
99                                 if(count == 0)
100                                         letterCount += temp.length();
101                                 if(letterCount == numLetters && count == 0) {
102                                         numCols = i + 1;
103                                         i = numCols;
104                                 }
105                         }
106                         if(!(last && count == 0))
107                                 sequencedb.set(count, sequencedb.get(count).getUnaligned() + sequence);
108                         if(letterCount == numLetters && count == 0)
109                                 last = true;
110                 }
111                 
112                 count++;
113                 
114                 if(count == numSeqs) {
115                         firstDone = true;
116                         count = 0;
117                 }
118         }
119         filehandle.close();
120 }
121
122 /*********************************************************************************/
123 SequenceDB* ReadPhylip::getDB() {
124         return &sequencedb;
125 }