]> git.donarmstrong.com Git - mothur.git/blob - readseqsphylip.cpp
b6be40efb1ff744d2565d94f5cefd847e4ecb26a
[mothur.git] / readseqsphylip.cpp
1 /*
2  *  readphylip.cpp
3  *  Mothur
4  *
5  *  Created by Thomas Ryabin on 4/24/09.
6  *  Copyright 2009 __MyCompanyName__. 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) {
35         try {
36                 openInputFile(file, filehandle);
37                 phylipFile = file;
38                 globaldata = GlobalData::getInstance();
39         }
40         catch(exception& e) {
41                 cout << "Standard Error: " << e.what() << " has occurred in the ReadTree class Function ReadTree. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
42                 exit(1);
43         }
44         catch(...) {
45                 cout << "An unknown error has occurred in the ReadTree class function ReadTree. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
46                 exit(1);
47         }               
48 }
49 /*******************************************************************************/
50 ReadPhylip::~ReadPhylip(){
51 //      for(int i = 0; i < sequencedb.getNumSeqs(); i++)
52 //              delete sequencedb.get(i);
53 }
54 /*******************************************************************************/
55 void ReadPhylip::read() {
56         string temp;
57         string name;
58         string sequence;
59         
60         int count = 0;
61         int letterCount = 0;
62         int numCols = 0;
63         filehandle >> temp;
64         int numSeqs = atoi(temp.c_str());
65         filehandle >> temp;
66         int numLetters = atoi(temp.c_str());
67         
68         bool firstDone = false; 
69         bool last = false;
70         filehandle >> name;
71         
72         while(!filehandle.eof()) {
73                 if(!firstDone) {
74                         sequence = "";
75                         if(count == 0) {
76                                 filehandle >> temp;
77                                 while(isSeq(temp)) {
78                                         sequence += temp;
79                                         numCols++;
80                                         filehandle >> temp;
81                                 }
82                                 letterCount += sequence.length();
83                         }
84                         else {
85                                 for(int i = 0; i < numCols; i++) {
86                                         filehandle >> temp;
87                                         sequence += temp;
88                                 }
89                                 if(count < numSeqs-1)
90                                         filehandle >> temp;
91                         }
92                         Sequence newSeq(name, sequence);
93                         sequencedb.add(newSeq);
94                         if(count < numSeqs-1)
95                                 name = temp;
96                 }       
97                 else {
98                         sequence = "";
99                         for(int i = 0; i < numCols; i++) {
100                                 filehandle >> temp;
101                                 sequence += temp;
102                                 if(count == 0)
103                                         letterCount += temp.length();
104                                 if(letterCount == numLetters && count == 0) {
105                                         numCols = i + 1;
106                                         i = numCols;
107                                 }
108                         }
109                         if(!(last && count == 0))
110                                 sequencedb.set(count, sequencedb.get(count).getAligned() + sequence);
111                         if(letterCount == numLetters && count == 0)
112                                 last = true;
113                 }
114                 
115                 count++;
116                 
117                 if(count == numSeqs) {
118                         firstDone = true;
119                         count = 0;
120                 }
121         }
122         filehandle.close();
123 }
124
125 /*********************************************************************************/
126 SequenceDB* ReadPhylip::getDB() {
127         return &sequencedb;
128 }