00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00029 #include <map>
00030 #include <Sequence/AlignStream.hpp>
00031 #include <iterator>
00032 #include <algorithm>
00033
00034 namespace Sequence
00035 {
00036 template < typename T >
00037 std::istream & ClustalW < T >::read (std::istream & s)
00043 {
00044 std::string clustalw;
00045 char ch;
00046 std::map < std::string, std::string > seqs;
00047
00048
00049
00050
00051 std::map < std::string, int >order;
00052 int nseqs = 0;
00053 s >> clustalw;
00054 if (clustalw != "CLUSTAL")
00055 {
00056 throw badFormat ("Sequence::ClustalW::read() : input stream does not appear to be in CLUSTALW format");
00057 }
00058 else
00059 {
00060 ReadThroughLine (s);
00061 }
00062 std::string temp, temp2;
00063 while (!s.eof ())
00064 {
00065 s.get (ch);
00066 bool putback = 0;
00067 if (ch == '\n' || ch == ' ' || ch == '*')
00068 {
00069 s.putback (ch);
00070 ReadThroughLine (s);
00071 putback=1;
00072 }
00073 else
00074 {
00075 if(!putback)
00076 s.putback(ch);
00077 s >> temp;
00078 std::map < std::string, std::string >::iterator iter =
00079 seqs.find (temp);
00080 if (iter != seqs.end ())
00081 {
00082 s >> temp2;
00083 seqs[(*iter).first] += temp2;
00084 }
00085 else
00086 {
00087 s >> temp2;
00088 seqs[temp] = temp2;
00089 order[temp] = nseqs++;
00090 }
00091 }
00092 }
00093
00094 typename std::vector<T> _data;
00095 for (int i = 0; i < nseqs; ++i)
00096 {
00097 std::map < std::string, std::string >::iterator iter = seqs.begin (),
00098 iter_end = seqs.end ();
00099 bool found = 0;
00100 while (iter != iter_end)
00101 {
00102 if (order[(*iter).first] == i)
00103 {
00104 _data.push_back (T((*iter).first,(*iter).second));
00105 iter = iter_end;
00106 found = 1;
00107 }
00108 if (!found)
00109 ++iter;
00110 }
00111 }
00112 this->assign(_data.begin(),_data.end());
00113 return s;
00114 }
00115
00116 template<typename T>
00117 std::ostream & ClustalW<T>::print(std::ostream &s) const
00118 {
00119 typename ClustalW<T>::const_iterator i=this->begin(),
00120 j=this->end();
00121 size_t len = i->second.length(),k=0;
00122 s << "CLUSTAL W" << "\n\n";
00123 while (k<len)
00124 {
00125 size_t offset = (k+60 < len) ? k+60 : k+(len-k);
00126 for(i=this->begin() ; i < j ; ++i)
00127 {
00128 s << i->first
00129 << '\t';
00130 std::copy(i->second.begin()+k,
00131 i->second.begin()+offset,
00132 std::ostream_iterator<char>(s,""));
00133 s << '\n';
00134 }
00135 s << '\n';
00136 k=offset;
00137 }
00138 return s;
00139 }
00140
00141 template < typename T >
00142 std::istream & ClustalW < T >::ReadThroughLine (std::istream & s)
00143 {
00144 char ch;
00145 while (s.get (ch))
00146 {
00147 if (ch == '\n')
00148 return s;
00149 }
00150 return s;
00151 }
00152
00153 }
00154